Telegram 机器人(aiogram 3+)不处理内联按钮 fsr。这是我的内联键盘的创建方式:
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
这是我尝试捕获不同状态的回调查询(会议: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)
但是当我按下生成的 kb 时 - 电报不处理它。 这是我注册路由器的方法:
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}")
我尝试更改机器人令牌,尝试简化callback_data。什么都不起作用。 Telegram 不处理内联按钮的点击。请帮助我:)
问题出在设置 webhook 上。这是使用 getWebhookInfo 方法的结果: webhook_info = 等待 bot.get_webhook_info() logger.debug(webhook_info)
[DEBUG 03/22/2024 16:40:06,849 PM] url='mysite.com' has_custom_certificate=Trueending_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=['消息']
起初,allowed_updates列表中只包含“message”,因此无法获取callback_query类型的更新。我解决这个问题的方法如下:我将机器人的操作模式更改为轮询,单击内联按钮,返回到 webhook。 这是使用 webhook_info = wait bot.get_webhook_info() 的新结果 logger.debug(webhook_info):
bot_1 | [DEBUG 2024-03-22 16:40:06,849] url='' has_custom_certificate=True挂起_update_count=0 ip_address=''last_error_date=无last_error_message=无last_synchronization_error_date=无max_connections=40 allowed_updates=['message','callback_query']
允许更新的列表已更改。内联键盘现在可以按预期工作。