SmartQuery /ВОПРОС → ПРИМЕР → ПОНЯТНЫЙ ОТВЕТ
Языки и платформы

Inline-запросы в aiogram 3: обработчик, результат и кеш

Inline-бот получает запрос, когда пользователь вводит его имя и текст в поле сообщения другого чата. Обработчик возвращает варианты, а выбранный пользователем результат отправляется в этот чат. Это не то же самое, что inline-кнопка с callback_query под обычным сообщением.

Подготовка режима

Включите inline-режим своего тестового бота через /setinline у BotFather. Установите согласованную версию aiogram 3.x и передайте токен через BOT_TOKEN. Старые dp.inline_handler() и Dispatcher(bot) относятся к API 2.x.

Полный пример: текст как один вариант ответа

import asyncio
import hashlib
import os
from aiogram import Bot, Dispatcher, Router
from aiogram.types import (
    InlineQuery, InlineQueryResultArticle, InputTextMessageContent,
)

router = Router()

@router.inline_query()
async def inline_text(query: InlineQuery):
    text = query.query.strip()
    if not text:
        await query.answer([], cache_time=1, is_personal=True)
        return
    result = InlineQueryResultArticle(
        id=hashlib.sha256(text.encode("utf-8")).hexdigest()[:32],
        title="Отправить этот текст",
        description=text[:80],
        input_message_content=InputTextMessageContent(
            message_text=text, parse_mode=None,
        ),
    )
    await query.answer([result], cache_time=1, is_personal=True)

async def main():
    dispatcher = Dispatcher()
    dispatcher.include_router(router)
    await dispatcher.start_polling(Bot(token=os.environ["BOT_TOKEN"]))

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

Обычный текст передаётся без HTML/Markdown-разбора. Идентификатор результата стабилен для одинакового текста, а description сокращает только превью. В пустом запросе возвращается пустой список. Проверяйте на собственном тестовом чате: ввод запроса ещё не означает выбор и отправку результата.

Кеш и приватность

cache_time задаёт время кеширования ответа Telegram, а is_personal ограничивает использование кеша конкретным пользователем. Для персональных результатов не используйте общий кеш без анализа утечки данных. Не помещайте секреты в title/description и не пишите полный inline-query в журнал по умолчанию.

При подключении базы или внешнего поиска

  • Ограничьте время ожидания источника и число результатов; обработчик должен отвечать и при пустом поиске.
  • Проверяйте права до выдачи персонального результата, а не после того, как пользователь его выбрал.
  • Используйте параметризованные запросы; текст пользователя — данные, а не готовая SQL-команда.
  • Оставьте один polling-процесс на токен или настройте согласованный webhook-режим; не удаляйте чужую рабочую настройку ради теста.

Документация