Перейти к содержимому
Unixgram

Bot API

HTTP-интерфейс для ботов Unixgram. Имена методов, параметров и формат ответов совпадают с Bot API Telegram, поэтому готовые библиотеки — aiogram, pyTelegramBotAPI — работают после смены адреса сервера.
Содержание

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

  1. Откройте Unixgram → меню → Мои боты → Создать. Придумайте имя и ник — он заканчивается на _bot.
  2. Скопируйте токен вида 123456789:AAH…. Он показывается один раз; потерянный токен перевыпускается там же, старый перестаёт работать.
  3. Проверьте токен:
shell
curl https://unixgram.com/api/bot/<токен>/getMe
json
{
  "ok": true,
  "result": {
    "id": 4012,
    "is_bot": true,
    "first_name": "Погода",
    "username": "weather_bot",
    "can_join_groups": true,
    "can_read_all_group_messages": false,
    "supports_inline_queries": false
  }
}

Первый бот на Python, без зависимостей:

python
import json, time, urllib.request

TOKEN = "123456789:AAH..."
API = f"https://unixgram.com/api/bot/{TOKEN}/"

def call(method, **params):
    req = urllib.request.Request(API + method, data=json.dumps(params).encode(),
                                 headers={"Content-Type": "application/json"})
    return json.load(urllib.request.urlopen(req, timeout=35))["result"]

offset = 0
while True:
    for update in call("getUpdates", offset=offset, timeout=25):
        offset = update["update_id"] + 1
        message = update.get("message")
        if message and "text" in message:
            call("sendMessage", chat_id=message["chat"]["id"], text="Вы написали: " + message["text"])

Запросы и ответы#

Адрес метода — https://unixgram.com/api/bot/<токен>/<метод>. Принимаются GET с параметрами в строке запроса и POST с телом application/json, application/x-www-form-urlencoded или multipart/form-data. В форме составные значения (массивы, объекты) передаются JSON-строкой, логические — строками true/false.

Ответ всегда JSON:

json
{"ok": true, "result": …}
{"ok": false, "error_code": 400, "description": "Bad Request: text: Too small: expected string to have >=1 characters"}
КодКогда
400Неверные параметры — описание называет поле
401Неверный токен
403Бот выключен владельцем или заблокирован модерацией; нет прав в группе
404Нет такого метода, чата или сообщения
429Больше 600 вызовов в минуту на токен. В ответе parameters.retry_after — сколько секунд подождать

Идентификаторы — целые числа. У групп chat_id отрицательный. В chat_id можно передать и @ник человека: если личного чата с ним ещё нет, он будет создан.

Обновления#

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

  • getUpdates — длинный опрос: запрос висит до 25 секунд и возвращается, как только что-то пришло. Передавайте offset = последний update_id + 1.
  • setWebhook — сервер сам отправляет каждое Update POST-запросом на ваш https-адрес с заголовком X-Unixgram-Bot-Api-Secret-Token, если вы задали секрет. Проверяйте его — иначе адрес вебхука становится способом прислать боту что угодно.

Очередь хранится на сервере, пока вы её не заберёте: бот, выключенный на полдня, после запуска получит всё пропущенное. Виды обновлений: message, edited_message, callback_query, my_chat_member, pre_checkout_query.

Ссылка-приглашение в бота с меткой — https://unixgram.com/dashboard/messages?user=<ник_бота>&start=<метка>: бот получит сообщение /start <метка>. Метка — до 64 символов [A-Za-z0-9_-].

Форматирование#

parse_mode принимает HTML, Markdown и MarkdownV2 в синтаксисе Telegram. Вместо него можно передать готовый массив entities. Незнакомый тег — ошибка 400, а не молча выброшенный кусок текста.

html
<b>жирный</b> <i>курсив</i> <u>подчёркнутый</u> <s>зачёркнутый</s>
<tg-spoiler>спойлер</tg-spoiler> <code>код</code> <a href="https://unixgram.com">ссылка</a>
<pre>блок кода</pre>

Боту текст приходит без разметки, с массивом entities — так же, как в Bot API. Команды (/start) отмечены сущностью bot_command.

Клавиатуры#

InlineKeyboardMarkup#

Кнопки под сообщением: {"inline_keyboard": [[кнопка, …], …]}. До 100 рядов по 8 кнопок, текст кнопки — до 128 символов. У кнопки ровно одно действие:

ПолеТипОписание
callback_dataStringДо 64 байт. Нажатие придёт CallbackQuery; сервер проверяет, что такая кнопка действительно есть на сообщении
urlStringСсылка http(s):// или путь внутри Unixgram, до 512 символов
web_appWebAppInfo{"url": …} — открыть мини-приложение
copy_textCopyTextButton{"text": …} — скопировать текст в буфер
switch_inline_query_current_chatStringПодставить текст в поле ввода этого чата
payBooleanКнопка оплаты — ставит sendInvoice

ReplyKeyboardMarkup#

Клавиатура вместо системной: {"keyboard": [["Да", "Нет"]], "resize_keyboard": true, "one_time_keyboard": true, "input_field_placeholder": "…"}. Нажатие клавиши отправляет её текст обычным сообщением. {"remove_keyboard": true} убирает клавиатуру, {"force_reply": true} открывает поле ввода в режиме ответа.

Файлы#

Поле с вложением (photo, document, …) принимает:

  • ссылку https://… — файл берётся по адресу как есть;
  • сам файл частью multipart/form-data под именем поля;
  • attach://<имя> — файл лежит в другой части формы под этим именем (так отправляют библиотеки).

Пределы: изображения 10 МБ, голосовые 12 МБ, видео и документы 50 МБ.

shell
curl -F chat_id=1234 -F caption="График за неделю" -F photo=@chart.png \
  https://unixgram.com/api/bot/<токен>/sendPhoto

Мини-приложения#

Кнопка web_app открывает вашу страницу поверх чата. Страница получает данные о том, кто её открыл, во фрагменте адреса — параметр unixgramWebAppData: строка запроса с полями и подписью hash. Проверка подписи — как у Telegram, но ключ выводится из хеша секретной половины токена (сам токен мы не храним):

python
import hashlib, hmac, urllib.parse

def check(init_data: str, token: str) -> bool:
    fields = dict(urllib.parse.parse_qsl(init_data))
    received = fields.pop("hash")
    check_string = "\n".join(f"{k}={v}" for k, v in sorted(fields.items()))
    secret_half = token.split(":", 1)[1]
    key = hmac.new(b"WebAppData", hashlib.sha256(secret_half.encode()).digest(), hashlib.sha256).digest()
    return hmac.compare_digest(hmac.new(key, check_string.encode(), hashlib.sha256).hexdigest(), received)
JavaScript-моста вида window.Telegram.WebApp нет: кнопок внизу, событий закрытия и темы страница не получает.

Платежи#

  1. sendInvoice — в чате появляется счёт с кнопкой «Оплатить N ⭐».
  2. Человек нажимает кнопку — боту приходит pre_checkout_query.
  3. Бот за 10 секунд отвечает answerPreCheckoutQuery: проверьте, что товар есть и цена в силе.
  4. Звёзды списываются, в чат приходит служебное сообщение, боту — message с successful_payment.

Деньги получает владелец бота. Доход три дня находится на удержании — в это время возможен возврат через refundStarPayment; потом его можно вывести в разделе «Мои боты».

Получение обновлений#

getUpdates#

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

ПараметрТипОбязателенОписание
offsetIntegerНетПервое ожидаемое update_id; всё, что меньше, считается полученным
limitIntegerНет1–100, по умолчанию 100
timeoutIntegerНетСколько секунд ждать, если обновлений нет: 0–25, по умолчанию 0

Возвращает: Массив Update

setWebhook#

Доставлять обновления POST-запросом на ваш адрес. Только публичный https: localhost и частные сети отклоняются. Каждое обновление также остаётся в очереди — если ваш сервер лежал, снимите вебхук и заберите всё через getUpdates.

ПараметрТипОбязателенОписание
urlStringДаПубличный https-адрес, до 512 символов
secret_tokenStringНетДо 128 символов; приходит в заголовке X-Unixgram-Bot-Api-Secret-Token

Возвращает: True

deleteWebhook#

Снять вебхук и вернуться к getUpdates.

Возвращает: True

getWebhookInfo#

Текущий вебхук.

Возвращает: WebhookInfo

Бот#

getMe#

Проверка токена и сведения о боте.

Возвращает: User с полями can_join_groups, can_read_all_group_messages, supports_inline_queries (всегда false)

setMyCommands#

Меню команд, которое человек видит по кнопке «/» в поле ввода.

ПараметрТипОбязателенОписание
commandsArray of BotCommandДаДо 100 команд. command — 1–32 символа [a-z0-9_], description — до 256

Возвращает: True

getMyCommands#

Текущее меню команд.

Возвращает: Массив BotCommand

deleteMyCommands#

Убрать меню команд.

Возвращает: True

setMyDescription#

Текст «Что умеет этот бот» в пустом чате с ботом.

ПараметрТипОбязателенОписание
descriptionStringНетДо 512 символов; пусто — убрать

Возвращает: True

setMyShortDescription#

Короткое описание в профиле бота.

ПараметрТипОбязателенОписание
short_descriptionStringНетДо 120 символов

Возвращает: True

close#

Совместимость с библиотеками: ничего не делает.

Возвращает: True

logOut#

Совместимость с библиотеками: ничего не делает.

Возвращает: True

Отправка сообщений#

sendMessage#

Текстовое сообщение.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
textStringДа1–4096 символов
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
entitiesArray of MessageEntityНетРазметка вместо parse_mode
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendPhoto#

Изображение. До 10 МБ.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
photoInputFile или StringДаИзображение: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendVideo#

Видео. До 50 МБ.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
videoInputFile или StringДаВидео: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendAnimation#

GIF или беззвучное видео-анимация.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
animationInputFile или StringДаАнимация: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendVoice#

Голосовое сообщение. До 12 МБ.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
voiceInputFile или StringДаАудио: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendVideoNote#

Круглое видеосообщение («кружок»).

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
video_noteInputFile или StringДаВидео: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendDocument#

Файл любого типа. До 50 МБ.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
documentInputFile или StringДаФайл: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
file_nameStringНетИмя файла, которое увидит получатель
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendAudio#

Аудиофайл — отправляется как документ.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
audioInputFile или StringДаАудио: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendSticker#

Стикер (изображение без пузыря).

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
stickerInputFile или StringДаИзображение: ссылка https://…, файл в форме или attach://<имя> — см. Файлы
captionStringНетПодпись, 0–1024 символа
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка подписи вместо parse_mode
has_spoilerBooleanНетСпрятать вложение под размытие до нажатия
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

sendMediaGroup#

Альбом из 2–10 фото, видео или документов. Подпись берётся у первого элемента.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
mediaArray of InputMediaДаЭлементы {"type": "photo"|"video"|"document"|"audio", "media": …, "caption"?, "has_spoiler"?}
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается

Возвращает: Массив Message

sendLocation#

Точка на карте.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
latitudeFloatДа−90…90
longitudeFloatДа−180…180
addressStringНетДо 200 символов
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message с полем location

sendVenue#

Место с названием.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
latitudeFloatДа−90…90
longitudeFloatДа−180…180
titleStringДа1–120 символов
addressStringНетДо 200 символов
disable_notificationBooleanНетОтправить без звука
reply_parametersReplyParametersНетОтвет на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message с полями location и venue

sendPoll#

Опрос или викторина.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
questionStringДа1–300 символов
optionsArray of String или InputPollOptionДа2–12 вариантов по 1–100 символов
is_anonymousBooleanНетПо умолчанию true
allows_multiple_answersBooleanНетНесколько ответов
typeStringНетquiz — викторина

Возвращает: Отправленный Message

sendDice#

Кубик с анимацией. Значение выпадает на сервере — обе стороны видят одно и то же.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
emojiStringНет🎲 🎯 🎳 (1–6), 🏀 ⚽ (1–5), 🎰 (1–64); по умолчанию 🎲

Возвращает: Отправленный Message с полем dice

sendChatAction#

Показать собеседнику «печатает…».

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
actionStringНетПринимается любое значение, показывается «печатает…»

Возвращает: True

forwardMessage#

Переслать сообщение с указанием автора.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
from_chat_idInteger или StringНетПринимается для совместимости; источник определяется по message_id
message_idIntegerДаИдентификатор сообщения

Возвращает: Отправленный Message

copyMessage#

Скопировать сообщение без указания автора.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
from_chat_idInteger или StringНетПринимается для совместимости
message_idIntegerДаИдентификатор сообщения

Возвращает: Отправленный Message

Изменение сообщений#

editMessageText#

Изменить текст своего сообщения. Без reply_markup кнопки остаются как были, с null — снимаются.

ПараметрТипОбязателенОписание
message_idIntegerДаИдентификатор сообщения
textStringДа1–4096 символов
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
entitiesArray of MessageEntityНетРазметка
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

editMessageCaption#

Изменить подпись к вложению.

ПараметрТипОбязателенОписание
message_idIntegerДаИдентификатор сообщения
captionStringДа1–4096 символов
parse_modeStringНетHTML, Markdown или MarkdownV2 — см. Форматирование
caption_entitiesArray of MessageEntityНетРазметка
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

editMessageReplyMarkup#

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

ПараметрТипОбязателенОписание
message_idIntegerДаИдентификатор сообщения
reply_markupInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReplyНетКнопки под сообщением или клавиатура — Клавиатуры

Возвращает: Отправленный Message

deleteMessage#

Удалить своё сообщение.

ПараметрТипОбязателенОписание
message_idIntegerДаИдентификатор сообщения

Возвращает: True

pinChatMessage#

Закрепить сообщение.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
message_idIntegerДаИдентификатор сообщения

Возвращает: True

unpinChatMessage#

Открепить сообщение.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
message_idIntegerДаИдентификатор сообщения

Возвращает: True

setMessageReaction#

Поставить реакцию. У бота на сообщении одна реакция; пустой список снимает её.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
message_idIntegerДаИдентификатор сообщения
reactionArray of ReactionTypeНет[{"type": "emoji", "emoji": "👍"}]

Возвращает: True

Нажатия кнопок#

answerCallbackQuery#

Ответ на нажатие inline-кнопки. Отвечайте на каждое нажатие, даже пустым текстом: до ответа кнопка у человека крутит индикатор. Идентификатор нажатия живёт минуту.

ПараметрТипОбязателенОписание
callback_query_idStringДаИз CallbackQuery
textStringНетДо 200 символов — всплывающая подсказка
show_alertBooleanНетПоказать окном с кнопкой ОК вместо подсказки
urlStringНетОткрыть ссылку

Возвращает: True

Чаты и группы#

getChat#

Сведения о чате. Для личного чата описывает собеседника.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека

Возвращает: Chat с полями accent_color_id и max_reaction_count

getChatMemberCount#

Число участников, включая бота.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека

Возвращает: Integer

getChatMember#

Участник группы.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
user_idInteger или StringДаЧисло из Bot API или @ник

Возвращает: ChatMember

getChatAdministrators#

Владелец и администраторы.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека

Возвращает: Массив ChatMember

banChatMember#

Исключить участника. Списка заблокированных нет: исключённый может вернуться по приглашению. Бот должен быть администратором.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
user_idInteger или StringДаКого исключить

Возвращает: True

unbanChatMember#

Совместимость: снимать нечего.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
user_idInteger или StringДа—

Возвращает: True

promoteChatMember#

Роль одна: любое выданное право делает участника администратором, ни одного — обычным участником.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
user_idInteger или StringДаКого повысить
can_manage_chat, can_delete_messages, can_restrict_members, can_invite_users, can_pin_messages, can_promote_members, can_change_infoBooleanНетХотя бы одно true — администратор

Возвращает: True

setChatTitle#

Название группы.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
titleStringДа1–128 символов

Возвращает: True

setChatPhoto#

Фото группы.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
photoInputFile или StringДаИзображение

Возвращает: True

leaveChat#

Выйти из группы.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека

Возвращает: True

Оплата звёздами#

sendInvoice#

Счёт с кнопкой «Оплатить». Только звёзды (XTR); платёжных провайдеров нет. Один счёт оплачивается один раз.

ПараметрТипОбязателенОписание
chat_idInteger или StringДаИдентификатор чата или человека (число из Bot API) либо @ник человека
titleStringДа1–64 символа
descriptionStringНетДо 255 символов
payloadStringДа1–128 символов — вернётся вам в pre_checkout_query и successful_payment
currencyStringНетТолько XTR
pricesArray of LabeledPriceДаСуммы складываются; итог — до 100 000 ⭐
disable_notificationBooleanНетОтправить без звука

Возвращает: Отправленный Message

answerPreCheckoutQuery#

Подтвердить или отклонить оплату. Ответ нужен за 10 секунд, иначе платёж отменяется.

ПараметрТипОбязателенОписание
pre_checkout_query_idStringДаИз PreCheckoutQuery
okBooleanДаtrue — списать звёзды
error_messageStringНетОбязателен при ok = false — его увидит человек

Возвращает: True

refundStarPayment#

Вернуть звёзды плательщику.

ПараметрТипОбязателенОписание
telegram_payment_charge_idStringДаИз SuccessfulPayment

Возвращает: True

Типы#

Поля, которых нет в ответе, отсутствуют, а не равны null.

Update#

Одно обновление. В объекте ровно одно необязательное поле.

ПолеТипОписание
update_idIntegerВозрастающий номер — передайте update_id + 1 в offset
messageMessageНовое сообщение боту (в том числе successful_payment)
edited_messageMessageЧеловек изменил своё сообщение
callback_queryCallbackQueryНажатие inline-кнопки
my_chat_memberChatMemberUpdatedБота добавили в группу или исключили
pre_checkout_queryPreCheckoutQueryЧеловек нажал «Оплатить» — подтвердите за 10 секунд

User#

Человек или бот.

ПолеТипОписание
idIntegerИдентификатор
is_botBooleanБот ли это
first_nameStringОтображаемое имя
usernameStringНик без @

Chat#

Чат.

ПолеТипОписание
idIntegerИдентификатор; у групп отрицательный
typeStringprivate или group
titleStringНазвание группы
usernameStringНик собеседника личного чата
first_nameStringИмя собеседника личного чата

Message#

Сообщение.

ПолеТипОписание
message_idIntegerИдентификатор
dateIntegerUnix-время
chatChatЧат
fromUserАвтор
textStringТекст без разметки
captionStringПодпись к вложению
entitiesArray of MessageEntityРазметка и команды (bot_command)
photoArray of PhotoSizeИзображение
videoVideoВидео
voiceVoiceГолосовое
documentDocumentФайл
locationLocationТочка (sendLocation/sendVenue)
venueVenueМесто
diceDiceКубик: emoji и value
reply_to_messageMessageНа что ответили
reply_markupInlineKeyboardMarkupКнопки под сообщением
successful_paymentSuccessfulPaymentОплата счёта прошла

MessageEntity#

Фрагмент разметки текста.

