Довідник API поки що доступний лише російською. Назви методів, шляхи й приклади однакові для всіх мов.
Bot API
Содержание
Начало работы#
- Откройте Unixgram → меню → Мои боты → Создать. Придумайте имя и ник — он заканчивается на
_bot. - Скопируйте токен вида
123456789:AAH…. Он показывается один раз; потерянный токен перевыпускается там же, старый перестаёт работать. - Проверьте токен:
curl https://unixgram.com/api/bot/<токен>/getMe{
"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, без зависимостей:
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:
{"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, а не молча выброшенный кусок текста.
<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_data | String | До 64 байт. Нажатие придёт CallbackQuery; сервер проверяет, что такая кнопка действительно есть на сообщении |
url | String | Ссылка http(s):// или путь внутри Unixgram, до 512 символов |
web_app | WebAppInfo | {"url": …} — открыть мини-приложение |
copy_text | CopyTextButton | {"text": …} — скопировать текст в буфер |
switch_inline_query_current_chat | String | Подставить текст в поле ввода этого чата |
pay | Boolean | Кнопка оплаты — ставит 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 МБ.
curl -F chat_id=1234 -F caption="График за неделю" -F photo=@chart.png \
https://unixgram.com/api/bot/<токен>/sendPhotoМини-приложения#
Кнопка web_app открывает вашу страницу поверх чата. Страница получает данные о том, кто её открыл, во фрагменте адреса — параметр unixgramWebAppData: строка запроса с полями и подписью hash. Проверка подписи — как у Telegram, но ключ выводится из хеша секретной половины токена (сам токен мы не храним):
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 нет: кнопок внизу, событий закрытия и темы страница не получает.
Платежи#
sendInvoice— в чате появляется счёт с кнопкой «Оплатить N ⭐».- Человек нажимает кнопку — боту приходит
pre_checkout_query. - Бот за 10 секунд отвечает
answerPreCheckoutQuery: проверьте, что товар есть и цена в силе. - Звёзды списываются, в чат приходит служебное сообщение, боту —
messageсsuccessful_payment.
Деньги получает владелец бота. Доход три дня находится на удержании — в это время возможен возврат через refundStarPayment; потом его можно вывести в разделе «Мои боты».
Получение обновлений#
getUpdates#
Длинный опрос очереди обновлений. Пока задан вебхук, метод отвечает отказом. Подтверждённые обновления (всё, что меньше переданного offset) повторно не выдаются — даже если следующий вызов придёт без offset.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
offset | Integer | Нет | Первое ожидаемое update_id; всё, что меньше, считается полученным |
limit | Integer | Нет | 1–100, по умолчанию 100 |
timeout | Integer | Нет | Сколько секунд ждать, если обновлений нет: 0–25, по умолчанию 0 |
Возвращает: Массив Update
setWebhook#
Доставлять обновления POST-запросом на ваш адрес. Только публичный https: localhost и частные сети отклоняются. Каждое обновление также остаётся в очереди — если ваш сервер лежал, снимите вебхук и заберите всё через getUpdates.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
url | String | Да | Публичный https-адрес, до 512 символов |
secret_token | String | Нет | До 128 символов; приходит в заголовке X-Unixgram-Bot-Api-Secret-Token |
Возвращает: True
Бот#
getMe#
Проверка токена и сведения о боте.
Возвращает: User с полями can_join_groups, can_read_all_group_messages, supports_inline_queries (всегда false)
setMyCommands#
Меню команд, которое человек видит по кнопке «/» в поле ввода.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
commands | Array of BotCommand | Да | До 100 команд. command — 1–32 символа [a-z0-9_], description — до 256 |
Возвращает: True
setMyDescription#
Текст «Что умеет этот бот» в пустом чате с ботом.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
description | String | Нет | До 512 символов; пусто — убрать |
Возвращает: True
setMyShortDescription#
Короткое описание в профиле бота.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
short_description | String | Нет | До 120 символов |
Возвращает: True
Отправка сообщений#
sendMessage#
Текстовое сообщение.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
text | String | Да | 1–4096 символов |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
entities | Array of MessageEntity | Нет | Разметка вместо parse_mode |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendPhoto#
Изображение. До 10 МБ.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
photo | InputFile или String | Да | Изображение: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendVideo#
Видео. До 50 МБ.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
video | InputFile или String | Да | Видео: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendAnimation#
GIF или беззвучное видео-анимация.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
animation | InputFile или String | Да | Анимация: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendVoice#
Голосовое сообщение. До 12 МБ.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
voice | InputFile или String | Да | Аудио: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendVideoNote#
Круглое видеосообщение («кружок»).
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
video_note | InputFile или String | Да | Видео: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendDocument#
Файл любого типа. До 50 МБ.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
document | InputFile или String | Да | Файл: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
file_name | String | Нет | Имя файла, которое увидит получатель |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendAudio#
Аудиофайл — отправляется как документ.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
audio | InputFile или String | Да | Аудио: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendSticker#
Стикер (изображение без пузыря).
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
sticker | InputFile или String | Да | Изображение: ссылка https://…, файл в форме или attach://<имя> — см. Файлы |
caption | String | Нет | Подпись, 0–1024 символа |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка подписи вместо parse_mode |
has_spoiler | Boolean | Нет | Спрятать вложение под размытие до нажатия |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
sendMediaGroup#
Альбом из 2–10 фото, видео или документов. Подпись берётся у первого элемента.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
media | Array of InputMedia | Да | Элементы {"type": "photo"|"video"|"document"|"audio", "media": …, "caption"?, "has_spoiler"?} |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
Возвращает: Массив Message
sendLocation#
Точка на карте.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
latitude | Float | Да | −90…90 |
longitude | Float | Да | −180…180 |
address | String | Нет | До 200 символов |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message с полем location
sendVenue#
Место с названием.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
latitude | Float | Да | −90…90 |
longitude | Float | Да | −180…180 |
title | String | Да | 1–120 символов |
address | String | Нет | До 200 символов |
disable_notification | Boolean | Нет | Отправить без звука |
reply_parameters | ReplyParameters | Нет | Ответ на сообщение: {"message_id": …}. Устаревшее reply_to_message_id тоже принимается |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message с полями location и venue
sendPoll#
Опрос или викторина.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
question | String | Да | 1–300 символов |
options | Array of String или InputPollOption | Да | 2–12 вариантов по 1–100 символов |
is_anonymous | Boolean | Нет | По умолчанию true |
allows_multiple_answers | Boolean | Нет | Несколько ответов |
type | String | Нет | quiz — викторина |
Возвращает: Отправленный Message
sendDice#
Кубик с анимацией. Значение выпадает на сервере — обе стороны видят одно и то же.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
emoji | String | Нет | 🎲 🎯 🎳 (1–6), 🏀 ⚽ (1–5), 🎰 (1–64); по умолчанию 🎲 |
Возвращает: Отправленный Message с полем dice
sendChatAction#
Показать собеседнику «печатает…».
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
action | String | Нет | Принимается любое значение, показывается «печатает…» |
Возвращает: True
forwardMessage#
Переслать сообщение с указанием автора.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
from_chat_id | Integer или String | Нет | Принимается для совместимости; источник определяется по message_id |
message_id | Integer | Да | Идентификатор сообщения |
Возвращает: Отправленный Message
copyMessage#
Скопировать сообщение без указания автора.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
from_chat_id | Integer или String | Нет | Принимается для совместимости |
message_id | Integer | Да | Идентификатор сообщения |
Возвращает: Отправленный Message
Изменение сообщений#
editMessageText#
Изменить текст своего сообщения. Без reply_markup кнопки остаются как были, с null — снимаются.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
message_id | Integer | Да | Идентификатор сообщения |
text | String | Да | 1–4096 символов |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
entities | Array of MessageEntity | Нет | Разметка |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
editMessageCaption#
Изменить подпись к вложению.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
message_id | Integer | Да | Идентификатор сообщения |
caption | String | Да | 1–4096 символов |
parse_mode | String | Нет | HTML, Markdown или MarkdownV2 — см. Форматирование |
caption_entities | Array of MessageEntity | Нет | Разметка |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
editMessageReplyMarkup#
Заменить или снять кнопки под сообщением.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
message_id | Integer | Да | Идентификатор сообщения |
reply_markup | InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove или ForceReply | Нет | Кнопки под сообщением или клавиатура — Клавиатуры |
Возвращает: Отправленный Message
deleteMessage#
Удалить своё сообщение.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
message_id | Integer | Да | Идентификатор сообщения |
Возвращает: True
pinChatMessage#
Закрепить сообщение.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
message_id | Integer | Да | Идентификатор сообщения |
Возвращает: True
unpinChatMessage#
Открепить сообщение.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
message_id | Integer | Да | Идентификатор сообщения |
Возвращает: True
setMessageReaction#
Поставить реакцию. У бота на сообщении одна реакция; пустой список снимает её.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
message_id | Integer | Да | Идентификатор сообщения |
reaction | Array of ReactionType | Нет | [{"type": "emoji", "emoji": "👍"}] |
Возвращает: True
Нажатия кнопок#
answerCallbackQuery#
Ответ на нажатие inline-кнопки. Отвечайте на каждое нажатие, даже пустым текстом: до ответа кнопка у человека крутит индикатор. Идентификатор нажатия живёт минуту.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
callback_query_id | String | Да | Из CallbackQuery |
text | String | Нет | До 200 символов — всплывающая подсказка |
show_alert | Boolean | Нет | Показать окном с кнопкой ОК вместо подсказки |
url | String | Нет | Открыть ссылку |
Возвращает: True
Чаты и группы#
getChat#
Сведения о чате. Для личного чата описывает собеседника.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
Возвращает: Chat с полями accent_color_id и max_reaction_count
getChatMemberCount#
Число участников, включая бота.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
Возвращает: Integer
getChatMember#
Участник группы.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
user_id | Integer или String | Да | Число из Bot API или @ник |
Возвращает: ChatMember
getChatAdministrators#
Владелец и администраторы.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
Возвращает: Массив ChatMember
banChatMember#
Исключить участника. Списка заблокированных нет: исключённый может вернуться по приглашению. Бот должен быть администратором.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
user_id | Integer или String | Да | Кого исключить |
Возвращает: True
unbanChatMember#
Совместимость: снимать нечего.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
user_id | Integer или String | Да | — |
Возвращает: True
promoteChatMember#
Роль одна: любое выданное право делает участника администратором, ни одного — обычным участником.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
user_id | Integer или String | Да | Кого повысить |
can_manage_chat, can_delete_messages, can_restrict_members, can_invite_users, can_pin_messages, can_promote_members, can_change_info | Boolean | Нет | Хотя бы одно true — администратор |
Возвращает: True
setChatTitle#
Название группы.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
title | String | Да | 1–128 символов |
Возвращает: True
setChatPhoto#
Фото группы.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
photo | InputFile или String | Да | Изображение |
Возвращает: True
leaveChat#
Выйти из группы.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
Возвращает: True
Оплата звёздами#
sendInvoice#
Счёт с кнопкой «Оплатить». Только звёзды (XTR); платёжных провайдеров нет. Один счёт оплачивается один раз.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
chat_id | Integer или String | Да | Идентификатор чата или человека (число из Bot API) либо @ник человека |
title | String | Да | 1–64 символа |
description | String | Нет | До 255 символов |
payload | String | Да | 1–128 символов — вернётся вам в pre_checkout_query и successful_payment |
currency | String | Нет | Только XTR |
prices | Array of LabeledPrice | Да | Суммы складываются; итог — до 100 000 ⭐ |
disable_notification | Boolean | Нет | Отправить без звука |
Возвращает: Отправленный Message
answerPreCheckoutQuery#
Подтвердить или отклонить оплату. Ответ нужен за 10 секунд, иначе платёж отменяется.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
pre_checkout_query_id | String | Да | Из PreCheckoutQuery |
ok | Boolean | Да | true — списать звёзды |
error_message | String | Нет | Обязателен при ok = false — его увидит человек |
Возвращает: True
refundStarPayment#
Вернуть звёзды плательщику.
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
telegram_payment_charge_id | String | Да | Из SuccessfulPayment |
Возвращает: True
Типы#
Поля, которых нет в ответе, отсутствуют, а не равны null.
Update#
Одно обновление. В объекте ровно одно необязательное поле.
| Поле | Тип | Описание |
|---|---|---|
update_id | Integer | Возрастающий номер — передайте update_id + 1 в offset |
message | Message | Новое сообщение боту (в том числе successful_payment) |
edited_message | Message | Человек изменил своё сообщение |
callback_query | CallbackQuery | Нажатие inline-кнопки |
my_chat_member | ChatMemberUpdated | Бота добавили в группу или исключили |
pre_checkout_query | PreCheckoutQuery | Человек нажал «Оплатить» — подтвердите за 10 секунд |
User#
Человек или бот.
| Поле | Тип | Описание |
|---|---|---|
id | Integer | Идентификатор |
is_bot | Boolean | Бот ли это |
first_name | String | Отображаемое имя |
username | String | Ник без @ |
Chat#
Чат.
| Поле | Тип | Описание |
|---|---|---|
id | Integer | Идентификатор; у групп отрицательный |
type | String | private или group |
title | String | Название группы |
username | String | Ник собеседника личного чата |
first_name | String | Имя собеседника личного чата |
Message#
Сообщение.
| Поле | Тип | Описание |
|---|---|---|
message_id | Integer | Идентификатор |
date | Integer | Unix-время |
chat | Chat | Чат |
from | User | Автор |
text | String | Текст без разметки |
caption | String | Подпись к вложению |
entities | Array of MessageEntity | Разметка и команды (bot_command) |
photo | Array of PhotoSize | Изображение |
video | Video | Видео |
voice | Voice | Голосовое |
document | Document | Файл |
location | Location | Точка (sendLocation/sendVenue) |
venue | Venue | Место |
dice | Dice | Кубик: emoji и value |
reply_to_message | Message | На что ответили |
reply_markup | InlineKeyboardMarkup | Кнопки под сообщением |
successful_payment | SuccessfulPayment | Оплата счёта прошла |
MessageEntity#
Фрагмент разметки текста.
| Поле | Тип | Описание |
|---|---|---|
type | String | bold, italic, underline, strikethrough, spoiler, code, pre, text_link, bot_command… |
offset | Integer | Начало в UTF-16 |
length | Integer | Длина в UTF-16 |
url | String | Для text_link |
PhotoSize · Video · Voice · Document#
Файлы. file_id — это прямой URL файла: скачайте его обычным GET, getFile не нужен.
| Поле | Тип | Описание |
|---|---|---|
file_id | String | URL файла |
file_unique_id | String | То же значение |
width, height | Integer | Для изображений и видео |
duration | Integer | Секунды — для видео и голоса |
file_name, mime_type, file_size | String, String, Integer | Для документов |
CallbackQuery#
Нажатие inline-кнопки.
| Поле | Тип | Описание |
|---|---|---|
id | String | Передайте в answerCallbackQuery |
from | User | Кто нажал |
message | Message | Сообщение с кнопкой (автор — сам бот) |
chat_instance | String | Идентификатор чата строкой |
data | String | callback_data кнопки |
ChatMemberUpdated#
Изменилось участие бота в чате.
| Поле | Тип | Описание |
|---|---|---|
chat | Chat | Чат |
from | User | Кто изменил |
date | Integer | Unix-время |
old_chat_member | ChatMember | Было |
new_chat_member | ChatMember | Стало: member, administrator, left или kicked |
ChatMember#
Участник и его статус.
| Поле | Тип | Описание |
|---|---|---|
status | String | creator, administrator или member |
user | User | Участник |
PreCheckoutQuery#
Вопрос боту перед списанием звёзд.
| Поле | Тип | Описание |
|---|---|---|
id | String | Передайте в answerPreCheckoutQuery |
from | User | Плательщик |
currency | String | Всегда XTR |
total_amount | Integer | Сумма в звёздах |
invoice_payload | String | payload из sendInvoice |
SuccessfulPayment#
Оплата прошла — приходит в обновлении message.
| Поле | Тип | Описание |
|---|---|---|
currency | String | XTR |
total_amount | Integer | Сумма |
invoice_payload | String | payload счёта |
telegram_payment_charge_id | String | Для refundStarPayment |
provider_payment_charge_id | String | То же значение |
BotCommand#
Команда в меню «/».
| Поле | Тип | Описание |
|---|---|---|
command | String | 1–32 символа [a-z0-9_], без слэша |
description | String | До 256 символов |
WebhookInfo#
Состояние вебхука.
| Поле | Тип | Описание |
|---|---|---|
url | String | Адрес или пустая строка |
has_custom_certificate | Boolean | Всегда false |
pending_update_count | Integer | Всегда 0 — очередь доступна через getUpdates после снятия вебхука |
Отличия от Telegram#
- Нет инлайн-режима (
inline_query) и платёжных провайдеров — только звёзды. file_id— прямой URL файла;getFileне нужен.banChatMemberисключает, но не блокирует;promoteChatMemberзнает одну роль — администратор.- Группа — тип
group; супергрупп и каналов в Bot API пока нет. - Счёт оплачивается один раз — для второго покупателя отправьте новый.
Библиотеки#
Python: unixgram-py#
Наша библиотека в форме pyTelegramBotAPI, без зависимостей, Python 3.9+.
pip install unixgram-pyfrom 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 переносится сменой адреса сервера:
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, если вашей программе нужно больше, чем умеют боты.