@demyanov_ivan

Как правильно обработать события от Telegram(pytelegrambotapi+flask)?

Написал Telegram Bot на python при помощи стандартной библиотеке pytelegrambotapi, на flask сделал маленький бэкенд и захостил всё на pythonanywhere (платный аккаунт). Установил webhook, post запросы приходят от телеграмма и обрабатываются, но сами сообщения от пользователя в телеграмме не обрабатываются в чём может быть проблема?

from flask import Flask, request
from flask_sslify import SSLify
import telebot
import time

token = 'токен бота'
bot = telebot.TeleBot(token)
app=Flask(__name__)
sslify=SSLify(app)

@bot.message_handler(commands=['start'])
def startCommand(message):
bot.send_message(message.chat.id, 'Hi')

@app.route('/')
def index():
return ''

@app.route('/', methods=['POST'])
def webhook():
bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode('utf-8'))])
return "ok"

if __name__=='__mane__':
app.run()

Я думал проблема в этой строчке bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode('utf-8'))]) или в хэндлере, который обрабатывает сообщения от пользователя к боту, но такой же код работает во многих примерах из интернета
  • Вопрос задан
  • 4630 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AlmazKayum
import telebot
import flask
import logging
import time

API_TOKEN = conf.token

WEBHOOK_HOST = 'IP_хостинга'
WEBHOOK_PORT = 88  # 443, 80, 88 or 8443 (port need to be 'open')
WEBHOOK_LISTEN = '0.0.0.0'  # In some VPS you may need to put here the IP addr

WEBHOOK_SSL_CERT = './webhook_cert.pem'  # Path to the ssl certificate
WEBHOOK_SSL_PRIV = './webhook_pkey.pem'  # Path to the ssl private key

WEBHOOK_URL_BASE = "https://{}:{}".format(WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/{}/".format(API_TOKEN)

logger = telebot.logger
telebot.logger.setLevel(logging.INFO)

bot = telebot.TeleBot(API_TOKEN)

app = flask.Flask(__name__)


@app.route('/', methods=['GET', 'HEAD'])
def index():
    return ''


# Process webhook calls
@app.route(WEBHOOK_URL_PATH, methods=['POST'])
def webhook():
    if flask.request.headers.get('content-type') == 'application/json':
        json_string = flask.request.get_data().decode('utf-8')
        update = telebot.types.Update.de_json(json_string)
        bot.process_new_updates([update])
        return ''
    else:
        flask.abort(403)


#         START
@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, 'Hi')

bot.remove_webhook()
time.sleep(1)
# Set webhook
bot.set_webhook(url=WEBHOOK_URL_BASE+WEBHOOK_URL_PATH,
                certificate=open(WEBHOOK_SSL_CERT, 'r'))

# Start flask server
app.run(host=WEBHOOK_LISTEN,
        port=WEBHOOK_PORT,
        ssl_context=(WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV),
        debug=True)
Ответ написан
Комментировать
@Manvalit1
Для pythonanywhere всё гораздо проще:
from flask import Flask, request
import telebot
from telebot import types
import time

secret = "Секретное слово(можно использовать токен бота)"
bot = telebot.TeleBot('TOKEN_TELEGRAM', threaded=False)

bot.remove_webhook()
time.sleep(1)
bot.set_webhook(url="https://YOURNAME.pythonanywhere.com/{}".format(secret))

app = Flask(__name__)

@app.route('/{}'.format(secret), methods=["POST"])
def webhook():
    bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode("utf-8"))])
    print("Message")
    return "ok", 200


@bot.message_handler(commands=['start', 'help'])
def startCommand(message):
    bot.send_message(message.chat.id, 'Hi *' + message.chat.first_name + '*!' , parse_mode='Markdown', reply_markup=types.ReplyKeyboardRemove())
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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