Obtener la posición física del dispositivo con Python?

¿Hay alguna manera de obtener la posición física de la computadora usando Python, preferiblemente sin una API, o con una API gratuita? He buscado un poco alrededor, y la única API gratuita que he encontrado es muy, muy inexacta. Solo necesito que esto sea un poco preciso, ya que es para obtener el clima local.

Puede eliminarlo de una página web como http://www.geoiptool.com/, por ejemplo.

 import urllib2 import json # Automatically geolocate the connecting IP f = urllib2.urlopen('http://freegeoip.net/json/') json_string = f.read() f.close() location = json.loads(json_string) print(location) location_city = location['city'] location_state = location['region_name'] location_country = location['country_name'] location_zip = location['zipcode'] 

Envíe las solicitudes HTTP GET a: freegeoip.net/{format}/{ip_or_hostname} para recibir una salida JSON que Python puede analizar.

Obtengo las siguientes claves JSON, que deberían ser suficientes para lo que necesita:

  • ip
  • código de país
  • nombre del país
  • código de región
  • nombre_región
  • ciudad
  • código postal
  • latitud
  • longitud
  • código_metro
  • codigo de AREA

Puede probar a usar la API GeoIP Python de MaxMind con su base de datos gratuita de GeoLite City . La precisión puede variar, más detalles aquí .

También eche un vistazo a esta pregunta para otras alternativas.

Si conoce la IP pública del dispositivo, puede hacerlo utilizando freegeip . A continuación se muestra el código de Python 3.4.2 para obtener la ubicación y la zona horaria.

 >>> import requests >>> ip = '141.70.111.66' >>> url = 'http://freegeoip.net/json/'+ip >>> r = requests.get(url) >>> js = r.json() >>> js['country_code'] 'DE' >>> js['country_name'] 'Germany' >>> js['time_zone'] 'Europe/Berlin' >>> js['city'] 'Stuttgart' >>> js.items() dict_items([('latitude', 48.7667), ('ip', '141.70.111.66'), ('region_code', 'BW'), ('country_code', 'DE'), ('city', 'Stuttgart'), ('zip_code', '70173'), ('country_name', 'Germany'), ('longitude', 9.1833), ('region_name', 'Baden-Württemberg Region'), ('time_zone', 'Europe/Berlin'), ('metro_code', 0)]) 

Redescubrí otra API de clima que no me gusta tanto (Weather Underground), pero opcionalmente puedo determinar la ubicación. Podría usar esto si no puedo trabajar con algo como un raspador de geoiptool.