Получение сообщений

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

Длинный опрос

Бот вызывает GET /updates в цикле:

  1. Первый запрос — offset=0&timeout=30.
  2. Если обновления есть, ответ приходит сразу. Если нет — сервер держит запрос до 30 секунд и отвечает, как только обновление появится, или пустым массивом [] по истечении времени.
  3. Обработав обновления, бот передаёт в следующем запросе offset = наибольший полученный update_id + 1. Обновления с меньшими номерами сервер удаляет.

Пока бот не передал offset больше номера обновления, оно приходит в каждом ответе снова: упавший бот после перезапуска получит то, что не успел обработать. Обновления хранятся 24 часа. Номера update_id у бота растут без пропусков в порядке появления сообщений.

Держите один опрос на бота. Клиент HTTP должен ждать ответа дольше timeout: при timeout=30 — не меньше 40 секунд.

Вебхук

После POST /webhook Marx отправляет каждое обновление запросом на заданный адрес:

POST /marx HTTP/1.1
Host: bot.example.org
Content-Type: application/json
User-Agent: marx-bot-webhook
X-Marx-Bot-Secret: Zr4q-8NnYtV2

{"update_id": 7, "chat": {"id": 812, "type": "group", "title": "Дача"}, "message": {…}}

DELETE /webhook возвращает бота к длинному опросу; неотправленные обновления остаются и приходят через GET /updates.

Обновление

ПолеЧто это
update_idНомер обновления у этого бота
chat.idНомер чата — chat_id для ответа
chat.typedirect или group
chat.titleНазвание группы
messageСообщение

Сообщение

Тот же объект, что приложение получает о новом сообщении. Полный пример — в ответе GET /updates. Поля, которые нужны боту:

ПолеЧто это
idНомер сообщения — message_id для POST /reactions
chat_idНомер чата
sender_idНомер аккаунта отправителя
authorОтправитель: id, display_name, username (может быть null), avatar_url, is_bot
typetext, image, video, file, voice, poll и другие
bodyТекст сообщения; у опроса — его описание в JSON
captionПодпись к картинке, видео или файлу
created_atВремя отправки, ISO 8601 в UTC
media_url, media, attachmentsВложения: адрес и описание файла
file_name, file_size, duration_msИмя и размер файла, длительность видео или голосового
reply_to_message_id, quoteСообщение, на которое это — ответ, и его цитата
pollОпрос: вопрос, варианты, голоса
forwarded_from_user_id, forwarded_from_chat_id, forwarded_from_nameОткуда переслано

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

Что видит бот

ЧатЧто приходит боту
Личный с человекомВсе сообщения человека
ГруппаСообщения, которые начинаются с команды: /команда или /команда@имя_этого_бота (но не /команда@другой_бот); сообщения с упоминанием бота @имя_бота; ответы на сообщения этого бота
КаналНичего: в канале бот только публикует

Не приходят никогда: собственные сообщения бота, сообщения других ботов, служебные строки чата (вход участника, переименование). Обычную переписку группы бот не видит.

Команды

Команда — сообщение, которое начинается с /: /today, /today@dacha_weather_bot, /today Москва. В группе, где несколько ботов, имя после @ указывает, какому боту она адресована.

Список команд с описаниями приложение показывает в меню чата с ботом. Его задают через PUT /commands или у @marxbot командой /setcommands.

Разбор команды — дело программы бота: в обновлении приходит текст сообщения как есть.