@voiceofnoise

Как одновременно использовать функции представления Flask и CommandHandlerы python-telegram-bot?

Необходимо получать команды от пользователя, а также получать информацию о том в какой чат добавили/удалили бота. Хороший способ получать сообщения от пользователя это использовать CommandHandlers. Такой код работает правильно:

import telegram, config 
from telegram.ext import Updater, CommandHandler, Filters, MessageHandler 
  
bot = telegram.Bot(config.TOKEN) 
  
def help(bot, update): 
    update.message.reply_text('...') 
  
def start(bot, update): 
    update.message.reply_text('...') 
  
 def about(bot, update): 
    update.message.reply_text('...')  
  

if __name__ == '__main__': 
    updater = Updater(config.TOKEN) 
  
    updater.start_webhook(listen='0.0.0.0', 
                      port=config.PORT, 
                      url_path=config.TOKEN, 
                      key=config.CERT_KEY, 
                      cert=config.CERT, 
                      webhook_url='https://{}:{}/{}'.format(config.HOST, config.PORT, config.TOKEN)) 
  
    dp = updater.dispatcher 
    dp.add_handler(CommandHandler("start", start)) 
    dp.add_handler(CommandHandler("help", help)) 
    dp.add_handler(CommandHandler("about", about))


Получать сообщения о добавлении/удалении бота в чаты можно, используя Flask's route и telegram.update.Update.de_json():
from flask import Flask, request
import telegram, config

bot = telegram.Bot(config.TOKEN)
app = Flask(__name__)
context = (config.CERT, config.CERT_KEY)

@app.route('/' + config.TOKEN, methods=['POST'])
def webhook():
    update = telegram.update.Update.de_json(request.get_json(force=True), bot)

    # Из update можно получить инфу о добавлении или удалении бота из чата
    print(update)
    return 'OK'

def setWebhook():
    bot.setWebhook(webhook_url='https://%s:%s/%s' % (config.HOST, config.PORT, config.TOKEN),
                   certificate=open(config.CERT, 'rb'))

if __name__ == '__main__':
    setWebhook()
    app.run(host='0.0.0.0',
            port=config.PORT,
            ssl_context=context,
            debug=True)


Можно ли получать сообщения о добавлении/удалении бота в чаты не используя? Если да, то как?

Если использовать одновременно CommandHandlers и Flask's routes, то CommandHandlers перестают работать, видимо потому, что @app.route перехватывает такие сообщения:

from flask import Flask, request
import telegram, config, time, datetime
from telegram.ext import Updater, CommandHandler, Filters, MessageHandler

bot = telegram.Bot(config.TOKEN)
app = Flask(__name__)
context = (config.CERT, config.CERT_KEY)

# Commands
def help(bot, update):
    update.message.reply_text('...')

def start(bot, update):
   update.message.reply_text('...')

def about(bot, update):
    update.message.reply_text('...')

@app.route('/' + config.TOKEN, methods=['POST'])
def webhook():
    update = telegram.update.Update.de_json(request.get_json(force=True), bot)
    print(update)
    return 'OK'

def setWebhook():
    bot.setWebhook(webhook_url='https://%s:%s/%s' % (config.HOST, config.PORT, config.TOKEN),
                   certificate=open(config.CERT, 'rb'))

if __name__ == '__main__':
    updater = Updater(config.TOKEN)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help))
    dp.add_handler(CommandHandler("about", about))

    setWebhook()
    app.run(host='0.0.0.0',
            port=config.PORT,
            ssl_context=context,
            debug=True)


1. Можно ли получать сообщения о добавлении/удалении бота в чаты не используя? Если да, то как?
2. Как сделать чтобы команды от пользователя не перехватывались @app.route?
3. Существуют ли другие способы получать сообщения о добавлении/удалении бота из/в чаты и удобной обработки команд от пользователя?
  • Вопрос задан
  • 938 просмотров
Пригласить эксперта
Ответы на вопрос 1
@sl4n
@app.route('/' + config.TOKEN, methods=['POST'])
def webhook():
update = telegram.update.Update.de_json(request.get_json(force=True), bot)
dp.process_update(update)
return "OK"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы