代码之家  ›  专栏  ›  技术社区  ›  RC1140

如何确定IP地址是否属于某个国家

  •  18
  • RC1140  · 技术社区  · 15 年前

    我如何确定特定IP地址来源于使用C_的国家。我需要用这个来检查连接是否来自一个特定的国家。

    9 回复  |  直到 7 年前
        1
  •  26
  •   Ron    15 年前

    您可以在项目中使用此SQL数据来确定: IP address geolocation SQL database . 下载数据并将其导入数据库以在本地运行检查。

    或者您可以使用他们的免费API返回包含国家代码和国家名称的XML。您将使用要检查的IP地址向以下URL发出请求,如本例中所示:

    http://ipinfodb.com/ip_query_country.php?ip=74.125.45.100

    返回:

    <Response>
    <Ip>74.125.45.100</Ip>
    <Status>OK</Status>
    <CountryCode>US</CountryCode>
    <CountryName>United States</CountryName>
    </Response>
    
        2
  •  4
  •   Jaimes    8 年前

    只是一个简单的 API 调用例如 https://ipapi.co/8.8.8.8/country/

    美国

    下面是一个C示例 working fiddle :

    using System;
    using System.Net;
    using System.IO;
    using System.Text;
    
    
    public class Program
    {
        public static void Main()
        {
    
          ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    
          HttpWebRequest request   = (HttpWebRequest)WebRequest.Create("https://ipapi.co/8.8.8.8/country/");
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
          var reader = new System.IO.StreamReader(response.GetResponseStream(), ASCIIEncoding.ASCII);
          Console.WriteLine(reader.ReadToEnd());
    
        }
    }
    
        4
  •  2
  •   JP Alioto    15 年前
        5
  •  1
  •   michael pearson    15 年前

    如果您不想使用类似hostip.info的API,那么我建议订阅maxmind并在本地运行主机查找数据库。

        6
  •  1
  •   gimel    15 年前

    ip2cc -按IP地址查找国家和俄罗斯地区的python模块,用脚本从最新的官方数据创建数据库。

    这个 Python 实用程序从加载最新信息(按您喜欢的频率) Regional Internet Registry 站点( arin , ripencc , apnic , lacnic , afrinic ) shown in the source :

    url_template = 'ftp://ftp.ripe.net/pub/stats/%s/delegated-%s-latest'
    sources = {}
    for name in ('arin', 'ripencc', 'apnic', 'lacnic', 'afrinic'):
        sources[name] = url_template % (name, name)
    

    加载数据后,可以回答查询 脱机 而且很快。 可以很容易地修改为直接回答原始问题,或者从命令行使用以返回国家/地区 IP address 属于。

        7
  •  1
  •   Ben Dowling    10 年前

    你可以使用的另一项服务是我自己的, http://ipinfo.io ,返回位置、组织和其他信息:

    $ curl ipinfo.io/8.8.8.8
    {
      "ip": "8.8.8.8",
      "hostname": "google-public-dns-a.google.com",
      "loc": "37.385999999999996,-122.0838",
      "org": "AS15169 Google Inc.",
      "city": "Mountain View",
      "region": "California",
      "country": "US",
      "phone": 650
    }
    

    http://ipinfo.io/developers 更多信息。

        8
  •  0
  •   Jonathan    7 年前

    以下是如何处理 https://ipdata.co

    //Common testing requirement. If you are consuming an API in a sandbox/test region, uncomment this line of code ONLY for non production uses.
    //System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    
    //Be sure to run "Install-Package Microsoft.Net.Http" from your nuget command line.
    using System;
    using System.Net.Http;
    
    var baseAddress = new Uri("https://api.ipdata.co/78.8.53.5");
    
    using (var httpClient = new HttpClient{ BaseAddress = baseAddress })
    {
    
      httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", "application/json");
    
      using(var response = await httpClient.GetAsync("undefined"))
      {
    
            string responseData = await response.Content.ReadAsStringAsync();
      }
    }
    

    通过卷曲

    curl https://api.ipdata.co/78.8.53.5
    {
        "ip": "78.8.53.5",
        "city": "G\u0142og\u00f3w",
        "region": "Lower Silesia",
        "region_code": "DS",
        "country_name": "Poland",
        "country_code": "PL",
        "continent_name": "Europe",
        "continent_code": "EU",
        "latitude": 51.6461,
        "longitude": 16.1678,
        "asn": "AS12741",
        "organisation": "Netia SA",
        "postal": "67-200",
        "currency": "PLN",
        "currency_symbol": "z\u0142",
        "calling_code": "48",
        "flag": "https://ipdata.co/flags/pl.png",
        "emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
        "time_zone": "Europe/Warsaw",
        "is_eu": true,
        "suspicious_factors": {
            "is_tor": false
        }
    }⏎ 
    
        9
  •  0
  •   Vlam    7 年前

    对于脱机数据库,您可以免费获得 IP2Location LITE DB1

    创建表格

    CREATE DATABASE ip2location
    GO
    
    USE ip2location
    GO
    
    CREATE TABLE [ip2location].[dbo].[ip2location_db1](
        [ip_from] float NOT NULL,
        [ip_to] float NOT NULL,
        [country_code] nvarchar(2) NOT NULL,
        [country_name] nvarchar(64) NOT NULL,
    ) ON [PRIMARY]
    GO
    
    CREATE INDEX [ip_from] ON [ip2location].[dbo].[ip2location_db1]([ip_from]) ON [PRIMARY]
    GO
    
    CREATE INDEX [ip_to] ON [ip2location].[dbo].[ip2location_db1]([ip_to]) ON [PRIMARY]
    GO
    

    导入数据

    BULK INSERT [ip2location].[dbo].[ip2location_db1]
        FROM 'C:\[path to your CSV file]\IP2LOCATION-LITE-DB1.CSV'
        WITH
        (
            FORMATFILE = 'C:\[path to your DB1.FMT file]\DB1.FMT'
        )
    GO
    

    对于fmt文件

    10.0
    5
    1 SQLCHAR 0 1 "\"" 0 first_double_quote  Latin1_General_CI_AI
    2 SQLCHAR 0 20 "\",\"" 1 ip_from ""
    3 SQLCHAR 0 20 "\",\"" 2 ip_to ""
    4 SQLCHAR 0 2 "\",\"" 3 country_code Latin1_General_CI_AI
    5 SQLCHAR 0 64 "\"\r\n" 4 country_name Latin1_General_CI_AI
    

    fmt代码的第一行表示bcp的版本。请根据安装的MS-SQL更改版本。

    SQL Server 2016 12.0

    SQL Server 2014 12.0

    SQL Server 2012 11.0

    SQL Server 2008/2008 R2 10.0

    SQL Server 2005 9.0

    SQL Server 2000 8.0

    SQL Server 7.0 7.0

    SQL Server 6.5 6.5

    查询MSSQL的代码

    using System.Data.SqlClient;
    using System.Numerics;
    using System.Net;
    using System.Text;
    public class Form1 {
    
        private void Form1_Load(object sender, System.EventArgs e) {
            string ip = "8.8.8.8";
            this.IP2Location(ip);
        }
    
        private void IP2Location(string myip) {
            IPAddress address = null;
            if (IPAddress.TryParse(myip, address)) {
                byte[] addrBytes = address.GetAddressBytes();
                this.LittleEndian(addrBytes);
                UInt32 ipno = 0;
                ipno = BitConverter.ToUInt32(addrBytes, 0);
                string sql = "SELECT TOP 1 * FROM ip2location_db1 WHERE ip_to >= \'" + ipno.ToString() + "\'";
                object conn = new SqlConnection("Server=yourserver;Database=yourdatabase;User Id=youruserid;Password=yourpassword;");
                object comm = new SqlCommand(sql, conn);
                SqlDataReader reader;
                comm.Connection.Open();
                reader = comm.ExecuteReader(CommandBehavior.CloseConnection);
                int x = 0;
                object sb = new StringBuilder(250);
                if (reader.HasRows) {
                    if (reader.Read()) {
                        for (x = 0; (x <= (reader.FieldCount() - 1)); x++) {
                            sb.Append((reader.GetName(x) + (": " + (reader.GetValue(x) + "\r\n"))));
                        }
                    }
                }
    
                reader.Close();
                MsgBox(sb.ToString());
            }
    
        }
    
        private void LittleEndian(ref byte[] byteArr) {
            if (BitConverter.IsLittleEndian) {
                List<byte> byteList = new List<byte>(byteArr);
                byteList.Reverse();
                byteArr = byteList.ToArray();
            }
    
        }
    }