paint-brush
构建一个 pyton 应用程序来提醒您靠近地球的小行星。经过@bogomil
13,337 讀數
13,337 讀數

构建一个 pyton 应用程序来提醒您靠近地球的小行星。

经过 Bogomil Shopov - Бого4m2023/05/09
Read on Terminal Reader

太長; 讀書

将两个 API 结合起来,每天都会收到关于最近的小行星从附近经过的警报。通过探索不同的 API,在保持安全的同时享受乐趣
featured image - 构建一个 pyton 应用程序来提醒您靠近地球的小行星。
Bogomil Shopov - Бого HackerNoon profile picture
0-item
1-item
2-item

今天早上我醒来时想到了世界末日,以及如果一颗小行星向我们驶来,我们作为一个星球是多么脆弱。我也对探索空间和办公桌上可用的技术很感兴趣。我将向您展示如何组合两个 API,以便在小行星经过附近(相对而言)时通过 SMS 发出警报。

美国宇航局开放式应用程序接口

第一个资源是NASA 的开放 API 门户。您可以为您的想法使用大量出色的界面,但在本例中,我感兴趣的是NeoWs(近地天体 Web 服务)。

开锁

了解 API 后,您旅程的第一步就是获取 API 密钥。这是通过将您的详细信息填写到表格中并提供有效的电子邮件来完成的。


显示 NASA API 注册表的屏幕


请注意,大多数 API 的 API 限制为每小时 1000 个请求。它们适用于测试和个人利益,但不适用于生产就绪用途

探索

让我们花几分钟时间查看 API 返回的数据以构建我们的用例。


请求(获取)

  • start_date (YYYY-MM-DD) - 小行星搜索的开始日期
  • end_date (YYYY-MM-DD) - 小行星搜索的结束日期
  • api_key - 您在上一步后通过电子邮件收到的密钥。


响应

它返回一个包含有价值数据的 JSON 对象,我们必须使用这些数据才能获得所需的数据。看看这里的数据

我们有一个名为near_earth_objects的结构,它包含我们在复杂结构中需要的细节:


  • estimated_diameter - 小行星的直径,以米、公里、英里和英尺为单位。
  • relative_velocity - 物体的相对速度
  • miss_distance - 与orbiting_body的距离
  • orbiting_body - 在大多数情况下,是地球,但如果您愿意,可以探索更多选项。


显示作为对上述请求的响应收到的 JSon 对象的屏幕。

跑步

所以我们有所有的物体都在附近经过,并希望获得最近的物体并每天提醒我们。让我们使用您的 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."

NeoWs 回顾

到目前为止你做了什么?

  1. 您拥有 NASA OpenAPI 门户的 API 密钥
  2. 您探索了 NeoWs API
  3. 你从所有可能经过附近的物体中提取出离地球最近的物体。
  4. 你制作了一条消息来提醒自己注意这次遭遇。

让我们发送该短信。

在这个简短但有用的示例中,我想介绍另一个 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 作业中,每天触发一次。


快乐黑客!