ПолеТипОписание
typeStringbold, italic, underline, strikethrough, spoiler, code, pre, text_link, bot_command…
offsetIntegerНачало в UTF-16
lengthIntegerДлина в UTF-16
urlStringДля text_link

PhotoSize · Video · Voice · Document#

Файлы. file_id — это прямой URL файла: скачайте его обычным GET, getFile не нужен.

ПолеТипОписание
file_idStringURL файла
file_unique_idStringТо же значение
width, heightIntegerДля изображений и видео
durationIntegerСекунды — для видео и голоса
file_name, mime_type, file_sizeString, String, IntegerДля документов

CallbackQuery#

Нажатие inline-кнопки.

ПолеТипОписание
idStringПередайте в answerCallbackQuery
fromUserКто нажал
messageMessageСообщение с кнопкой (автор — сам бот)
chat_instanceStringИдентификатор чата строкой
dataStringcallback_data кнопки

ChatMemberUpdated#

Изменилось участие бота в чате.

ПолеТипОписание
chatChatЧат
fromUserКто изменил
dateIntegerUnix-время
old_chat_memberChatMemberБыло
new_chat_memberChatMemberСтало: member, administrator, left или kicked

ChatMember#

Участник и его статус.

ПолеТипОписание
statusStringcreator, administrator или member
userUserУчастник

PreCheckoutQuery#

Вопрос боту перед списанием звёзд.

ПолеТипОписание
idStringПередайте в answerPreCheckoutQuery
fromUserПлательщик
currencyStringВсегда XTR
total_amountIntegerСумма в звёздах
invoice_payloadStringpayload из sendInvoice

SuccessfulPayment#

Оплата прошла — приходит в обновлении message.

ПолеТипОписание
currencyStringXTR
total_amountIntegerСумма
invoice_payloadStringpayload счёта
telegram_payment_charge_idStringДля refundStarPayment
provider_payment_charge_idStringТо же значение

BotCommand#

Команда в меню «/».

ПолеТипОписание
commandString1–32 символа [a-z0-9_], без слэша
descriptionStringДо 256 символов

WebhookInfo#

Состояние вебхука.

ПолеТипОписание
urlStringАдрес или пустая строка
has_custom_certificateBooleanВсегда false
pending_update_countIntegerВсегда 0 — очередь доступна через getUpdates после снятия вебхука

Отличия от Telegram#

  • Нет инлайн-режима (inline_query) и платёжных провайдеров — только звёзды.
  • file_id — прямой URL файла; getFile не нужен.
  • banChatMember исключает, но не блокирует; promoteChatMember знает одну роль — администратор.
  • Группа — тип group; супергрупп и каналов в Bot API пока нет.
  • Счёт оплачивается один раз — для второго покупателя отправьте новый.

Библиотеки#

Python: unixgram-py#

Наша библиотека в форме pyTelegramBotAPI, без зависимостей, Python 3.9+.

shell
pip install unixgram-py
python
from unixgram import Bot, InlineKeyboardMarkup, InlineKeyboardButton

bot = Bot("123456789:AAH...")

@bot.message_handler(commands=["start"])
def start(message):
    kb = InlineKeyboardMarkup()
    kb.row(InlineKeyboardButton("Нажми", callback_data="ping"))
    bot.send_message(message.chat.id, "Привет!", reply_markup=kb)

@bot.callback_query_handler(func=lambda q: q.data == "ping")
def on_ping(query):
    bot.answer_callback_query(query.id, "Понг!", show_alert=True)

bot.polling()

aiogram 3#

Бот для Telegram переносится сменой адреса сервера:

python
from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer

session = AiohttpSession(api=TelegramAPIServer(
    base="https://unixgram.com/api/bot/{token}/{method}",
    file="https://unixgram.com/{path}",
))
bot = Bot(token="123456789:AAH...", session=session)

Любая другая библиотека Bot API подключается так же — замените https://api.telegram.org/bot на https://unixgram.com/api/bot/. Остальное — в Client API, если вашей программе нужно больше, чем умеют боты.