¿Cómo encontrar una ubicación con dirección IP en Python?

Estoy desarrollando un proyecto que necesita almacenar la ubicación del usuario en mi base de datos. Tengo la dirección IP pública de ese usuario. Pero no puedo obtener la ubicación del usuario. He intentado varias maneras (de StackOverflow ) pero no encontré ninguna pista. Como el de abajo

url = urllib.urlopen("http://api.hostip.info/get_html.php?ip=%s&position=true" % ip) data = re.compile('^[^\(]+\(|\)$').sub('', url.read()) print data 

pero estoy obteniendo el resultado como

 Unknown Country?) (XX) City: (Unknown City?) 

de otra manera:

 import urllib response = urllib.urlopen("http://api.hostip.info/get_html.php?ip={}&position=true".format(ip)).read() print(response) 

pero el resultado es

 Country: (Unknown Country?) (XX) City: (Unknown City?) Latitude: Longitude: IP: 115.xxx.xxx.xx 

¡Cualquier ayuda sería apreciada!

Uno de los métodos más simples para obtener la dirección IP, así como la ubicación en detalle, es utilizar http://ipinfo.io

 import re import json from urllib2 import urlopen url = 'http://ipinfo.io/json' response = urlopen(url) data = json.load(response) IP=data['ip'] org=data['org'] city = data['city'] country=data['country'] region=data['region'] print 'Your IP detail\n ' print 'IP : {4} \nRegion : {1} \nCountry : {2} \nCity : {3} \nOrg : {0}'.format(org,region,country,city,IP) 

Probar con Pygeoip

 ~$ ping stackoverflow.com PING stackoverflow.com (198.252.206.16) 56(84) bytes of data. >>> import pygeoip >>> GEOIP = pygeoip.GeoIP("/absolute_path/GeoIP.dat", pygeoip.MEMORY_CACHE) >>> GEOIP.country_name_by_addr(ip) 'United States' 

GeoIP.data está disponible aquí

En última instancia, depende de cómo obtenga la dirección IP de su computadora. Si está en una red privada virtual (VPN) o en otra red privada, solo obtendrá la dirección IP local y no le devolverá nada, como lo está viendo ahora. En este caso tienes que obtener la dirección IP pública así:

 url = 'http://api.hostip.info/get_json.php' info = json.loads(urllib.urlopen(url).read()) ip = info['ip'] 

Aquí está mi código completo para obtener toda la información que está buscando (usé freegeoip.net):

 import urllib import json url = 'http://api.hostip.info/get_json.php' info = json.loads(urllib.urlopen(url).read()) ip = info['ip'] urlFoLaction = "http://www.freegeoip.net/json/{0}".format(ip) locationInfo = json.loads(urllib.urlopen(urlFoLaction).read()) print 'Country: ' + locationInfo['country_name'] print 'City: ' + locationInfo['city'] print '' print 'Latitude: ' + str(locationInfo['latitude']) print 'Longitude: ' + str(locationInfo['longitude']) print 'IP: ' + str(locationInfo['ip']) 

requisitos:

 sudo add-apt-repository ppa:maxmind/ppa sudo apt update sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin sudo pip install geoip2 

base de datos geoip:

 wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz tar xvfz GeoLite2-City.tar.gz 

Ejemplo para registros de acceso nginx:

 python -c 'import geoip2.database reader = geoip2.database.Reader("./GeoLite2-City/GeoLite2-City.mmdb") for line in open("/var/log/nginx/access.log').readlines(): response = reader.city(line.split(" ")[0]) print(dir(response)) ' 

relacionado:

para python-3.x

 def ipInfo(addr=''): from urllib.request import urlopen from json import load if addr == '': url = 'https://ipinfo.io/json' else: url = 'https://ipinfo.io/' + addr + '/json' res = urlopen(url) #response from url(if res==None then check connection) data = load(res) #will load the json response into data for attr in data.keys(): #will print the data line by line print(attr,' '*13+'\t->\t',data[attr]) 

Estoy haciendo lo mismo en mi propio servidor. Obtenga una clave de API en http://ipinfodb.com/register.php y pruebe:

 import requests ipdb = "http://api.ipinfodb.com/v3/ip-city/?key=&ip=" ip_address = function_to_get_ip_address() location = " ".join(str(requests.get(ipdb+ip_address).text).split(";")[4:7]) 

El valor del location será COUNTRY REGION CITY .

Tenga en cuenta que las direcciones IP no son geo-localizadores precisos . Especialmente cuando accede a su sitio web desde un dispositivo móvil, verá que la ubicación de la dirección IP está a aproximadamente 100 millas de la ubicación física del usuario.

Suponiendo que ya tiene la dirección IP, puede intentar usar la biblioteca Python de IP2Location para obtener la ubicación del usuario. Un código de ejemplo es así:

 import os import IP2Location database = IP2Location.IP2Location(os.path.join("data", "IPV4-COUNTRY.BIN")) rec = database.get_all(ip) print(rec.country_short) print(rec.country_long) print(rec.region) print(rec.city) print(rec.isp) print(rec.latitude) print(rec.longitude) print(rec.domain) print(rec.zipcode) print(rec.timezone) print(rec.netspeed) print(rec.idd_code) print(rec.area_code) print(rec.weather_code) print(rec.weather_name) print(rec.mcc) print(rec.mnc) print(rec.mobile_brand) print(rec.elevation) print(rec.usage_type) 

Depende de sus requisitos, por ejemplo, si desea obtener el nombre del país y la región del usuario, puede hacer esto:

 import os import IP2Location database = IP2Location.IP2Location(os.path.join("data", "IPV4-COUNTRY.BIN")) rec = database.get_all(ip) user_country = rec.country_long user_region = rec.region 

Para más detalles, puede visitar aquí: IP2Location Python library

Enlace Github: IP2Location Python library Github

Puede utilizar los servicios de https://geoip-db.com . Se admiten IPv4 e IPv6. Se devuelve una función de callback JSON-object o JSONP.

Python 2:

 import urllib import json url = "https://geoip-db.com/json" response = urllib.urlopen(url) data = json.loads(response.read()) print data 

Python 3:

 import urllib.request import json with urllib.request.urlopen("https://geoip-db.com/json") as url: data = json.loads(url.read().decode()) print(data) 

Un ejemplo de python 3 jsonp:

 import urllib.request import json with urllib.request.urlopen("https://geoip-db.com/jsonp/8.8.8.8") as url: data = url.read().decode() data = data.split("(")[1].strip(")") print(data)