🤖 Боты ВЕЧЕ

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

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—Информация о боте
getUpdatesoffset, limit, timeout (до 50 с)Новые события (long polling). Передавай offset = последний update_id + 1, чтобы подтвердить полученные.
setWebhookurl (https), secret_tokenСлать события POST-ом на твой сервер. Заголовок X-Veche-Bot-Api-Secret-Token — для проверки.
deleteWebhook—Вернуться к getUpdates
sendMessagechat_id, text, reply_markup, reply_to_message_idОтправить текст. Поддерживается разметка **жирный**, __курсив__, `код`, ||спойлер||.
sendPhotochat_id, photo, caption, reply_markupphoto — путь /uploads/… (из uploadFile или из входящего сообщения) либо https-ссылка на картинку.
uploadFileтело запроса — сам файл, Content-Type картинки/аудио/видео/pdfЗагрузить файл, вернёт {"file_id":"/uploads/…"}
editMessageTextmessage_id, text, reply_markupИзменить своё сообщение
editMessageReplyMarkupmessage_id, reply_markupПоменять только кнопки
deleteMessagemessage_idУдалить сообщение
answerCallbackQuerycallback_query_id, text, show_alertОтвет на нажатие кнопки (всплывашка у пользователя)
sendChatActionchat_idПоказать «печатает…»
setMyCommandscommands: [{command, description}]Меню команд «/» у пользователей
getChatchat_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"]})

Ограничения

Живой пример Бот знакомств @vechinchik_bot работает на этом API — открой его в ВЕЧЕ и нажми «Начать».