Ich bin heute Morgen aufgewacht und habe an Armageddon gedacht und daran, wie zerbrechlich wir als Planet sind, wenn ein Asteroid auf uns zukommt. Außerdem fasziniert mich die Erkundung des Weltraums und der von meinem Schreibtisch aus verfügbaren Technologien. Ich zeige Ihnen, wie Sie zwei APIs kombinieren, um per SMS benachrichtigt zu werden, wenn ein Asteroid (relativ gesehen) in der Nähe vorbeizieht.
Die erste Ressource ist das offene API-Portal der NASA . Sie könnten für Ihre Ideen jede Menge tolle Schnittstellen nutzen, aber diejenige, die mich in diesem Fall interessiert, ist NeoWs (Near Earth Object Web Service).
Nachdem Sie sich über die API informiert haben, besteht der erste Schritt auf Ihrer Reise darin, einen API-Schlüssel zu erhalten. Dazu geben Sie Ihre Daten in ein Formular ein und geben eine gültige E-Mail-Adresse an.
Bitte beachten Sie, dass die meisten APIs ein API-Limit von 1000 Anfragen pro Stunde haben. Sie sind für Tests und den persönlichen Nutzen geeignet, jedoch nicht für den produktionsreifen Einsatz
Lassen Sie uns ein paar Minuten damit verbringen, die von der API zurückgegebenen Daten zu sehen, um unseren Anwendungsfall zu erstellen.
Die Anfrage (GET)
Die Antwort
Es gibt ein JSON-Objekt mit wertvollen Daten zurück, mit denen wir arbeiten müssen, um das zu bekommen, was wir brauchen. Schauen Sie sich die Daten hier an.
Wir haben eine Struktur namens near_earth_objects , die die Details enthält, die wir in einer komplexen Struktur benötigen:
Wir haben also alle vorbeiziehenden Objekte in der Nähe und möchten das nächstgelegene Objekt finden und uns täglich benachrichtigen. Nutzen wir dazu Ihre Python-Kenntnisse.
#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']
Mit der Funktion „findClosestEncounter“ können Sie aus der Liste aller Dinge, die in der Nähe vorbeikommen, das erdnächste Objekt finden. Vielleicht gibt es eine elegantere Lösung, aber diese funktioniert für mich gut.
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))
Da wir eine SMS versenden, empfiehlt es sich, die Daten zu formatieren. Gerne können Sie auch eine andere Formatierung verwenden.
#format the data howclose = round(float(how_close)) diameter = round(dia_meter)
Erstellen Sie die Nachricht, die Sie per SMS senden möchten.
#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."
Was hast du bis jetzt gemacht?
Es gibt eine weitere API, die ich in diesem kurzen, aber hilfreichen Beispiel vorstellen möchte – Messagebird.
Besuchen Sie deren Website und registrieren Sie sich, um einen API-Schlüssel zu erhalten
Nach der Registrierung können Sie ein paar kostenlose SMS-Nachrichten an Ihre tatsächliche Telefonnummer senden. Fügen wir diese Funktionalität Ihrem Python-Code hinzu.
#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' } )
Fügen Sie alle Teile zusammen und führen Sie Ihren Code aus, um zu sehen, ob Sie es gut gemacht haben. Jetzt können Sie besser schlafen, da Sie wissen, dass Sie vor jedem großen Objekt gewarnt werden, das auf die Erde zufliegt. Natürlich muss die NASA es zuerst entdecken.
Wenn Ihnen das Ergebnis gefällt, können Sie es in einen Cronjob einfügen und ihn einmal am Tag auslösen.
Viel Spaß beim Hacken!