SMeet Bot API
Первый бот
За несколько минут вы создадите бота и получите от него первый ответ. Нужны аккаунт SMeet с подтверждённым e-mail и компьютер с Python 3.9+ или Node.js 22.13+.
Перед началом#
- Ваш аккаунт. Для создания бота нужен подтверждённый адрес e-mail. У одного человека может быть до 5 ботов.
- Разрешение в пространстве. Бот создаётся в том пространстве, где вы открыли BotFather. В публичном пространстве создание открывает платформа, в организации её администраторы (см. Организации и доступ). Если создание закрыто, BotFather так и скажет.
- Примеры. Скачайте их для Python или Node.js. Каждый архив распаковывается в папку
smeet-bot-examplesс ботами, их README и локальным mock-сервером. Все примеры описаны в разделе Рабочие примеры.
Шаг 1. Создайте бота#
- Откройте SMeet BotFather из раздела Мои боты в приложении или откройте чат с
@smeet_botfather. - Отправьте
/newbotили нажмите Создать бота. - Отправьте имя, которое увидят люди, от 1 до 64 символов, например
Помощник поддержки. - Отправьте адрес: от 5 до 32 символов, строчные латинские буквы, цифры и
_, в начале буква, в конце_bot, напримерsupport_helper_bot.
BotFather отвечает: Готово: бот @support_helper_bot создан. Статус: не подключён. Если адрес занят, зарезервирован или не подходит по правилам, BotFather сохранит имя и попросит другой адрес.
Шаг 2. Получите токен#
Нажмите Получить токен под ответом BotFather. Кнопка открывает защищённый экран токена в вашем приложении; в чат BotFather токен не присылает никогда.
Токен выглядит как sbt1_<key id>_<secret> и показывается один раз. Скопируйте его в менеджер паролей или сразу в файл .env бота. SMeet хранит только хэш токена: если вы его потеряете, выпустите новый на том же экране, и старый сразу перестанет работать.
Любой, у кого есть токен, может действовать от имени вашего бота. Не вставляйте токен в URL, чаты, скриншоты и git-репозитории. Как хранить и менять токен, описано в разделе Эксплуатация.
Шаг 3. Проверьте токен#
getMe подтверждает, что токен работает, и показывает, что SMeet знает о боте. Сначала поместите токен в переменную SMEET_BOT_TOKEN; команда read -rs SMEET_BOT_TOKEN && export SMEET_BOT_TOKEN запросит его без вывода на экран и не оставит в истории командной оболочки.
curl -s https://messenger.scrile.com/bot-api/v1/getMe \
-H "Authorization: Bearer $SMEET_BOT_TOKEN"{
"ok": true,
"result": {
"id": "5001",
"username": "support_helper_bot",
"display_name": "Помощник поддержки",
"is_bot": true,
"space": {"id": "1", "kind": "public", "name": "SMeet"},
"status": "active",
"delivery_mode": "polling",
"can_send_files": true
}
}id здесь означает идентификатор аккаунта бота: сообщения, которые отправляет бот, несут то же значение в from.id. Токен всегда передаётся в заголовке Authorization. Опечатка или отозванный токен дают 401 с кодом INVALID_TOKEN. Все идентификаторы передаются строками; храните их в коде тоже строками.
Шаг 4. Запустите эхо-бота#
Эхо-бот отвечает на /start и /help коротким текстом, а любой другой текст возвращает без изменений. Обе версии читают SMEET_BOT_TOKEN и SMEET_API_URL из окружения или из файла .env в текущей папке; по умолчанию SMEET_API_URL равен https://messenger.scrile.com/bot-api/v1.
Python#
unzip smeet-bot-examples-python.zip
cd smeet-bot-examples/python
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # впишите токен в SMEET_BOT_TOKEN
python echo_bot.pyNode.js#
Нужен Node.js 22.13 или новее, npm install не нужен: примеры используют только то, что входит в Node.js.
unzip smeet-bot-examples-node.zip
cd smeet-bot-examples/node
cp .env.example .env # впишите токен в SMEET_BOT_TOKEN
node echo_bot.mjs # или: npm run echoПрограмма пишет в лог Running as @support_helper_bot, delivery mode polling и ждёт. Вот вся логика ответа в версии на Python; ключ каждого ответа строится из event_id события, поэтому повторно доставленное событие никогда не даёт второго сообщения:
def handle(client: smeet.Client, update: dict) -> None:
# Only new messages matter here. Button presses, edits (an edit is a correction, not a new
# command), access changes and update types added in later API versions are ignored.
if update["type"] != "message":
return
message = update["message"]
client.send_message(
message["chat"]["id"],
reply_for(message),
# Same event, same key: a repeated update never produces a second reply.
idempotency_key=smeet.action_key(update["event_id"], "reply"),
)
log.info("Replied to update %s in chat %s", update["update_id"], message["chat"]["id"])Шаг 5. Нажмите «Начать»#
Откройте бота в SMeet: найдите его по адресу или откройте https://messenger.scrile.com/u/support_helper_bot. Нажмите Начать.
Бот получает два события: chat_access_changed со статусом started и ваше сообщение /start. В течение секунды приходит ответ:
Hello! Send me any text and I will send it back.
/help shows what I can do.Отправьте любой текст, и он вернётся. Остановите программу через Ctrl+C и запустите снова: она продолжит с того же места, потому что хранит позицию в echo_bot_state.json.
Если ничего не приходит, смотрите раздел Если бот молчит.
Без токена: mock-сервер#
В обоих архивах есть локальный тестовый двойник Bot API, mock-server/smeet_mock.py. Ему нужен только Python; он обслуживает одного бота с токеном sbt1_mock_localtestonly, а управляющий API под /_mock/ играет роль пользователя. Открывайте каждый терминал в папке, куда распакован архив:
# терминал 1: mock
python3 smeet-bot-examples/mock-server/smeet_mock.py
# терминал 2: бот
cd smeet-bot-examples/python
export SMEET_API_URL=http://127.0.0.1:8081/bot-api/v1
export SMEET_BOT_TOKEN=sbt1_mock_localtestonly
python echo_bot.py
# терминал 3: вы в роли пользователя
curl -s -X POST localhost:8081/_mock/start -d '{}' # в ответе есть chat_id, здесь 550
curl -s -X POST localhost:8081/_mock/message -d '{"chat_id": "550", "text": "hello"}'
curl -s localhost:8081/_mock/chats/550Mock не является SMeet: он следует контракту достаточно точно, чтобы запускать все примеры, но не воспроизводит квоты, ограничения частоты и надёжность настоящего сервера. Прежде чем полагаться на бота, проверьте его с настоящим SMeet.
Шаг 6. Запустите бота на сервере#
Бот отвечает, только пока работает его программа, поэтому засыпающего ноутбука мало. Long polling нужен только исходящий HTTPS, так что подойдёт любой сервер, в том числе за NAT. Unit для systemd с эхо-ботом на Python, папка smeet-bot-examples скопирована в /opt/smeet-bot:
[Unit]
Description=SMeet echo bot
After=network-online.target
Wants=network-online.target
[Service]
User=smeetbot
WorkingDirectory=/opt/smeet-bot/python
ExecStart=/opt/smeet-bot/python/.venv/bin/python echo_bot.py
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target- Файл
.envс токеном остаётся в рабочей папке, и читать его может только пользователь сервиса. Там же пишется файл состоянияecho_bot_state.json. - Запускайте одну копию на бота. Вторая копия получает
CONSUMER_CONFLICTи ждёт; так работает резервная копия, это не ошибка. systemctl stopотправляет SIGTERM, и примеры корректно завершаются с кодом 0. При ошибке настройки (отозванный токен, режим webhook, бот на паузе, боты выключены в организации) они пишут в лог одну строку с причиной и завершаются с кодом 2; с этим unit systemd пробует снова каждые 30 секунд, пока вы не исправите настройку.- Эхо-бот служит учебным примером. Если бот пишет в базу данных, CRM или платёжную систему, начинайте с
python/production_poller.py: он сохраняет каждое событие до подтверждения (Надёжная обработка).
Что дальше#
- Управление ботом: профиль, команды, токен, пауза и удаление.
- Сообщения и кнопки: кнопки под сообщениями, нажатия, редактирование.
- Получение событий: правила доставки, на которые опирается ваша программа.