개발블로그 알림서비스 TodayDevblog_bot 개발기

 

서론

평소처럼 깃허브에서 한국개발자들의 레파지토리를 탐방하던 중 국내외 개발관련 블로그, 뉴스, 슬라이드, 방송 등을 수집하여 제공하고 있는 awesome-devblog를 보게되었다.
굉장히 좋은 프로젝트라고 생각하며 둘러보던 중 이 곳을 참고해 운영되고 있는 메일구독 서비스 Daily DevBlog를 알게되었고, 개발기를 굉장히 재밌게 읽었다.
갑자기 챗봇으로 만들고 싶다는 욕구가 솟아올라서 이틀밤을 새서 결국 완성한 TodayDevblog_bot의 개발기를 적어본다.

개발기

매일 몇 시에?

나는 아침과 낮에는 바쁘고, 정신이 없어서 업무상의 메일이나 메신저를 제외하고는 잘 보지못하고, 오히려 저녁에 챙겨보는 편이다. 그래서 하루를 정리하고 저녁에 보거나 다음날 아침에 볼 수 있도록 메시지 전송 시각은 오후 10시로 정했다.

데이터 크롤링을 하자

데이터 크롤링에 대한 지식이 전무한 사람이지만 Puppeteer를 한 번 사용해본 경험이 있어서, 다른 선택지는 고려하지 않았다.

국내 개인 개발자들의 글들을 모으기 위해 awesome-devblog의 국내 개인피드에서 이름.제목.링크 를 가져오도록 했다.

1

데이터베이스를 만들자

MongoDB 클라우드 서비인 mLab을 사용하기 위해 접속했더니 MongoDB에 합병되어 MongoDB Atlas만 사용가능해졌다. 가입하고, DB 생성해보고 새로운 플랫폼에 익숙해지는데 시간을 꽤 소모했다.

아무튼, 데이터베이스는 클라우드 서비스인 MongoDB Atlas를 사용해 구축하였고,
봇을 시작한 사용자들을 저장하는 user 그리고 크롤링한 글들을 저장하는 list 가 존재한다.

  • user의 구조
    • chatId : 텔레그램 고유아이디, 이 아이디가 있어야 봇 참여자에게 메시지를 전송할 수 있다.
    • date : 봇을 시작한 날짜, 봇 참가자 수의 추이를 차트화하기 위함이다.
    • activate : 활성화된 사용자, Default는 true이다.

문득, 사용자가 탈퇴를 하거나 봇을 삭제시키면 존재하지 않는 chatId에 계속해서 메시지를 보낼 것이고, 서버에도 악영향을 줄 것이고, 에러가 발생할 수도 있다는 생각이 들어서 여러가지 상황에 대해 테스트를 해보았다. 그래서 나온 결론은 activate 를 추가해서 만약 메시지가 전송되지 않는 사용자라면 false로 변경하도록 하였다.

  • list의 구조
    • auth : 작성자, 메시지를 보낼 때 사용되지는 않는다.
    • title : 제목, 비하인드 스토리는 아래에
    • date : 작성일, 비하인드 스토리는 아래에
    • link : 주소, 클릭 수를 수집하기 위해 서버를 통해 리다이렉트되도록 했다.
    • view : 클릭 수, 내 봇을 통해 글에 접속하는 수의 추이를 차트화하기 위함이다.

제목을 수집하고, 저장하는 과정에는 전혀 문제가 없었으나 메시지에 보낼 때 작은 이슈가 발생했다. 나는 메시지를 마크다운으로 작성해서 전송하는데, 제목에 [] 이 있으면 링크를 걸 수 없다는 것이였다. replace 를 사용해 [] 를 모두 제거해 해결은 했지만 또 다른 문제가 생길만한 특수문자가 있을 지도 모른다는 불안감은 가시지 않는다.

2

개발의 거의 막바지에 Heroku에 올려 테스트를 하는 중 분명 6월22일에 올라온 글인데 자꾸 DB에는 6월21일이라고 저장이 되었다. 로컬에서 테스트를 하면 6월22일로 정상적으로 저장이 되고, 배포를 하면 6월21일로 저장이 되는 기이한 현상을 해결하기 위해 한참을 고민했다.
1시간정도를 삽질하다가 결국 찾은 해답은 Heroku를 통해 배포한 서버는 미국 에 위치해있어서였다. 사용자 수가 많아진다면 Netlify로 옮길 계획도 있어서 아직 타임존을 설정하는 문제는 해결하지 않았다.

텔레그램 봇을 만들자

텔레그램 봇은 시작을 하려면 /start 를 무조건 입력을 해야한다. 그래서 /start 를 입력하자마자 사용자의 정보를 데이터베이스에 저장하도록 했다. 그리고 오늘 올라온 글이 없을 경우와 에러가 발생했을 경우를 위한 메시지도 처리해두었다.

텔레그램 봇에 대해 더 궁금하다면 아래의 게시글을 참고하길 바란다.

스케쥴러를 만들자

내 크롤러는 첫번째 페이지의 정보만 수집하기 때문에 하루에 한 번만 수집하게 된다면 2페이지에 있는 글들은 데이터베이스에 저장하지 못하게된다. 그래서 Node Cron-tab을 이용해 한시간마다 크롤링을 하도록 하였고, 이미 수집한 게시글은 데이터베이스에 저장이 되지 않도록 처리하였다.

매일 오후 10시에 텔레그램 메시지를 보내는 것도 Node Cron-tab을 이용했다. 혹시 사용자가 늘어서 100명이 넘게 된다면 과연 오후 10시에 정상적으로 모두가 메시지를 받을 수 있을 지에 대한 의문이 들지만 그 때가서 생각해야겠다.

시각화는 언제?

신규 사용자수와 클릭 수를 차트화하고 싶으나 엄두가 안나서 하지 못하는 중이다.

결론

ID : @TodayDevblog_bot
Link: t.me/TodayDevblog_bot

3

이 프로젝트는 오픈소스로 공개하고 있으며, 기여도 환영이다.

github.com/MiryangJung/TodayDevblog_Telebot