Что такое inline запрос

Инлайн-боты

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Помимо отправки команд боту напрямую, пользователи могут использовать вашего бота через инлайн-запросы. Если режим инлайн запросов включён, пользователи смогут обращаться к вашему боту, написав его юзернейм и ключевое слово в поле отправки сообщений в любом чате, группе или канале. Таким образом происходит запрос к боту без непосредственной отправки ему сообщений.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Чтобы включить эту возможность, отправьте команду /setinline пользователю @BotFather и укажите текст-подсказку, который будет отображаться в поле ввода при наборе пользователем имени вашего бота.

Результаты инлайн-запросов

Встроенные боты могут отображать любые данные, доступные в Telegram (19 штук): фильмы, аудиозаписи, стикеры и т. д.

Приложения Telegram могут отображать встроенные результаты как с горизонтальной, так и с вертикальной прокруткой, в зависимости от типа результата.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Как только пользователь нажмёт на предложенный результат, он сразу же отправится в чат, а поле ввода будет очищено.

Переключение между инлайн-режимом и чатом

Ваш бот может отобразить кнопку перехода в личный чат над результатами запроса или вместо них. После перехода и выполнения настроек возможен переход обратно в тот чат, откуда пришёл пользователь с помощью встроенной клавиатуры и метода switch_inline_query

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Пример

@youtube — Предлагает войти в аккаунт YouTube, чтобы отобразить персонализированные результаты.

Геоориентированные сервисы

Пример

@foursquare — этот бот будет запрашивать местоположение пользователя для поиска мест поблизости.

Вирусное распространение

Сообщения, отправленные с помощью вашего бота, будут содержать пометку с его именем пользователя рядом с именем отправителя.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Когда пользователь нажимает на юзернейм бота в заголовке сообщения, оно автоматически копируется в поле ввода сообщения. Ввод символа @ в поле ввода сообщения вызовет список недавно использованных ботов.

Сбор статистики

Обратите внимание: в популярных ботах эта функция может вызвать существенную нагрузку из-за кэширования (см. параметр cache_time в answerInlineQuery). Чтобы избежать этого, рекомендуется устанавливать настройку вероятности в 1/10, 1/100 или 1/1000 от результатов.

Примеры инлайн-ботов

Вот небольшой список ботов, работающих в инлайн-режиме. Попробуйте:

Сайт про Telegram на русском (неофициальный).

Здесь собраны приложения на базе MTProto, переведена некоторая документация с официального сайта, а также работает Webogram.

Источник

Бот для telegram на php. Отложенный постинг, кнопки, инлайн-запросы.

В общем-то, эта статья является дополнением этой — Пишем бота для Telegram на php, так-что если вы попали сюда впервые — советую, для начала, прочитать ее.

Здесь я отвечу читателям на ряд вопросов, которые мне были заданы тут на блоге, см комментарии в указанном выше посте. В общем и целом, все варианты тут будут приведены на php, однако ничто не мешает вам использовать так-же и C# тоже, да и любой другой язык.

Как, используя бота, публиковать новости в свой канал

Поясню для читателя, что такое канал. Канал, это что-то вроде паблика вк, на нем нельзя общаться, но можно читать, что пишет автор этого самого канала. Как пример — Красные Котлеты — это мой личный канал, подписывайтесь, к стати. Ну, если мои взгляды (анархо-коммунист) разделяете, разумеется.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Тыкаем туда, после чего указываем ник нашего бота и добавляем.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

А тут, на самом деле, ничего сложно нет. Фича именно что не очевидная, для многих. Сейчас поясню. По идее нам надо отправлять в канал сообщения через метод $bot->sendMessage(), однако, первый аргумент этого метода требует наличия некоего ID чата, в который отсылается сообщение. В случае с чатами, конфами и прочей фигней эти самые ID — цифровые, как у групп в VK, а вот в случае с каналами такие ID соответствуют названию самих каналов. Поэтому чтобы отослать в канал «Красные котлеты» сообщение «Тест» сгодится такой код:

Куда прописывать этот код? Да прямо между $bot = new \TelegramBot\Api\Client($token,null); и $bot->run(); впишите. В смысле примерно так, как на картинке.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Как запустить? Да легко, переходим на страничку с вашим ботом и руками нажимаем там F5(обновить).

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запросНу и, собственно, вот результат работы данной команды —

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Теперь ничего не стоит добавить вызов данной страницы в, например, CURL и получить отложенный постинг. Разберетесь. Так-же был вопрос — как сделать, чтобы бот публиковал в канал по команде, или публиковал в несколько каналов. — Запросто — используйте банальные GET параметры, вот как примерно в этом наброске кода:

Теперь достаточно обратиться к файлу index.php с get параметрами вида index.php?bname=revcombot. Дальше, думаю, сами разберетесь.

Как вывести кнопки после сообщения и обработать их

Для начала о каких кнопках идет речь. Вот на картинке вы видите их:

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Как вывести такие кнопки используя telegram-bot/api? Вообще это весьма обширная тема, я чуть ли не два часа потратил на эти гребаные кнопки и попытки их осилить. Выводятся они следующим кодом:

То есть по команде /ibutton вылезут к нам две кнопки Answer и ОтветЪ. С выводом разобрались, теперь нам надо их обработать. Это очень сложная часть всей свистопляски, которая отняла у меня изрядно времени. Делается все так:

Вот и все. Собственно, вот результат работы этой функции:

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Как вы видите — все отлично работает. Ну и вторая кнопка для большей… полноты материала.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Как вы видите так — тоже можно.

Обработка reply-кнопок

Если вы работали с botfater’ом то видели там такую панельку из кнопок, примерно:

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

То есть этот вид кнопок появляется не под сообщением, а под вашим текстовым полем. Как вывести эти кнопки? Вот код —

Тут задается команда /buttons после которой и появляются эти команды. Как обработать? На самом деле никакой особой обработки эти кнопки не требуют, в смысле их надо обрабатывать как обычные текстовые сообщения. В данном случае, я сделал это через метод on()

Ну и, собственно, если на любую из этих кнопок ткнуть, получим результат.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Обработка inline-запросов

Что такое inline запрос у telegram? Хм, на словах будет сложно объяснить, лучше покажу. Есть у нас бот, очень популярный — @vkmusic_bot, он выполняет поиск музыки по вконтакте. И его можно вызывать в любом месте телеграма. Просто прописываем его название и следом — название трека, который надо найти. Это и есть inline запрос.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Как сделать в своем боте такую-же фичу?

На самом деле эта задачка заставила меня попотеть изрядно. Я перелопатил половину буржунета и весь код долбаной библиотеки telebram-bot/api, отдебажил там все ключевые функции и только потом смог найти нормальный ответ. И знаете что? Вам, таки, повезло что я его нашел!

Подготовка бота

Не только лишь все боты могут обрабатывать inline запросы, а только те, в которых автор включил эту фичу. Идем на botfather’а и выполняем там команду /setinline, и выбираем бота. Вылезет что-то типа того:

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Думаете все, режим включился? А вот фиг там было! Нам надо передать в botfather’а форму инлайн команды, примерно так: @revcom_bot тестовый inline ответ

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Вот ТЕПЕРЬ можно начинать написание кода.

Собственно в библиотеке бота есть метод $bot->inlineQuery(), именно он отвечает за обработку контекстных запросов. Но как заставить его работать? Оказывается у каждого поля, отправляемого в результат запроса свой формат + для некоторых полей надо данные готовить заранее. Однако я все прокомментировал, так что разобраться с этим функционалом вы сможете в два счета. А вот мне пришлось чуть ли не в слепую угадывать что и куда ставить из-за отсутствия вменяемой документации к библиотеке.

Как это работает в боте? Смотрим.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Проверить как это работает во всех трех случаях вы сможете прямо в telegram’е, ну а тут выведу вам результат теста только одного варианта с отрывком поэмы Сергея Есенина.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Надеюсь я смог решить вашу проблему.

Исходники

Разумеется, важно выложить исходники бота. Если не хотите все перечитывать, просто скачайте их и тестируйте.

Желающие могут поиграться с демонстрационным ботом тут — revcom_bot

Источник

Inline variables

Введение

Описание и примеры

Эволюция термина inline

One definition rule и как его нарушить?

Функции и переменные, объявленные inline, могут быть определены в программе несколько раз.
Это, по сути, исключение из правила одного определения. ODR говорит, что вы можете определить только один раз функции, переменные, классы, перечисление и т. д.
ODR должен выполняться не только на уровне единицы трансляции, но и на уровне программы.

Встроенные функции и переменные являются исключением из правила одного определения: они могут быть определены несколько раз в программе (несколько раз в программе, но только единожды в одной единице трансляции).

Давайте рассмотрим пару примеров: использование inline при объявлении и инициализации глобальных констант и использование inline при объявлении и инициализации статических полей класса.

Глобальные константы

Часто определенные символьные константы могут быть использованы в разных частях программы (а не только в одном месте). Это могут быть физические или математические константы, которые не изменяются (например, число Пи или число Авогадро), или специфические для приложения значения (например, коэффициенты трения или гравитации). Вместо того чтобы переопределять эти константы в каждом файле, который нуждается в них, лучше объявить их один раз в одном месте и использовать везде, где это необходимо. Тогда, если вам когда-либо понадобится изменить их, вам нужно будет изменить их только в одном месте.

Немного про линковку

В единицу трансляции включены файл реализации (.c/.cpp) и все его заголовочные файлы (.h/.hpp).
Если внутри единицы трансляции у объекта или функции есть внутреннее связывание, то этот символ виден компоновщику только внутри этой единицы трансляции. Если же у объекта или функции есть внешнее связывание, то компоновщик сможет видеть его при обработке других единиц трансляции. Использование ключевого слова static в глобальном пространстве имен дает символу внутреннее связывание. Ключевое слово extern дает внешнее связывание.
Компилятор по умолчанию дает символам следующие связывания:

Non-const глобальные переменные — внешнее связывание;

Const глобальные переменные — внутреннее связывание;

Функции — внешнее связывание.

Глобальные константы как переменные с внутренним связыванием

Один из способов сделать это:

Создайте заголовочный файл для хранения этих констант.

Внутри этого заголовочного файла определите пространство имен.

Добавьте все ваши константы в пространство имен (убедитесь, что они constexpr).

#include вашего заголовочного файла везде, где это нужно.

И используйте ваши константы:

Глобальные константы с внешним связыванием

Вышеприведенный метод имеет несколько потенциальных недостатков.Это легко использовать, но каждый раз, когда мы включаем заголвочный файл с константами в файл с кодом, каждая из этих переменных копируется в файл с кодом. Поэтому, если constants.h включается в 20 различных файлов кода, каждая из этих переменных дублируется 20 раз. Header guard не предотвратит это, так как она предотвращает только включение заголовка более одного раза в один cpp-файл, а не в несколько разных файлов с кодом. Это создает две проблемы:

Изменение одной константы потребует перекомпиляции каждого файла, используеющего константы, что делает компиляцию долгой для крупных проектов.

Если константы имеют большой размер и не могут быть оптимизированы, это приведёт к нежелательному расходу памяти.

Можем использовать их:

Теперь константы будут создаваться только один раз (в constants.cpp), а не один раз каждый раз при включении constants.h, и все использования будут просто ссылаться на версию в constants.cpp. Любые внесенные изменения в constants.cpp потребуют только перекомпиляции constants.cpp.
Однако у этого метода есть несколько недостатков. Во-первых, эти константы теперь могут считаться константами времени компиляции только в файле, в котором они фактически определены (constants.cpp), а не где-либо еще. Это означает, что вне constants.cpp они не могут быть использованы нигде, где требуется постоянная времени компиляции. Во-вторых, оптимизировать их использование компилятору сложнее.
Учитывая вышеперечисленные недостатки, хочется определять константы в заголовочном файле.

Глобальные константы как inline переменные

Все определения встроенной переменной должны быть идентичны (в противном случае, это приведёт к неопределенному поведению).

Определение встроенной переменной должно присутствовать в любом файле, использующем переменную.

Мы можем включать constants.h в любое количество cpp-файлов, но эти переменные будут созданы только один раз и совместно использоваться во всех файлах с кодом.

Инициализация статических полей класса

Рассмотрим класс со статическим полем. В C++14 вам нужно сначала объявить его в классе:

А затем определить его в отдельном блоке компиляции:

В C++14 определение переменной в классе приведет к ошибке во время компиляции. Однако в C++17 можно так:

Определение вне класса также возможно:

Замечания

Ещё раз подчеркну: все определения встроенной функции или переменной во всей программе должны быть идентичны. Нарушение этого правила приведёт к неопределённому поведению.

Статическая переменная-член (но не переменная пространства имен), объявленная constexpr, неявно является встроенной переменной.

Но почему же мы не сталкиваемся с проблемами при определении функций в заголовочных файлах классов?

На самом деле для функций всё сказанное выше тоже актуально, но компилятор облегчает нам задачу, самостоятельно расставляя слово inline в нужных местах. А если точнее:

Функция, определенная полностью внутри определения класса/структуры/объединения, неявно является встроенной функцией.

Функция, объявленная constexpr, неявно является встроенной функцией.

Удаленная функция неявно является встроенной функцией: ее определение (=delete) может отображаться в нескольких единицах трансляции.

Ссылки

При подготовке статьи, кроме материалов, на которые я ссылался в тексте, использовались:

В преддверии старта курса, приглашаем всех желающих записаться на бесплатный демоурок по теме: «Полезные инструменты в разработке на С++».

Источник

Всё, о чём должен знать разработчик Телеграм-ботов

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Вы вряд ли найдете в интернете что-то про разработку ботов, кроме документаций к библиотекам, историй «как я создал такого-то бота» и туториалов вроде «как создать бота, который будет говорить hello world». При этом многие неочевидные моменты просто нигде не описаны.

Как вообще устроены боты? Как они взаимодействуют с пользователями? Что с их помощью можно реализовать, а что нельзя?

Подробный гайд о том, как работать с ботами — под катом.

Начало работы

Telegram API vs Telegram Bot API

Рассказываю по порядку.

Телеграм использует собственный протокол шифрования MTProto. MTProto API (он же Telegram API) — это API, через который ваше приложение Телеграм связывается с сервером. Telegram API полностью открыт, так что любой разработчик может написать свой клиент мессенджера.

Для написания ботов был создан Telegram Bot API — надстройка над Telegram API. Перевод с официального сайта:

Чтобы использовать Bot API, вам не нужно ничего знать о том, как работает протокол шифрования MTProto — наш вспомогательный сервер будет сам обрабатывать все шифрование и связь с Telegram API. Вы соединяетесь с сервером через простой HTTPS-интерфейс, который предоставляет простую версию Telegram API.

Среди упрощений Bot API: работа через вебхуки, упрощенная разметка сообщений и прочее.

Почему-то мало кто знает о том, что боты могут работать напрямую через Telegram API. Более того, таким образом можно даже обойти некоторые ограничения, которые даёт Bot API.

Вся информация ниже будет по умолчанию относиться и к Bot API, и к Telegram API. О различиях я буду упоминать. От некоторых ограничений Bot API можно избавиться с помощью локального сервера, об этом в конце статьи.

На чём пишут Телеграм-ботов

Бот должен уметь отправлять запросы Телеграм-серверу и получать от него апдейты (updates, обновления).

Как получать апдейты в Bot API

Получать апдейты можно одним из двух способов:

Поллинг — просто регулярно отправлять запрос к серверу Телеграма для получения обновлений,

Вебхук — сделать так, чтобы Телеграм сам отправлял запросы по нужному URL.

Конечно, удобнее использовать библиотеки, чем делать http-запросы «руками».

Если вы попробуете загуглить, как написать Телеграм-бота на Python, вам предложат воспользоваться библиотеками python-telegram-bot и telebot. Но не стоит.

Ну, если вы только хотите познакомиться с разработкой ботов и написать своего hello-world-бота, то можете, конечно использовать и их. Но эти библиотеки могут далеко не всё. Среди разработчиков ботов лучшей библиотекой для ботов на Python считается aiogram. Она асинхронная, использует декораторы и содержит удобные инструменты для разработки. Ещё был хороший Rocketgram, но он давно не обновлялся.

Также ботов часто пишут на JavaScript, для этого обычно используется Telegraf. Библиотеки есть и для многих других языков, но используют их реже.

Если же вы хотите использовать Telegram API, то можете воспользоваться Python’овскими Telethon и Pyrogram.

Если вы хотите получить какое-то представление о том, как вообще выглядит код бота, вот вам пример использования на aiogram с его странички на GitHub:

Этот бот будет отвечать на команды /start и и /restart.

Создание бота

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Один пользователь может создать до 20 ботов.

Юзернеймы

При создании бота нужно выбрать юзернейм. После этого поменять его будет очень сложно.

Как поменять юзернейм бота

Если у вас есть бот, и вы хотите дать ему более короткий юзернейм (который может быть занят неработающим ботом), то вы, теоретически, можете это сделать через @BotSupport.

Для этого бот должен (внезапно) быть рабочим, а также поддерживать английский язык.

Принято использовать такой формат обращения в поддержку:

Если вы везунчик 9999 lvl — вам ответят.

Юзернейм бота выглядит как обычный юзернейм, но он должен заканчиваться на «bot».
Вы могли видеть ботов с именами @pic, @vid, @sticker, @gamee — это официальные боты Телеграма. Им можно нарушать все правила 🙂

Очень многие юзернеймы уже заняты. Свободных коротких юзернеймов осталось очень мало. И что самое грустное: почти все эти боты мертвы. Просто не отвечают на сообщения. Наверное, это просто разные любопытные люди хотят сделать бота, создают его, а потом забивают. У меня самого есть несколько лежащих ботов. Так что, думаю, лимит в 20 ботов на одного владельца вполне оправдан 🙂

Оформление бота

Открыв бота, пользователи могут увидеть его профиль.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Описание (Description) — это текст, который пользователи будут видеть в начале диалога с ботом под заголовком «Что может делать этот бот?»

Информация (About) — это текст, который будет виден в профиле бота.

Аватарка. Аватарки ботов, в отличие от аватарок пользователей и чатов, не могут быть анимированными. Только картинки.

