Что означает запрос inline_query и как его отправить боту?

Какие функции выполняют хендлеры @router.inline_query() и @router.chosen_inline_result() в библиотеке Aiogram для работы с Telegram API? Как можно вызвать эти хендлеры и какие типы обновлений они обрабатывают?
  • 7 февраля 2024 г. 15:18
Ответы на вопрос 3
`inline_query` в контексте Telegram бота относится к запросу, который пользователь отправляет через интерфейс Telegram, не в приватном чате с ботом, а в любом чате, начиная ввод текста с `@имя_бота` и следующего запроса. Это позволяет ботам отвечать на запросы непосредственно в контексте чата, предлагая различные виды контента, такие как результаты поиска, предложения по автозаполнению и многое другое. Пользователи могут выбирать из представленных ботом вариантов, чтобы отправить их в чат.

Чтобы отправить `inline_query` боту, пользователь должен начать печатать в текстовом поле в любом чате `@имя_бота` и затем ввести свой запрос. Бот затем получит это событие через Telegram Bot API и сможет ответить на него.

Для работы с таким типом запросов в библиотеке Aiogram используются следующие хендлеры:

1. `@router.inline_query()` - Этот хендлер регистрируется для обработки событий `inline_query`, когда пользователь отправляет inline запрос боту. Функция, ассоциированная с этим хендлером, обычно принимает объект `InlineQuery`, и её задача - сформировать и вернуть ответ, который может представлять собой список статей, картинок, видеороликов и других поддерживаемых типов контента.

```python
from aiogram import types

@router.inline_query()
async def inline_handler(inline_query: types.InlineQuery):
    # Здесь код для обработки inline запроса и отправки ответа
    results = [...]  # Список объектов InlineQueryResult
    await inline_query.answer(results)
```

2. `@router.chosen_inline_result()` - Обрабатывает событие `chosen_inline_result`, которое возникает, когда пользователь выбирает один из результатов, предложенных в ответ на `inline_query`. Функция, ассоциированная с этим хендлером, обычно принимает объект `ChosenInlineResult`, который содержит информацию о выбранном результате, включая его уникальный идентификатор.

```python
@router.chosen_inline_result()
async def inline_choice_handler(chosen_inline_result: types.ChosenInlineResult):
    # Здесь код для обработки выбора пользователя
```

Чтобы вызвать эти хендлеры, соответствующие события (`inline_query` и `chosen_inline_result`) должны быть сгенерированы пользователем в Telegram, и после этого эти события будут получены ботом через Telegram Bot API и обработаны зарегистрированными функциями.

Типы обновлений, обрабатываемых этими хендлерами, следующие:
- `inline_query` - обновление для обработки запроса, отправленного пользователем в inline режиме.
- `chosen_inline_result` - обновление, возникающее после того, как пользователь выбрал один из предложенных inline результатов.

Помните о том, что для использования inline режима у бота должен быть включен соответствующий режим, который можно активировать через BotFather в Telegram.
У ботов есть интерфейс, который помогает пользователю написать новое сообщение. Для этого надо ввести в любом чате имя бота в начале (@###bot) и какой-то текст, секунду спустя бот вернёт список вариантов для использования. Например, @vid "текст" сделает поиск видео на YouTube и покажет варианты. Пользователь может выбрать вариант и отправить его в текущий чат, а может не выбрать - бот об этом не узнает. 


Как вариант, можно посмотреть моего бота glagolitic_bot, который помогает писать в чатах глаголицей, тифинагицей, коптицей и ивритицей. Ссылка на исходный код есть в описании бота.

Чтобы бот мог работать в таком режиме, его надо включить у BotFather (Bot Settings - Inline Mode). Надо ещё не забывать, что Телеграм может кэшировать такие подсказки бота.
Inline query - это апдейт, который оправляется боту в момент вызова инлайн-меню (@gif text) 
Chosen inline result - это апдейт, который отлавливает ваш выбор из инлайн-меню (Telegram не рекомендует выставлять в настройках 100% шанс отлавливания)

Для включения inline mode вам нужно обратиться к BotFather, выбрать вашего бота и пройти по следующему пути: Bot Settings > Inline Mode . В данном меню вы можете включить/выключить данный режим, а также выставить текст, который у вас заменит привычный текст в строке ввода "Написать сообщение..." (placeholder)

Для включения chose inline result вам нужно также войти в настройки бота и перейти теперь в " Inline Feedback "

Если вы хотите почитать про инлайн режим в aiogram, то вот вам раздел из книги Груши: *книга*
В принципе там будут все ответы на выше поставленные вопросы
Похожие вопросы