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-режим; не удаляйте чужую рабочую настройку ради теста.