Inline bot telegram что это
Создание Inline-бота, python-telegram-bot в Python.
Базовый пример Telegram бота с режимом встроенных запросов.
В материале рассматривается базовый пример создания Telegram бота на основе библиотеке python-telegram-bot , использующего режим встроенных запросов Телеграмм, а так же обработчика InlineQueryHandler для распознавания этих встроенных запросов.
Пример снабжен подробными комментариями. Сначала определяются несколько функций обработчика. Затем эти функции передаются Диспетчеру и регистрируются в соответствующих местах. Затем бот запускается и работает до тех пор, пока пользователь в командной строке не нажмет Ctrl-C.
Внимание! Изначально, созданный вами бот в @BotFather не поддерживает режим встроенных запросов Телеграмм. Для включения этого режима необходимо снова подключиться к @BotFather , и используя команду /setinline переключить созданного бота во встроенный режим запросов.
Inline Bots
Beyond sending commands in private messages or groups, users can interact with your bot via inline queries. If inline queries are enabled, users can call your bot by typing its username and a query in the text input field in any chat. The query is sent to your bot in an update. This way, people can request content from your bot in any of their chats, groups, or channels without sending any messages at all.
To enable this option, send the /setinline command to @BotFather and provide the placeholder text that the user will see in the input field after typing your bot’s name.
See the Bot API Manual for the relevant methods and objects.
Inline results
Inline bots support all types of content available in Telegram (20 in all). They are capable of sending stickers, videos, music, locations, documents and more.
Clients can display the results with vertical or horizontal scrolling, depending on the type of content:
Switching inline/PM modes
You can display a special ‘Switch to PM’ button above the inline results (or instead of them). This button will open a private chat with the bot and pass a parameter of your choosing, so that you can prompt the user for the relevant setup actions. Once done, you can use an inline keyboard with a switch_inline_query button to send the user back to the original chat.
Sample bots
@youtube – Shows a ‘Sign in to YouTube’ button, then suggests personalized results.
Location-based results
Inline bots can request location data from their users. Use the /setinlinegeo command with @BotFather to enable this. Your bot will ask the user for permission to access their location whenever they send an inline request.
Spreading virally
When a user taps on the bot username in the message header, the mention is automatically inserted into the input field. Entering the @ symbol in the input field brings up a list of suggestions, featuring recently used inline bots.
Collecting feedback
To know which of the provided results your users are sending to their chat partners, send @Botfather the /setinlinefeedback command. With this enabled, you will receive updates on the results chosen by your users.
Please note that this can create load issues for popular bots – you may receive more results than actual requests due to caching (see the cache_time parameter in answerInlineQuery). For these cases, we recommend adjusting the probability setting to receive 1/10, 1/100 or 1/1000 of the results.
Inline bot samples
Here are some sample inline bots, in case you’re curious to see one in action. Try any of these:
@gif – GIF search
@vid – Video search
@pic – Yandex image search
@bing – Bing image search
@wiki – Wikipedia search
@imdb – IMDB search
@bold – Make bold, italic or fixed sys text
Инлайн-боты
Чтобы включить эту возможность, отправьте команду /setinline пользователю @BotFather и укажите текст-подсказку, который будет отображаться в поле ввода при наборе пользователем имени вашего бота.
Результаты инлайн-запросов
Встроенные боты могут отображать любые данные, доступные в Telegram (19 штук): фильмы, аудиозаписи, стикеры и т. д.
Приложения Telegram могут отображать встроенные результаты как с горизонтальной, так и с вертикальной прокруткой, в зависимости от типа результата.
Как только пользователь нажмёт на предложенный результат, он сразу же отправится в чат, а поле ввода будет очищено.
Переключение между инлайн-режимом и чатом
Ваш бот может отобразить кнопку перехода в личный чат над результатами запроса или вместо них. После перехода и выполнения настроек возможен переход обратно в тот чат, откуда пришёл пользователь с помощью встроенной клавиатуры и метода switch_inline_query
Пример
@youtube — Предлагает войти в аккаунт YouTube, чтобы отобразить персонализированные результаты.
Геоориентированные сервисы
Инлайн-боты могут запрашивать у пользователей их геолокацию. Для включения этой возможности отправьте @BotFather команду /setinlinegeo . После этого ваш бот будет спрашивать у пользователя разрешение на использование его местоположения при каждом запросе во встроенном режиме.
Пример
@foursquare — этот бот будет запрашивать местоположение пользователя для поиска мест поблизости.
Вирусное распространение
Сбор статистики
Чтобы узнать, какие именно результаты из предоставленных вашим ботом предложений пользователи отправляют чаще всего, отправьте боту @Botfather команду /setinlinefeedback . После этого вы будете получать обновления с результатами, выбранными вашими пользователями.
Обратите внимание: в популярных ботах эта функция может вызвать существенную нагрузку из-за кэширования (см. параметр cache_time в answerInlineQuery). Чтобы избежать этого, рекомендуется устанавливать настройку вероятности в 1/10, 1/100 или 1/1000 от результатов.
Примеры инлайн-ботов
Вот небольшой список ботов, работающих в инлайн-режиме. Попробуйте:
-
– поиск GIF – поиск видео – поиск изображений от Яндекс – поиск изображений от Bing – поиск статей в Wikipedia – поиск фильмов в IMDB – форматирование текста
Сайт про Telegram на русском (неофициальный).
Здесь собраны приложения на базе MTProto, переведена некоторая документация с официального сайта, а также работает Webogram.
Когда пользователь вызывает бота в инлайн-режиме, введя его юзернейм в поле ввода, бот получает апдейт с типом InlineQuery, из которого нам важно поле from ( from_user в aiogram), содержащее тип User с информацией о юзере, вызвавшем бота, а также поле query , т.е. текст запроса (может быть пустым). К сожалению, в настоящий момент нет возможности узнать, в каком чате был вызван инлайн-бот, вероятно, это сделано специально для повышения приватности пользователей, т.к. бота необязательно добавлять в группу или канал, чтобы использовать его в инлайн-режиме.
Для ответа на запрос необходимо вызвать метод answerInlineQuery, куда следует передать массив объектов-результатов, и дополнительно различные флаги, о которых поговорим чуть позже. Типов объектов-результатов аж целых двадцать, однако многие из них являются вариациями друг друга. Так, например, InlineQueryResultPhoto содержит ссылку (URL) на изображение, а InlineQueryResultCachedPhoto — file_id уже загруженного в Telegram изображения. Более того, рекомендуется использовать объекты одного типа в инлайн-ответе, поскольку клиентские приложения некорректно отображают (или не отображают вовсе) смешанный контент.
Обратите внимание: в инлайн-режиме нельзя загружать новые медиафайлы в Telegram, только использовать уже имеющиеся в облаке, либо указывать URL из Интернета.
Одним из наиболее часто используемых типов объектов-результатов является InlineQueryResultArticle — просто текст. Рассмотрим основные элементы такого объекта внимательнее:
Цифрами на рисунке выше обозначены: 1 — заголовок объекта; 2 — описание; 3 — предпросмотр; 4 — ссылка, по которой перейдёт пользователь если нажмёт на (3). Всё, кроме (1) необязательно, но позволяет визуально разнообразить выдаваемые результаты. Но что отправится в чат, если нажать не на предпросмотр, а на то, что справа от него? Для этого существует тип InputMessageContent, представленный четырьмя подтипами: Текст, Геолокация, Достопримечательность (Venue) и Контакт. В самом простом случае, пользователь видит такой список ссылок, нажимает на один из элементов и получает текст, указанный в InputTextMessageContent.
Сложно? Но и это ещё не всё! InputMessageContent можно использовать и с другими типами инлайн-объектов, например, выдавать пользователю в ответ стикеры, а при нажатии отправлять ссылку на весь стикерпак. Или описание фильма при нажатии на обложку в инлайн-режиме. Экспериментируйте!
Пишем бота¶
От теории — к практике. Опишем суть будущего бота: пользователь в диалоге с ботом добавляет (или обновляет) ссылку на видео с YouTube и указывает собственное описание. Далее в любом другом чате он вызывает бота в инлайн-режиме, выбирает в списке одно из сохранённых ранее видео и отправляет его. Дополнительно можно ввести текст, по наличию которого результаты будут отфильтрованы. Разумеется, у каждого юзера должен быть свой собственный набор сохранённых ссылок.
Предупреждение об используемых технологиях
Поскольку главная цель этой главы — рассказать об инлайн-режиме, то сопуствующие детали, такие как реализация работы с базой данных и хранилищем FSM, будут сознательно упрощены и/или не упомянуты в тексте. Так, например, в качестве FSM будет использован MemoryStorage, а в роли СУБД подойдёт и SQLite. В реальности рекомендуется использовать персистентное хранилище FSM (напр. Redis) и более продвинутую СУБД (напр. PostgreSQL), а также отдельный поисковый движок (ElasticSearch, Sonic. ).
Хранение данных¶
Исходя из приведённого выше «техзадания», сделаем вывод, что каждое сохранённое видео можно описать тремя обязательными сущностями: Telegram ID пользователя, идентификатор YouTube-видео (извлекается из URL) и пользовательское описание. Первые два элемента образуют первичный ключ, что даёт ограничение уникальности для каждой пары «Telegram_ID + YouTube_ID». Описание таблицы в БД выглядит следующим образом:
Ранее мы договорились, что не будем особо рассматривать работу с БД, и сконцетрируемся на особенностях инлайн-режима, однако две функции всё же стоит рассмотреть для дальнейшего понимания. Первая — добавление ссылки с описанием в базу данных. Здесь можно применить один трюк, называемый "UPSERT", т.е. Insert or Update. Дело в том, что, сформировав SQL-запрос специальным образом, можно при вставке данных (Insert) в случае нарушения уникальности не выбрасывать ошибку, а неявно обновлять затронутую строку (Update). Посмотрите на следующий кусок кода. В нём мы пытаемся добавить новую строку в базу данных, однако если указанная пара «Telegram_ID + YouTube_ID» уже существует, то вместо вставки обновляется описание ( description ):
Вторая важная функция — получение списка ссылок. Поскольку пользователь может захотеть отфильтровать выдачу, появляется второй необязательный аргумент search_query . При его наличии в конец SQL-запроса будет добавлен поиск подстроки с ключевым словом LIKE . Вспомним, что в реальных условиях такой подход вряд ли сгодится из-за низкой эффективности и точности поиска, но для демонстрации будет достаточно:
Switch-кнопки¶
Просмотр и удаление ссылок в личке с ботом делается элементарно, а добавление организуется с помощью простейшего конечного автомата (подробнее о механизме FSM можно узнать в предыдущей главе). Здесь стоит обратить внимание на последний шаг, когда идёт непосредственно добавление записи и подтверждение юзеру:
Обработка инлайн-запроса¶
Перейдём непосредственно к обработке запроса от юзера к боту в инлайн-режиме. В некоторых случаях удобно делать отдельный хэндлер на пустой запрос (когда длина текста в поле query объекта InlineQuery равно нулю) и показывать какой-нибудь «общий» ответ или приглашение перейти к боту, однако в нашем случае любой, даже пустой запрос, требует обращения к БД, поэтому объединим оба случая в одном хэндлере. Рассмотрим первый вариант: у пользователя нет сохранённых ссылок или он ввёл запрос, по которому ничего не нашлось. Смотрим код:
Автор этих строк однажды забыл указать флаг is_personal в его боте @my_id_bot, выставил кэш на 86400 секунд (1 сутки) и выслушал много возмущений от пользователей, отправлявших его ID вместо их собственных. Учитесь на чужих ошибках, не на своих.
Теперь рассмотрим второй случай: по запросу пользователя нашлись какие-то ссылки. Сформируем массив объектов-результатов типа InlineQueryResultArticle:
Итого полный текст инлайн-обработчика будет выглядеть следующим образом:
А вы знали, что, имея YouTube-хэш, можно легко получить различные превью к видео? Если нет, то добро пожаловать в этот чудесный пост на StackOverflow.
Switch туда и обратно¶
Как мы уже выяснили чуть выше, switch_pm_parameter подставляется как start-параметр с переходом в личку с ботом (на языке Bot API это называется Deep Linking). А у нашего бота на команду /add навешан трёхэтапный процесс добавления ссылки (в этом тексте не рассматривается, см. исходники к главе). Пускай тот же процесс вызывается ещё и по Deep-линку /start add , для этого зарегистрируем первый этап добавления ссылки по двум разным триггерам:
На этом с ботом всё, исходные тексты к главе смотрите в репозитории, доступным по нажатию на кнопку в правом верхнем углу. Но прежде, чем закончить с инлайн-режимом, надо рассмотреть ещё пару интересных особенностей.
Дополнительные материалы¶
Подгрузка результатов¶
Теперь давайте перепишем наш инлайн-хэндлер таким образом, чтобы при приближении к концу текущего списка запрашивать продолжение. Для этого в начале проверяем поле offset и ставим его равным единице, если оно пустое. Далее генерируем фейковый список результатов. Если на выходе ровно 50 объектов, то в ответе указываем next_offset равный текущему значению + 50. Если объектов меньше, то его делаем пустой строкой, чтобы Telegram больше не присылал запросы боту.
По мере листания инлайн-результатов, бот будет получать запросы и возвращать всё новые и новые результаты, пока не дойдёт до 195-го элемента, дальше запросы прекратятся.
Сбор статистики¶
Мало кто знает, но Telegram позволяет собирать простенькую статистику по использованию бота в инлайн-режиме. Для начала требуется включить соответствующую настройку у @BotFather: /mybots - (выбрать бота) - Bot Settings - Inline Feedback:
Числа на кнопках означают вероятность получения события ChosenInlineResult при выборе пользователем какого-либо объекта в инлайн-режиме. Так, например, если выставлено значение 10%, то при каждом выборе объекта существует вероятность в десять процентов получить событие ChosenInlineResult в боте. Выставлять значение 100% Telegram не рекомендует из-за удвоения нагрузки на бота. Таким образом, для сколько-нибудь серьёзной аналитики подобная фича не подходит, но в умелых руках и за большой период времени может дать общее представление о наиболее полезных инлайн-результатах. Пример хэндлера на подобные события:
Очередная подборка ботов, но на этот раз инлайн ботов телеграм, для применения в чатах. Да, это те самые телеграм боты, вызвать которых можно прямо в группу. Если так и не понимаете о чем же идёт речь, то прямо в группе пишем @gif ставим пробел и теперь есть возможность задать название для поиска и отправки гифок в чат.
Ну вот, надеюсь теперь стало всё понятно! Подключать данные боты не нужно, они уже встроены в ваш Telegram клиент, так что вы сразу же можете приступить к тестированию инлайн запросов. Предлагаю ниже, без лишней воды, пробежаться по списку инлайн ботов, известных мне на сегодняшний день.
Если вам интересна криптовалюта, обязательно заходите на мой Telegram канал. Там я публикую интересные сценарии поведения рынка. Где и куда лучше зайти, когда выйти. Очень полезно, а главное бесплатно!
Инлайн боты Telegram
Многие инлайн боты в чатах Telegram уже не работают, хотя раньше я их постоянно использовал.
Также читайте об инлайн ботах на офицальном сайте Telegram
Возможно вас заинтересует моя еще одна подборка: Telegram боты для пробива инфы. Я буду очень рад, если вы добавите в комментарии то, что я мог пропустить. Это было бы здорово!
Каналы и чаты в Telegram
Дневник Джека если вы любите криптовалюты, то этот Telegram канал для вас. Только дельные советы, когда купить, что купить, какие монеты лучше, всё это и не только на моем телеграм канале. А самое главное как всегда бесплатно
Чат Криптовалюта все любители криптовалют добро пожаловать!
Канал HYIP PW специально для админов HYIP-проектов, да и не только. я там публикую все свои секреты :)
Чат HYIP если вам знакомы такие вещи как H-Script, GoldCoders, HSbuilder ждём вас в нашем чате HYIP админов.
Для решения этой, с виду не такой уж простой, задачи надо добавить нашего бота в канал, как администратора. Чтобы сделать это, я, на своей текущей версии телеграма, перехожу в админку канала и добавляю туда своего бота из вышеуказанной статьи. Переходим в управление группой -> administrators
Тыкаем туда, после чего указываем ник нашего бота и добавляем.
Куда прописывать? Да прямо между $bot = new \TelegramBot\Api\Client($token,null); и $bot->run(); впишите. В смысле примерно так, как на картинке.
Теперь ничего не стоит добавить вызов страницы бота в, например, CURL и получить отложенный постинг для канала.
Теперь достаточно обратиться к файлу index.php с get параметрами вида index.php?bname=revcombot, чтобы получить результат.
Для начала о каких кнопках идет речь. Вот на картинке вы видите их:
Как вывести такие кнопки используя telegram-bot/api? Вообще, это весьма обширная тема, я чуть ли не два часа потратил на эти гребаные кнопки и попытки их осилить. Выводятся они следующим кодом:
То есть по команде /ibutton вылезут к нам две кнопки Answer и ОтветЪ. С выводом разобрались, теперь нам надо их обработать. Делается все так:
Вот и все. Собственно, вот результат работы этой функции:
Обработка reply-кнопок
У людей возникает вопрос: как вывести эти кнопки? На самом деле это весьма просто сделать.
Ну и, собственно, если на любую из этих кнопок ткнуть, получим результат.
Обработка inline-запросов
Как сделать в своем боте такую-же фичу?
На самом деле эта задачка заставила меня попотеть изрядно. Я перелопатил половину буржунета и весь код долбаной библиотеки telebram-bot/api . Однако, решение все-таки нашел, к счастью.
Подготовка бота
Вот ТЕПЕРЬ можно начинать написание кода.
Собственно в библиотеке бота есть метод $bot->inlineQuery(), именно он отвечает за обработку контекстных запросов. Но как заставить его работать? Оказывается у каждого поля, отправляемого в результат запроса свой формат + для некоторых полей надо данные готовить заранее. Однако я все прокомментировал, так что разобраться с этим функционалом вы сможете в два счета. А вот мне пришлось чуть ли не в слепую угадывать что и куда ставить из-за отсутствия вменяемой документации к библиотеке.
Как это сработает в боте? Смотрим.
Надеюсь, я смог решить вашу проблему.
Исходники
Разумеется, важно выложить исходники бота. Если не хотите все перечитывать, просто скачайте их и тестируйте.
RevcomBot исходникиЧитайте также: