Что сделать
- Найди в коде бота все тексты сообщений, подписи к медиа и кнопки.
- К каждому месту подбери иконку по смыслу из списка эмодзи. ID бери только из него, не выдумывай и не бери по памяти.
- В текстах сообщений вставляй эмодзи тегом
<tg-emoji>и отправляй сparse_mode=HTML. - В кнопках, инлайн и обычной клавиатуры, ставь ID в поле
icon_custom_emoji_id. Обычные эмодзи из текста кнопки убери: в кнопках только премиум. - Проверь, что библиотека бота свежая и знает поле
icon_custom_emoji_id.
Требования
- Bot API 9.4 или новее (февраль 2026). В aiogram 3 и python-telegram-bot нужна версия с его поддержкой.
- У владельца бота должен быть Telegram Premium. Без него вместо иконок будут обычные эмодзи.
- Работает в личных чатах, группах и супергруппах.
Сообщения
Формат тега: <tg-emoji emoji-id="ID">эмодзи</tg-emoji>
- В
emoji-idтолько цифры, без приставкиid. - Внутри тега ровно один обычный эмодзи: тот, что стоит первым в строке списка. Его видно там, где премиум не показывается.
- Нужен
parse_mode=HTML, иначе тег придёт текстом. Символы<,>и&в остальном тексте экранируй. - Подписи к фото, видео и файлам работают так же, через
captionиparse_mode=HTML.
@dp.callback_query(F.data == "admin_broadcast")
async def broadcast_callback(callback: CallbackQuery, state: FSMContext):
if callback.from_user.id not in ADMIN_IDS:
await callback.answer("✖️ У вас нет доступа", show_alert=True)
return
await callback.message.edit_text(
'<b><tg-emoji emoji-id="6021418126061605425">📢</tg-emoji> Отправь сообщение, которое нужно разослать всем пользователям.</b>',
parse_mode=ParseMode.HTML,
reply_markup=get_broadcast_keyboard()
)
await state.set_state(BroadcastStates.waiting_for_message)
await callback.answer()Инлайн кнопки
Текст кнопки без эмодзи, иконка в поле icon_custom_emoji_id.
return InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(
text="Подписаться",
url=CHANNEL_LINK,
icon_custom_emoji_id="6039486778597970865"
)],
[InlineKeyboardButton(
text="Проверить подписку",
callback_data="check_subscribe",
icon_custom_emoji_id="5774022692642492953"
)],
])Кнопки клавиатуры
Правило то же: в text без эмодзи, иконка в icon_custom_emoji_id. В aiogram это KeyboardButton(text=..., icon_custom_emoji_id=...).
keyboard = {
"keyboard": [
[
{"text": "Профиль", "icon_custom_emoji_id": "6035084557378654059"}
],
[
{"text": "Настройки", "icon_custom_emoji_id": "6032742198179532882"},
{"text": "Помощь", "icon_custom_emoji_id": "6030848053177486888"}
]
],
"resize_keyboard": True
}Где премиум не работает
- Всплывающие ответы
callback.answer()и алерты: там только обычные эмодзи. - Описание бота, список команд и кнопка меню.
Частые ошибки
emoji-id="id5870...": приставкаidлишняя, только цифры.- Обычный эмодзи в тексте кнопки вместе с
icon_custom_emoji_id: получится две иконки. - Нет
parse_mode=HTML: тег будет виден как текст. - ID придуман или взят из другого пака: иконки не будет. Бери из списка.
- Старая версия библиотеки: поле
icon_custom_emoji_idпотеряется или вызовет ошибку.