Hola amigos del internet. Quiero mostrarle un script que realice hace mucho tiempo y lo publicque en un blog recientemente. Es muy interesante y me hace pensar en todo lo que saben las grandes empresas hoy en día. Pueden saber mucho con nuestra IP. Ya sin mucha explicación aquí el script.
import requests
import json
# URL de la API
api_url = "http://ip-api.com/json/"
# Definimos los parametros de respuesta que queremos obtener
parametros = 'status,country,countryCode,region,regionName,city,zip,lat,lon,timezone,isp,org,as,query'
data = {"fields":parametros}
def ip_scraping(ip=""):
# Nos conectamos con la API
res = requests.get(api_url+ip, data=data)
# Obtenemos y procesamos la respuesta JSON
api_json_res = json.loads(res.content)
return api_json_res
if __name__ == '__main__':
# Solicitamos la entrada
ip = input("Ingrese la dirección IP: ")
# Llamamos a la función ip_scraping y mostramos los resultados
par = parametros.split(",")
for x in par:
print(x.upper(), ":")
print(ip_scraping(ip)[x])
print("\n")
Si quieres, puedes ver como funciona el código en tiempo real en linea. Te dejo el link: https://www.geeksacademy.site/2020/07/ipgeopy-geolocalizacion-por-ip-con.html
Les agradecería mucha si me dan su opinión. Alguna sugerencia.
Buenas @PeterParker (https://underc0de.org/foro/index.php?action=profile;u=109765)! :)
He visto varios errores en tu código.
Para empezar, si quiere mostrar todos estos valores:
parametros = 'status,country,countryCode,region,regionName,city,zip,lat,lon,timezone,isp,org,as,query'
data = {"fields":parametros}
Entonces, realmente no hace falta que hagas un string con los mismos, lo mismo va para la variable data, ya que al hacer la petición, basta con enviarle la misma IP y nada más.
En la función ip_scraping, si *ip=""* quiere decir que al ingresar nada, devuelva los datos de su propia ip, entonces, podría solo dejar el parámetro ip, ya que al concatenarla con la cadena *api_url* va a ser igual a la misma.
Luego tenemos el for:
par = parametros.split(",")
for x in par:
print(x.upper(), ":")
print(ip_scraping(ip)<ul class="bbc_list"><li type="square">)[/li][/list]
print("\n")
En esta sección del código se itera sobre todos los valores de la lista par. Por cada iteración, se imprime el mismo objeto JSON. Y además, no sé que quiso hacer acá, además de lo dicho anteriormente, aunque lo más probable es que se haya confundido:
print(ip_scraping(ip)<ul class="bbc_list"><li type="square">)[/li][/list]
Hay otro par de errores que mencionar, pero creo que le falta aprender un poco más sobre Python. Acá le dejo un manual que le guiará bastante a mejorar todo lo dicho.
http://www.utic.edu.py/citil/images/Manuales/Python_para_todos.pdf
Y además, le dejo mi versión de su código (lo hice más módular) para que lo examine. No dude en preguntar, acá estaremos para ayudarlo ;) ;)
import requests
import json
# URL de la API
api_url = "http://ip-api.com/json/"
# Obtener toda la informacion acerca de la IP
def get_info(ip):
# el .decode() sirve para decodicar la cadena que está en bytes
res = requests.get(api_url+ip).content.decode()
return res
# Obtener objeto JSON
def get_object(request_obj):
api_json_res = json.loads(request_obj)
return api_json_res
# Guardar resultados
def save_results(info):
# Obtener la info como un objeto
ip_object = get_object(info)
results = "\n"
# Recorrer objeto por identificador key y almacenar en results la cadena
for key in ip_object:
results += key + ": " + str(ip_object[key]) + "\n"
return results
if __name__ == '__main__':
# Solicitamos la entrada
ip = input("Ingrese la dirección IP: ")
info = get_info(ip)
results = save_results(info)
# Mostrar resultados
print (results)
Saludos!
-Kirari
waw muy bueno!! gracias!!