🤖 Боты ВЕЧЕ
Бот — это аккаунт, который отвечает сам: ведёт анкеты, присылает новости, принимает заказы, играет. Сделать бота можно двумя способами.
1. Без программирования — конструктор
В приложении: Настройки → 🤖 Мои боты → Создать бота. Задай приветствие, кнопки и ответы на команды или слова — бот заработает сразу, прямо на сервере ВЕЧЕ. Свой сервер и внешний IP не нужны.
2. Для разработчиков — HTTP API
Там же возьми токен. API устроено как Telegram Bot API, поэтому многие боты для Telegram переносятся заменой адреса.
Адрес запросов
POST https://ваш-сервер/bot<ТОКЕН>/<метод>
Content-Type: application/json
Ответ всегда такой: {"ok": true, "result": …} или {"ok": false, "error_code": 403, "description": "…"}.
Правило согласия
Бот пишет человеку в личку только после того, как тот сам открыл бота и нажал «Начать» (или написал ему). Если человек заблокировал бота — сообщения не доходят (ошибка 403). В группу или канал бот пишет, если его туда добавили; в канале он должен быть администратором. Так пользователи защищены от спама, а разработчики могут присылать рассылки тем, кто подписался.
Методы
| Метод | Параметры | Что делает |
|---|---|---|
getMe | — | Информация о боте |
getUpdates | offset, limit, timeout (до 50 с) | Новые события (long polling). Передавай offset = последний update_id + 1, чтобы подтвердить полученные. |
setWebhook | url (https), secret_token | Слать события POST-ом на твой сервер. Заголовок X-Veche-Bot-Api-Secret-Token — для проверки. |
deleteWebhook | — | Вернуться к getUpdates |
sendMessage | chat_id, text, reply_markup, reply_to_message_id | Отправить текст. Поддерживается разметка **жирный**, __курсив__, `код`, ||спойлер||. |
sendPhoto | chat_id, photo, caption, reply_markup | photo — путь /uploads/… (из uploadFile или из входящего сообщения) либо https-ссылка на картинку. |
uploadFile | тело запроса — сам файл, Content-Type картинки/аудио/видео/pdf | Загрузить файл, вернёт {"file_id":"/uploads/…"} |
editMessageText | message_id, text, reply_markup | Изменить своё сообщение |
editMessageReplyMarkup | message_id, reply_markup | Поменять только кнопки |
deleteMessage | message_id | Удалить сообщение |
answerCallbackQuery | callback_query_id, text, show_alert | Ответ на нажатие кнопки (всплывашка у пользователя) |
sendChatAction | chat_id | Показать «печатает…» |
setMyCommands | commands: [{command, description}] | Меню команд «/» у пользователей |
getChat | chat_id | Информация о чате/пользователе |
chat_id: для лички — id пользователя (он приходит в событиях как message.chat.id), для группы/канала — grp:…/chn:… или @адрес публичного канала.
Кнопки
{
"chat_id": "…",
"text": "Нравится анкета?",
"reply_markup": {
"inline_keyboard": [[{"text": "❤️", "callback_data": "like:42"}, {"text": "👎", "callback_data": "skip:42"}],
[{"text": "Сайт", "url": "https://example.com"}]],
"keyboard": [["🔍 Анкеты", "👤 Моя анкета"]],
"one_time_keyboard": false
}
}
inline_keyboard — кнопки под сообщением: нажатие присылает событие callback_query. keyboard — большие кнопки вместо клавиатуры: нажатие отправляет их текст как обычное сообщение. {"remove_keyboard": true} — убрать клавиатуру.
События
{ "update_id": 7,
"message": { "message_id": "a1b2…", "date": 1790000000, "text": "/start",
"from": { "id": "u123", "username": "anton", "first_name": "Антон", "is_bot": false },
"chat": { "id": "u123", "type": "private" },
"photo": [{ "file_id": "/uploads/…", "url": "/uploads/…" }] } }
{ "update_id": 8,
"callback_query": { "id": "c9…", "data": "like:42", "from": {…}, "message": {…} } }
В группах бот получает только команды (/…), упоминания @бота и ответы на свои сообщения.
Пример: эхо-бот на Node.js (без библиотек)
const API = 'https://ваш-сервер/bot' + process.env.TOKEN + '/';
const call = (m, body) => fetch(API + m, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body || {}) }).then((r) => r.json());
let offset = 0;
(async function loop() {
for (;;) {
const r = await call('getUpdates', { offset, timeout: 30 }).catch(() => ({ result: [] }));
for (const u of r.result || []) {
offset = u.update_id + 1;
if (u.message && u.message.text) {
await call('sendMessage', { chat_id: u.message.chat.id, text: 'Ты написал: ' + u.message.text,
reply_markup: { inline_keyboard: [[{ text: '👍', callback_data: 'ok' }]] } });
}
if (u.callback_query) await call('answerCallbackQuery', { callback_query_id: u.callback_query.id, text: 'Спасибо!' });
}
}
})();
Пример на Python
import requests, os
API = "https://ваш-сервер/bot" + os.environ["TOKEN"] + "/"
offset = 0
while True:
ups = requests.post(API + "getUpdates", json={"offset": offset, "timeout": 30}).json()["result"]
for u in ups:
offset = u["update_id"] + 1
m = u.get("message")
if m and m.get("text"):
requests.post(API + "sendMessage", json={"chat_id": m["chat"]["id"], "text": "Привет, " + m["from"]["first_name"]})
Ограничения
- До 40 запросов в секунду на бота.
- До 10 ботов на аккаунт.
- Токен — это пароль бота. Утёк — смени его в «Мои боты».
- Спам, мошенничество и запрещённый контент — бан бота и владельца.
Живой пример Бот знакомств @vechinchik_bot работает на этом API — открой его в ВЕЧЕ и нажми «Начать».