@dmitriy8720

Не работает меню и за Webhook, как исправить?

Скриншоты
61f53e340faec660653917.jpeg
61f53e3ebb052732454135.jpeg
61f53e462c1a7167387464.jpeg
61f53e4de8094356409219.jpeg
61f53e572cbc5874541922.jpeg


Подскажите, почему не работает меню? Веб хуки вроде работают.
import telebot
import time
import os
from telebot import types
from flask import Flask, request
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton


TOKEN = '5moitoken'
APP_URL = f'https://api.telegram.org/bot5moitoken/{TOKEN}'
bot = telebot.TeleBot(TOKEN)
server = Flask(__name__)



@bot.message_handler(content_types=["text"])
def any_msg(message):
    # Создаем клавиатуру и каждую из кнопок (по 2 в ряд)
    keyboard = types.InlineKeyboardMarkup(row_width=2)
    url_button = types.InlineKeyboardButton(text="URL", url="https://yandex.ru")
    callback_button = types.InlineKeyboardButton(text="Callback", callback_data="test")
    switch_button = types.InlineKeyboardButton(text="Switch", switch_inline_query="Telegram")
    keyboard.add(url_button, callback_button, switch_button)
    bot.send_message(message.chat.id, "Я – сообщение из обычного режима", reply_markup=keyboard)


@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    # Если сообщение из чата с ботом
    if call.message:
        if call.data == "test":
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Текст1")
            # Уведомление в верхней части экрана
            bot.answer_callback_query(callback_query_id=call.id, show_alert=False, text="Текст1!")
    # Если сообщение из инлайн-режима
    elif call.inline_message_id:
        if call.data == "test":
            bot.edit_message_text(inline_message_id=call.inline_message_id, text="Текст2")



@bot.inline_handler(lambda query: len(query.query) > 0)
def query_text(query):
    kb = types.InlineKeyboardMarkup()
    kb.add(types.InlineKeyboardButton(text="Нажми меня", callback_data="test"))
    results = []
    # Обратите внимание: вместо текста - объект input_message_content c текстом!
    single_msg = types.InlineQueryResultArticle(
        id="1", title="Press me",
        input_message_content=types.InputTextMessageContent(message_text="Я – сообщение из инлайн-режима"),
        reply_markup=kb
    )
    results.append(single_msg)
    bot.answer_inline_query(query.id, results)

'''
@bot.message_handler(func=lambda message: True, content_types=['text'])
def echo(message):
    bot.reply_to(message, message.text)


@server.route('/' + TOKEN, methods=['POST'])
def get_message():
    json_string = request.get_data().decode('utf-8')
    update = telebot.types.Update.de_json(json_string)
    bot.process_new_updates([update])
    return '!', 200


@server.route('/')
def webhook():
    bot.remove_webhook()
    bot.set_webhook(url=APP_URL)
    return '!', 200
'''
if __name__ == "__main__":
#RUN
 #server.run(host='0.0.0.0', port=int(os.environ.get('PORT', 5000)))
 bot.polling(none_stop=True)


Если убираю код вебхуков, меню работает.
TOKEN = '5moitoken'
APP_URL = f'https://api.telegram.org/bot5moitoken/{TOKEN}'
bot = telebot.TeleBot(TOKEN)
server = Flask(__name__)

@bot.message_handler(func=lambda message: True, content_types=['text'])
def echo(message):
    bot.reply_to(message, message.text)


@server.route('/' + TOKEN, methods=['POST'])
def get_message():
    json_string = request.get_data().decode('utf-8')
    update = telebot.types.Update.de_json(json_string)
    bot.process_new_updates([update])
    return '!', 200


@server.route('/')
def webhook():
    bot.remove_webhook()
    bot.set_webhook(url=APP_URL)
    return '!', 200
И этот код 
server.run(host='0.0.0.0', port=int(os.environ.get('PORT', 5000)))

Меняю подключение к токену
Это все удаляю
TOKEN = '5moitoken'
APP_URL = f'https://api.telegram.org/bot5moitoken/{TOKEN}'
bot = telebot.TeleBot(TOKEN)
server = Flask(__name__)
И меняю на этот код
bot = telebot.TeleBot("moy_token")

И тогда, все работает.

Как сделать так, чтобы в одном файле, вебхуки, меню и все работало, или нужно вебхуки в отдельном файле? И как, это тогда все прописать?
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 1
InternetMaster
@InternetMaster
Интернет
Не понял, зачем bot.polling() если у вас webHook?
Это раз. Во вторых, вы хотите дать самоуничтожение серверам Telegram или что? Зачем вы в качестве своего url даете url сервера телеграма на который обычно нужно отправлять запросы, если телеграм с него и посылает вам (см. переменную APP_URL)?
В третьих, хочу вам сказать, чтобы вы не забыли насчет слешей когда будете принимать запросы от телеграма, чтобы если ваш url был yourdomain.com/secrettoken/ вы указали @server.route('/secrettoken/'), а не @server.route('/secrettoken')

Можно через домен (желательно), можно по IP, но указать ваш сервер куда телеграм будет посылать запросы, а не чтобы телеграм сам себе посылал запросы.

Также не забудьте, про сертификат SSL, который требует от вас телеграм. Можно - нормальный, можно самоподписанный. Его отправьте в запросе setWebhook и добавьте к server.run в паре с секретным ключом.

Если не хотите SSL, можно настроить Local Bot API Server, и чтобы он отсылал вам запросы по localhost и вы ему, но это куда запарнее, чем дать SSL.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы