今天早上我醒来时想到了世界末日,以及如果一颗小行星向我们驶来,我们作为一个星球是多么脆弱。我也对探索空间和办公桌上可用的技术很感兴趣。我将向您展示如何组合两个 API,以便在小行星经过附近(相对而言)时通过 SMS 发出警报。
第一个资源是NASA 的开放 API 门户。您可以为您的想法使用大量出色的界面,但在本例中,我感兴趣的是NeoWs(近地天体 Web 服务)。
了解 API 后,您旅程的第一步就是获取 API 密钥。这是通过将您的详细信息填写到表格中并提供有效的电子邮件来完成的。
请注意,大多数 API 的 API 限制为每小时 1000 个请求。它们适用于测试和个人利益,但不适用于生产就绪用途
让我们花几分钟时间查看 API 返回的数据以构建我们的用例。
请求(获取)
响应
它返回一个包含有价值数据的 JSON 对象,我们必须使用这些数据才能获得所需的数据。看看这里的数据。
我们有一个名为near_earth_objects的结构,它包含我们在复杂结构中需要的细节:
所以我们有所有的物体都在附近经过,并希望获得最近的物体并每天提醒我们。让我们使用您的 Python 技能来做到这一点。
#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']
findClosestEncounter 函数可帮助您从附近经过的所有物体的桶中找到离地球最近的物体。也许有更优雅的解决方案,但这个对我来说效果很好。
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))
由于我们要发送短信,格式化数据是个好主意。也可以随意使用其他格式。
#format the data howclose = round(float(how_close)) diameter = round(dia_meter)
构建您要通过 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."
到目前为止你做了什么?
在这个简短但有用的示例中,我想介绍另一个 API - Messagebird。
访问他们的网站并注册以获取 API 密钥
注册后,您可以向您的实际电话号码发送一些免费的SMS 消息。让我们将此功能添加到您的 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' } )
您可以在此处找到完整的脚本。
将所有部分放在一起并运行您的代码,看看您是否做得很好。现在您可以睡得更好了,因为您知道每一个飞向地球的大物体都会提醒您。当然,NASA 需要先检测到它。
如果你喜欢这个结果,你可以把它放在一个 cron 作业中,每天触发一次。
快乐黑客!