2009-08-13 19 views
17

¿Cómo puedo determinar el país en el que se origina una dirección IP específica al usar C#. Necesito usar esto para verificar si las conexiones se originan en un país específico.Cómo determinar si una dirección IP pertenece a un país

+1

necesito que los datos estén disponibles sin conexión, ya que será utilizado para las estadísticas. Debido a esto, estaré usando la opción sql – RC1140

+0

. También podría realizar búsquedas masivas con https://ipdata.co – Jonathan

Respuesta

25

Puede utilizar estos datos SQL en su proyecto para determinar que: IP address geolocation SQL database. Descargue esos datos e impórtelos en su base de datos para ejecutarlos localmente.

O puede utilizar su API gratuita que devuelve XML que contiene el código del país y el nombre del país. Se podría hacer una solicitud a la siguiente dirección URL con la dirección IP que quería comprobar, como se ve en este ejemplo:

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

Devuelve:

<Response> 
<Ip>74.125.45.100</Ip> 
<Status>OK</Status> 
<CountryCode>US</CountryCode> 
<CountryName>United States</CountryName> 
</Response> 
+0

Tenga en cuenta que las asignaciones de IP cambian ocasionalmente. Así que recuerde actualizar su base de datos ocasionalmente. (La frecuencia de las actualizaciones que necesita depende de lo que esté haciendo; para las estadísticas simples, puede decidir si las actualizaciones anuales son correctas). – user9876

+1

Esto ahora ha cambiado: debes registrarte ahora (gratis) para poder usar su API. Vea aquí: http://ipinfodb.com/ip_location_api.php –

1

Si no desea use una API como quizás hostip.info, luego sugeriría suscribirse a maxmind y ejecutar localmente una base de datos de búsqueda de host.

1

ip2cc - Busque país y región de Rusia por dirección IP Módulo Python con secuencia de comandos para crear una base de datos a partir de datos oficiales actualizados.

Este Python cargas de servicio público (con la frecuencia que se quiere) hasta al día la información de Regional Internet Registry sitios (arin, ripencc, apnic, lacnic, afrinic), como 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) 

vez que los datos se cargado, las consultas se pueden responder fuera de línea y muy rápidamente. Puede modificarse fácilmente para responder directamente a la pregunta original, o utilizarse desde la línea de comando para devolver el país al que pertenece IP address.

1

Otro de los servicios que usted podría utilizar es la mía, http://ipinfo.io, que devuelve la ubicación, organización y otra información:

$ 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 
} 

Ver http://ipinfo.io/developers para más información.

+0

para obtener json a mano: "http://ipinfo.io/8.8.8.8/json" –

3

Solo una simple llamada API p. Ej.https://ipapi.co/8.8.8.8/country/

de EE.UU.

He aquí un ejemplo de C# con 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

es como se hace esto con 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

Aquí
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

Para la base de datos fuera de línea, usted puede conseguir la libre IP2Location LITE DB1

para crear la tabla

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 

Para importar los datos

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 

Para el archivo 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 

La primera línea del código FMT indica la versión de bcp. Por favor, cambie la versión de acuerdo con su MS-SQL instalado.

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ódigo C# para consultar 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(); 
     } 

    } 
} 
Cuestiones relacionadas