https://github.com/J-hoplin1/Weather_Hook
날씨 관련 API 정하기
다양한 사이트의 API를 살펴보고 사용해보았습니다. 하지만 대부분 사용하기 편하지 않다거나(API Document가 제대로 작성되어있지 않음), 유료인 경우가 많았습니다. API같은 경우에는 결론적으로 https://openweathermap.org/ 의 API를 사용하였습니다. 제공하는 정보도 다양하였으며, API Document또한 잘 작성되어 사용하기 편했습니다. 저는 openweathermap의 API중에 아래 API들을 사용하였습니다.
- Current weather data : 현재 날씨를 불러오기 위해 사용합니다.
- Air pollution : 대기정보를 불러오기 위해서 사용합니다
- Geocoding API : 위 두 API는 Geocoding API의 결과값인 위도 경도값을 쿼리 param으로 받습니다.
개발 및 구동
우선 이 웹훅은 디스코드 뿐만 아니라 슬랙 플랫폼도 지원하는것을 목적으로 하였습니다. 그렇기 때문에, 데이터에 대한 처리를 하는 부분과, 각 플랫폼에 대해 웹훅 이벤트를 대응하는 부분을 분리하였습니다. 언어는 Node.js를 사용하였습니다. JavaScript언어를 7월달에 처음 다루기 시작해서 문법적으로나, Lint적으로나 많이 부족한 부분이 있을 수 있는 코드입니다. 해당 부분을 발견하시고, 피드백을 주실 분은 Issue에 남겨주시면 감사하겠습니다. 이 봇은 아래 package 의존성을 가집니다.
- axios
- discord-js
- node-scheduler
현재로서는 각 패키지들마다 pacakge를 따로 설치/관리해 주어야 하는 형태지만, 빠른 시일 내로 Mono-Repo화를 할 예정입니다. config.json파일은 최상단 디렉토리에 모두 통합되어있는 형태로 되어있습니다. 기능은 크게 두가지로 나뉩니다.
- 도시 단위 날씨 정보
- 좌표 단위 날씨 정보
스케줄러 같은 경우 node-scheduler패키지를 사용해서 스케줄링 하며, 스케줄링 expression은, crontab expression을 기반으로 작동합니다. 아마 코드 디폴트는 10초마다 실행되는것으로 되어있을 것입니다. 하나의 웹훅주소당, 도시단위 하나, 좌표단위 하나씩의 정보만 연결할 수 있습니다.(웹훅이 한번에 받을 수 있는 요청의 수는 정해져있습니다.)
사용법을 알려드리겠습니다. 우선 필요한 값들입니다.
- 알림을 받고자 하는 디스코드 혹은 슬랙 특정 채널의 웹훅 URL이 필요합니다.
- OpenWeatherMap의 API Key가 필요합니다.
OpenWeatherMap의 API Key는 config.json의 "hooks"-"api_key" 필드의 value에 넣어줍니다.
그 다음 웹훅을 설정해 주어야 합니다 config.json의 discord 혹은 slack 필드에 아래와 같이 되어있는것을 볼 수 있을겁니다
"region_weather~~" 부분이 도시 기반으로 정보를 받는 부분이고, "custom_weather~~"부분이 좌표 단위 날씨 정보를 받는 부분입니다. 값을 입력할때 아래와 같이 입력하시면 됩니다. 도시기반정보 설정에서 region을 설정할때 모두 hooks필드의 supported_region에 있는 도시들 내에서 선택해 입력해 주시기 바랍니다. 만약 도시가 없는 경우, issue를 달아주시면, 검토 후 즉각 적용하도록 하겠습니다.(제가 모든 도시를 추가하진 못했습니다. 양해부탁드려요)
< 도시 단위 >
"(웹훅 URL)" : "seoul"
< 좌표 단위 >
"(웹훅 URL)" : "[장소이름 혹은 닉네임, 장소의 위도, 장소의 경도]"
장소의 위도 경도를 얻는 가장 간단한 방법은 모바일 구글 지도에서 지정하고자 하는 장소를 길게 누르면, 더보기 정보란에 좌표값이 같이 나타나게 됩니다.
위 예시를 가지고 한번 웹훅을 작동시켜 보겠습니다. 예를 들어 저는 제 웹훅에 서울의 날씨/대기정보와 용산가족공원(위 사진)의 날씨/대기정보를 얻고싶다고 가정해 보겠습니다. config.json파일은 아래와 같은 상태입니다
"discord" : {
"scheduler_expression":"0/10 * * * * *",
"region_weather_hooks_endpoints" : {
"https://ptb.discord.com/api/webhooks/10~~~" : "Seoul"
},
"custom_weather_hooks_endpoints" : {
"https://ptb.discord.com/api/webhooks/10~~~" : ["용산가족공원",37.5215875, 126.9836936]
}
}
이제 이걸 기반으로 discord 웹훅 클라이언트를 실행해 보면 아래와 같이 알림이 오는것을 볼 수 있습니다.
그리고 추가적으로 비가 오는 날에는 아래와 같이 시간당 강수량이, 눈이 오는날에는 제설량 필드가 추가됩니다
여기까지 간단한 날씨/대기 웹훅 소개였습니다. 소스코드의 깃허브는 상단 링크 참조해주시면 감사하겠습니다.만약 소스코드적으로 잘못된 부분, 개선하면 좋을꺼같은 부분이 있거나, 정보를 더 추가하거나 제외했으면 하는 부분이 있다면, issue를 남겨주시면 감사하겠습니다 :)
'Discord Bot' 카테고리의 다른 글
디스코드 롤 전적봇 Riot API로 포팅하기(Porting LOL Discord Bot using Riot API) (2) | 2021.06.27 |
---|---|
디스코드 봇(Discord Bot) : 전략적 팀 전투(TFT, Team Fight Tactics) 디스코드 전적검색 봇 (0) | 2020.04.26 |
디스코드봇(Discord Bot) : 레인보우 식스 시즈(Rainbow Six Siege, R6) 전적검색 봇 (5) | 2020.04.08 |
디스코드봇(Discord Bot) : 코로나바이러스 한국상황 정보봇(Covid-19 Korea Status Bot) (3) | 2020.04.08 |
디스코드봇(Discord Bot) : 파파고 번역봇(Papago Translation Bot) (41) | 2020.04.08 |