Bitwise serialization of CallbackData for aiogram 3.x instead of the text format prefix:field1:field2. Each field occupies a fixed number of bits - more data fits into the Telegram limit (64 bytes), and the payload size is known at class definition time.
pip install aiogram-bincallback
Dependencies: aiogram>=3.0,<4.0, pydantic>=2.0,<3.0, Python 3.8+.
from enum import Enum, IntEnum
from aiogram_bincallback import BinaryCallbackData, bfield
class CbPrefix(IntEnum):
ORDER = 1
HOME = 2
class Status(str, Enum):
PENDING = "pending"
SHIPPED = "shipped"
class OrderCb(BinaryCallbackData, prefix=CbPrefix.ORDER.value, version=1):
order_id: int = bfield(bits=16, signed=False)
status: Status = bfield(bits=4)prefix and version are class inheritance arguments, not model fields. Both are required.
cb = OrderCb(order_id=42, status=Status.PENDING)
packed = cb.pack()
restored = OrderCb.unpack(packed)OrderCb is simultaneously a pydantic.BaseModel and an aiogram.CallbackData, used in filters like a regular CallbackData:
from aiogram import Router
router = Router()
@router.callback_query(OrderCb.filter())
async def handle_order(callback, callback_data: OrderCb):
...