Команды — тут имеются ввиду подсказки команд в боте. Подробнее о командах ниже.

Inline Placeholder — об инлайн-режиме см. ниже.

Стандартный совет: Потратьте свое время и заполните описание и информацию бота, чтобы пользователям было понятнее и проще его использовать. Можете оставить там свои контакты. И поставьте аватарку, чтобы бота было проще отличать от других чатов в списке.

Сообщения и чаты

Запуск бота пользователем

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Таким образом, первое сообщение от пользователя — это всегда /start (либо /start с параметрами, об этом ниже в разделе «Диплинки»).

. если пользователь использует официальный клиент

На стороне сервера это не проверяется, поэтому теоретически пользователь может отправить боту любое сообщение через Telegram API.

Сообщения

Понятно, что главная функция бота — отправлять и получать сообщения.

И то, и другое можно делать со всеми видами сообщений (фото и видео, файлы, опросы, голосовые сообщения и т. д.).

В Телеграме можно делиться файлами до 2 ГБ, но в Bot API более жесткие лимиты: боты могут скачивать файлы до 20 МБ и отправлять файлы до 50 МБ.

Работа с файлами в Bot API

Если бот уже загрузил файл на сервер Телеграма, то он может использовать file_id, чтобы отправлять этот файл.

Загружать файл на сервер можно в том числе и по URL файла.

Куда может писать бот

Бот может писать в личку только тем пользователям, которые его запустили. Пользователь может заблокировать бота, и тогда бот снова не сможет ему писать.

Боты не могут писать другим ботам.

Бота можно добавить в группу (если в BotFather включена соответствующая настройка). По умолчанию он видит не все сообщения (об этом ниже, в разделе «Видимость сообщений в группах»).

В группе боту можно дать права администратора, чтобы он мог выполнять действия админов.

В одной группе может быть до 20 ботов. В публичные группы (группы с юзернеймом) ботов могут добавлять только админы.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Также бота можно добавить в канал, причем только как администратора. Самый частый способ использования ботов в каналах — добавление кнопок под постами («лайки», ссылки и прочее).

Как боты добавляют кнопки

У админа канала может быть специальное право: «Редактирование чужих публикаций». С помощью него боты редактируют посты, добавляя к ним кнопки.

Подробнее о кнопках тоже ниже.

Супергруппы

На самом деле многие группы в Телеграме являются супергруппами.

Почему так? Раньше было четкое разделение на группы и супергруппы. По задумке, супергруппы — это группы для сообществ. Супергруппы могут иметь больше участников, публичные ссылки и другие плюшки.

Со временем, видимо, решили, что это неудобная концепция. Теперь обычная группа становится супергруппой, когда у группы меняются какие-нибудь настройки (подробнее тут). Вот такой костыль.

В этой статье под группами я подразумеваю и супергруппы, и обычные группы.

Супергруппу нельзя обратно превратить в группу. С точки зрения API супергруппа устроена так же, как и канал. Важное отличие супергрупп от обычных групп состоит в нумерации сообщений: о нём чуть ниже.

id пользователей и чатов

У каждого пользователя, бота, группы, канала в Телеграме есть собственный id. Различать чаты в коде бота следует именно по id, потому что он никогда не меняется.

id сообщений

Каждое сообщение в Телеграме имеет свой id. Это относится и к системным сообщениям (пользователь зашел в группу, изменилось название группы и т. д.)

Через Telegram API боты могут получать по запросу сообщения в любом чате по их id.

id сообщений в супергруппах и каналах уникальны для чата: первое сообщение в чате имеет номер 1, второе имеет номер 2 и так далее.

id сообщений в личных сообщениях и обычных группах работают по другому. Там, можно сказать, нумерация сквозная: id сообщения уникально для каждого отправившего его пользователя. Так, первое сообщение от пользователя во всех личках и группах имеет номер 1, второе сообщение от того же пользователя имеет номер 2 и так далее.

Видимость сообщений в группах

Обычно бот должен реагировать именно на команды. Телеграм не уведомляет бота об остальных сообщениях, и это гарантирует приватность переписки.

Но если боту нужно видеть все сообщения в группе (например, если это чат-бот или антиспам-бот), для него можно отключить Privacy mode.

Privacy mode — настройка в BotFather, которая по умолчанию включена. В таком режиме бот в группах видит только такие сообщения:

Сообщения с упоминанием бота,

Ответы на сообщение бота, ответы на ответы и так далее,

Команды — о них в следующем пункте.

А если Privacy mode выключен, то бот видит все сообщения в группе.

Если бот — админ в группе, то он в любом случае видит все сообщения.

