Abrufen des Benutzerstandorts anhand der IP-Adresse

77

Ich habe eine ASP.NET-Website in C # geschrieben.

Auf dieser Site muss automatisch eine Startseite angezeigt werden, die auf dem Standort des Benutzers basiert.

Kann ich den Namen der Stadt des Benutzers basierend auf der IP-Adresse des Benutzers erhalten?

Damir
quelle
2
kostenlos Rest Apiüberprüfen Sie freegeoip.net oder geoplugin.net , oder überprüfen Sie dies und diesen Beitrag, Hoffnung hilft jemandem.
Shaijut

Antworten:

45

Sie benötigen eine IP-Adress-basierte Reverse-Geocodierungs-API ... wie die von ipdata.co . Ich bin sicher, es gibt viele Möglichkeiten.

Möglicherweise möchten Sie dem Benutzer jedoch erlauben, dies zu überschreiben. Sie können sich beispielsweise in einem Unternehmens-VPN befinden, wodurch die IP-Adresse so aussieht, als ob sie sich in einem anderen Land befindet.

Jon Skeet
quelle
2
Geh Skeet! Wie geht es dir immer zuerst? :)
Herr B
2
@ Jonathan: Aktualisiert.
Jon Skeet
2
Eine weitere blitzschnelle und genaue API für Geolokalisierungs- und Bedrohungsdaten ist ipregistry.co (Haftungsausschluss: Ich führe den Dienst aus).
Laurent
26

Verwenden Sie http://ipinfo.io . Sie müssen sie bezahlen, wenn Sie mehr als 1000 Anfragen pro Tag stellen.

Der folgende Code erfordert das Json.NET- Paket.

public static string GetUserCountryByIp(string ip)
{
    IpInfo ipInfo = new IpInfo();
    try
    {
        string info = new WebClient().DownloadString("http://ipinfo.io/" + ip);
        ipInfo = JsonConvert.DeserializeObject<IpInfo>(info);
        RegionInfo myRI1 = new RegionInfo(ipInfo.Country);
        ipInfo.Country = myRI1.EnglishName;
    }
    catch (Exception)
    {
        ipInfo.Country = null;
    }
    
    return ipInfo.Country;
}

Und die IpInfoKlasse, die ich benutzt habe:

public class IpInfo
{
    [JsonProperty("ip")]
    public string Ip { get; set; }

    [JsonProperty("hostname")]
    public string Hostname { get; set; }

    [JsonProperty("city")]
    public string City { get; set; }

    [JsonProperty("region")]
    public string Region { get; set; }

    [JsonProperty("country")]
    public string Country { get; set; }

    [JsonProperty("loc")]
    public string Loc { get; set; }

    [JsonProperty("org")]
    public string Org { get; set; }

    [JsonProperty("postal")]
    public string Postal { get; set; }
}
Offir Pe'er
quelle
17

Der folgende Code funktioniert für mich.

Aktualisieren:

Da rufe ich eine kostenlose API-Anfrage (json base) IpStack auf .

    public static string CityStateCountByIp(string IP)
    {
      //var url = "http://freegeoip.net/json/" + IP;
      //var url = "http://freegeoip.net/json/" + IP;
        string url = "http://api.ipstack.com/" + IP + "?access_key=[KEY]";
        var request = System.Net.WebRequest.Create(url);
        
         using (WebResponse wrs = request.GetResponse())
         using (Stream stream = wrs.GetResponseStream())
         using (StreamReader reader = new StreamReader(stream))
         {
          string json = reader.ReadToEnd();
          var obj = JObject.Parse(json);
            string City = (string)obj["city"];
            string Country = (string)obj["region_name"];                    
            string CountryCode = (string)obj["country_code"];
        
           return (CountryCode + " - " + Country +"," + City);
           }

  return "";

}

