관리 메뉴

개발이야기

[날씨 챗봇] 텔레그램 날씨 챗봇 만들기 본문

Toy Project /텔레그램 날씨 챗봇

[날씨 챗봇] 텔레그램 날씨 챗봇 만들기

안성주지몬 2019. 3. 12. 00:00

작년까지 매일 아침마다 카카오톡으로 오던 날씨 챗봇 서비스가 끝나면서 언제부턴가 날씨를 어플에 들어가 직접 확인하게 되었습니다. 

그러던 중 불편함을 느껴 간단하게 날씨 정보를 알려주는 챗봇을 개발해보았습니다.


이전에 텔레그램 챗봇을 개발해본 적이 있어 메시지 플랫폼으로는 텔레그램을 선택하게 되었습니다.


간단한 플로우는 다음과 같습니다.


- 프로젝트 플로우 


1. 리눅스 서버에서 crontab 명령을 사용하여 매일 오전 6:30분 날씨 데이터 크롤링 

- 리눅스 서버는 AWS EC2 사용

- 크롤링 코드는 파이썬으로 작성

- 날씨 데이터는 공공 데이터 포털의 데이터만을 사용할 생각이었으나 공식 문서처럼 데이터가 긁어오지 않아 네이버 날씨도 크롤링하였습니다.

(하늘 상태, 강우율만 공공 데이터 이용)


2. 크롤링된 날씨 데이터를 텔레그램 챗봇 메시지로 보낸다.


위의 캡처화면은 실제로 매일 아침 6:30마다 오고 있는 텔레그램 메시지입니다. 날씨뿐만 아니라 미세먼지도 좋지 않아서 미세먼지 데이터도 크롤링하였습니다.


* TIP

AWS EC2를 생성하는 방법과 텔레그램 챗봇을 만드는 방법은 아래의 링크를 확인해주세요!!


AWS EC2 생성

텔레그램 챗봇 개발 



- 에러, 문제 상황 


데이터를 크롤링하고 메시지를 보내는 코드 작성은 얼마 걸리지 않았지만 실제로 서비스를 하는 중에 여러 에러가 생겨서 메시지가 제대로 전송이 안된적이 몇 번 있었습니다. 발생했던 에러는 다음과 같습니다.



1. AWS 표준시간 

처음 crontab 명령으로 6:30을 설정하였는데 해당 시간에 특별한 오류없이 메시지가 오지 않았었습니다. 이런저런 테스트를 해보다가 AWS 표준시간대가 UTC 기준으로 설정되어 있는것을 알게되었습니다. AWS EC2 서버를 사용하시면서 crontab 명령으로 한국시간으로 기준 시간을 바꾸시려면 아래와 같은 구문을 crontab 편집기에 추가해주시면 됩니다.


[이미지 1] - crontab



2. 공공 데이터 크롤링 오류(?) 


제가 사용한 데이터는 (신)동네예보조회 서비스의 동네예보조회 데이터였습니다. 공식문서에는 예보시간 오전 5시에 최고기온 데이터가 포함되어있다고 나와있지만 실제로 데이터를 긁어보니 최고기온 데이터가 긁어오지 않아 에러가 발생하였습니다. 예보시간 8시 데이터에는 최고기온 데이터가 포함되어 있어 8시 이후로 데이터를 크롤링하면 최고기온을 긁어올 수 있었으나 그렇게 되면 8시 이전에는 최고기온 데이터가 포함된 메시지를 보낼 수 없는 문제가 발생하여 기온정보를 네이버 날씨에서 긁어오게 되었습니다.



3. 네이버 날씨 크롤링 




[이미지 2] - 네이버 날씨 html 속성 


[이미지 3] - 네이버 날씨 




네이버 날씨를 크롤링 할때 html 속성을 [이미지 2] 를 참고하여 추출하여 다음과 같이 코드를 작성하였었습니다.


results = soup.find('dl',class_='indicator').find('dd', class_='lv2')


하지만 어느날 'lv2' 클래스를 찾을 수 없다는 오류가 발생하여 다시 개발자 도구를 사용하여 html 속성을 확인해보니 'lv2'의 의미는 미세먼지 수치에 따라 달라지는 속성값이 없습니다. 즉, [이미지 3] 과 같이 미세먼지가 보통이면 'lv2' 좋음이면 'lv1' 같이 수치에 따라 동적으로 변하는 속성이었습니다.


그래서 저는 [이미지 3] 에 dl.indicator 부분을 모두 가져와서 메시지를 보내게 코드를 수정하는 식으로 이 문제를 해결하였습니다.



- 알게된 것 


1. 공공 데이터포털 이용


사실 공공 데이터포털에 대해서 알고는 있었지만 한번도 사용해본적이 없었습니다. 이번 프로젝트를 통해 날씨 데이터와 미세먼지 데이터를 공공 데이터포털에서 긁어오며 승인을 받는 방법과 공식 문서를 보며 데이터를 받아오는 것에 대해서 익힐 수 있었습니다.


2. AWS EC2 사용


본 프로젝트는 매일마다 메시지가 오는 서비스라 매일 돌아가는 서버가 필요하였습니다. 그래서 사용하지 않는 노트북을 이용할까 고민을 하였지만 서비스 대비 전력 소비가 너무 심할 것 같아 AWS EC2를 사용하게 되었습니다. 실제로 어려울거라고 생각했던 EC2생성이 생각보다 쉬웠고 실제로 EC2 리눅스 서버를 사용하여 동작하는 서비스를 성공적으로 구동시켜 처음 사용해보는 플랫폼에 대한 나름의 자신감이 생겼습니다.


3. 불편함을 개선시키는 방법


개발자는 귀찮음을 잘 느껴야한다는 말을 우연히 들은적이 있습니다. 생활 속에 불편한점을 잘 찾아내고 그것을 개선시킬 방법에 대해 항상 고민하는게 좋은 개발자라의 마음가짐이라고 생각했습니다. 본 프로젝트에서 날씨 서비스에 대한 불편함과 필요성을 느끼고 본 프로젝트를 통해 불편함을 어느정도 해소할 수 있었습니다. 


4. 실제로 서비스되는 프로덕트


본 프로젝트가 서비스라고 하기도 너무 작고 프로덕트라고 하기에도 초라하지만 실제로 제가 기획부터 서비스까지 모든 것을 수행하면서 많은 부분을 느낄 수 있었습니다. 정말 작은 프로젝트지만 제 친구들에게도 이 서비스를 제공하고 서비스를 사용하는 클라이언트(제 친구들이지만..)가 원하는 니즈와 개선사항을 들으면서 기획의 중요성과 서비스 품질 개선에 대해 다시한번 생각할 수 있는 좋은 기회였습니다. 또한 점점 큰 프로젝트를 할 수 있을거라는 자신감의 기초가 되었습니다. 




본 프로젝트의 코드는 아래의 URL에서 확인할 수 있습니다.


https://github.com/AhnSungJoo/weather-tg



Comments