Telegram 机器人(aiogram 3+)无法处理内联按钮

-1 投票
1 回答
41 浏览
提问于 2025-04-13 01:06

我在用Telegram机器人(aiogram 3+)时,发现它处理不了内联按钮。下面是我创建内联键盘的方式:

class KeyboardCreator:

    @staticmethod
    async def create_meetings_inline_keyboard(meetings: dict, timezone_shift=3) -> InlineKeyboardMarkup:
        kb = []
        current_time = datetime.utcnow() + timedelta(hours=timezone_shift)
        for meeting in meetings["meetings"]:
            if meeting['paid'] == '1' and meeting['status'].lower() == 'planned':
                meeting_time = datetime.utcfromtimestamp(int(meeting['date'])) + timedelta(hours=timezone_shift)
                if meeting_time > current_time:
                    formatted_date = meeting_time.strftime('%d-%m-%Y %H:%M')
                    button_text = f"{formatted_date} - {meeting['specialistFirstName']} {meeting['specialistLastName']}"
                    callback_data = f"meeting:{meeting['id']}"
                    logger.debug({callback_data})
                    kb.append([InlineKeyboardButton(text=button_text, callback_data=callback_data)])
        keyboard = InlineKeyboardMarkup(inline_keyboard=kb)
        return keyboard

这是我尝试捕捉回调查询(meeting:ID)的方法,适用于不同的状态:

@router.callback_query(MessageManager.waiting_for_consultation, F.data.startswith('meeting:'))
async def meeting_button_callback_handler(call: CallbackQuery, state: FSMContext):
    logger.debug('button pressed')
    await call.message.answer('Input the message, pls')

    await state.set_state(MessageManager.waiting_for_message)


@router.callback_query(FileManager.waiting_for_meeting, F.data.startswith('meeting:'))
async def meeting_button_callback_handler_2(call: CallbackQuery, state: FSMContext):
    logger.debug('button pressed')

    await call.message.answer('Pls, input the file you want to send to the host')

    await state.set_state(FileManager.waiting_for_file)

但是当我点击生成的键盘时,Telegram并没有反应。下面是我注册路由的方式:

dp.include_routers(
        start.router,
        sendmessage.router,
        my_consultations.router,
        upload.router,
        callback_query_handlers.router,
        about.router,
        authorisation.router,
        get_results.router
    )

这是我使用KeyboardCreator以及设置状态的方式:

@router.message(StateFilter(None), F.text == '✉️ Send Message')
async def sendmessage_button_handler(message: types.Message, state: FSMContext):
    user_id = message.from_user.id

    await message.answer(text='Pls, wait',
                         allow_sending_without_reply=True)
    await async_db_manager.create_pool()
    email = await async_db_manager.fetch_email_by_user_id(user_id=user_id)

    if not email:
        logger.error(f'Email is not filled or doesnt exist for user: {user_id}')
        return

    meetings = await user_auth_client.get_user_meetings(tg_id=user_id, email=email)
    logger.debug(str(meetings))

    formatted_message = await Formatter.parse_paid_meetings(meetings=meetings)
    await message.answer(formatted_message)

    inline_keyboard = await KeyboardCreator.create_meetings_inline_keyboard(meetings=meetings)

    await message.answer(text='Choose a meeting, pls', reply_markup=inline_keyboard)

    current_state = await state.get_state()
    logger.debug(f"Current state before button press: {current_state}")

    await state.set_state(MessageManager.waiting_for_consultation)

    logger.debug('state waiting_for_consultation set')
    current_state = await state.get_state()
    logger.debug(f"Current state before button press: {current_state}")

我尝试过更换机器人令牌,也尝试简化回调数据,但都没有用。Telegram就是不响应内联按钮的点击。请帮帮我 :)

1 个回答

0

问题出在设置 webhook 的时候。这里是使用 getWebhookInfo 方法得到的结果:

webhook_info = await bot.get_webhook_info()
logger.debug(webhook_info)

[DEBUG 03/22/2024 16:40:06,849 PM] url='mysite.com' has_custom_certificate=True pending_update_count=0 ip_address='1.1.1.1.1' last_error_date=没有 last_error_message=没有 last_synchronization_error_date=没有 max_connections =40 allowed_updates=['message']

一开始,允许的更新列表里只包含“message”,所以无法获取 callback_query 类型的更新。为了解决这个问题,我把我的机器人操作模式改成了轮询,点击了内联按钮,然后又回到了 webhook。

这是使用后的新结果:

webhook_info = await bot.get_webhook_info()
logger.debug(webhook_info):

bot_1 | [DEBUG 2024-03-22 16:40:06,849] url='' has_custom_certificate=True pending_update_count=0 ip_address='' last_error_date=None last_error_message=None last_synchronization_error_date=None max_connections=40 allowed_updates=['message', 'callback_query']

允许的更新列表变了。现在内联键盘可以正常工作了。

撰写回答