Bot API Nemazing
Боты — это программы, которые общаются с пользователями прямо в чатах: отвечают на команды, присылают уведомления, принимают оплату и работают в группах и каналах.
Bot API — обычный HTTP-интерфейс. Подойдёт любой язык программирования: JavaScript, Python, PHP, Go, Java и другие. Никаких специальных библиотек не нужно — достаточно уметь отправлять HTTP-запросы и разбирать JSON.
Создание бота
- Откройте в Nemazing чат с @botfather (Nemazing Father) — он создаёт ботов и управляет ими. Его также можно найти в «Настройки → Мои боты».
- Отправьте команду
/newbot. - Введите имя бота — его увидят пользователи, например «Погода».
- Придумайте логин: латиница, 5–32 символа, в конце
bot. Например,weather_bot. - 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 });
}
}
# pip install requests; TOKEN=... python echo.py
import os, requests
API = "https://nemazing.org/bot" + os.environ["TOKEN"]
def call(method, **params):
r = requests.post(f"{API}/{method}", json=params, timeout=60).json()
if not r["ok"]:
raise RuntimeError(r["description"])
return r["result"]
offset = 0
while True:
for u in call("getUpdates", offset=offset, timeout=30):
offset = u["update_id"] + 1
m = u.get("message") or {}
if "text" not in m:
continue
if m["text"] == "/start":
call("sendMessage", chat_id=m["chat"]["id"], text="Привет! Напиши что-нибудь 👋")
else:
call("sendMessage", chat_id=m["chat"]["id"], text=m["text"], reply_to_message_id=m["message_id"])
<?php // webhook.php — укажите его адрес в setWebhook
$token = getenv('TOKEN');
$u = json_decode(file_get_contents('php://input'), true);
$m = $u['message'] ?? null;
if ($m && isset($m['text'])) {
$q = http_build_query(['chat_id' => $m['chat']['id'], 'text' => 'Вы написали: ' . $m['text']]);
file_get_contents("https://nemazing.org/bot$token/sendMessage?$q");
}
Студия разработчика
Бота можно не размещать на своём сервере: в приложении откройте Настройки → Мои боты → бот → Студия разработчика. Это среда разработки прямо в 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_bot | true, если это бот |
first_name | Имя |
username | Логин без @ |
Chat
| Поле | Описание |
|---|---|
id | Номер чата — передавайте его как chat_id |
type | private, 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://…" } — открывает веб-приложение бота |
pay | true — кнопка оплаты счёта (только в sendInvoice) |
switch_inline_query_current_chat | Подставляет в поле ввода @бот запрос |
Оформление кнопок — цвет и анимация
Любой кнопке (и под сообщением, и в клавиатуре внизу) можно задать вид. Поля необязательные — без них кнопка обычная.
| Поле | Значения |
|---|---|
style | primary (фирменный оранжевый), 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 скрывает фото и видео под спойлер.
| Метод | Параметр с файлом | Что отправляет |
|---|---|---|
sendPhoto | photo | Фото |
sendVideo | video | Видео |
sendAnimation | animation | GIF-анимация |
sendVoice | voice | Голосовое сообщение |
sendAudio | audio | Музыка. Дополнительно: title, performer, duration |
sendDocument | document | Любой файл |
sendSticker | sticker | Стикер (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.jpgcurl -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_alert | true — показать окно с кнопкой «ОК» вместо всплывающей подсказки |
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. - За нарушения бот и аккаунт владельца могут быть заблокированы.