paint-brush
Créez une application pyton pour vous alerter des astéroïdes proches de la Terre.par@bogomil
13,337 lectures
13,337 lectures

Créez une application pyton pour vous alerter des astéroïdes proches de la Terre.

Trop long; Pour lire

Combinez deux API pour être alerté quotidiennement des astéroïdes les plus proches passant à proximité. Restez en sécurité et amusez-vous en même temps en explorant différentes API
featured image - Créez une application pyton pour vous alerter des astéroïdes proches de la Terre.
Bogomil Shopov - Бого HackerNoon profile picture
0-item
1-item
2-item

Je me suis réveillé ce matin en pensant à Armageddon et à la fragilité de notre planète si un astéroïde venait à nous. Je suis également intrigué par l'exploration de l'espace et les technologies disponibles depuis mon bureau. Je vais vous montrer comment combiner deux API pour être alerté par SMS lorsqu'un astéroïde passe à proximité (relativement parlant).

OpenAPI de la NASA

La première ressource est le portail API ouvert de la NASA . Vous pourriez utiliser des tonnes d'interfaces géniales pour vos idées, mais celle qui m'intéresse, dans ce cas, est NeoWs (Near Earth Object Web Service).

Ouvrir

Après avoir pris connaissance de l'API, la première étape de votre parcours consiste à obtenir une clé API. Cela se fait en remplissant vos coordonnées dans un formulaire et en fournissant un e-mail valide.


Un écran affichant le formulaire d'inscription à l'API de la NASA


Veuillez noter que la plupart des API ont une limite d'API de 1 000 requêtes par heure . Ils conviennent aux tests et aux avantages personnels, mais pas à une utilisation prête pour la production

Explorer

Passons quelques minutes à voir les données renvoyées par l'API pour construire notre cas d'utilisation.


La requête (GET)

  • start_date (AAAA-MM-JJ) - Date de début de la recherche d'astéroïdes
  • end_date (AAAA-MM-JJ) - Date de fin de la recherche d'astéroïdes
  • api_key - la clé que vous avez reçue par e-mail après l'étape précédente.


La réponse

Il renvoie un objet JSON avec des données précieuses, avec lesquelles nous devons travailler pour obtenir ce dont nous avons besoin. Regardez les données ici .

Nous avons une structure appelée near_earth_objects qui contient les détails dont nous avons besoin dans une structure complexe :


  • estimate_diameter - le diamètre de l'astéroïde en mètres, kilomètres, miles et pieds.
  • relative_velocity - la vitesse relative de l'objet
  • miss_distance - la distance de l' orbiting_body
  • orbiting_body - dans la plupart des cas, c'est la Terre, mais vous pouvez explorer plus d'options si vous le souhaitez.


Un écran montrant l'objet JSon reçu en réponse à la requête ci-dessus.

Courir

Nous avons donc tous les objets qui passent à proximité et nous souhaitons obtenir le plus proche et nous alerter quotidiennement. Utilisons vos compétences Python pour le faire.


 #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 fonction findClosestEncounter vous aide à trouver l'objet le plus proche de la Terre à partir du seau de toutes les choses passant à proximité. Il existe peut-être une solution plus élégante, mais celle-ci fonctionne bien pour moi.


 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))

Rendez-le lisible par l'homme.

Puisque nous allons envoyer un SMS, le formatage des données est une bonne idée. N'hésitez pas à utiliser également un autre formatage.


 #format the data howclose = round(float(how_close)) diameter = round(dia_meter)


Construisez le message que vous souhaitez envoyer par 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."

Récapitulatif de NeoWs

Qu'avez-vous fait jusqu'à présent?

  1. Vous avez une clé API pour le portail NASA OpenAPI
  2. Vous avez exploré l'API NeoWs
  3. Vous avez extrait l'objet le plus proche de la Terre parmi tous les objets susceptibles de passer à proximité.
  4. Vous avez rédigé un message pour vous alerter de cette rencontre.

Envoyons ce SMS.

Il y a une autre API que je veux introduire dans cet exemple court mais utile - Messagebird.

Relâchez l'oiseau

Visitez leur site Web et inscrivez-vous pour obtenir une clé API


Après l'inscription, vous pouvez envoyer quelques SMS gratuits livrés à votre numéro de téléphone actuel. Ajoutons cette fonctionnalité à votre code 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' } )

Recevez l'alerte Armageddon

Vous pouvez trouver le script complet ici .


Rassemblez toutes les pièces et exécutez votre code pour voir si vous avez bien fait. Maintenant, vous pouvez mieux dormir, sachant que vous serez alerté de chaque gros objet volant vers la Terre. Bien sûr, la NASA doit d'abord le détecter.


Si vous aimez le résultat, vous pouvez le mettre dans une tâche cron et le déclencher une fois par jour.


Bon piratage !