나는 오늘 아침에 일어나 아마겟돈과 소행성이 우리에게 다가오면 행성으로서 우리가 얼마나 취약한지에 대해 생각했습니다. 나는 또한 내 책상에서 사용할 수 있는 공간과 기술을 탐색하는 데 흥미를 느낍니다. 소행성이 근처를 지나갈 때(상대적으로 말하면) SMS를 통해 경고를 받을 수 있도록 두 개의 API를 결합하는 방법을 보여 드리겠습니다.
첫 번째 리소스는 NASA의 오픈 API 포털 입니다. 아이디어를 위해 수많은 훌륭한 인터페이스를 사용할 수 있지만 이 경우 제가 관심을 갖는 것은 NeoWs(Near Earth Object Web Service)입니다.
API에 대해 읽은 후 여정의 첫 번째 단계는 API 키를 얻는 것입니다. 이는 귀하의 세부 정보를 양식에 입력하고 유효한 이메일을 제공함으로써 이루어집니다.
대부분의 API에는 시간당 1,000개의 요청 이라는 API 제한이 있습니다. 테스트 및 개인적인 이익에는 적합하지만 프로덕션 환경에서 사용하기에는 적합하지 않습니다.
사용 사례를 구축하기 위해 API에서 반환된 데이터를 몇 분 동안 살펴보겠습니다.
요청(GET)
응답
이는 필요한 데이터를 얻기 위해 작업해야 하는 귀중한 데이터가 포함된 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))
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."
지금까지 무엇을 했나요?
이 짧지만 유용한 예제에서 소개하고 싶은 또 다른 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 작업에 넣고 하루에 한 번 트리거할 수 있습니다.
즐거운 해킹!