在 aiogram 3.0 中实现阻塞功能如何更正确?

How is it more correct to implement the blocking function in aiogram 3.0?

提问人:nerduz 提问时间:11/16/2023 更新时间:11/17/2023 访问量:24

问:

这是一个技术支持机器人。管理员收到用户的申诉,如果违反规则,则通过内联按钮,管理员可以禁止此用户。将数据从一个处理程序传输到另一个处理程序的最佳方法是什么?

我这样做了,它似乎有效。但我认为有一个更聪明的解决方案(p.s почистил код от лишнего)

@probiv_router.message(Form.order_text)
async def form_order_text(message: Message, state: FSMContext):
    await state.update_data(order_text=message.text)

    order_data = await state.get_data()


    username = message.from_user.username
    userid = message.from_user.id
    
    await bot.send_message(chat_id=ADMIN_ID, text=
                                                  f'text: <b>text</b>',
                           parse_mode='HTML',
                           reply_markup=InlineKeyboardMarkup(inline_keyboard=[

                               [
                                   InlineKeyboardButton(text='write',
                                                        url=f'https://t.me/{userid}'),
                                   InlineKeyboardButton(text='ban', callback_data='ban_user')
                               ]
                           ]))

    await state.clear()

    @probiv_router.callback_query(F.data == 'ban_user')
    async def banuserfunc(callback: CallbackQuery):
        await callback.message.answer(f'user @{userid} banned')
                                     
aiogram (英语)

评论


答:

0赞 w0rraps 11/17/2023 #1

是的,有更好的解决方案。

您可以使用回调工厂方法:https://docs.aiogram.dev/en/latest/dispatcher/filters/callback_data.html#:~:text=Another%20abstract%20example%3A。 问题是,在callback_data中,您指定了不同的数据。例如,就像您的情况一样,它可以是操作user_id

此外,我会使用 InlineKeyboardBuilder,而不仅仅是将 InlineKeyboardButtons 保留在数组中:https://docs.aiogram.dev/en/latest/utils/keyboard.html

一定是这样的:

class BanUser(CallbackData, prefix="ban_user"):
    user_id: str
    # action: ... # in case you wanna add more manipulation actions, like get information about previous punishments etc. Don't forget to rename the class then.

keyboard = InlineKeyboardBuilder()

keyboard.add(
    InlineKeyboardButton(text="contact", url="...")
    InlineKeyboardButton(text="ban", callback_data=BanUser(user_id=user_id).pack()),
)
keyboard.adjust(1, 2)
bot.send_message(..., reply_markup=keyboard.as_markup())

@router.callback_query(BanUser.filter())
async def ban_user(query: CallbackQuery, callback_data: BanUser, bot: Bot):
    ...