Me desperté esta mañana pensando en Armagedón y en lo frágiles que somos como planeta si un asteroide se cruza en nuestro camino. También me intriga explorar el espacio y las tecnologías disponibles en mi escritorio. Le mostraré cómo combinar dos API para recibir alertas por SMS cuando un asteroide pasa cerca (en términos relativos).
El primer recurso es el portal API abierto de la NASA . Podrías usar toneladas de excelentes interfaces para tus ideas, pero la que me interesa, en este caso, es NeoWs (Near Earth Object Web Service).
Después de leer sobre la API, el primer paso en su viaje es obtener una clave de API. Esto se hace completando sus datos en un formulario y proporcionando un correo electrónico válido.
Tenga en cuenta que la mayoría de las API tienen un límite de API de 1000 solicitudes por hora . Son adecuados para pruebas y beneficio personal, pero no para uso en producción.
Dediquemos unos minutos a ver los datos devueltos por la API para construir nuestro caso de uso.
La solicitud (GET)
La respuesta
Devuelve un objeto JSON con datos valiosos, con los que debemos trabajar para obtener lo que necesitamos. Mira los datos aquí .
Tenemos una estructura llamada near_earth_objects que contiene los detalles que necesitamos en una estructura compleja:
Entonces tenemos todos los objetos que pasan cerca y queremos obtener el más cercano y alertarnos diariamente. Usemos tus habilidades de Python para hacer eso.
#Settings and URL to conect to NASA API #Get your free API key from here: https://api.nasa.gov/ ad_today = date.today().strftime("%Y-%m-%d") url = "https://api.nasa.gov/neo/rest/v1/feed?start_date="+ad_today+"&end_date="+ad_today+"&api_key=[your keu]" #Hadle the responce json response = requests.request("GET", url) response.encoding = 'utf-8' jsn = response.json() if "near_earth_objects" in jsn: base = jsn['near_earth_objects'][ad_today] i = findClosestEncounter(base) #extract the data we need to create the alert name = base[i]['name'] to_appear = base[i]['close_approach_data'][0]['close_approach_date_full'] how_close = base[i]['close_approach_data'][0]['miss_distance']['kilometers'] dia_meter = base[i]['estimated_diameter']['meters']['estimated_diameter_max']
La función findClosestEncounter te ayuda a encontrar el objeto más cercano a la Tierra del conjunto de todas las cosas que pasan cerca. Tal vez haya una solución más elegante, pero esta funciona bien para mí.
def findClosestEncounter(jd): # a simple function for discovering the nearest object for the day from all registered objects asteroids = [] for i in range(0, len(jd)): asteroids.insert(i,jd[i]['close_approach_data'][0]['miss_distance']['kilometers']) return asteroids.index(min(asteroids))
Dado que enviaremos un SMS, formatear los datos es una buena idea. Siéntase libre de usar otro formato también.
#format the data howclose = round(float(how_close)) diameter = round(dia_meter)
Cree el mensaje que desea enviar por SMS.
#build the message alert ="The nearest asteroid for today is "+ name+". It will be "+str(howclose)+" km away with a diameter of "+str(diameter)+" meters."
¿Que has hecho hasta ahora?
Hay otra API que quiero presentar en este breve pero útil ejemplo: Messagebird.
Visite su sitio web y regístrese para obtener una clave API
Después del registro, puede enviar algunos mensajes SMS gratuitos a su número de teléfono real. Agreguemos esta funcionalidad a su código Python.
#SMS client #Get your free API key from here: https://developers.messagebird.com/api/#api-endpoint sms = messagebird.Client("your API key here") #Prepare and send the message to a phone number of your choice. # Change the name "Asteroid" to something you want. It will appear as a sender message = sms.message_create( 'Asteroid', '+yourphonenumner', alert, { 'reference' : 'Asteroid' } )
Puede encontrar el guión completo aquí .
Junte todas las piezas y ejecute su código para ver si lo hizo bien. Ahora puedes dormir mejor, sabiendo que recibirás alertas sobre cada objeto grande que vuele hacia la Tierra. Por supuesto, la NASA necesita detectarlo primero.
Si le gusta el resultado, puede ponerlo en un trabajo cron y activarlo una vez al día.
¡Feliz hackeo!