Бот, работающий через Bot API, в любом случае не будет видеть сообщения от других ботов.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запросБот видит не все сообщения Я включил Privacy mode, а он не работает

Нужно удалить бота из группы и добавить заново.

Недавно был найден баг: боты не могли видеть некоторые сообщения от юзеров, если сообщения выглядят как команды с юзернеймом пользователя на конце.

Это могло нарушить работу антиспам- и других ботов.

Сейчас баг уже исправлен.

Команды

Часто используемый способ «общения» пользователей с ботом — команды. Команды начинаются на «/» и состоят из латинских букв (можно использовать цифры и нижние подчеркивания).

Команды подсвечиваются как ссылки: нажатие отправляет команду в чат.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

В BotFather можно указать подсказки команд для бота. Он будут отображаться при вводе «/» и команд. Если есть подсказки, рядом с кнопкой «Отправить» появляется кнопка для открытия меню команд.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Разметка сообщений

Как вы, наверное, знаете, сообщения в Телеграме могут содержать не только обычный текст, но и жирный, курсив и др. В Bot API разметку сообщений можно делать в HTML и Markdown.

Разметка в Telegram API

В Telegram API для разметки надо вместе с сообщением передавать entities (MessageEntityBold, MessageEntityItalic и так далее). Хорошие библиотеки сами превращают HTML/Markdown в текст и entities.

Способы выделения текста:

Жирный текст

Моноширинный текст («в строке» и «блоком»)

Упоминание пользователя — текст, похожий на ссылку, клик по которому открывает профиль пользователя. Если упомянуть в группе её участника, он получит уведомление.
Чтобы вставить в сообщение упоминание пользователя, в Bot API нужно встроить ссылку на tg://user?id=123456789.

Кнопки

Инлайн-кнопки

Бот может оставлять кнопки под своими сообщениями.

Кнопки под сообщениями (они же inline keyboards / inline buttons) в основном бывают трёх видов:

URL button — кнопка с ссылкой.

Callback button. При нажатии на такую кнопку боту придёт апдейт. С созданием кнопки можно указать параметр, который будет указан в этом апдейте (до 64 байтов). Обычно после нажатий на такие кнопки боты изменяют исходное сообщение или показывают notification или alert.

Switch to inline button. Кнопка для переключения в инлайн-режим (об инлайн-режиме см. ниже). Кнопка может открывать инлайн в том же чате или открывать меню для выбора чата. Можно указать в кнопке запрос, который появится рядом с никнеймом бота при нажатии на кнопку.

Дополнительные виды кнопок

Login URL button — специальная кнопка для авторизации пользователей на сайте. Использовалась, например, в официальном боте @discussbot (до добавления нативных комментариев в Телеграм).

Callback game button — кнопка для открытия HTML-игры. См. пункт «HTML-игры».

Pay button — кнопка для платежей. См. пункт «Платежи через ботов».

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Клавиатурные кнопки

Есть другой тип кнопок: keyboard buttons. Они отображаются вместо клавиатуры как подсказки. При нажатии на такую кнопку пользователь просто отправит этот текст.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

При этом в личных чатах с помощью кнопки можно:

Запросить номер телефона пользователя,

Запросить геолокацию пользователя,

Открыть у пользователя меню создания опроса.

Есть опция resize_keyboard, которая отвечает за то, изменять ли высоту этой «клавиатуры из кнопок». По умолчанию она, почему-то, выключена, и тогда высота клавиатуры стандартная большая. Получаются кнопки как на этой картинке:

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Чтобы показать клавиатурные кнопки, бот должен отправить сообщение. Можно отправить клавиатуру, которая свернётся (но не пропадёт) после нажатия на кнопку.

По умолчанию, если показать кнопки в группе, они будут видны всем пользователям. Вместо этого можно отобразить кнопки одновременно для этих пользователей:

Для пользователей, юзернеймы которых были в тексте сообщения,

Если это ответ на другое сообщение: для пользователя, который его отправил.

Ещё о кнопках

Оба типа кнопок могут составлять несколько рядов, в каждом из которых по несколько кнопок. Ограничения: в ряду может быть до 8 кнопок, а всего с сообщением до 100 кнопок.

При отправке сообщения можно выбрать одно (но не больше) из следующих действий:

Добавить к сообщению инлайн-кнопки,

Показать клавиатурные кнопки,

Убрать все клавиатурные кнопки,

Force reply: автоматически заставить пользователя ответить на сообщение. Так произойдёт то же самое, что и при нажатии пользователем кнопки «Ответить». Это нужно для того, чтобы бот мог общаться с пользователями в группах, не нарушая Privacy mode.

Таким образом, нельзя показать оба типа кнопок одновременно.

