paint-brush
소행성이 지구에 가까워지면 경고하는 Python 앱 구축~에 의해@bogomil
13,333 판독값
13,333 판독값

소행성이 지구에 가까워지면 경고하는 Python 앱 구축

~에 의해 Bogomil Shopov - Бого4m2023/05/09
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

두 개의 API를 결합하여 근처를 지나가는 가장 가까운 소행성에 대해 매일 경고를 받습니다. 다양한 API를 탐색하여 안전을 유지하고 동시에 즐거운 시간을 보내세요
featured image - 소행성이 지구에 가까워지면 경고하는 Python 앱 구축
Bogomil Shopov - Бого HackerNoon profile picture
0-item
1-item
2-item

나는 오늘 아침에 일어나 아마겟돈과 소행성이 우리에게 다가오면 행성으로서 우리가 얼마나 취약한지에 대해 생각했습니다. 나는 또한 내 책상에서 사용할 수 있는 공간과 기술을 탐색하는 데 흥미를 느낍니다. 소행성이 근처를 지나갈 때(상대적으로 말하면) SMS를 통해 경고를 받을 수 있도록 두 개의 API를 결합하는 방법을 보여 드리겠습니다.

NASA 오픈API

첫 번째 리소스는 NASA의 오픈 API 포털 입니다. 아이디어를 위해 수많은 훌륭한 인터페이스를 사용할 수 있지만 이 경우 제가 관심을 갖는 것은 NeoWs(Near Earth Object Web Service)입니다.

터놓다

API에 대해 읽은 후 여정의 첫 번째 단계는 API 키를 얻는 것입니다. 이는 귀하의 세부 정보를 양식에 입력하고 유효한 이메일을 제공함으로써 이루어집니다.


NASA API 등록 양식을 보여주는 화면


대부분의 API에는 시간당 1,000개의 요청 이라는 API 제한이 있습니다. 테스트 및 개인적인 이익에는 적합하지만 프로덕션 환경에서 사용하기에는 적합하지 않습니다.

탐구하다

사용 사례를 구축하기 위해 API에서 반환된 데이터를 몇 분 동안 살펴보겠습니다.


요청(GET)

  • start_date (YYYY-MM-DD) - 소행성 검색 시작 날짜
  • end_date (YYYY-MM-DD) - 소행성 검색 종료 날짜
  • api_key - 이전 단계 이후 이메일을 통해 받은 키입니다.


응답

이는 필요한 데이터를 얻기 위해 작업해야 하는 귀중한 데이터가 포함된 JSON 개체를 반환합니다. 여기 데이터를 보세요.

복잡한 구조에 필요한 세부 정보를 포함하는 Near_earth_objects 라는 구조가 있습니다.


  • 추정_직경 - 소행성의 직경(미터, 킬로미터, 마일, 피트)입니다.
  • 상대 속도 - 물체의 상대 속도
  • miss_distance - 궤도 몸체 로부터 떨어진 거리
  • 궤도_몸체 - 대부분의 경우 지구이지만 원하는 경우 더 많은 옵션을 탐색할 수 있습니다.


위 요청에 대한 응답으로 수신된 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))

사람이 읽을 수 있도록 만드세요.

SMS를 보낼 예정이므로 데이터 형식을 지정하는 것이 좋습니다. 다른 형식도 자유롭게 사용해 보세요.


 #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."

NeoW 요약

지금까지 무엇을 했나요?

  1. NASA OpenAPI 포털용 API 키가 있습니다.
  2. NeoWs API를 살펴보았습니다.
  3. 근처를 지나갈 수 있는 모든 물체 중에서 지구에 가장 가까운 물체를 추출했습니다.
  4. 당신은 이 만남에 대해 자신에게 알리기 위해 메시지를 만들었습니다.

해당 SMS를 보내 보겠습니다.

이 짧지만 유용한 예제에서 소개하고 싶은 또 다른 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 작업에 넣고 하루에 한 번 트리거할 수 있습니다.


즐거운 해킹!