Загрузка...

Invisible custom callbacks in Telegram bots or How to hide logic and save bytes

Thread in Python created by teracota Mar 23, 2026. 125 views

  1. teracota
    teracota Topic starter Mar 23, 2026 Banned 18 Dec 31, 2025
    Здарова, форумчане. Недавно увидел в фанстате(тг бот для деанончика) непонятные каллбеки и чуть углубился в эту тему. Они выглядят как одинаковые квадраты это называется ASCII управлением. Ниже приложил скрин.

    Сегодня разберем, зачем это нужно кодеру с лолза и как заставить тг бота на aiogram хавать «невидимки»


    1. Зачем это нужно?


    В Телеге лимит на callback_data — всего 64 байта. Если ты передаешь там длинные ID, флаги и команды, ты быстро упрешься в потолок.

    Какая профитность юзания невидимых символов:

    Экономия места: Вместо разделителя _ или : юзаем \x05. Экономим драгоценные байтики.
    Скрытая маркировка: Твой бот сразу поймет, что кнопка «своя», просто проверив первый байт.
    Защита от копипаста: Обычный школяр не поймет, почему его скрипт не ловит твои кнопки, потому что он не видит управляющие символы.


    2. Разбираем «невидимки» по байтам


    То, что кажется квадратиком, на самом деле — конкретный код:

    \x05 (ENQ) — Enquiry.
    \x03 (ETX) — End of Text.
    \x0f (SI) — Shift In.


    Бот разделяет их просто: он режет строку по этим байтам. Для него это такие же разделители, как точки, просто они не рендерятся в интерфейсе.
    3. Пишем код (aiogram 3+)

    Забудь про копирование символов из чатов — они побьются. Юзай нормальное экранирование.
    Python

    import asyncio
    from aiogram import Bot, Dispatcher, F
    from aiogram.types import Message, CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup

    bot = Bot(token="Токен_сюды")
    dp = Dispatcher()

    # Разные невидимые ASCII-символы
    BTN1 = "\x01" # SOH
    BTN2 = "\x02" # STX
    BTN3 = "\x03" # ETX
    BTN4 = "\x04" # EOT
    BTN5 = "\x05" # ENQ

    @dp.message()
    async def welcome(message: Message):
    kb = InlineKeyboardMarkup(inline_keyboard=[
    [InlineKeyboardButton(text="Кнопка 1", callback_data=BTN1),
    InlineKeyboardButton(text="Кнопка 2", callback_data=BTN2)],
    [InlineKeyboardButton(text="Кнопка 3", callback_data=BTN3),
    InlineKeyboardButton(text="Кнопка 4", callback_data=BTN4)],
    [InlineKeyboardButton(text="Кнопка 5", callback_data=BTN5)],
    ])
    await message.answer("Выбери кнопку:", reply_markup=kb)

    @dp.callback_query(F.data == BTN1)
    async def press1(call: CallbackQuery):
    await call.message.answer("Нажата кнопка 1")
    await call.answer()

    @dp.callback_query(F.data == BTN2)
    async def press2(call: CallbackQuery):
    await call.message.answer("Нажата кнопка 2")
    await call.answer()

    @dp.callback_query(F.data == BTN3)
    async def press3(call: CallbackQuery):
    await call.message.answer("Нажата кнопка 3")
    await call.answer()

    @dp.callback_query(F.data == BTN4)
    async def press4(call: CallbackQuery):
    await call.message.answer("Нажата кнопка 4")
    await call.answer()

    @dp.callback_query(F.data == BTN5)
    async def press5(call: CallbackQuery):
    await call.message.answer("Нажата кнопка 5")
    await call.answer()

    async def main():
    await dp.start_polling(bot)

    if __name__ == "__main__":
    asyncio.run(main())

    В коде - код - название

    "\x01" - 0x01 - SOH
    "\x02" - 0x02 - STX
    "\x03" - 0x03 - ETX
    "\x04" - 0x04 - EOT
    "\x05" - 0x05 - ENQ
    "\x06" - 0x06 - ACK
    "\x07" - 0x07 - BEL
    "\x08" - 0x08 - BS
    "\x09" - 0x09 - TAB
    "\x0a" - 0x0A - LF
    "\x0b" - 0x0B - VT
    "\x0c" - 0x0C - FF
    "\x0d" - 0x0D - CR
    "\x0e" - 0x0E - SO
    "\x0f" - 0x0F - SI
    "\x10" - 0x10 - DLE
    "\x11" - 0x11 - DC1
    "\x12" - 0x12 - DC2
    "\x13" - 0x13 - DC3
    "\x14" - 0x14 - DC4
    "\x15" - 0x15 - NAK
    "\x16" - 0x16 - SYN
    "\x17" - 0x17 - ETB
    "\x18" - 0x18 - CAN
    "\x19" - 0x19 - EM
    "\x1a" - 0x1A - SUB
    "\x1b" - 0x1B - ESC
    "\x1c" - 0x1C - FS
    "\x1d" - 0x1D - GS
    "\x1e" - 0x1E - RS
    "\x1f" - 0x1F - US
    "\x7f" - 0x7F - DEL
    Итого 32 штуки для одиночных символов. Если нужно больше кнопок, то можно по совмещать по 2 кода(не более): \x01\x01, \x01\x02 и т.д., это даёт 32×32 = 1024 варианта, и всё влезает в лимит Telegram, а именно: 64 байта на callback_data

    Юзайте, пока Дуров не запретил непечатные символы в кнопках.:obmusic:

    [IMG]<--ТОТ САМЫЙ СКРИН
     
  2. marselshow
    marselshow Mar 24, 2026 18 Jan 4, 2021
    не ново
     
Loading...