Nemazing Bot API

Bot API Nemazing

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

Bot API — обычный HTTP-интерфейс. Подойдёт любой язык программирования: JavaScript, Python, PHP, Go, Java и другие. Никаких специальных библиотек не нужно — достаточно уметь отправлять HTTP-запросы и разбирать JSON.

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

  1. Откройте в Nemazing чат с @botfather (Nemazing Father) — он создаёт ботов и управляет ими. Его также можно найти в «Настройки → Мои боты».
  2. Отправьте команду /newbot.
  3. Введите имя бота — его увидят пользователи, например «Погода».
  4. Придумайте логин: латиница, 5–32 символа, в конце bot. Например, weather_bot.
  5. Nemazing Father пришлёт токен вида 123:AbCdEf…. Он нужен для всех запросов к API.
🔒 Токен — это ключ от бота. Не публикуйте его и не храните в открытых репозиториях. Если токен утёк, выпустите новый командой /token у Nemazing Father — старый сразу перестанет работать.

Другие команды Nemazing Father

КомандаЧто делает
/mybotsСписок ваших ботов и их настройки
/tokenВыпустить новый токен
/setdescriptionИзменить описание, которое видно в профиле бота
/setcommandsЗадать список команд для подсказок в чате
/deletebotУдалить бота

Аватар, имя и описание бота также можно поменять в приложении: «Настройки → Мои боты».

Как делать запросы

Все методы вызываются по адресу:

https://nemazing.org/bot<ТОКЕН>/<метод>

Название метода не зависит от регистра: sendMessage и sendmessage — одно и то же. Параметры можно передавать любым способом:

  • в строке запроса — GET …/sendMessage?chat_id=5&text=Привет;
  • в теле POST как JSON (Content-Type: application/json);
  • как форму application/x-www-form-urlencoded;
  • как multipart/form-data — так загружаются файлы.

Ответ всегда в формате JSON:

{ "ok": true, "result": { … } }

// при ошибке
{ "ok": false, "error_code": 400, "description": "Bad Request: chat not found" }

Быстрый старт

Проверьте токен — метод getMe вернёт информацию о боте:

curl "https://nemazing.org/bot<ТОКЕН>/getMe"

А теперь — бот-«эхо», который повторяет всё, что ему пишут:

// node echo.js  (Node.js 18+)
const API = 'https://nemazing.org/bot' + process.env.TOKEN;
let offset = 0;

async function call(method, params = {}) {
  const r = await fetch(`${API}/${method}`, {
    method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params)
  });
  const j = await r.json();
  if (!j.ok) throw new Error(j.description);
  return j.result;
}

while (true) {
  const updates = await call('getUpdates', { offset, timeout: 30 });
  for (const u of updates) {
    offset = u.update_id + 1;
    const m = u.message;
    if (!m?.text) continue;
    if (m.text === '/start') await call('sendMessage', { chat_id: m.chat.id, text: 'Привет! Напиши что-нибудь 👋' });
    else await call('sendMessage', { chat_id: m.chat.id, text: m.text, reply_to_message_id: m.message_id });
  }
}

Студия разработчика

Бота можно не размещать на своём сервере: в приложении откройте Настройки → Мои боты → бот → Студия разработчика. Это среда разработки прямо в Nemazing:

  • Файловый менеджер — проект из любого числа файлов и папок: модули .js, .json, картинки, звуки, документы. Загрузка файлов и перетаскивание с компьютера, переименование, копирование, скачивание.
  • Редактор кода — вкладки, подсветка синтаксиса, нумерация строк, автоотступы, Ctrl+S — сохранить, Ctrl+Enter — сохранить и перезапустить, Ctrl+/ — закомментировать.
  • Встроенный хостинг — бот работает на сервере Nemazing круглосуточно, с автоперезапуском после сбоя, журналом, статистикой памяти и запросов.
  • Терминал, переменные окружения для токенов и паролей, сайт бота и собственный HTTP API, импорт и экспорт проекта в ZIP, готовые шаблоны.

API скриптов

Код пишется на JavaScript. Главный файл (по умолчанию main.js) подключает остальные через require('./путь'). Объект bot доступен везде:

// main.js — главный файл проекта
const { money } = require('./lib/format');   // модули проекта
const catalog = require('./catalog.json');   // JSON сразу как объект

bot.command('start', (ctx) => ctx.reply('Привет, ' + ctx.from.first_name, {
  buttons: [[{ text: 'Каталог', data: 'catalog' }]]
}));
bot.on('callback', async (ctx) => {
  if (ctx.data === 'catalog') await ctx.edit(catalog.items.map((i) => i.title + ' — ' + money(i.price)).join('\n'));
});
bot.command('photo', (ctx) => ctx.replyPhoto('img/banner.jpg', 'Картинка из проекта'));

const n = await bot.storage.incr('starts');            // хранилище бота
await bot.fs.write('data/stats.json', { starts: n });    // файлы данных
const key = process.env.WEATHER_KEY;                     // секреты
bot.daily('09:00', () => bot.send(Number(process.env.CHANNEL_ID), 'Доброе утро!'));

Полная справка с примерами — в самой Студии (кнопка «Справка по API»).

Сайт и HTTP API бота

Файлы из папки public/ проекта публикуются по адресу /b/<логин_бота>/ — это может быть лендинг, мини-приложение или панель управления. Свои обработчики запросов добавляются через bot.http:

// public/index.html открывается по адресу https://nemazing.org/b/<логин_бота>/
bot.http.get('/items', async (req, res) => res.json(await bot.storage.get('items')));
bot.http.post('/order', async (req, res) => {
  await bot.send(Number(process.env.ADMIN_CHAT), 'Заказ: ' + req.body.name);
  res.json({ ok: true });
});
// → POST https://nemazing.org/b/<логин_бота>/api/order

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

Терминал

Безопасная оболочка для проекта: работает с файлами проекта, управляет ботом и выполняет код внутри него. Установка npm-пакетов недоступна — положите код библиотеки в проект файлом и подключите через require.

help                        все команды
ls · tree · cd · cat · grep · find · mv · cp · rm · mkdir · touch
start · stop · restart · status · logs 50
env TOKEN=abc               переменная окружения
kv ls · kv get ключ         хранилище бота
api getMe                   любой метод Bot API
js await bot.storage.all()  выполнить код внутри работающего бота
template shop               проект из шаблона: echo, shop, quiz, site

Обновления

Всё, что происходит с ботом — новое сообщение, нажатие на кнопку, оплата счёта, — приходит ему в виде обновления (Update). Получать обновления можно двумя способами — выберите один:

  • getUpdates — бот сам спрашивает сервер о новых событиях. Проще всего начать: не нужен свой сервер с внешним адресом.
  • Webhook — Nemazing сам отправляет каждое событие на ваш адрес. Удобно для сайтов и облачных функций.

Неполученные обновления хранятся 24 часа.

getUpdates ПОЛУЧЕНИЕ

Возвращает массив новых обновлений. Поддерживает «долгий опрос»: если событий нет, сервер подождёт до timeout секунд и ответит сразу, как только что-то произойдёт.

ПараметрОписание
offsetНомер первого нужного обновления. Передавайте update_id последнего полученного + 1 — тогда предыдущие считаются обработанными и удаляются.
limitСколько обновлений вернуть: 1–100, по умолчанию 100.
timeoutСколько секунд ждать новых событий: 0–50. Рекомендуем 25–30.

setWebhook ПОЛУЧЕНИЕ

Включает отправку обновлений на ваш адрес: каждое событие приходит POST-запросом с JSON-объектом Update в теле. Ответьте любым кодом 2xx в течение 10 секунд.

ПараметрОписание
urlобязательныйАдрес, например https://example.com/phantom-bot. Пустое значение отключает webhook.

Пока webhook включён, getUpdates не возвращает событий. Связанные методы:

  • deleteWebhook — отключить webhook и вернуться к getUpdates;
  • getWebhookInfo — текущий адрес и число ожидающих обновлений: { url, pending_update_count }.

Объект Update

В каждом обновлении есть update_id и одно из полей:

ПолеКогда приходит
update_idНомер обновления, растёт по порядку
messageНовое сообщение в личном чате или группе — объект Message. Здесь же приходят сообщения об оплате (successful_payment)
edited_messageСообщение было изменено
channel_postНовая публикация в канале, где бот — администратор
callback_queryПользователь нажал на кнопку под сообщением
{
  "update_id": 1052,
  "message": {
    "message_id": 881,
    "date": 1790851234,
    "chat": { "id": 42, "type": "private", "first_name": "Мария", "username": "maria" },
    "from": { "id": 3, "is_bot": false, "first_name": "Мария", "username": "maria" },
    "text": "/start",
    "entities": [{ "type": "bot_command", "offset": 0, "length": 6 }]
  }
}

Объект Message

ПолеОписание
message_idНомер сообщения
dateВремя отправки, Unix-время в секундах
chatЧат, в котором отправлено сообщение — Chat
fromОтправитель — User
textТекст сообщения
captionПодпись к фото, видео или файлу
entitiesКоманды в тексте: [{ type: "bot_command", offset, length }]
reply_to_messageСообщение, на которое ответили: { message_id, text }
photoМассив с фото: [{ file_id, file_url, width, height, file_size }]
video, voice, video_note, audio, animation, sticker, documentФайл соответствующего типа: file_id, file_url, file_size, mime_type, у аудио и видео — duration, у документа — file_name
locationГеопозиция: { latitude, longitude }
contactКонтакт: { user_id, first_name, username }
successful_paymentСчёт оплачен — см. Платежи
phantom_typeТип сообщения: text, image, video, voice, videonote, audio, file, sticker, gif, location, contact, poll, gift и др.
📎 Чтобы скачать файл, добавьте file_url к адресу сервера: https://nemazing.org + /uploads/…. Этот же file_id можно передать в методы отправки, чтобы переслать файл без повторной загрузки.

User и Chat

User

ПолеОписание
idУникальный номер пользователя
is_bottrue, если это бот
first_nameИмя
usernameЛогин без @

Chat

ПолеОписание
idНомер чата — передавайте его как chat_id
typeprivate, group или channel
titleНазвание группы или канала
first_name, usernameДля личных чатов — данные собеседника

Вместо числового chat_id публичного канала или группы можно передать его ссылку: @channel_name.

Клавиатуры

К любому отправляемому сообщению можно добавить параметр reply_markup — JSON-объект с кнопками.

Кнопки под сообщением

При нажатии на кнопку с callback_data бот получит обновление callback_query. Кнопка с url открывает ссылку. До 20 рядов, до 8 кнопок в ряду, текст — до 64 символов.

{
  "inline_keyboard": [
    [{ "text": "👍 Нравится", "callback_data": "like" }, { "text": "👎", "callback_data": "dislike" }],
    [{ "text": "Открыть сайт", "url": "https://example.com" }]
  ]
}

Другие кнопки

ПолеЧто делает
copy_text{ "text": "PROMO10" } — кнопка копирует текст (промокод, номер заказа)
web_app{ "url": "https://…" } — открывает веб-приложение бота
paytrue — кнопка оплаты счёта (только в sendInvoice)
switch_inline_query_current_chatПодставляет в поле ввода @бот запрос

Оформление кнопок — цвет и анимация

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

ПолеЗначения
styleprimary (фирменный оранжевый), success (зелёный), danger (красный), warning (жёлтый), secondary (серый), dark, light
color, color2Свой цвет "#ff2d92"; с color2 — градиент
effectАнимация: pulse (пульсирует), shine (блик), glow (свечение), bounce (подпрыгивает), shake (покачивается), rainbow (переливается радугой)
iconЭмодзи перед текстом, например "🛒"
{ "inline_keyboard": [
  [{ "text": "Купить", "callback_data": "buy", "style": "success", "effect": "pulse", "icon": "🛒" }],
  [{ "text": "Промокод", "copy_text": { "text": "NEMAZING10" }, "color": "#ff2d92", "color2": "#7c3aff", "effect": "shine" }]
] }

Кнопки без действия или со ссылкой не на https://, tg://, nemazing://, mailto:, tel: не показываются. Пользователи с включённым «облегчённым режимом» или «уменьшением движения» видят кнопки без анимации.

Клавиатура вместо обычной

Кнопки с готовыми ответами внизу экрана. Нажатие отправляет текст кнопки обычным сообщением.

{ "keyboard": [["Погода", "Курс"], ["Помощь"]], "resize_keyboard": true, "one_time_keyboard": false }

// убрать клавиатуру
{ "remove_keyboard": true }

Информация о боте

getMe

Проверка токена. Возвращает User бота.

setMyCommands

Задаёт команды, которые пользователь видит подсказками при вводе «/».

ПараметрОписание
commandsобязательныйМассив до 100 команд: [{ "command": "weather", "description": "Погода сейчас" }]

getMyCommands

Возвращает текущий список команд.

setMyDescription

Меняет описание бота в профиле и на пустом экране чата. Параметр description — до 500 символов.

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

Все методы отправки возвращают отправленный Message и принимают общие параметры:

ПараметрОписание
chat_idобязательныйНомер чата или @ссылка. Бот должен быть участником чата, а в канале — администратором
reply_to_message_idОтветить на сообщение
reply_markupКлавиатура

Разметка: parse_mode

Как в Telegram: "HTML" — теги <b>, <i>, <s>, <code>, <pre>, <a href>, <tg-spoiler>, <blockquote>; "MarkdownV2" и "Markdown" — *жирный*, _курсив_, ~зачёркнутый~, ||спойлер||. Работает в text и caption всех методов. Без parse_mode действует разметка Nemazing (ниже).

sendMessage

Текстовое сообщение. Параметр text (обязательный) — до 8000 символов. Поддерживается оформление: **жирный**, __курсив__, ~~зачёркнутый~~, `код`, ссылки и упоминания @username.

curl -X POST "https://nemazing.org/bot<ТОКЕН>/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{"chat_id": 42, "text": "Привет! 👋", "reply_markup": {"inline_keyboard": [[{"text": "Старт", "callback_data": "go"}]]}}'

sendPoll

Опрос. Параметры: question — вопрос, options — массив вариантов (строки), allows_multiple_answers — несколько ответов, is_anonymous — анонимный (по умолчанию да).

Викторина: sendPoll с type: "quiz"

Передайте type: "quiz", correct_option_id — номер правильного варианта (с нуля) и необязательное explanation — пояснение, которое пользователь увидит после ответа. Правильный ответ не виден, пока человек не ответит; изменить ответ нельзя.

sendChecklist

Чек-лист — список дел, который участники отмечают галочками. Параметры: title — название, items — массив пунктов (строки, до 50), others_can_add_tasks и others_can_mark_tasks_as_done — могут ли участники добавлять и отмечать пункты (по умолчанию да).

sendContact

Контакт. Параметры: phone_number, first_name, last_name, необязательный user_id — пользователь Nemazing (тогда под карточкой появится кнопка «Написать»).

sendDice

Анимированный кубик со случайным значением. Параметр emoji: 🎲 (1–6), 🎯 (1–6), 🏀 и ⚽ (1–5), 🎳 (1–6), 🎰 (1–64). Значение — в поле dice.value ответа.

forwardMessage

Пересылает сообщение с пометкой «Переслано от». Параметры: chat_id — куда, from_chat_id — откуда (бот должен там состоять, или это публичный канал), message_id.

copyMessage

Копирует сообщение без пометки о пересылке. Параметры как у forwardMessage, плюс caption — новая подпись и reply_markup. Возвращает { message_id }.

sendLocation

Геопозиция. Параметры latitude и longitude.

sendChatAction

Показывает собеседнику «печатает…». Параметр action: typing или record_voice. Удобно, если ответ готовится несколько секунд.

Медиа и файлы

Файл можно передать тремя способами:

  • загрузить в запросе multipart/form-data — имя поля совпадает с названием параметра (photo, video…);
  • указать file_id файла, который уже есть в Nemazing;
  • указать ссылку на файл.

Подпись передаётся в параметре caption. Размеры фото Nemazing определяет сам — картинка показывается в чате целиком, с правильными пропорциями. Ссылку на файл сервер скачивает к себе (до 20 МБ), поэтому фото не пропадёт, даже если исходный сайт удалит его. has_spoiler: true скрывает фото и видео под спойлер.

МетодПараметр с файломЧто отправляет
sendPhotophotoФото
sendVideovideoВидео
sendAnimationanimationGIF-анимация
sendVoicevoiceГолосовое сообщение
sendAudioaudioМузыка. Дополнительно: title, performer, duration
sendDocumentdocumentЛюбой файл
sendStickerstickerСтикер (PNG/WebP с прозрачностью)

sendMediaGroup

Альбом из 2–10 фото и видео одним сообщением. Параметр media — массив { type: "photo" | "video", media, caption }, где media — ссылка, file_id или attach://имя_поля для файла из multipart/form-data. Подпись берётся из первого элемента, где она указана. Возвращает массив из одного Message.

curl -X POST "https://nemazing.org/bot<ТОКЕН>/sendMediaGroup" \
  -F chat_id=42 -F media='[{"type":"photo","media":"attach://a","caption":"Отпуск"},{"type":"photo","media":"attach://b"}]' \
  -F a=@1.jpg -F b=@2.jpg
curl -X POST "https://nemazing.org/bot<ТОКЕН>/sendPhoto" \
  -F chat_id=42 -F caption="Закат 🌅" -F photo=@sunset.jpg

getFile

Возвращает { file_id, file_path }. Скачать файл: https://nemazing.org + file_path.

Изменение и удаление

editMessageText

Меняет текст сообщения бота. Параметры: chat_id, message_id, text, необязательный reply_markup.

editMessageReplyMarkup

Меняет только кнопки под сообщением: chat_id, message_id, reply_markup.

editMessageCaption

Меняет подпись к фото, видео или файлу: chat_id, message_id, caption, необязательно reply_markup.

editMessageMedia

Заменяет фото, видео или файл в сообщении: chat_id, message_id, media — { "type": "photo" | "video" | "animation" | "document" | "audio", "media": ссылка | file_id | "attach://поле", "caption" }.

deleteMessage · deleteMessages

Удаляет сообщение (message_id) или до 100 сразу (message_ids). Бот всегда может удалять свои сообщения и сообщения в личном чате с ним, а в группах и каналах — любые, если у него есть право «Удалять чужие сообщения». Так работает антиспам.

Чужие публикации в канале

Бот-администратор канала с правом «Изменять чужие публикации» может менять текст и кнопки любых постов канала — например, добавить кнопки «👍» или «Купить» к посту, который опубликовал человек. Нажатия на такие кнопки приходят этому боту как callback_query.

Чаты

getChat

Информация о чате: id, type, title, username, description, photo, permissions, pinned_message, invite_link, а также оформление Nemazing — member_count, theme, wallpaper, frame, level. Параметр chat_id.

getChatMemberCount

Количество участников чата. Параметр chat_id.

getChatMember

Статус участника: { user, status }, где status — creator, administrator, member, left или kicked. У администраторов — права can_delete_messages, can_pin_messages и др. Параметры: chat_id, user_id.

getChatAdministrators

Список владельца и администраторов чата. Параметр chat_id.

pinChatMessage · unpinChatMessage · unpinAllChatMessages

Закрепить или открепить сообщение: chat_id, message_id. В группах и каналах боту нужно право администратора «Закреплять сообщения».

banChatMember · unbanChatMember

Удалить участника и запретить ему возвращаться, или снять запрет: chat_id, user_id. Нужно право «Блокировать и удалять участников». Администраторов заблокировать нельзя.

restrictChatMember

Запретить участнику группы писать: chat_id, user_id, permissions: { "can_send_messages": false }, необязательно until_date (unix-время; без него — до снятия). Снять ограничение — "can_send_messages": true. Нужно право «Блокировать и удалять участников».