Взаимодействие с ботом

Ссылки на бота

Юзернеймы ботов работают так же, как и любые другие юзернеймы в Телеграме: бота @examplebot можно открыть по ссылке t.me/examplebot.

Также существует прямая ссылка: tg://resolve?domain=examplebot

Подробнее о ссылках tg://

Такие ссылки могут не только заменять ссылки t.me, но и задавать свои действия. Например, tg://settings открывает настройки.

Список известных таких ссылок есть канале @DeepLink.

Ссылка на добавление в группу

По ссылке t.me/examplebot?startgroup=true у пользователя откроется меню: выбор группы для добавления бота.

Прямая ссылка: tg://resolve?domain=examplebot&startgroup=true

Диплинки

По ссылке t.me/examplebot?start= пользователь может запустить бота с каким-то стартовым параметром ( ).

При переходе по ссылке бот открывается как обычно.

Отображается кнопка «Запустить», даже если пользователь уже запускал бота.

Пользователь нажимает на кнопку и видит сообщение /start (всё как обычно).

Боту вместо этого приходит сообщение /start

Так бот может отреагировать на запуск не как на обычный «/start», а другим способом.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Часто диплинки используются для реферальных программ (в качестве параметра можно передавать id пользователя, который поделился ссылкой). Есть и другие применения.

Прямая ссылка: tg://resolve?domain=examplebot&start=

Инлайн-режим

Инлайн-режим (inline mode) — это специальный режим работы бота, с помощью которого пользователь может использовать бота во всех чатах.

Выглядит это так: пользователь вводит юзернейм бота в поле для ввода сообщения. После юзернейма можно ещё записать запрос (текст до 256 символов).

Появляется менюшка с результатами. Выбирая результат, пользователь отправляет сообщение.

Инлайн-режим можно включить в BotFather, там же можно выбрать плейсхолдер вместо стандартного «Search. «

В группе можно запретить использовать инлайн всем или некоторым участникам. В официальных приложениях Телеграм это ограничение объединено с ограничением на отправку стикеров и GIF.

Результаты инлайн-режима

Результаты можно отображать двумя способами:

Сеткой. Удобно для выдачи картинок.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

    Вертикальным списком. Удобно для выдачи текста.

    Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Можно совмещать два типа, но корректно отображается это только на Telegram Desktop.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Приватность и геопозиция в инлайне

Когда пользователь вызывает инлайн-режим, бот не может получить никакую информацию о контексте, кроме информации о пользователе. Таким образом, бот не может узнать ни чат, в котором вызвали инлайн, ни сообщение, на которое пользователь отвечает.

Но зато если включить в BotFather настройку «Inline Location Data», то бот сможет видеть геопозицию пользователей, когда они используют инлайн (на мобильных устройствах). Перед этим у пользователей показывается предупреждение.

Inline feedback

Inline feedback — это апдейты о выбранных инлайн-результатах. Включаются через BotFather.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Предполагается использование inline feedback для сбора статистики, но не всегда он используется так. Inline feedback позволяет «подгружать» не все результаты сразу, а только выбранный. Например, если бот используется для поиска музыки, то он может загружать не все песни сразу, а только одну.

Важный момент: если вы получили апдейт об отправке инлайн-сообщения, то вы можете его редактировать, только если к нему прикреплены инлайн-кнопки. (Если кнопок нет, то в апдейте не указывается id инлайн-сообщения, по которому происходит редактирование).

Создание наборов стикеров

Боты (и только боты!) могут создавать наборы стикеров. При этом каждый набор стикеров должен принадлежать какому-то пользователю. Посмотреть свои наборы стикеров пользователь может с помощью бота @Stickers.

Платежи через ботов

Телеграм предоставляет ботам возможность принимать платежи от пользователей. Это делается через провайдеров ЮMoney, Сбербанк, Stripe и ещё 7.

Эта возможность используются редко, потому что для использования провайдеров нужно юридическое лицо.

UPD 26.04.2021. В новом обновлении появилось больше возможностей платежей для разработчиков. Теперь боты могут отправлять платежи не только в лс, но и в группы и в каналы. Это позволяет сделать из канала «витрину», на которой можно сразу купить товар. Вы можете посмотреть, как это выглядит, в официальном демо-канале.

HTML-игры в ботах

Боты могут позволять пользователям играть в HTML5-игры в чатах. Бот может отправлять сообщения-игры или создавать их через инлайн-режим. Как это работает, можно посмотреть на примере официального @gamebot.

Telegram Login Widget

Вы можете добавить на свой сайт авторизацию через Телеграм. Процесс авторизации будет проходить так:

Пользователь должен будет ввести свой номер телефона.

