해결된 질문
21.04.04 00:36 작성
·
659
1
안녕하세요 강사님. 강사님 강좌를 합쳐서 하나의 서비스로 구현하려고 하는데, 어느 강좌에 글을 남겨야하는지 몰라서 두군데 모두 글을 남겨봅니다. 한쪽에만 답변하셔도 됩니다.
현재 강사님의 강좌인 실전 웹사이트 만들기 강좌와 실전 100% 활용강좌를 모두 완강하였습니다. 게시판 서버를 감시하기위해서 텔레그램봇을 추가하려고 합니다.
봇파일(bot.py)을 별도로도 만들어 보고 run.py 에다 옮겨서 구현해봤는데도 메시지 보내기는 되는데, 메시지 가져오는 폴링 기능이 동작을 하지 않고 있습니다. 기본 기능인 에코 기능을 테스트 중입니다.
추가로 웹훅 방식으로도 구현해 봤는데, 게시판 서버가 nginx+uwsgi+flask 구조라서 그런지 POST 방식으로 텔레그램에서 게시판서버로 접속을하면 308 redirect 오류가 발생합니다. 확인해보니 텔레그램봇을 redirect 를 지원하지 않는다고 합니다. 혹시 동일구조(nginx+uwsgi+flask) 웹서비스와 텔레그램봇을 구현하신 경험이 있으시면 조언 부탁드립니다.
물론 웹훅을 위해서 도매인 설정 및 https 설정도 적용하여 정상동작하고 있습니다.
웹서비스와 텔레그램봇(폴링 또는 웹훅)을 어떤 구조로 만들어야 하는지 문의 드립니다.
웹훅방식이면 더 좋겠지만, 폴링방식이어도 감사드립니다.
답변 2
1
2021. 04. 05. 22:57
먼저 강좌를 모두 완강하셨다니 축하드립니다~ ^^
말씀하신 플라스크에 텔레그램봇 기능을 추가하는 방법에 대해서는 생각해볼 문제가 있습니다. 일단 최대한 간략하게 이론적으로 설명을 드리자면.....
텔레그램봇은 메세지를 감시하기 위해서 어딘가에서 무한루프로 동작하고 있습니다. 그런데 플라스크 역시 내부 어딘가에서는 요청이 들어오고 있는지를 감시 하기 위해서 무한루프로 동작을 하고 있을겁니다. 이와 같은 경우 2개의 무한루프가 1개의 쓰레드내에서 동작을 해야하기 때문에 문제가 발생하게 됩니다.
bot.polling()
app.run()
실제 위와 같은 코드가 있다면 bot.polling() 함수가 완료되기 전까진 app.run() 함수는 실행되지 않습니다만 polling() 함수가 내부적으로 무한루프로 돌기 때문에 app.run() 함수는 실행될 수 없는 구조 입니다. 이 순서를 반대로 해도 결과는 똑같습니다.
그렇기 때문에 이렇게 2개의 무한루프를 각각 동작하게 하려면 쓰레드를 분리해야하는 작업이 필요합니다. 아래의 예제 코드를 참고하시기 바랍니다.
# pip install python-telegram-bot --upgrade
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 환경 파일에서 쓰레드 동작 가능 여부 같은 설정을 해야 하는것으로 기억합니다.
2020년 어느날부터 텔레그램의 정책이 변경되어 이제 웹훅방식을 사용하기 위해선 https 도메인이 있어야 하고 해당 도메인에 대한 인증서가 있어야 합니다. 그로인해 테스트를 해보지 못했습니다만 아래 링크를 참조하시면 대략 적인 흐름을 이해하실 수 있을꺼라 생각됩니다.
https://github.com/python-telegram-bot/python-telegram-bot/wiki/Webhooks#heroku
0