banChatMember — дополнительно

until_date — временная блокировка (снимется сама), revoke_messages: true — удалить все сообщения нарушителя в чате. unbanChatMember для участника, который в чате, исключает его без запрета вернуться (как в Telegram); с only_if_banned: true — только снимает блокировку.

promoteChatMember · setChatAdministratorCustomTitle

Назначить администратора с правами can_change_info, can_delete_messages, can_restrict_members, can_invite_users, can_pin_messages, can_post_messages, can_edit_messages, can_manage_video_chats, can_promote_members (все false — снять права). Бот не может выдать право, которого нет у него самого. Должность — custom_title до 24 символов.

setChatPermissions

Общие разрешения участников группы: permissions: { can_send_messages, can_send_media_messages, can_invite_users, can_pin_messages, can_manage_video_chats }.

exportChatInviteLink · createChatInviteLink · editChatInviteLink · revokeChatInviteLink

Пригласительные ссылки. createChatInviteLink: name, expire_date, member_limit, creates_join_request (вступление после одобрения).

approveChatJoinRequest · declineChatJoinRequest

Одобрить или отклонить заявку: chat_id, user_id. Заявки приходят ботам-администраторам с правом «Добавлять участников» как обновление chat_join_request.

setChatTitle · setChatDescription

Изменить название (title) или описание (description) группы или канала. Нужно право «Изменять профиль».

setChatPhoto · deleteChatPhoto

Фото группы или канала: photo — файл (multipart/form-data), file_id или ссылка.

Оформление: setChatTheme · setChatWallpaper · setChatFrame

Методы Nemazing. theme — тема чата (пустая строка — стандартная); wallpaper — фон для всех (название фона или grad:#ff6a00,#7c3aff,135, открывается на 5 уровне сообщества); frame — рамка аватарки (frame_…, с 4 уровня). Нужно право «Изменять профиль». Обычные участники и подписчики оформление сообщества не меняют.

События об участниках

Бот получает:

  • my_chat_member — бота добавили в группу или канал, назначили администратором, изменили права или удалили;
  • message.new_chat_members и message.left_chat_member — в группе кто-то вступил или вышел (для приветствий);
  • chat_member — любые изменения участника: вступил, вышел, ограничен (restricted), заблокирован (kicked), стал администратором. В каналах — только ботам-администраторам;
  • chat_join_request — заявка на вступление по ссылке.
// приветствие новичка с кнопкой
if (update.message?.new_chat_members) {
  const u = update.message.new_chat_members[0];
  await api('sendMessage', { chat_id: update.message.chat.id, text: `Привет, ${u.first_name}! 👋`, parse_mode: 'HTML',
    reply_markup: { inline_keyboard: [[{ text: 'Правила', url: 'https://example.com', style: 'primary', effect: 'pulse' }]] } });
}

Темы (форумы)

В группе с включёнными темами передайте message_thread_id в любом методе отправки, чтобы сообщение попало в нужную тему (без него — в «Общее»). Во входящих сообщениях есть message_thread_id и is_topic_message, у чата — is_forum: true.

createForumTopic · editForumTopic · closeForumTopic · reopenForumTopic · deleteForumTopic

Управление темами (бот должен быть администратором). createForumTopic: chat_id, name, необязательно icon_emoji и icon_color (0–7) — возвращает { message_thread_id, name }. Остальные принимают chat_id и message_thread_id; editForumTopic — ещё name и icon_emoji.

leaveChat

Бот выходит из группы или канала. Параметр chat_id.

Добавить бота: откройте его профиль → «В группу» или «В канал», либо «Управление» сообщества → «Боты». В группу бота можно добавить участником или администратором (для модерации и приветствий). В канал бот добавляется администратором — тогда он публикует записи (с кнопками), изменяет и удаляет их и получает channel_post.

Мини-приложения и кнопка «Меню»

Мини-приложение — ваш сайт, который открывается внутри Nemazing поверх чата. Сайт сразу знает, кто его открыл (без логина), и может принимать оплату рублями. Работает как Telegram Mini Apps: подключите наш скрипт — и код, написанный для Telegram, заработает без изменений.

<script src="https://nemazing.org/js/web-app.js"></script>
// дальше — как в Telegram
const app = Telegram.WebApp;   // или Nemazing.WebApp
app.ready(); app.expand();
app.initDataUnsafe.user          // { id, first_name, username, … }
app.MainButton.setText('Купить').show().onClick(() => …);
app.openInvoice(link, (status) => { /* 'paid' | 'cancelled' | 'failed' */ });

Как открыть приложение

  • кнопка под сообщением: { "text": "Открыть", "web_app": { "url": "https://…" } };
  • кнопка клавиатуры внизу с web_app — тогда приложение может вызвать Telegram.WebApp.sendData(…), и бот получит message.web_app_data;
  • кнопка «Меню» у поля ввода — метод setChatMenuButton (или «Мои боты» → «Мини-приложение и кнопка Меню»);
  • кнопка «Открыть» в профиле бота — появляется, если задана кнопка меню.

setChatMenuButton · getChatMenuButton

menu_button: { "type": "web_app", "text": "🎰 Играть", "web_app": { "url": "https://…" } } или { "type": "commands" } — обычное меню команд. Без chat_id — для всех чатов, с chat_id — для одного.

Проверка пользователя (initData)

При открытии сайт получает Telegram.WebApp.initData — строку с данными пользователя и подписью hash. Подпись считается так же, как в Telegram: secret = HMAC_SHA256("WebAppData", токен_бота), hash = HMAC_SHA256(secret, строки "ключ=значение" по алфавиту через \n) — готовые библиотеки для Telegram подходят. Отправляйте initData на свой сервер в заголовке и проверяйте. Если сайт лежит в папке public/ бота на хостинге Nemazing, проверять ничего не нужно: передайте заголовок X-Init-Data в запросах к api/…, и в обработчике будет готовый req.user.

createInvoiceLink

Счёт для оплаты из мини-приложения: title, description, amount (₽), payload. Возвращает ссылку — передайте её в Telegram.WebApp.openInvoice(ссылка). Одной ссылкой могут заплатить много пользователей; каждый платёж приходит боту как successful_payment. Если рублей не хватает, Nemazing сам предложит пополнить кошелёк.

answerWebAppQuery

Отправить сообщение в чат от имени пользователя (с пометкой «через @бота»): web_app_query_id — из initDataUnsafe.query_id, result — { type: "article", title, input_message_content: { message_text } } или { type: "photo", photo_url }.

Трансляция геопозиции

sendLocation

Параметры: chat_id, latitude, longitude, horizontal_accuracy. С live_period (секунды; округляется до 15 минут, 1 часа или 8 часов) отправляется трансляция — её можно обновлять.

editMessageLiveLocation

Новая точка трансляции: message_id, latitude, longitude, horizontal_accuracy, heading. Карта у всех участников обновляется сразу.

stopMessageLiveLocation

Завершить трансляцию: message_id.

Игры

HTML5-игра открывается в мессенджере на весь экран. Создайте её методом setMyGame, отправьте sendGame — у сообщения будут кнопки «Играть» и «Рекорды». При нажатии «Играть» бот получает callback_query с полем game_short_name (как в Telegram) и может ответить answerCallbackQuery с url; если у игры задан url, она откроется сразу. К ссылке добавляется #nmz_ticket=…&user_id=…&chat_id=…&message_id=…: игра передаёт эти данные вашему серверу, а он записывает результат.

setMyGame

short_name (латиница, цифры, _), title, description, photo_url (https), url — адрес игры (https или сайт бота /b/логин/…). Также getMyGames и deleteMyGame.

sendGame

chat_id, game_short_name.

setGameScore

user_id, score, chat_id, message_id; force — записать даже меньший результат; disable_edit_message — не обновлять тройку лидеров в сообщении. Если новый результат не больше прежнего — ошибка BOT_SCORE_NOT_MODIFIED.

getGameHighScores

user_id, chat_id, message_id → массив { position, user, score }: тройка лидеров и место пользователя.

Inline-режим

Включите inline-режим в «Мои боты» → бот → «Inline-режим». Пользователь пишет @ваш_бот запрос в любом чате — бот получает обновление inline_query { id, from, query, offset, chat_type } и в течение 8 секунд отвечает методом answerInlineQuery. Выбранный результат отправляется от имени пользователя с пометкой «через @бот», бот получает chosen_inline_result.

answerInlineQuery

Параметры: inline_query_id, results — до 50 результатов, cache_time (секунды, по умолчанию 300), next_offset — для подгрузки следующих. Типы результатов: article (title, description, thumbnail_url, input_message_content.message_text), photo (photo_url, thumbnail_url, caption), gif (gif_url), video (video_url), sticker. У любого результата может быть reply_markup с инлайн-кнопками. Ссылки на картинки — только https.

// в Студии разработчика
bot.on('inline', (q) => q.answer([
  { type: 'article', id: '1', title: 'Эхо: ' + q.query, input_message_content: { message_text: q.query } }
], { cache_time: 0 }));

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

Когда пользователь нажимает кнопку с callback_data, бот получает callback_query:

ПолеОписание
idНомер нажатия — передайте его в answerCallbackQuery
fromКто нажал — User
messageСообщение с кнопкой
dataЗначение callback_data нажатой кнопки

answerCallbackQuery

Ответ на нажатие — покажет пользователю короткое уведомление. Ответить нужно в течение 10 минут.

ПараметрОписание
callback_query_idобязательныйЗначение id из callback_query
textТекст уведомления
show_alerttrue — показать окно с кнопкой «ОК» вместо всплывающей подсказки
urlОткрыть ссылку

Платежи в рублях

Боты могут продавать товары и услуги за рубли с баланса пользователя в Nemazing. Пользователь оплачивает счёт одной кнопкой, деньги поступают на кошелёк владельца бота, откуда их можно вывести на карту. Код валюты в API — PHM.

sendInvoice

Отправляет счёт с кнопкой «Оплатить».

ПараметрОписание
chat_idобязательныйКому выставить счёт
titleобязательныйНазвание товара, до 64 символов
descriptionОписание, до 255 символов
amountСумма в рублях: 1–1 000 000. Можно вместо неё передать prices — массив [{ label, amount }], суммы сложатся
payloadВаш внутренний идентификатор заказа (до 128 символов) — вернётся после оплаты
photo_urlКартинка товара

Возвращает Message с полем invoice: { invoice_id, title, total_amount, currency }.

Подтверждение оплаты

После оплаты бот получит обновление message с полем successful_payment:

"successful_payment": {
  "currency": "PHM",
  "total_amount": 150,
  "invoice_payload": "order-1024",
  "invoice_id": 77,
  "charge_id": "3191"
}

refundPayment

Возвращает деньги за оплаченный счёт с кошелька владельца бота. Параметр invoice_id.

getMyBalance

Баланс кошелька владельца бота: { amount, currency: "PHM" }.

Ошибки

КодЧто значит
400Неверные параметры: пустой текст, чат не найден, сообщение нельзя удалить и т. п. Подробности — в description
401Неверный токен
403Нет прав, например бот не администратор канала
404Метод не существует
413Слишком большой файл
429Слишком много запросов — подождите немного

Ограничения

  • Текст сообщения — до 8000 символов.
  • Размер файла — до 200 МБ.
  • До 20 ботов на один аккаунт.
  • Неполученные обновления хранятся 24 часа.
  • Webhook должен ответить за 10 секунд.
  • Не отправляйте одному пользователю больше 1 сообщения в секунду, а в группу — больше 20 в минуту.

Правила для ботов

  • Бот пишет пользователю, только если тот сам начал с ним чат.
  • Запрещены спам, реклама без согласия, мошенничество и сбор чужих данных.
  • При оплате бот обязан выполнить обещанное или вернуть деньги через refundPayment.
  • За нарушения бот и аккаунт владельца могут быть заблокированы.