Бот Telegram попросит подтвердить вход.

Пользователь авторизуется и нажимает на «Принять» на сайте.

Что такое inline запрос. Смотреть фото Что такое inline запрос. Смотреть картинку Что такое inline запрос. Картинка про Что такое inline запрос. Фото Что такое inline запрос

Telegram Login Widget не связан с Login URL button (см. раздел про кнопки выше), а является его альтернативой.

Разработка ботов

Какие апдейты можно получать

Бот не может получить старые сообщения из чата. Бот не может получить список всех своих пользователей. Все, что может получать бот — это информацию об обновлениях. В этом заключается главная сложность разработки ботов.

Вы можете получать информацию о новых сообщениях в боте и других событиях, но только один раз. Вам придётся самим хранить список чатов, старых сообщений (если это зачем-то нужно) и так далее. Если вы случайно сотрёте/потеряете эту информацию, вы её больше никак не получите.

В Telegram API бот может чуточку больше: он может получать сообщения по id, получать список участников группы и прочее.

Получение апдейтов: Bot API vs Telegram API

Если вы получили апдейт в Bot API, то второй раз вы его уже не получите.

В Telegram API это не так: пользователь может пользоваться мессенджером через несколько клиентов, каждый из которых должен получать апдейты.

Если запустить для одного бота несколько программ на Telegram API, то каждая из них будет получать все апдейты.

Ограничения Bot API не позволяют сделать то же самое.

Лимиты

Конечно, на запросы к серверу существуют лимиты. В Bots FAQ на сайте Telegram названы следующие:

Не больше одного сообщения в секунду в один чат,

Не больше 30 сообщений в секунду вообще,

Не больше 20 сообщений в минуту в одну группу.

Эти лимиты не строгие, а примерные. Лимиты могут быть увеличены для больших ботов через поддержку.

Другие известные ограничения в Telegram собраны на limits.tginfo.me — см. раздел про ботов.

Рассылка по пользователям

Ниже в Bots FAQ сказано, что Bot API не позволяет рассылать сообщения всем юзерам одновременно и что в будущем, может быть, они что-то для этого сделают. И написано это уже несколько лет.

Они советуют растянуть рассылку на длительное время (8-12 часов) и замечают, что API не позволит отправлять сообщения более чем

30 пользователям в секунду.

Смена владельца бота

Осенью 2020 года появилась возможность передавать ботов другому человеку. Это можно сделать в настройках бота в BotFather. Для этого на вашем аккаунте должна быть включена двухфакторная авторизация — не менее, чем за 7 дней до передачи. Передать бота можно только пользователю, который что-либо ему писал.

Локальный сервер Bot API

Также осенью 2020 года исходники Bot API выложили на GitHub. Теперь вы можете поднять собственный сервер Bot API. На GitHub перечислены следующие преимущества:

Скачивание файлов с сервера без ограничения (ограничение на отправку файлов пользователями в Телеграме — 2 ГБ),

Загрузка файлов на сервер до 2000 МБ,

Загрузка файлов на сервер с помощью локального пути и URI файла,

Использование HTTP URL для вебхука,

Использование любого локального IP-адреса для вебхука,

Использование любого порта для вебхука,

Возможность увеличить максимальное число соединений до 100000,

Получение локального пути файла вместо загрузки файла с сервера.

Юзерботы

В начале статьи я рассказывал о том, что такое Telegram API и Telegram Bot API.

Telegram API используется не только для ботов — тогда в чём проблема управлять аккаунтами пользователей, как ботами? Люди это делают. Кто-то автоматически ставит текущее время себе на аватарку, кто-то скриптом реагирует на свои сообщения как на команды, кто-то сохраняет сообщения из публичных групп и каналов. Всё это называют юзерботами.

Юзерботов следует использовать аккуратно: за большую подозрительную активность аккаунт могут ограничить или забанить.

Заключение

Я постарался собрать в одном месте и структурировать информацию о всех возможностях Телеграм-ботов. Большое спасибо vanutp, NToneE и Grinrill за помощь с фактами. Если мы что-то забыли — пишите, исправлю.

Я специально не разделял большую статью на несколько постов, чтобы можно было быстро найти нужную информацию. К тому же, в начале статьи есть её содержание. Так что можете сохранить её к себе и использовать как справочник 🙂

Вообще интерфейс бота (то есть интерфейс чата) имеет много ограничений. Но плохо ли это? Действительно удобнее использовать инструмент, когда это часть привычной среды. Я часто прямо в переписке нахожу нужную картинку или информацию с помощью инлайн-ботов. Как заядлый пользователь Телеграма, я люблю использовать ботов. И создаю ботов. И вы создавайте.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *