2009-08-13 6 views
17

Как определить страну, из которой исходит IP-адрес от использования C#. Мне нужно использовать это, чтобы проверить, происходят ли соединения из определенной страны.Как определить, принадлежит ли IP-адрес стране

+1

мне нужны данные, чтобы быть доступны в автономном режиме, так как она будет использоваться для статистики. Из-за этого я буду использовать опцию sql – RC1140

+0

Вы также можете выполнять массовый поиск с помощью https://ipdata.co – Jonathan

ответ

25

Вы можете использовать эти данные SQL в своем проекте, чтобы определить это: IP address geolocation SQL database. Загрузите эти данные и импортируйте их в свою базу данных, чтобы выполнять проверки локально.

Или вы можете использовать их бесплатный API, который возвращает XML, содержащий код страны и название страны. Вы бы сделать запрос на следующий URL-адрес с IP-адрес, который вы хотели, чтобы проверить, как показано в следующем примере:

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> 
+0

Обратите внимание, что присваивания IP иногда меняются. Поэтому не забудьте периодически обновлять базу данных. (Частота обновлений зависит от того, что вы делаете, для простой статистики вы можете решить, что годовые обновления в порядке). – user9876

+1

Теперь это изменилось: вам нужно зарегистрироваться (бесплатно), чтобы иметь возможность использовать свой API. См. Здесь: http://ipinfodb.com/ip_location_api.php –

1

Если вы не хотите используйте API, например, hostip.info, тогда я бы предложил подписку на maxmind и запустить локальную поисковую базу данных локально.

1

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.

1

Еще одна услуги, вы можете использовать мой собственная, 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 См для получения дополнительной информации.

+0

, чтобы получить json вручную: «http://ipinfo.io/8.8.8.8/json» –

3

Простой 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()); 

    } 
} 
0

Вот как сделать это с 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(); 
    } 
} 

Via Curl

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 
    } 
}⏎ 
0

Для автономной базы данных, вы можете получить бесплатно 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

C# код для запроса 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(); 
     } 

    } 
}