여기서 중요한 포인트는 '매일 매일' '1시간 주기'로 알림을 준다는 것이다.
'매일 매일'을 위해서 Python anywhere 라는 서비스를 이용했으며 (매월 $5인 유료 서비스)
'1시간 주기'를 위해서 APScheduler라는 Python package를 이용했다.
프로젝트 컨셉
https://www.youtube.com/watch?v=DyJDNnEAycY
'매일' '1시간 주기'로 단독 뉴스 전해주는 봇 만들기
※아래 내용을 이해하려면, 위 영상을 끝까지 시청하는 것이 도움이 되니 꼭 시청해주세요. (Only 4 minutes :D)
소스 코드
import requests
from bs4 import BeautifulSoup
import telepot
#시간 마다 알람 지정용
from apscheduler.schedulers.blocking import BlockingScheduler
#서치 키워드
search_word = '단독'
#텔레그램 봇 생성
token = '본인의 Token 번호'
bot = telepot.Bot(token=token)
#스케줄러 생성
sched = BlockingScheduler()
#기존에 보냈던 링크를 담아둘 리스트
old_links = []
#링크 추출 함수
def extract_links(old_links=[]):
url = f'https://m.search.naver.com/search.naver?where=m_news&sm=mtb_jum&query={search_word}'
req = requests.get(url)
html = req.text
soup = BeautifulSoup(html, 'html.parser')
search_result = soup.select_one('#news_result_list')
news_list = search_result.select('.bx > .news_wrap > a')
links = []
for news in news_list[:5]:
link = news['href']
links.append(link)
new_links=[]
for link in links:
if link not in old_links:
new_links.append(link)
print(new_links)
return new_links
#이전 링크를 매개변수로 받아서 비교 후, 새로운 링크만 출력
#차후 이 부분을 메세지 전송 코드로 변경하고 매시간 동작하도록 설정
#새로운 링크가 없다면 빈 리스트 반환
def send_links():
global old_links
new_links = extract_links(old_links)
if new_links:
for link in new_links:
bot.sendMessage(chat_id='본인의 ID', text = link)
else:
bot.sendMessage(chat_id='본인의 ID', text = '새로운 단독 뉴스 없으뮤ㅠㅠ')
old_links += new_links.copy()
old_links = list(set(old_links))
#최초 시작
send_links()
#스케줄 설정
#1시간 마다 해당 코드 반복 실행
sched.add_job(send_links, 'interval', hours = 1)
#시작
sched.start()
'1시간 주기'를 위해서 APScheduler라는 Python package를 이용했다.
sched = BlockingScheduler() 이렇게 스케줄러를 생성해두고
sched.add_job(실행할 함수, 'interval', hours = 1) 이렇게 실행할 함수를 원하는 interval로 설정하면 된다.
Python anywhere
'매일 매일'을 위해서 Python anywhere 라는 서비스를 이용했다. (매월 $5인 유료 서비스)
Files
먼저 위에서 짠 코드를 Python anywhere에 올려야 한다.
File upload 버튼을 통해 올려도 되고 직접 여기서 py파일을 만들고 소스 코드를 복사 붙여넣기 해도 된다.
Tasks
파일을 만들었으니 이제 매일 매일 반복 작업을 수행해줄 Tasks 항목으로 들어간다.
여기선 원하는 주기를 Daily와 Hours로 설정할 수 있으며, 매일 같은 시각에 해당 Command 경로의 파일을 실행한다.
혹은 원하는 시간 주기 마다 파일을 실행할 수도 있다.
하지만 이번 프로젝트에서는 1시간마다 실행하는 코드를 넣었기 때문에 굳이 시간 주기마다 파일을 실행할 필요 없다.
여기서 한 가지 명심할 부분은 바로 'Time'.
저번 Python anywhere 소개 포스팅에서 언급했듯이 이 서비스는 유럽 시각 기준이므로
내가 원하는 한국 시각 - 9시간을 해주어야 한다.
아래가 유럽 시각 기준 새벽 4시 37분이므로, 우리 나라 시각으로는 오후 1시 37분이 된다. (그렇다. 그래서 오후 1시 37분을 시작으로 매 37분마다 뉴스 알람이 울린 것이다.)
Consoles
콘솔 목록으로 가면 위와 같이 원하는 python 버전에 맞춰 실행할 수 있다.
그리고 python 파일 실행 콘솔 뿐만 아니라 패키지 다운로드, 파일/폴더 생성등을 관리할 수 있는 Bash 콘솔도 있다.
여기서 한 가지 알아둘 점은 내가 python anywhere에 파일들을 올리고 Run을 실행하면 각 파일마다 console이 만들어진다.
이 말은 모든 파일이 각각 다른 콘솔에서 실행된다는 것이다. 그러나, 무한정 진행되지는 않고 어느 정도의 시간이 지나면 자동 초기화 된다.
그럼 왜 새벽 1시 37분 이후 부터 뉴스 알람이 안 울렸는 지 로그를 통해 분석해보자..
Tasks에서 실행한 파이썬 파일은 아래 노란색 아이콘을 클릭하면 로그를 확인할 수 있다.
보통 내가 Tasks에 입력한 routine이 실행하고 언제 Completed 되었는 지를 남긴다.
자세히 보니 여기서 답을 찾을 수 있었다.
6월 13일 04시 37분(한국 시각 13시 37분)에 'telegram_Dandok.py' 파일을 실행하고 45167초(약 12시간) 후인 6월 13일 17시 09분(한국 시각 14일 02시 09분)에 Completed task가 되었다.
Consoles에서 언급했듯이 파일을 실행하면 무한정 진행되지는 않고 어느 정도의 시간이 지나면 자동 초기화 된다. 그 시점이 약 12시간 정도 되는 듯하다.
Summary
Python anywhere의 동작 방식을 간략히 정리하면 다음과 같다.
Python anywhere에서 특정 파일을 실행하는 방법은 2가지가 있다.
Files에서 'RUN' 버튼을 누르는 것과 Tasks에서 Frequency를 입력하여 특정 주기로 실행하는 것.
그리고 이 둘은 독립적으로 동작하기 때문에 만약 Files에서도 실행하고 Tasks에서도 실행했다면 같은 파일이 각각 다른 공간에서 실행된다.
그래서 로그를 확인하는 방식도 각각 다르다.
Files에서 'RUN' 버튼을 통해 실행된 파일은 Consoles의 파일에서 로그가 남는다.
위의 Consoles에서 Your consoles의 해당 파일을 클릭하면 아래와 같이 python consoles 창이 뜬다.
만약 python code에 print로 로그가 될만한 내용을 남겼다면, 이 창에 뜨게 될 것이다.
필자는 뉴스 링크 url을 print로 넘겨 다음과 같이 출력되는 것을 알 수 있다.
해당 파일은 Tasks에서 실행할 때보다 더 오래 동작이 지속된다. 테스트해 본 결과, 약 41시간 동안 동작하였다.
Tasks에서 실행된 파일은 Tasks의 항목에서 로그가 남는다.
약 12시간 동안 동작하였다.
그러니 이 부분을 숙지하여 효율적이고 알찬 'Python anywhere' 서비스를 사용해보자 :)
아래는 '텔레그램 봇' 관련한 포스팅으로 참조.
2021.05.02 - [SW programming/Python] - [Python 텔레그램 봇] - 원하는 지역의 날씨 정보 알림
2021.05.16 - [SW programming/Python] - [Python 텔레그램 봇] - I say '관심 기업', you say '기사 5개' 툭!
2021.06.06 - [SW programming/Python] - [Python 텔레그램 봇] 커뮤니티의 특정 '키워드'가 들어간 게시글 알림 받기
'SW programming > Telegram bot 프로젝트' 카테고리의 다른 글
[Python 텔레그램 봇] python-telegram-bot 모듈이란? (1) | 2021.06.17 |
---|---|
[Python 텔레그램 봇] 커뮤니티의 특정 '키워드'가 들어간 게시글 알림 받기 (7) | 2021.06.06 |
[Python 텔레그램 봇] - I say '관심 기업', you say '기사 5개' 툭! (5) | 2021.05.16 |
[Python 텔레그램 봇] - 원하는 지역의 날씨 정보 알림 (1) | 2021.05.02 |
댓글