提问人:nerduz 提问时间:11/16/2023 更新时间:11/17/2023 访问量:24
在 aiogram 3.0 中实现阻塞功能如何更正确?
How is it more correct to implement the blocking function in aiogram 3.0?
问:
这是一个技术支持机器人。管理员收到用户的申诉,如果违反规则,则通过内联按钮,管理员可以禁止此用户。将数据从一个处理程序传输到另一个处理程序的最佳方法是什么?
我这样做了,它似乎有效。但我认为有一个更聪明的解决方案(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')
答:
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):
...
评论