Встроенная кнопка 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'
)