이번에는 좀더 새로운 방식의 프로젝트를 해보도록 하자.
며칠전에 비가 미친듯이 쏟아져서 동네 주변이 여럿 잠겼었는데 이와 어쩌면 유사한 프로젝트를 해보려고 한다.
시간을 정해두고 밖에 비가 오면 우리에게 우산을 챙기라는 문자를 자동적으로 받을 수 있도록 작성해보자.
간단한 스케치를 해보고 그 다음 세분해서 작성하자.
우리는 OpenWeathermap 이라는 홈페이지의 API 를 사용하여 실시간 날씨를 data 로 받을것이다.
이 떄 api 의 변수로 날씨가 궁금한 도시의 위도, 경도 를 구해야한다.
우리가 data 를 받아 비가 온다는 조건을 설정한 후에는 twilio 라를 홈페이지의 기능을 통해 우리에게 메세지가 오도록 작성할 것이다.
마무리로는 우리의 코드가 언제나 정해진 비가 오는지 확인을 할 수 있도록 pythonanywhere 라는 홈페이지에 등록할 것이다.
그렇다면 이제 차분히 진행해보자.
먼저 우리에게 날씨 정보를 전달해줄 OpenWeatherMap 을 살펴보자.
해당 홈페이지의 api 관련 문서를 확인해보면 API 를 요청받아 data 를 받는 방법이 설명되어 있다.
( 참고 링크 : https://openweathermap.org/api/one-call-3 )
One Call API 3.0 - OpenWeatherMap
Make just one API call and get all your essential weather data for a specific location with our new OpenWeather One Call API 3.0. Easy migration from the Dark Sky API. The One Call API provides the following weather data for any geographical coordinates: H
openweathermap.org
해당 홈페이지에서 API 를 얻어오려면 필요한 필수 변수는 3개이다.
위도, 경도인 lat, lon 그리고 api key 이다.
우리가 원하는 도시의 위도와 경도는 아래 링크를 통해 확인할 수 있다.
( lat, lon 찾기 링크 :https://www.latlong.net/ )
Latitude and Longitude Finder on Map Get Coordinates
What is Latitude and Longitude? Just like every actual house has its address (which includes the number, the name of the street, city, etc), every single point on the surface of earth can be specified by the latitude and longitude coordinates. Therefore, b
www.latlong.net
참고로 여기서 진행한 코드는 내가 서울에 살고 있어서 서울에 해당하는 위도, 경도를 찾아 썻는데
제대로 코드가 진행되는지 확인하기 위해서 일부러 비가오는 도시에 해당하는 위도, 경도를 사용해도 된다.
( 실시간 날씨 확인 사이트 : https://www.ventusky.com/?p=37.70;127.62;6&l=rain-1h )
Ventusky - 지도상 일기예보
www.ventusky.com
이제 작성을 해보자.
OpenWeatherMap 에 가입하여 무료 api key 를 받아오고 이를 OWM_api_key 에 저장한다.
( 각자 계정이니 노출하지 않기 )
OpenWeatherMap 에서 받을 data 를 respose 로 설정하고 requests.get() 사용한다.
인자로는 OWM_Endpoint 와 weather_parameters 를 사용한다.
weather_parameters 에서 키 값으로 lat, lon, appid, exclude 가 있다.
lat 은 위도, lon 은 경도, appid 는 OWM_api_key 를, 그리고 exclude는 제외할 data 를 지정하는 것이다.
exclude 를 적용하지 않고 코드를 실행할 경우, 분당 날씨 데이터, 현재 데이터, 그리고 일간 날씨 데이터 등을 모두 받아오게 될 것이다.
따라서 우리는 시간 별 날씨 데이터를 원하기 때문에 필요없는 것은 exclude 로 설정해야한다.
미리 설정한 Endpoint, params 를 사용하여 requests 의 method 를 사용하여 데이터를 response 에 저장하고 이를 json 형식으로 변환, slicing 하여 필요한 12시간만의 정보를 가져온다.
이를 Online Json Viewer 를 사용하여 확인하면 아래와 같이 데이터 구조가 짜여진 것을 알 수 있다.
( 참고 링크 : http://jsonviewer.stack.hu/ )
Online JSON Viewer
jsonviewer.stack.hu
위 사진처럼 online json viewer 를 통해 확인해보면 각각의 시간별로 구분되어 중첩된 list 가 형성되어 있고, 하위 list 까지 타고 내려가면 id 라는 key 에 값이 802 가 되어있는 것을 알 수 있다. ( id 값이 700 초과 이면 비가 오지 않는다 )
우리는 이 값을 사용하여 비가 오는지 확인할 것이다.
boolean 값인 will_rain 을 False 값으로 새로 만든다.
그리고 위에서 만든 weather_data_slice 를 사용하여 id 값을 700 기준으로 will_rain 을 조절한다.
드디어 우리는 twilio 라는 툴을 사용할 것이다.
( 참고 링크 https://www.twilio.com/ )
Communication APIs for SMS, Voice, Video & Authentication | Twilio
Connect with customers on their preferred channels—anywhere in the world. Quickly integrate powerful communication APIs to start building solutions for SMS and WhatsApp messaging, voice, video, and email.
www.twilio.com
twilio 에 회원가입하고 나만의 해외전화번호를 발급받으면 sms, aduio 등 서버에서 유저에게 연결해주는 것을 도와준다.
우리는 twilio 에서 programmable SMS 를 사용할 것이고 이는 서버에서 유저에게 문자 메세지를 보내는 것을 가능하게 해준다.
위는 twilio 가입 후 account_sid 와 auth_token, 그리고 twilio 에서 정해준 내 해외 번호가 나오는 화면이다.
이를 사용하기 위해 twilio.rest 의 Client 를 import 한다. ( cllient = Client(account_sid, auth_token) )
우리가 보낼 SMS 내용은 message 로 client.messages 를 사용하여 body 에는 내용을, from 에는 twilio 에서 받은 번호를, to 에는 개인의 번호를 입력한다.
실행하면 아래 그림처럼 문자를 받을 수 있다.
우리가 위에 만든 코드는 pycharm 에서 직접 우리가 실행을 시켰을 때만 작동한다.
그렇다면 매일 아침 실시간 시간별 날씨를 확인하여 문자를 보내도록 하려면 어떻게 해야할까?
우리는 이 때 pythonanywhere 사이트를 사용한다.
( 참고 사이트 : https://www.pythonanywhere.com/ )
Login: PythonAnywhere
It's always a pleasure to hear from you! Ask us a question, or tell us what you love or hate about PythonAnywhere. We'll get back to you over email ASAP. Sorry, there was an error connecting to the server. Please try again in a few moments... Sorry, we hav
www.pythonanywhere.com
사이트 가입 후, Dashboard 에서 Files 에 우리가 작성한 main.py 를 추가한다.
추가하고 나면 우리가 작성했던 코드가 나오는데 여기서 신경써야하는 부분이 있다.
기존에 우리는 twilio.rest의 Client 만 import 했지만, 여기서는 TwilioHttpClient 까지 import 해줘야한다.
또 마지막 if 문에서 client 를 proxy_client 로 변경하여 사용해야한다.
이렇게 하면 등록이 완료된다.
'Studying > Python' 카테고리의 다른 글
24. miniProject(14) - QuizBrain (feat.tkinter, requests) (0) | 2022.08.11 |
---|---|
23. miniProject(13) - french / english word study (feat.tkinter, pandas) (0) | 2022.08.11 |
22. miniProject(12) - password manager (feat.tkinter) (0) | 2022.08.10 |
21. miniProject(11) - miles / km 변환기 (feat. tkinter) (0) | 2022.08.09 |
20. miniProject(10) - 미국 states 퀴즈 (feat. turtle, pandas) (0) | 2022.07.29 |