Bearbeiten: Zuerst war es http://freegeoip.net/ jetzt ist es https://ipstack.com/ (und jetzt ist es vielleicht ein kostenpflichtiger Service - Kostenlos Bis zu 10.000 Anfragen / Monat)

BJ Patel
quelle
1
Ich habe keine Ahnung, warum dies nicht die Antwort war. Gute Arbeit
BoundForGlory
1
Dies unterstützt auch das Ersetzen jsondurch xmlin der Adresse, um eine XML-Rückgabestruktur zu erhalten.
DonBoitnott
Sie sollten Ihren API-Schlüssel am Ende hinzufügen. Richtig?
Michael Haephrati
IPStack ist sehr ungenau
user1034912
1
Es gibt immer noch wenige freie Treffer :)
Gaurav Kaushik
12

IPInfoDB verfügt über eine API , die Sie aufrufen können, um anhand einer IP-Adresse einen Speicherort zu finden.

Für "City Precision" nennen Sie es so (Sie müssen sich registrieren, um einen kostenlosen API-Schlüssel zu erhalten):

 http://api.ipinfodb.com/v2/ip_query.php?key=<your_api_key>&ip=74.125.45.100&timezone=false

Hier ist ein Beispiel in VB und C #, das zeigt, wie die API aufgerufen wird.

Krapfen
quelle
7

Ich habe versucht, http://ipinfo.io zu verwenden, und diese JSON-API funktioniert einwandfrei. Zunächst müssen Sie die folgenden Namespaces hinzufügen:

using System.Linq;
using System.Web; 
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
using System.Xml;
using System.Collections.Specialized;

Für localhost werden Dummy-Daten als angegeben AU. Sie können versuchen, Ihre IP-Adresse fest zu codieren, um Ergebnisse zu erhalten:

namespace WebApplication4
{
    public partial class WebForm1 : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
         {

          string VisitorsIPAddr = string.Empty;
          //Users IP Address.                
          if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
          {
              //To get the IP address of the machine and not the proxy
              VisitorsIPAddr =   HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
          }
          else if (HttpContext.Current.Request.UserHostAddress.Length != 0)
          {
              VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress;`enter code here`
          }

          string res = "http://ipinfo.io/" + VisitorsIPAddr + "/city";
          string ipResponse = IPRequestHelper(res);

        }

        public string IPRequestHelper(string url)
        {

            string checkURL = url;
            HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
            StreamReader responseStream = new StreamReader(objResponse.GetResponseStream());
            string responseRead = responseStream.ReadToEnd();
            responseRead = responseRead.Replace("\n", String.Empty);
            responseStream.Close();
            responseStream.Dispose();
            return responseRead;
        }


    }
}
Poonam Singhania
quelle
3
Könnten Sie ein paar Zeilen hinzufügen, um Ihre Lösung zu erklären? Vielen Dank.
m4rtin
Könnten Sie das bitte erklären?
wannabeLearner
7

Ich konnte dies in ASP.NET MVC mithilfe der Client-IP-Adresse und der freegeoip.net- API erreichen. freegeoip.net ist kostenlos und erfordert keine Lizenz.

Unten ist der Beispielcode, den ich verwendet habe.

String UserIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(UserIP))
{
    UserIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
string url = "http://freegeoip.net/json/" + UserIP.ToString();
WebClient client = new WebClient();
string jsonstring = client.DownloadString(url);
dynamic dynObj = JsonConvert.DeserializeObject(jsonstring);
System.Web.HttpContext.Current.Session["UserCountryCode"] = dynObj.country_code;

Sie können diesen Beitrag für weitere Details durchgehen. Hoffentlich hilft es!

Pranay
quelle
1
Von Nur-Link-Antworten wird hier dringend abgeraten, da die Links in Zukunft möglicherweise nicht mehr funktionieren. Ich schlage vor, Sie bearbeiten Ihre Antwort mit Zitaten aus den von Ihnen zitierten Quellen.
Anirudh Sharma
15К Anfragen pro Tag kostenlos
aleha
5

Verwenden der Anfrage der folgenden Website

http://ip-api.com/

Es folgt der C # -Code für die Rückgabe von Land und Ländercode

public  string GetCountryByIP(string ipAddress)
    {
        string strReturnVal;
        string ipResponse = IPRequestHelper("http://ip-api.com/xml/" + ipAddress);

        //return ipResponse;
        XmlDocument ipInfoXML = new XmlDocument();
        ipInfoXML.LoadXml(ipResponse);
        XmlNodeList responseXML = ipInfoXML.GetElementsByTagName("query");

        NameValueCollection dataXML = new NameValueCollection();

        dataXML.Add(responseXML.Item(0).ChildNodes[2].InnerText, responseXML.Item(0).ChildNodes[2].Value);

        strReturnVal = responseXML.Item(0).ChildNodes[1].InnerText.ToString(); // Contry
        strReturnVal += "(" + 

responseXML.Item(0).ChildNodes[2].InnerText.ToString() + ")";  // Contry Code 
 return strReturnVal;
}

Und im Folgenden finden Sie einen Helfer zum Anfordern einer URL.

public string IPRequestHelper(string url) {

      HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
      HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

      StreamReader responseStream = new StreamReader(objResponse.GetResponseStream());
      string responseRead = responseStream.ReadToEnd();

      responseStream.Close();
      responseStream.Dispose();

  return responseRead;
}
BJ Patel
quelle
es scheint, wir müssen für die kommerzielle Nutzung bezahlen.
Shaijut
5

Was Sie benötigen, wird als "Geo-IP-Datenbank" bezeichnet. Die meisten von ihnen kosten etwas Geld (wenn auch nicht zu teuer), besonders ziemlich präzise. Eine der am häufigsten verwendeten ist die MaxMind-Datenbank . Sie haben eine ziemlich gute kostenlose Version der IP-to-City-Datenbank namens GeoLity City - es gibt viele Einschränkungen, aber wenn Sie damit fertig werden, wäre dies wahrscheinlich die beste Wahl, es sei denn, Sie haben etwas Geld für ein Abonnement übrig genaueres Produkt.

Und ja, sie haben eine C # -API, um verfügbare Geo-IP-Datenbanken abzufragen .

GreyCat
quelle
Das ist praktisch zu wissen, insbesondere GEO-IP-Optionen für C #
Martin Sansone - MiOEE
MaxMind hat die Site-Struktur geändert. Ich habe die Links korrigiert. Danke, @Dementic.
GreyCat
5

Sie müssen wahrscheinlich eine externe API verwenden, von der die meisten Geld kosten.

Ich habe dies jedoch gefunden, scheint kostenlos zu sein: http://hostip.info/use.html

Chuck Callebs
quelle
2
Die erwähnte URL ist nicht mehr verfügbar, aber Details der API finden Sie jetzt unter hostip.info/use.html
Peter
@ PeterBailey aktualisiert! Vielen Dank.
Chuck Callebs
4

Rückkehrland

static public string GetCountry()
{
    return new WebClient().DownloadString("http://api.hostip.info/country.php");
}

Verwendung:

Console.WriteLine(GetCountry()); // will return short code for your country

Informationen zurückgeben

static public string GetInfo()
{
    return new WebClient().DownloadString("http://api.hostip.info/get_json.php");
}

Verwendung:

Console.WriteLine(GetInfo()); 
// Example:
// {
//    "country_name":"COUNTRY NAME",
//    "country_code":"COUNTRY CODE",
//    "city":"City",
//    "ip":"XX.XXX.XX.XXX"
// }
Ionică Bizău
quelle
8
Wenn Sie dies ausführen, wird das Land des Servers zurückgegeben, auf dem die Webanwendung ausgeführt wird (und dieser Code), nicht das Land des Clients, der die Webseite anfordert. Dies ist also nicht der angeforderte Benutzerstandort. (Trotzdem ein wirklich anständiger Programmierstil)
spikey
4
im Moment gebrochen
HellBaby
2

Es ist eine gute Probe für Sie:

public class IpProperties
    {
        public string Status { get; set; }
        public string Country { get; set; }
        public string CountryCode { get; set; }
        public string Region { get; set; }
        public string RegionName { get; set; }
        public string City { get; set; }
        public string Zip { get; set; }
        public string Lat { get; set; }
        public string Lon { get; set; }
        public string TimeZone { get; set; }
        public string ISP { get; set; }
        public string ORG { get; set; }
        public string AS { get; set; }
        public string Query { get; set; }
    }
 public string IPRequestHelper(string url)
    {
        HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

        StreamReader responseStream = new StreamReader(objResponse.GetResponseStream());
        string responseRead = responseStream.ReadToEnd();

        responseStream.Close();
        responseStream.Dispose();

        return responseRead;
    }

    public IpProperties GetCountryByIP(string ipAddress)
    {
        string ipResponse = IPRequestHelper("http://ip-api.com/xml/" + ipAddress);
        using (TextReader sr = new StringReader(ipResponse))
        {
            using (System.Data.DataSet dataBase = new System.Data.DataSet())
            {
                IpProperties ipProperties = new IpProperties();
                dataBase.ReadXml(sr);
                ipProperties.Status = dataBase.Tables[0].Rows[0][0].ToString();
                ipProperties.Country = dataBase.Tables[0].Rows[0][1].ToString();
                ipProperties.CountryCode = dataBase.Tables[0].Rows[0][2].ToString();
                ipProperties.Region = dataBase.Tables[0].Rows[0][3].ToString();
                ipProperties.RegionName = dataBase.Tables[0].Rows[0][4].ToString();
                ipProperties.City = dataBase.Tables[0].Rows[0][5].ToString();
                ipProperties.Zip = dataBase.Tables[0].Rows[0][6].ToString();
                ipProperties.Lat = dataBase.Tables[0].Rows[0][7].ToString();
                ipProperties.Lon = dataBase.Tables[0].Rows[0][8].ToString();
                ipProperties.TimeZone = dataBase.Tables[0].Rows[0][9].ToString();
                ipProperties.ISP = dataBase.Tables[0].Rows[0][10].ToString();
                ipProperties.ORG = dataBase.Tables[0].Rows[0][11].ToString();
                ipProperties.AS = dataBase.Tables[0].Rows[0][12].ToString();
                ipProperties.Query = dataBase.Tables[0].Rows[0][13].ToString();

                return ipProperties;
            }
        }
    }

Und testen:

var ipResponse = GetCountryByIP("your ip address or domain name :)");
Ali Yousefi
quelle
1

Eine Alternative zur Verwendung einer API ist die Verwendung des HTML 5-Standortnavigators, um den Browser nach dem Benutzerstandort abzufragen. Ich suchte nach einem ähnlichen Ansatz wie in der Betrefffrage, stellte jedoch fest, dass HTML 5 Navigator für meine Situation besser und billiger funktioniert. Bitte beachten Sie, dass Ihr Szenario anders sein kann. Die Benutzerposition mit HTML5 zu ermitteln ist sehr einfach:

function getLocation()
{
    if (navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(showPosition);
    }
    else
    {
        console.log("Geolocation is not supported by this browser.");
     }
}

function showPosition(position)
{
      console.log("Latitude: " + position.coords.latitude + 
  "<br>Longitude: " + position.coords.longitude); 
}

Probieren Sie es selbst im W3Schools Geolocation Tutorial aus

Hat AlTaiar
quelle
0
    public static string GetLocationIPAPI(string ipaddress)
    {
        try
        {
            IPDataIPAPI ipInfo = new IPDataIPAPI();
            string strResponse = new WebClient().DownloadString("http://ip-api.com/json/" + ipaddress);
            if (strResponse == null || strResponse == "") return "";
            ipInfo = JsonConvert.DeserializeObject<IPDataIPAPI>(strResponse);
            if (ipInfo == null || ipInfo.status.ToLower().Trim() == "fail") return "";
            else return ipInfo.city + "; " + ipInfo.regionName + "; " + ipInfo.country + "; " + ipInfo.countryCode;
        }
        catch (Exception)
        {
            return "";
        }
    }

public class IPDataIPINFO
{
    public string ip { get; set; }
    public string city { get; set; }
    public string region { get; set; }
    public string country { get; set; }
    public string loc { get; set; }
    public string postal { get; set; }
    public int org { get; set; }

}

==========================

    public static string GetLocationIPINFO(string ipaddress)
    {            
        try
        {
            IPDataIPINFO ipInfo = new IPDataIPINFO();
            string strResponse = new WebClient().DownloadString("http://ipinfo.io/" + ipaddress);
            if (strResponse == null || strResponse == "") return "";
            ipInfo = JsonConvert.DeserializeObject<IPDataIPINFO>(strResponse);
            if (ipInfo == null || ipInfo.ip == null || ipInfo.ip == "") return "";
            else return ipInfo.city + "; " + ipInfo.region + "; " + ipInfo.country + "; " + ipInfo.postal;
        }
        catch (Exception)
        {
            return "";
        }
    }

public class IPDataIPAPI
{
    public string status { get; set; }
    public string country { get; set; }
    public string countryCode { get; set; }
    public string region { get; set; }
    public string regionName { get; set; }
    public string city { get; set; }
    public string zip { get; set; }
    public string lat { get; set; }
    public string lon { get; set; }
    public string timezone { get; set; }
    public string isp { get; set; }
    public string org { get; set; }
    public string @as { get; set; }
    public string query { get; set; }
}

==============================

    private static string GetLocationIPSTACK(string ipaddress)
    {
        try
        {
            IPDataIPSTACK ipInfo = new IPDataIPSTACK();
            string strResponse = new WebClient().DownloadString("http://api.ipstack.com/" + ipaddress + "?access_key=XX384X1XX028XX1X66XXX4X04XXXX98X");
            if (strResponse == null || strResponse == "") return "";
            ipInfo = JsonConvert.DeserializeObject<IPDataIPSTACK>(strResponse);
            if (ipInfo == null || ipInfo.ip == null || ipInfo.ip == "") return "";
            else return ipInfo.city + "; " + ipInfo.region_name + "; " + ipInfo.country_name + "; " + ipInfo.zip;
        }
        catch (Exception)
        {
            return "";
        }
    }

public class IPDataIPSTACK
{
    public string ip { get; set; }
    public int city { get; set; }
    public string region_code { get; set; }
    public string region_name { get; set; }
    public string country_code { get; set; }
    public string country_name { get; set; }
    public string zip { get; set; }


}
Vinuvd
quelle
Bitte fügen Sie eine Erklärung hinzu, was dieser Code tut und was damit zu tun ist. [aus der Rezension]
Artemis vertraut SE
-1

Sie können

using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;
public ActionResult geoPlugin()
    {

        var url = "http://freegeoip.net/json/";
        var request = System.Net.WebRequest.Create(url);

        using (WebResponse wrs = request.GetResponse())
        using (Stream stream = wrs.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream))
        {
            string json = reader.ReadToEnd();
            var obj = JObject.Parse(json);
            var City = (string)obj["city"];
            // - For Country = (string)obj["region_name"];                    
            //- For  CountryCode = (string)obj["country_code"];
            Session["CurrentRegionName"]= (string)obj["country_name"];
            Session["CurrentRegion"] = (string)obj["country_code"];
        }
        return RedirectToAction("Index");
    }
Sultan
quelle