인프런 커뮤니티 질문&답변

MIKE.aeon님의 프로필 이미지

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

리눅스 우분투 서버에서 배포하기

기존 flask 에 텔레그램봇을 추가하는 방법.

해결된 질문

21.04.04 00:38 작성

·

408

1

안녕하세요 강사님. 강사님 강좌를 합쳐서 하나의 서비스로 구현하려고 하는데, 어느 강좌에 글을 남겨야하는지 몰라서 두군데 모두 글을 남겨봅니다. 한쪽에만 답변하셔도 됩니다.

현재 강사님의 강좌인 실전 웹사이트 만들기 강좌와 실전 100% 활용강좌를 모두 완강하였습니다. 게시판 서버를 감시하기위해서 텔레그램봇을 추가하려고 합니다.

봇파일(bot.py)을 별도로도 만들어 보고 run.py 에다 옮겨서 구현해봤는데도 메시지 보내기는 되는데, 메시지 가져오는 폴링 기능이 동작을 하지 않고 있습니다. 기본 기능인 에코 기능을 테스트 중입니다.

추가로 웹훅 방식으로도 구현해 봤는데,  게시판 서버가 nginx+uwsgi+flask 구조라서 그런지 POST 방식으로 텔레그램에서 게시판서버로 접속을하면 308 redirect 오류가 발생합니다. 확인해보니 텔레그램봇을 redirect 를 지원하지 않는다고 합니다. 혹시 동일구조(nginx+uwsgi+flask) 웹서비스와 텔레그램봇을 구현하신 경험이 있으시면 조언 부탁드립니다.

물론 웹훅을 위해서 도매인 설정 및 https 설정도 적용하여 정상동작하고 있습니다.

웹서비스와 텔레그램봇(폴링 또는 웹훅)을 어떤 구조로 만들어야 하는지 문의 드립니다.

웹훅방식이면 더 좋겠지만, 폴링방식이어도 감사드립니다.

답변 2

0

MIKE.aeon님의 프로필 이미지
MIKE.aeon
질문자

2021. 04. 06. 18:45

답변 감사합니다.

우선 폴링 방식으로 해보고 웹훅방식은 알려주신 웹훅사이트 참고해서 만들어보겠습니다.

0

남박사님의 프로필 이미지
남박사
지식공유자

2021. 04. 05. 23:10

먼저 강좌를 모두 완강하셨다니 축하드립니다~~! 질문의 내용을 보면 열심히 여러가지 시도해보시는게 보입니다. ^^

일단 말씀하신 텔레그램봇 + 플라스크 의 동작의 구조를 생각해봐야 할 듯 합니다. 간략하게 이론적으로 이해해보자면 텔레그램 봇은 polling() 함수가 동작하는 순간 메세지를 감시하기 위해 내부적으로 무한 루프로 동작할듯 합니다. 그리고 플라스크 역시 app.run() 함수가 동작하는 순간 요청을 감시하기 위해 내부적으로는 무한루프로 동작을 하게 될듯 합니다. 그래서..

bot.polling()

app.run() 

위와 같은 코드를 수행하면 polling() 의 동작이 끝나야만 run() 함수가 수행될텐데 내부적으로 루프를 돌고 있을테니 끝나질 않게 되고 그로 인해 run() 함수가 동작하지 않게 됩니다. 물론 순서를 변경한다 해도 똑같습니다. 그래서 이 루프 구조를 쓰레드로 분리해야 할 듯 합니다.

# telebot 라이브러리는 pip install python-telegram-bot 로 설치
# 그냥 pip install telebot 하면 다른 라이브러리가 설치됨!!!!!

import telebot
from flask import Flask
from threading import Thread

TOKEN = "텔레그램토큰"
app = Flask(__name__)
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(func=lambda message: True)
def echo_all(message):
	bot.reply_to(message, message.text)

@app.route("/")
def index():
    return "OK"

# 텔레그램 봇의 폴링 함수를 쓰레드로 동작하게 분리
thread = Thread(target=bot.polling)
thread.daemon = True
thread.start()

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=9000, debug=True)

급하게 작성한 코드라 여러가지 테스트를 해보진 않았지만 위의 코드는 실제 로컬에서 테스트 해봤을때 문제없이 구동되는 코드입니다. 물론 이는 로컬 테스트 용이고 nginx + uwsgi 환경에서는 uwsgi 설정파일에서 enable-threads = True 설정이 되어야 쓰레드가 동작하는걸로 기억합니다만 테스트는 안해봤습니다.

웹훅방식은 사실 사용하기가 어렵지 않았었는데 언젠가부터 텔레그램 보안 정책이 변경되어 https 도메인과 그에 따른 인증서가 있어야만 사용이 가능해졌습니다. 그로인해 제가 테스트는 해보지 않았습니다만

https://github.com/python-telegram-bot/python-telegram-bot/wiki/Webhooks#heroku 

위 링크는 영문페이지긴 하지만 구글 번역기만 사용하셔도 대략적인 맥락은 이해할 수 있을꺼라 생각됩니다.