본문 바로가기

카테고리 없음

파이썬으로 뉴스 알림 텔레그램 봇 만들기(3): 매 시간 메시지 보내기

글 순서

(1) 사이트 구조 살펴보기, 뉴스 링크 수집하기

(2) 봇 만들기, 새로운 뉴스 링크만 추출하기

(3) 스케쥴러 만들기, 매 시간 메시지 보내기


이번에는 프로그램 종료 전까지 매 시간 새로운 뉴스를 전송해주는 봇을 만들겠습니다. 여러 가지 스케줄러를 사용할 수 있겠지만 사용이 손쉬운 APScheduler 라이브러리를 사용하겠습니다. 

 

파이썬 스케줄러 만들기 

스케줄러는 컴퓨터에서 원하는 작업을 특정 시간/주기에 실행할 수 있도록 일정을 관리해줍니다. 여러 가지 스케줄러가 있지만 매우 간단한 수준의 일정관리면 충분하기 때문에 파이썬 라이브러리를 이용하겠습니다.

 

스케줄러에게 시킬 일을 다음과 같습니다.

1. 한 시간마다

2. 뉴스 링크를 수집하고

3. 새로운 링크가 있으면 텔레그램 메시지를 나에게 보내주렴

 

앞의 단계에서 이미 2번과 3번은 어떻게 작성하는지 알아보았고 작성을 마쳤습니다. 이제 남은 1번만 코드로 작성하면 되는데요. 매우 쉽습니다.

# 라이브러리 불러오기
from apscheduler.schedulers.blocking import BlockingScheduler
# 스케쥴러 생성
sched = BlockingScheduler()
# 스케줄 설정
sched.add_job(작동시킬 함수명, 'interval', hours=1)
# 시작
sched.start()

이를 활용해서 이전에 작성한 코드를 업데이트하겠습니다.

 

스케줄러를 사용한 메시지 전송 코드

# 라이브러리 불러오기
import requests
from bs4 import BeautifulSoup
import telegram
from apscheduler.schedulers.blocking import BlockingScheduler

# 검색 키워드
search_word = '삼성전자'

# 텔레그램 봇 생성
token = '내 토큰'
bot = telegram.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)
    
    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='내 토큰', text=link)
    else:
        bot.sendMessage(chat_id='내 토큰', text='새로운 뉴스 없음')
    old_links += new_links.copy()
    old_links = list(set(old_links))

# 최초 시작
send_links()
# 스케쥴러 세팅 및 작동
sched.add_job(send_links, 'interval', hours=1)
sched.start()

sched.start() 실행 시 현재 실행 간격이 한 시간 단위이기 때문에 이대로 입력하면 1시간 뒤부터 메시지를 보내기 시작합니다. 때문에 바로 위에 별도로 스크립트 동작 시점에 메시지를 한번 보내고 시작하도록 했습니다.

 

한 시간마다 새로운 뉴스를 알려주는 봇이 완성되었습니다. 컴퓨터를 켜지 않고도 봇을 계속 동작시키고 싶으시다면 호스팅을 알아보시면 됩니다. 저는 월 5$ 파이썬 애니웨어를 이용하고 있습니다.

 

 

- 이 글은 아나콘다(Anaconda3)가 설치된  주피터 노트북에서 작성되었습니다.