반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

 

오늘은 컴퓨터가 사용자에게 메세지를 보내줄 수 있도록 해주는 python-telegram-bot이라는 파이썬 패키지를 공부해보겠습니다.

 

이 패키지를 확실히 공부해두면 향후에 제가 계획하고 있는 '실시간 뉴스 기사 크롤링 및 메세지 전달' 프로젝트를 보다 쉽게 할 수 있을 것 같아서 정리해보았습니다. 참고로 이번 글을 따라오시려면 지난 시간의 글을 참고하셔서 telegram 앱을 휴대폰에 설치하셔야합니다.

 

2021.04.03 - [파이썬 프로젝트] - Python으로 Telegram bot 사용하는 법 (feat. 공시정보알림 탤레그램 봇 소개)

 


설치 및 import 방법

import할 모듈이 여러가지가 있는데, 사용할 기능에 따라 선택적으로 import 하시면 됩니다. 잘 모를 때는 일단 그냥 다 import 하시는 것을 추천드립니다.

#텔레그램 모듈 설치(pip와 conda 두 가지중에 하나 선택해서 설치) 
pip install python-telegram-bot --upgrade 
conda install -c conda-forge python-telegram-bot 

#텔레그램 모듈 import
import telegram 
from telegram.ext import Updater
from telegram.ext import CommandHandler
from telegram.ext import MessageHandler, Filters

 

<참고. import telegram이 잘 안될 때>

case1. 설치가 잘 되지 않았을 때

터미널 창에서 pip list나 conda list를 입력하면 설치된 파이썬 패키지들을 확인해볼 수 있습니다. python-telegram-bot이 잘 설치되있는지 확인해주세요. 주의할 점은 vscode에서 현재 프로젝트에 사용중인 환경이 anaconda인지 python인지 확인하고, 거기에 맞는 명령어로 설치해야한다는 것입니다.

 

case2. 설치가 되어 있는데도 되지 않을 때

 

cmd창에 AttributeError: partially initialized module 'telegram' has no attribute 'Bot' (most likely due to a circular import)라고 출력될 때가 있습니다. 이 경우는 현재 실행중인 파이썬 파일(.py)의 이름이 telegram.py로 되어 있는 경우입니다.

 

 

 

 

 

패키지 작동 구조

 

 

Updater: User(사용자)로부터 새로운 명령이나 메시지가 왔는지 주기적으로 확인

Queue: Updater를 통해 받은 명령이나 메시지를 임시저장

Dispatcher: Queue에 저장된 명령이나 메시지를 분류하여 Handler의 목적에 맞게 전달

Handler: 각 요청에 대하여 맡은 역할을 수행

 

 

텔레그램 명령어 처리

텔레그램에는 /명령어 형식으로 채팅을 치면 그것에 맞는 행동을 bot이 실행합니다. 아래 코드는 그런 기능을 구현할 수 있는 기초 코드라고 할 수 있겠습니다. 주석을 자세히 달아두었으니 참고하세요.

#step1.telegram 패키지의 Updater, CommandHandler 모듈 import
from telegram.ext import Updater
from telegram.ext import CommandHandler

#step2.Updater(유저의 입력을 계속 모니터링하는 역할), Dispatcher
updater = Updater(token='발급받은 bot_token 입력', use_context=True)
dispatcher = updater.dispatcher

#step3./start 명령어가 입력되었을 때의 함수 정의
def start(update, context):
    context.bot.send_message(chat_id=update.effective_chat.id, text="반가워요!")

#step4.위에서 정의한 함수를 실행할 CommandHandler 정의
start_handler = CommandHandler('start', start) #('명렁어',명령 함수)

#step5.Dispatcher에 Handler를 추가
dispatcher.add_handler(start_handler)

#step6.Updater 실시간 입력 모니터링 시작(polling 개념)
updater.start_polling()

 

 

텔레그램 메시지 처리

아래의 코드는 사용자가 전송한 메세지를 다시 되돌려 주는 코드입니다. 추후에 def echo를 조금 바꿔서 뉴스 기사의 링크를 보내주도록 해주면 제가 원하는 기능을 구현할 수 있을 것 같네요. 참고로 Filters 모듈은 MessageHandler에서 명령어는 되돌려 주지 않고, 텍스트만 되돌려주도록 걸러주는 필터 역할을 할 때 사용합니다.

#step1.telegram 패키지의 Updater, CommandHandler 모듈 import
from telegram.ext import Updater
from telegram.ext import MessageHandler, Filters

#step2.Updater(유저의 입력을 계속 모니터링하는 역할), Dispatcher
updater = Updater(token='발급받은 bot_token 입력', use_context=True)
dispatcher = updater.dispatcher

#step3.메시지가 입력되었을 때의 함수 정의
def echo(update, context):
    user_id = update.effective_chat.id
    user_text = update.message.text
    context.bot.send_message(chat_id=user_id, text=user_text)

#step4.위에서 정의한 함수를 실행할 CommandHandler 정의
echo_handler = MessageHandler(Filters.text & (~Filters.command), echo) #(메시지&명령어 제외, 함수)

#step5.Dispatcher에 Handler를 추가
dispatcher.add_handler(echo_handler)

#step6.Updater 실시간 입력 모니터링 시작(polling 개념)
updater.start_polling()

 


오늘은 여기까지 정리해보고, 다음에는 원하는 주제의 네이버 뉴스 기사를 실시간으로 모니터링 해서, 새로 올라오는 기사의 링크를 텔레그램 봇으로 사용자에게 전송해주는 프로젝트를 해보겠습니다.

 

혹시 필요하신 분들은 공유해놓은테니 또 찾아주세요!

반응형

+ Recent posts