Встроенная кнопка keyboardbutton с обратным вызовом_data не работает

InlineKeyboardButton с помощью callback_data не работает. Когда я нажимаю на нее, ничего не происходит.

Вот как я создаю кнопку:

from django.apps import apps
from asgiref.sync import sync_to_async
from telegram import Update, InlineKeyboardMarkup, InlineKeyboardButton, WebAppInfo
from telegram.ext import CommandHandler, ApplicationBuilder, MessageHandler, filters, CallbackQueryHandler

async def start(self, update: Update, context):
    keyboard = InlineKeyboardMarkup([
        [InlineKeyboardButton("Already registred", callback_data="already_registered")],
        [InlineKeyboardButton("Register", web_app=WebAppInfo(url=WEB_APP_URL))]
    ])

    await update.message.reply_text(
        "Welcome",
        reply_markup=keyboard
    )
    return

Это обработчик запроса обратного вызова:

async def button(self, update: Update, context):
    query = update.callback_query
    if not query:
        return

    await query.answer()

    if query.data == "already_registered":
        await context.bot.send_message(
            chat_id=update.message.chat_id,
            text='Good'
        )
        return

и вот как я запускаю:

def run(self):
    TOKEN = apps.get_model('app.Config').objects.get_mailing_tg_bot_token()
    app = ApplicationBuilder().token(TOKEN).build()
    app.add_handler(CommandHandler('start', self.start))
    app.add_handler(CallbackQueryHandler(self.button))

Попробуйте записать данные обратного вызова перед условием в обработчике кнопки, чтобы посмотреть, что они содержат. Возможно, вы что-то перепутали.

Когда я запускаю его в консоли (без django) и нажимаю кнопку "Already registred", я вижу ошибку

chat_id=update.message.chat_id, 

AttributeError: 'NoneType' object has no attribute 'chat_id'

Кажется, что message это None. Возможно, InlineKeyboardButton не отправляет сообщение.

Но в документации вы можете увидеть пример inlinekeyboard.py и в нем используется

await query.edit_message_text(text= ...)

вместо await context.bot.send_message(...) для отправки сообщения.
И для этого не нужно chat_id. И у меня это работает.

async def button(update: Update, context):
    query = update.callback_query
    if not query:
        return

    await query.answer()

    if query.data == "already_registered":
        await query.edit_message_text(text='Good')
        #await context.bot.send_message(
        #    chat_id=update.message.chat_id,
        #    text='Good'
        #)
<время работы/>

РЕДАКТИРОВАТЬ:

update.message есть None, но существует query.message, и у него есть query.message.chat.id, и это тоже работает для меня:

        await context.bot.send_message(
        #    chat_id=update.message.chat_id,
            chat_id=query.message.chat.it
            text='Good'
        )
Вернуться на верх