Без boilerplate: клонируйте бота, который уже работает
- Отправка обычного сообщения;
- Отправка медиа: изображение / файл / видео;
- Отправка контакта (визитная карточка vCard);
- Отправка товара;
- Создание WhatsApp группы;
- Отправка приглашения в группу;
- Отправка сообщения в WhatsApp группу;
- Получение и обработка входящих сообщений;
- Ответ на неизвестную команду (для реализации меню, инструкций или приветственного сообщения).
git clone https://github.com/Whapi-Cloud/nodejs-whatsapp-chatbot
cd nodejs-whatsapp-chatbot
package.json:
npm install
Структура проекта
- /files — примеры медиа, которые бот может отправить (картинка, PDF, видео, vCard). Меняйте, когда понадобится.
- config.js —
token,botUrl,portи опциональные IDgroup/product. - index.js — регистрирует вебхук, слушает
/hook/messagesи мапит цифры 1–9 на действия.
Подключите свой номер WhatsApp
Отсканируйте QR-код в аккаунте
config.js как token. Запросы к https://gate.whapi.cloud идут с Bearer.
Перед запуском бота
- Токен канала вставлен в
config.js. - Второй телефон для теста: бот игнорирует сообщения с подключённого номера.
- Публичный HTTPS-URL. Локально — ngrok; в продакшене — любой хост с HTTPS.
Дайте боту публичный HTTPS-URL
/hook/messages вашего сервера -> бот смотрит команду и отвечает. URL в панель не вставляют; бот регистрирует его из config.js при старте.config.js как botUrl; при старте репозиторий регистрирует её через API настроек канала.Локальный туннель через ngrok
port по умолчанию в config.js — 80 (443 не используйте). Скачайте ngrok и выполните ngrok http 80 — или тот порт, который указали в config.js.https://. Задайте botUrl как этот хост плюс /hook, например botUrl: "https://84c7-151-33-282-113.ngrok-free.app/hook".
/hook. Сервер слушает POST на /hook/messages; botUrl — это префикс, который попадает в настройки канала.node index.js бот отправляет PATCH /settings с этим URL и событием messages. Сообщения WhatsApp приходят в ваш процесс. Поля вебхука в панели можно не трогать — разве что хотите посмотреть, что зарегистрировалось.Что нужно продакшену
botUrl, перезапустите бота, чтобы вебхук зарегистрировался заново.Запуск бота
token и botUrl в config.js и из корня проекта выполните node index.js. Должен появиться лог listening. С другого телефона отправьте любой текст на подключённый номер. Бот ответит нумерованным меню.Меню команд
- Простое текстовое сообщение
- Отправить изображение
- Отправить документ
- Отправить видео
- Отправить контакт
- Отправить товар
- Создать группу
- Простой текст в группу
- Получить id трёх ваших групп
Отправьте только цифру, например 1. Всё остальное снова вернёт этот список.
product и group в config.js. На первом тесте их можно пропустить. Когда понадобятся, ID берите через GET /groups и GET /business/products.Если что-то не работает
Бот не отвечает
from_me. Проверьте токен, что botUrl заканчивается на /hook, что ngrok (или хост) ещё жив и что процесс вывел сообщение listening.Бот уходит в цикл сообщений
if (message.from_me) continue. Без этой проверки бот отвечает сам себе и не останавливается.В одних чатах работает, в других нет
Отправка сообщений WhatsApp из Node.js
fetch на https://gate.whapi.cloud с Bearer-токеном.Отправить текстовое сообщение
const response = await fetch('https://gate.whapi.cloud/messages/text', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: '[email protected]',
body: 'Hello from the cloned bot'
})
});
const data = await response.json();
console.log(data);
Отправить документ
const response = await fetch('https://gate.whapi.cloud/messages/document', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: '[email protected]',
media: 'https://example.com/file.pdf',
caption: 'Document from the bot'
})
});
const data = await response.json();
console.log(data);
Работа с группами WhatsApp
/groups.Список ваших групп
const response = await fetch('https://gate.whapi.cloud/groups', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN'
}
});
const { groups } = await response.json();
console.log(groups);
Посчитать участников группы
groups.forEach(group => {
console.log(`Group Name: ${group.name}`);
console.log(`Participants: ${group.participants.length}`);
});
Обработка сообщений в группе
@g.us. Входящие вебхуки используют тот же суффикс; клонированный бот уже ветвится по нему, когда команда адресована группе.
// Из клонированного бота: сообщения групп идут с chat_id, который заканчивается на @g.us
const messages = req.body.messages;
messages.forEach(message => {
if (message.chat_id.endsWith('@g.us')) {
console.log(`Group message: ${message.text?.body}`);
}
});
config.group. Пропишите этот ID до того, как пользоваться этими номерами.Оставьте его онлайн
node index.js на машине с публичным HTTPS-URL и задайте botUrl как https://ваш-хост/hook. Это долгоживущий процесс Express, а не одноразовая serverless-функция: подойдёт VPS или любой Node-хост с HTTPS. После смены botUrl перезапустите, чтобы вебхук зарегистрировался снова.Firebase
- Создайте проект в Firebase Console;
- Установите Firebase CLI, следуя инструкциям;
- Инициализируйте Firebase в директории вашего проекта с помощью команды firebase init;
- Разверните вашего бота, используя команду firebase deploy --only functions.
AWS (Amazon Web Services)
- Зарегистрируйтесь или войдите в AWS Management Console;
- Создайте новую функцию Lambda через консоль AWS, выбрав в качестве триггера API Gateway;
- Загрузите код вашего бота в Lambda функцию;
- Настройте API Gateway для взаимодействия вашего бота с внешним миром.
Heroku
- Создайте аккаунт на Heroku;
- Установите Heroku CLI и войдите в систему;
- Создайте новое приложение на Heroku через консоль или используя команду heroku create;
- Свяжите ваш Git репозиторий с Heroku и выполните деплой с помощью команд git push heroku master;
- Установите URL вебхука, предоставленный Heroku.