当使用 Aiogram 的 CallbackData 时,需要注意其参数数量不能过多。因为在回调中,参数会被编码为字符串,如果参数太多,会导致字符串长度过长,从而出现错误。 例如,以下代码将使用 CallbackData 创建一个“select”按钮,并给它添加一个回调函数和一个过滤器:
from aiogram.types import InlineKeyboardButton
from aiogram.types import InlineKeyboardMarkup
from aiogram.utils.callback_data import CallbackData
select_callback = CallbackData("select", "option_1", "option_2", "option_3")
button = InlineKeyboardButton(
text="Select",
callback_data=select_callback.new(
option_1="value_1", option_2="value_2", option_3="value_3"
)
)
async def on_select_callback(query: types.CallbackQuery):
data = select_callback.parse(query.data)
option_1 = data.get("option_1")
option_2 = data.get("option_2")
option_3 = data.get("option_3")
# do something with options...
dp.register_callback_query_handler(
on_select_callback,
lambda query: query.data and query.data.startswith("select")
)
以上代码中,我们使用了三个参数,在回调查询中,它们将会被编码为一个较长的字符串。为了避免这个问题,我们可以考虑减少参数的数量,或者使用一个唯一的标识符作为参数,然后使用字典等数据结构来管理参数的值。例如:
select_callback = CallbackData("select", "option")
button = InlineKeyboardButton(
text="Select",
callback_data=select_callback.new(option="value_1")
)
async def on_select_callback(query: types.CallbackQuery):
data = select_callback.parse(query.data)
option = data.get("option")
# do something with option...
dp.register_callback_query_handler(
on_select_callback,
lambda query: query.data and query.data.startswith("select")
)
以上代码中,我们仅使用了一个参数“option”,它的值为“value_1”。在回调查询中,它们将会被编码为一个短字符串,避免了过长的字符串问题。同时,在回调函数中,我们可以通过参数名直接获取参数的值,而不必使用索引。这种方式可以