본문 바로가기

Bot 기술노트

웹페이지 게시물 업데이트 알람 봇 만들기(2)

텔레그램 웹페이지 게시물 업데이트 알람 봇 만들기(2)


Heroku 활용한 텔레그램 봇 실행


  • Herokudyno라는 작은 리눅스 가상 서버를 제공해서 개발자가 만든 애플리케이션을 빌드, 실행하고 스케일링 할 수 있게 해준다.
  • bot 로직이 구현된 python 실행할 App을 Heroku CLI를 통해 Dashboard로 배포 할 수 있다.
  • 로컬 컴퓨터에서 실시간으로 파싱하고 있는 python 프로그램을 실행하고 있을 순 없기 때문에 Heroku 가상 서버 서비스를 활용한다.

Heroku 가입 및 App 만들기

  • 간단한 정보 입력 후 Heroku에 가입하여 Dashboard로 이동
  • 아래와 같이 사용할 App 이름 입력 후 생성

  • 이번 포스팅에서는 CLI 명령어로 App 생성 및 배포하는 방법으로 진행

Heroku 배포에 필요한 파일 준비

  • Heroku Deploy에 필요한 파일은 Procfile , requirements.txt , runtime.txt, 실행할.py
Procfile 파일 작성 내용(실행할 python 파일 이름 명시)
worker: python telegram_bot.py
requirements.txt 파일 작성 내용(python 필요 패키지 명시)
python-telegram-bot

beautifulsoup4

requests
runtime.txt 파일 작성 내용(실행할 python 버전 명시)
python-3.6.8

Heroku CLI 사용한 python 소스코드 배포하기

  • GitHeroku CLI 설치가 되어야 아래의 명령어들을 수행할 수 있다.
  • Anaconda Prompt에서 heroku login 명령어로 로그인 한다.
  • CLI 환경에서는 heroku create 명령어로 생성 가능(Heroku CLI 설치가 되어 있어야함)
  • CLI에서 App 생성 후 App 이름이 랜덤으로 생성되기 때문에 필요시 rename 명령어로 변경해준다. heroku rename new-post-alaram-bot
  • 아래의 git 명령어를 통해 Deploy에 필요한 파일들을 배포 해준다.

  • App이 생성 완료 되었다면, Heroku Dashboard에서 Free Dynos에서 App이 생성된 것을 확인할 수 있다.

Heroku 배포한 python 실행하기

  • Dashboard > Resources > Free Dynos 부분 편집 버튼 누른 후 App 활성화 시켜주면 됨

  • 활성화 해준 뒤 Confirm\ 하면 python telegram\_bot.py 명령어가 실행되면서 python 프로그램이 실행된다.

  • More > View logs에서 실행중인 python app 로그, 상태 등을 실시간으로 확인할 수 있다.

Heroku 스케쥴러에 App 등록하기


  • Heroku에서 제공되는 스케쥴러 사용하게 되면 Dyno 사용시간 절약할 수 있다는 장점이 있다.
  • 10분 단위, 요일, 월 등으로 Heroku에 등록된 App을 스케쥴링 하여 실행해주는 기능이다.(이번 글에서는 10분 마다 python 코드를 실행하는 예제로 설명함)
  • 스케쥴러 사용을 위해 위에서 실행했던 Heroku App은 중지 시킨다.
  • 스케쥴러와 동시에 실행될 시 Dyno의 시간 책정 및 프로그램 충돌 일어나는 현상이 있다(workerscheduler 두 가지 유형으로 App이 함께 실행되기 때문에)

Heroku 스케쥴러 Add-ons 추가하기

  • Heroku 스케쥴러 사용을 위해 Add-ons 추가를 해주어야한다.
  • Heroku Dashboard > Resources > Add-ons > add add-ons 검색하기
  • Heroku Scheduler 검색 후 추가

)

  • Provision 선택하여 Add-ons 추가
  • 추가 완료가 되기 위해서는 계정의 지불 방법으로 신용카드가 등록되어 있어야함

  • Add Job 클릭하여 등록할 스케쥴 정보 등록하기

  • 스케쥴러가 동작할 시간, 실행 명령어 편집 후 저장
  • More > View logs에서 10분마다 python app이 실행되는지 확인하자

Heroku 스케쥴러 실행 python 소스코드

  • 최신글 번호를 Heroku 환경변수에 저장하기 위해 환경변수 설정해준다. heroku config:set PPOMPU_ID=0
  • 1편 글에서의 소스코드에서 while 반복문 제거와, 환경변수 사용 코드 추가됨
#!/usr/bin/env python
# encoding=utf-8
import requests
import time
from bs4 import BeautifulSoup
import telegram
import os
bot = telegram.Bot(token='YourTokenKey')
# heroku 서버의 환경변수 사용하여 최신글 번호 업데이트
ppompu_latest\_num = os.environ.get('PPOMPU\_ID')
def ppomppu():
    global ppompu\_latest\_num
    req = requests.get('http://www.ppomppu.co.kr/zboard/zboard.php?id=ppomppu')
    html = req.text
    soup = BeautifulSoup(html, 'html.parser') #, from_encoding='utf-8')
    posts = soup.find("tr", {"class" : "list1"})
    post\_num = posts.find("td", {"class" : "eng list_vspace"}).text
    post\_num.strip()

    # 스케쥴러가 10분 마다 제일 최신 게시글 번호와 크롤링한 최신 게시글 번호 비교
    # 비교 후 같지 않으면 최신 게시글 업데이트 된 것으로 텔레그램 봇으로 업데이트 메시지 전송
    if ppompu_latest_num != post_num :
        ppompu_latest_num = post_num
    # PPOMPU_ID 환경 변수 최신글의 번호로 업데이트
    os.environ\["PPOMPU_D"] = ppompu_latest_num.strip()
    link = 'http://www.ppomppu.co.kr/zboard/'+posts.find("td", { "valign" : "middle"}).find("a").attrs['href']
    title = posts.find("font", {"class" : "list_title"}).text
    text = '<뽐뿌 게시글 업데이트>'+'\\n'+title+'\\n'+link  
    bot.sendMessage(-123456789, text)
    # 프롬프트 로그
    print(text)
    print(os.environ)

    print('bot 동작 중...현재 게시글 번호 ' + ppompu_latest_num.strip())
    print('heroku PPOMPU_ID 환경변수' + os.environ.get('PPOMPU_ID'))

if __name__ == '__main__':
    try:
        ppomppu()
    except AttributeError as e:
    print(e)