Как определить страну, из которой исходит IP-адрес от использования C#. Мне нужно использовать это, чтобы проверить, происходят ли соединения из определенной страны.Как определить, принадлежит ли IP-адрес стране
ответ
Вы можете использовать эти данные 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>
Обратите внимание, что присваивания IP иногда меняются. Поэтому не забудьте периодически обновлять базу данных. (Частота обновлений зависит от того, что вы делаете, для простой статистики вы можете решить, что годовые обновления в порядке). – user9876
Теперь это изменилось: вам нужно зарегистрироваться (бесплатно), чтобы иметь возможность использовать свой API. См. Здесь: http://ipinfodb.com/ip_location_api.php –
Если вы не хотите используйте API, например, hostip.info, тогда я бы предложил подписку на maxmind и запустить локальную поисковую базу данных локально.
вы можете попросить Google сделать это за вас.
Есть также услуги, которые вы можете заплатить за вы хотите:
Вот бесплатный IP Address to Country database.
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
.
Еще одна услуги, вы можете использовать мой собственная, 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 См для получения дополнительной информации.
, чтобы получить json вручную: «http://ipinfo.io/8.8.8.8/json» –
Простой 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());
}
}
Вот как сделать это с 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
}
}⏎
Для автономной базы данных, вы можете получить бесплатно 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();
}
}
}
мне нужны данные, чтобы быть доступны в автономном режиме, так как она будет использоваться для статистики. Из-за этого я буду использовать опцию sql – RC1140
Вы также можете выполнять массовый поиск с помощью https://ipdata.co – Jonathan