Часть 1: Если у вас нет времени на чтение
Данная реализация бота включает в себя наиболее часто используемые функции. Это позволит вам адаптировать исходный код под ваши задачи и потребности или использовать его в качестве основы для создания любой другой интеграции. Мы оставили комментарии рядом с каждой функцией, чтобы вам было проще понять код. В исходном коде бота вы найдете следующие функции:
- Ответ на неизвестную команду, это может быть инструкция или ваше приветственное сообщение;
- Отправка обычного сообщения;
- Отправка изображения;
- Отправка файла;
- Отправка видео;
- Отправка контакта (vCard);
- Отправка товара;
- Создание новой группы, отправка приглашения и отправка сообщения в группу;
- Получение и чтение входящих сообщений;
Для работы бота НЕ ТРЕБУЕТСЯ, чтобы телефон был включен или находился в сети. Подключите номер и комфортно протестируйте интеграцию!
А если вам нужна помощь, просто напишите нам в чат поддержки на любой странице сайта.
А если вам нужна помощь, просто напишите нам в чат поддержки на любой странице сайта.
Часть 2: Введение
Добро пожаловать в это исчерпывающее руководство по созданию собственного бота для WhatsApp с использованием Node.js! Эта статья нацелена на то, чтобы предоставить вам знания и практические навыки для создания функционального бота для WhatsApp с нуля. Независимо от того, являетесь ли вы полным новичком в мире программирования или имеете некоторый опыт, но новичок в Node.js, это руководство для вас.
Что такое бот для WhatsApp и зачем он вам нужен?
Бот для WhatsApp - это автоматизированная программная система, разработанная для взаимодействия с пользователями через платформу WhatsApp. Он может обеспечивать мгновенную поддержку клиентов, отправлять уведомления и даже обрабатывать транзакции. В эпоху, когда вовлечение клиентов критически важно, бот для WhatsApp может значительно улучшить пользовательский опыт, оптимизировать бизнес-операции и даже увеличить продажи.
Почему Node.js?
Node.js - это открытая, кроссплатформенная среда выполнения JavaScript, которая позволяет разработчикам создавать масштабируемые сетевые приложения. Вот почему это отличный выбор для создания бота для WhatsApp:
- Асинхронное программирование. Node.js неблокирующий, что означает, что он может обрабатывать несколько соединений одновременно, что идеально подходит для чат-бота, который должен управлять несколькими взаимодействиями сразу.
- Сильная поддержка сообщества. С живым экосистемом и большим количеством свободно доступных модулей в реестре npm, вы никогда не будете одиноки, кодируя на Node.js.
- Легкость обучения. Если вы уже знакомы с JavaScript, освоение Node.js будет легким. Даже если вы не знакомы, JavaScript — один из самых простых языков программирования для изучения.
- Наша поддержка. Мы рады помогать разработчикам на этом языке программирования. Если вы отправите нам фрагмент вашего кода, где что-то не работает, нам будет проще вам помочь, подсказать или улучшить вашу работу.
По окончании этого руководства у вас будет рабочий бот для WhatsApp, способный получать и отправлять сообщения, медиафайлы и даже взаимодействовать в групповых чатах. Готовы начать своё путешествие? Давайте погрузимся!
Настройка среды разработки
Прежде чем приступить к кодированию, есть несколько вещей, которые вам нужно будет подготовить:
- Node.js и npm. Если у вас не установлены Node.js и npm (Node Package Manager) на вашем компьютере, вам нужно будет их установить. Вы можете скачать последнюю версию с официального сайта Node.js.
- Текстовый редактор. Любой текстовый редактор подойдет, но IDE, такие как Visual Studio Code или WebStorm, предлагают дополнительные функции, такие как отладка и автодополнение, которые могут упростить вашу жизнь.
- Терминал или командная строка. Здесь вы будете запускать все свои скрипты на Node.js.
Этапы установки
- Шаг 1: Установите Node.js и npm. Посетите официальный сайт Node.js и скачайте установщик для вашей операционной системы. Запустите установщик и следуйте инструкциям на экране. Это установит и Node.js, и npm.
- Шаг 2: Настройте папку вашего проекта. Создайте новую папку, где будут храниться все файлы, связанные с вашим ботом для WhatsApp. Перейдите в эту папку, используя терминал. Инициализируйте новый проект Node.js. Это создаст файл package.json, который будет содержать всю метаинформацию и зависимости вашего проекта.
- Шаг 3: Установите необходимые пакеты. Поскольку мы будем работать с API WhatsApp, нам нужно будет установить несколько пакетов для выполнения задачи.
На этом этапе у вас есть рабочая среда разработки, новый проект на Node.js и все необходимые пакеты. Теперь вы готовы начать программировать вашего бота для WhatsApp!
Подключение провайдера API WhatsApp
Whapi.Cloud — это API-шлюз, который облегчает интеграцию с WhatsApp. Это позволяет, с учетом строгих ограничений облачного API и дорогих сообщений, полностью автоматизировать любую функциональность мессенджера. В этой статье мы рассмотрим лишь несколько методов отправки, приема и обработки сообщений в WhatsApp, но возможности этого инструмента гораздо шире.
Как подключиться к Whapi.Cloud
Регистрация. Первый шаг — зарегистрироваться на сайте Whapi.Cloud и создать аккаунт. Это бесплатно и не требует ввода кредитной карты.
После регистрации у вас сразу будет доступ к тестовому каналу с небольшим ограничением. Подождите, пока он запустится (обычно это занимает около минуты). Вам потребуется подключить свой телефон для автоматизации WhatsApp. Именно с подключенного телефона будут отправляться сообщения. Большое преимущество сервиса в том, что запуститься и начать работу занимает всего пару минут.
Чтобы подключить ваш телефон, используйте QR-код, доступный при клике на ваш тестовый канал в личном кабинете. Затем откройте WhatsApp на вашем мобильном устройстве, перейдите в Настройки -> Подключенные устройства -> Подключить устройство -> Сканировать QR-код.


На втором и третьем шагах сервис попросит вас настроить канал: написать его имя для вашего удобства, установить вебхуки, изменить настройки. Все эти шаги можно пропустить, и мы вернемся к вебхукам чуть позже. После запуска, вы найдете в центральном блоке под информацией о лимитах ваш API-ключ, то есть токен. Этот токен будет использоваться для аутентификации ваших запросов к API. Обычно его добавляют в заголовки запроса как токен типа Bearer или просто как параметр запроса, в зависимости от используемого вами метода API.


Закладываем основу бота для WhatsApp
Инициализация сервера с Express
Express — это минималистичный и гибкий фреймворк веб-приложений для Node.js, который предлагает надежный набор функций для веб и мобильных приложений. Мы будем использовать его для инициализации нашего сервера.
Установка: Если вы еще не установили Express, вы можете сделать это с помощью следующей команды npm.
npm install express --save
Инициализация сервера: Создайте новый файл с именем index.js и инициализируйте сервер Express.
const express = require('express');
const app = express();
const port = 3000;
app.listen(port, () => {
console.log(`Server running on http://localhost:${port}/`);
});
Основы асинхронного программирования в Node.js
Node.js построен на базе движка JavaScript V8, который является асинхронным и событийно-ориентированным. Понимание основ асинхронного программирования, таких как колбэки, промисы и async/await, является необходимым для разработки вашего бота.
async function fetchData() {
const data = await getData();
console.log(data);
}
С этими основами, перейдем к конкретным деталям обработки сообщений в следующей главе.
Обработка входящих сообщений
В этой главе мы рассмотрим основную часть любого бота для обмена сообщениями — обработку входящих сообщений. Мы рассмотрим, как настроить вебхук, основы маршрутизации и, наконец, реализацию некоторой элементарной логики для ответа на текстовые сообщения.
Ваш бот для WhatsApp и API-шлюз должны общаться друг с другом, чтобы, когда что-то меняется в одной системе, другая система знала об этом. Например, отслеживание изменений в статусе сообщений, таких как 'отправлено', 'доставлено' и 'прочитано'.
Вот здесь на помощь приходит вебхук! Специально настроенный вебхук позволяет вашему серверу мгновенно узнавать о определенных событиях. В зависимости от ваших настроек, вы можете получать уведомления о сообщениях, их статусе, статусе канала и даже пропущенных звонках.
Мы подробно рассмотрели все нюансы работы с вебхуками в нашей базе знаний: Смотреть статью о вебхуках


Whapi.Cloud предоставляет возможность настроить вебхук для вашего бота. И можно настроить сразу несколько вебхуков для разных событий и с разными условиями. Это значительно облегчает работу программистов.
Маршрутизация и обработка запросов
Для маршрутизации и обработки запросов мы продолжим использовать Express. URL вебхука, который мы предоставили в Whapi.Cloud, будет указывать на конкретный маршрут в нашем приложении.
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhook', (req, res) => {
// Handle incoming messages
});
app.listen(3000, () => {
console.log('Server started');
});
Наконец, давайте добавим некоторую базовую логику для ответа на входящие текстовые сообщения. Для простоты мы будем использовать базовую структуру if-else, хотя позже вы сможете расширить это до чего-то более сложного.
app.post('/webhook', async (req, res) => {
const message = req.body.message.text;
if (message === 'hello') {
await sendMessage('Hi there!');
} else if (message === 'help') {
await sendMessage('How can I assist you today?');
}
res.sendStatus(200);
});
Функция sendMessage будет являться заглушкой на данный момент, которую мы заменим в главе 6 реальным кодом для отправки сообщений.
Отправка сообщений в WhatsApp, используя Node JS
В этой главе мы рассмотрим все тонкости отправки текстовых и медийных сообщений. Отправка правильного типа контента в нужный момент может сделать вашего бота гораздо интереснее. Мы рассмотрим фрагменты кода, которые позволят вашему боту отправлять текстовые сообщения, медиафайлы и даже документы.
Отправка текстовых сообщений
Отправка текстовых сообщений - это самая базовая, но важная функция. Ниже представлен фрагмент кода, который демонстрирует, как отправить текстовое сообщение с использованием API Whapi.Cloud.
const request = require('request');
const options = {
method: 'POST',
url: 'https://gate.whapi.cloud/messages/text?token=YOUR_API_TOKEN',
headers: {accept: 'application/json', 'content-type': 'application/json'},
body: {typing_time: 10, to: '1234567891@s.whatsapp.net', body: 'Hello, world!'},
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
Отправка мультимедиа, документов
WhatsApp позволяет отправлять различные типы медиа - изображения, аудио, видео. Вы можете отправить файл по URL или загрузив его в наше хранилище. Также можно отправить файлы документов, такие как PDF или текстовые файлы. Ниже пример с использованием файла, закодированного в base64.
const request = require('request');
const options = {
method: 'POST',
url: 'https://gate.whapi.cloud/messages/document?token=YOUR_API_TOKEN',
headers: {accept: 'application/json', 'content-type': 'application/json'},
body: {
to: '1234567891@s.whatsapp.net',
media: 'data:application/octet-stream;name=site.webmanifest;base64,ewogICAgIm5hbWUiOiAiIiwKICAgICJzaG9ydF9uYW1lIjogIiIsCiAgICAiaWNvbnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAic3JjIjogIi9hbmRyb2lkLWNocm9tZS0xOTJ4MTkyLnBuZyIsCiAgICAgICAgICAgICJzaXplcyI6ICIxOTJ4MTkyIiwKICAgICAgICAgICAgInR5cGUiOiAiaW1hZ2UvcG5nIgogICAgICAgIH0KICAgIF0sCiAgICAidGhlbWVfY29sb3IiOiAiI2ZmZmZmZiIsCiAgICAiYmFja2dyb3VuZF9jb2xvciI6ICIjZmZmZmZmIiwKICAgICJkaXNwbGF5IjogInN0YW5kYWxvbmUiCn0K'
},
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
В конце статьи мы опубликуем исходный код бота, который вы можете скопировать для своих нужд.


Работа с группами WhatsApp на Node.JS
В этой главе мы рассмотрим, как взаимодействовать с группами в WhatsApp, используя API Whapi.Cloud. В частности, мы рассмотрим, как получить список всех групп, посчитать количество участников в каждой группе и обрабатывать сообщения, поступающие из групп.
Получение списка групп
Во-первых, чтобы получить список всех групп, в которых вы состоите, вы можете использовать следующий фрагмент кода:
const request = require('request');
const options = {
method: 'GET',
url: 'https://gate.whapi.cloud/groups?token=YOUR_API_TOKEN',
headers: {accept: 'application/json'}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
Ответ будет включать в себя массив с деталями группы, такими как имя, аватар чата, последнее сообщение, имя владельца, описание, участники и так далее.
Подсчет числа участников в группе WhatsApp
Теперь, когда у нас есть информация о группе, мы можем перейти к подсчету количества участников в каждой группе. Следующий фрагмент кода это демонстрирует. В этом фрагменте кода мы проходим по каждой группе и записываем имя группы и количество участников в ней. Поле участников - это массив объектов, и мы можем получить его длину, чтобы посчитать количество участников.
request(options, function (error, response, body) {
if (error) throw new Error(error);
const groups = JSON.parse(body);
groups.forEach(group => {
console.log(`Group Name: ${group.name}`);
console.log(`Number of Participants: ${group.participants.length}`);
});
});
Обработка групповых сообщений
Чтобы обработать сообщения, поступающие из групп, вы можете модифицировать обработчик вашего веб-хука следующим образом:
app.post('/webhook', (req, res) => {
const message = req.body;
if (message.from.endsWith('@g.us')) {
// This is a group message
handleGroupMessage(message);
} else if (message.type === 'text') {
// Handle Text Messages
sendTextMessage(message.from, 'You said: ' + message.body);
}
res.status(200).end();
});
function handleGroupMessage(message) {
console.log(`Received a group message from ${message.from}: ${message.body}`);
// Further logic for group messages can be implemented here.
}
В обновленном веб-хуке мы проверяем, заканчивается ли поле message.from на @g.us, который является типичным идентификатором для групповых сообщений в WhatsApp. Если это так, мы вызываем функцию handleGroupMessage для обработки сообщения.
И вот и все! Теперь у вас есть базовое представление о том, как работать с группами в WhatsApp с использованием Whapi.Cloud. Отсюда вы можете расширить функциональность в соответствии с вашими потребностями.
Тестирование и отладка
В этой главе мы обсудим ключевые принципы тестирования вашего бота для WhatsApp, методы локальной отладки и как решать распространенные ошибки.
Разрабатывая вашего бота для WhatsApp, вы захотите протестировать его локально перед развертыванием на сервере. Простейший способ это сделать - использовать инструменты типа ngrok, создающие безопасный туннель к вашему localhost, что позволит вам предоставить доступ к локальному серверу из Интернета.
- Скачайте ngrok и распакуйте его.
- Откройте терминал и перейдите в папку, где хранится ngrok.
- Запустите ./ngrok http НОМЕР_ПОРТА, заменяя НОМЕР_ПОРТА на порт, на котором ваш сервер Express работает локально.
- Теперь у вас должен быть публичный URL, который вы можете использовать как URL для вебхука в вашей панели управления Whapi.Cloud.
Деплой и хостинг
Теперь, когда ваш бот протестирован, следующим шагом является его развертывание. Вы можете выбрать хостинг-провайдера, такого как AWS, Heroku или любого другого, с которым вам удобно работать. Вот упрощенное руководство по развертыванию вашего бота на Heroku:
- Установите Heroku CLI и войдите в систему.
- Перейдите в каталог вашего проекта и инициализируйте git-репозиторий, если вы этого еще не сделали.
- Запустите heroku create, чтобы создать новое приложение на Heroku.
- Загрузите ваш код на Heroku, используя git push heroku master.
- Откройте панель управления Heroku, перейдите в настройки приложения и добавьте ваши переменные окружения, включая ваш API-токен Whapi.Cloud.
- Наконец, установите URL вебхука в вашей панели управления Whapi.Cloud на URL, предоставленный Heroku.
Исходный код готового простого бота для WhatsApp на Node.JS
Вот пример полного кода для создания простого бота WhatsApp с использованием Node.js и Express. Этот код включает в себя инициализацию сервера, обработку входящих сообщений через вебхук и отправку текстовых и медиа-сообщений. Вначале создадим config.js для хранения настроек конфигурации.
module.exports = {
// API endpoint URL
apiUrl: "https://gate.whapi.cloud",
// API token from your channel
token: "YOUR CHANNEL TOKEN",
// The ID of the group to which we will send the message. Use to find out the ID: https://whapi.readme.io/reference/getgroups
group: '120363167596599603@g.us',
// The ID of the product we will send for the example. Create a product in your WhatsApp and find out the product ID: https://whapi.readme.io/reference/getproducts
product: '6559353560856703',
// Bot`s URL (for static file). Webhook Link to your server. At ( {server link}/messages ), when POST is requested, processing occurs
botUrl: "https://yoursite.com/messages"
}
Напомню, что весь исходный код этого проекта можно скачать с ГитХаба: https://github.com/Whapi-Cloud/nodejs-whatsapp-chatbot
const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');
const fetch = require('node-fetch');
const FormData = require('form-data');
const config = require('./config.js');
process.on('unhandledRejection', err => {
console.log(err)
});
const COMMANDS = {
TEXT: 'Simple text message',
IMAGE: 'Send image',
DOCUMENT: 'Send document',
VIDEO: 'Send video',
CONTACT: 'Send contact',
PRODUCT: 'Send product',
GROUP_CREATE: 'Create group',
GROUP_TEXT: 'Simple text message for the group',
GROUPS_IDS: 'Get the id\'s of your three groups'
}
const FILES = {
IMAGE: './files/file_example_JPG_100kB.jpg',
DOCUMENT: './files/file-example_PDF_500_kB.pdf',
VIDEO: './files/file_example_MP4_480_1_5MG.mp4',
VCARD: './files/sample-vcard.txt'
}
/**
* Send request to Whapi.Cloud
* @param endpoint - endpoint path
* @param params - request body
* @param method - GET, POST, PATCH, DELETE
* @returns {Promise (object) }
*/
async function sendWhapiRequest(endpoint, params= {}, method = 'POST') {
let options = {
method: method,
headers: {
Authorization: `Bearer ${config.token}`
},
};
if (!params.media) options.headers['Content-Type'] = 'application/json';
let url = `${config.apiUrl}/${endpoint}`;
if(params && Object.keys(params).length > 0) {
if(method === 'GET')
url += '?' + new URLSearchParams(params);
else
options.body = params?.media ? toFormData(params) : JSON.stringify(params);
}
const response = await fetch(url, options);
let json = await response.json();
console.log('Whapi response:', JSON.stringify(json, null, 2));
return json;
}
/**
* Convert object to FormData
* @param obj
* @returns {FormData}
*/
function toFormData(obj) {
const form = new FormData();
for (let key in obj) {
form.append(key, obj[key]);
}
return form;
}
async function setHook() {
if (config.botUrl) {
/** type {import('./whapi').Settings} */
const settings = {
webhooks: [
{
url: config.botUrl,
events: [
// default event for getting messages
{type: "message", method: "post"}
],
mode: "method"
}
]
}
await sendWhapiRequest('settings', settings, 'PATCH');
}
}
async function handleNewMessages(req, res){
try {
/** type {import('./whapi').Message[]} */
const messages = req?.body?.messages;
for (let message of messages) {
if (message.from_me) continue;
/** type {import('./whapi').Sender} */
const sender = {
to: message.chat_id
}
let endpoint = 'messages/text';
const command = Object.keys(COMMANDS)[+message.text?.body?.trim() - 1];
switch (command) {
case 'TEXT': {
sender.body = 'Simple text message';
break;
}
case 'IMAGE': {
sender.caption = 'Text under the photo.';
sender.media = fs.createReadStream(FILES.IMAGE);
endpoint = 'messages/image';
break;
}
case 'DOCUMENT': {
sender.caption = 'Text under the document.';
sender.media = fs.createReadStream(FILES.DOCUMENT);
endpoint = 'messages/document';
break;
}
case 'VIDEO': {
sender.caption = 'Text under the video.';
sender.media = fs.createReadStream(FILES.VIDEO);
endpoint = 'messages/video';
break;
}
case 'CONTACT': {
sender.name = 'Whapi Test';
sender.vcard = fs.readFileSync(FILES.VCARD).toString();
endpoint = 'messages/contact';
break;
}
case 'PRODUCT': {
/* you can get real product id using endpoint https://whapi.readme.io/reference/getproducts */
endpoint = `business/products/${config.product}`;
break;
}
case 'GROUP_CREATE': {
/* Warning : you can create group only with contacts from phone contact list */
const res = await sendWhapiRequest(`groups`, {subject: 'Whapi.Cloud Test', participants: [message.chat_id.split('@')[0]]});
sender.body = res.group_id ? `Group created. Group id: ${res.group_id}` : 'Error';
break;
}
case 'GROUP_TEXT': {
/*To get group id, use /groups endpoint */
sender.to = config.group;
sender.body = 'Simple text message for the group';
break;
}
case 'GROUPS_IDS': {
const {groups} = await sendWhapiRequest('groups', {count: 3}, 'GET');
sender.body = groups && groups.reduce((prevVal, currVal, i) => {
return i === 0 ? `${currVal.id} - ${currVal.name}` : prevVal + ',\n ' + `${currVal.id} - ${currVal.name}`;
}, '') || 'No groups';
break;
}
default: {
sender.body = 'Hi. Send me a number from the list. Don\'t forget to change the actual data in the code! \n\n' +
Object.values(COMMANDS).map((text, i) => `${i + 1}. ${text}`).join('\n');
}
}
await sendWhapiRequest(endpoint, sender);
}
res.send('Ok');
} catch (e) {
res.send(e.message);
}
}
// Create a new instance of express
const app = express();
app.use(bodyParser.json());
app.get('/', function (req, res) {
res.send('Bot is running');
});
app.post('/messages', handleNewMessages);
setHook().then(() => {
const port = config.port || (config.botUrl.indexOf('https:') === 0 ? 443 : 80)
app.listen(port, function () {
console.log(`Listening on port ${port}...`);
});
});
В этом примере кода:
- Мы инициализируем сервер с помощью Express и устанавливаем вебхук для обработки входящих сообщений.
- Когда получено текстовое сообщение, бот отвечает, повторяя полученный текст.
- Для отправки сообщений мы используем функции sendTextMessage и sendImageMessage.
Пожалуйста, замените YOUR_API_TOKEN на ваш реальный API-токен от Whapi.Cloud. Этот код является базовым примером и может быть дополнен другими функциями и обработчиками для создания более сложных и интерактивных ботов.


Заключение и следующие шаги
Поздравляем с созданием вашего бота для WhatsApp! Это руководство предоставило вам основные шаги по настройке бота для WhatsApp с использованием Node.js, Express и API Whapi.Cloud. Теперь, когда у вас есть базовый бот, вы можете расширить его функциональность для удовлетворения ваших конкретных потребностей.
В нашей подробной документации вы найдете пошаговые инструкции и примеры методов, которые позволяют отправлять различные типы сообщений, от любого формата файлов, местоположений и контактов до стикеров, аудио, опросов и товаров. Кроме того, вы можете динамически взаимодействовать с вашими сообщениями: ставить реакции, цитировать их, отмечать как прочитанные или имитировать печать в реальном времени.
Кроме того, вы можете эффективно управлять своими группами, меняя аватары, переименовывая их, приглашая новых участников или блокируя нежелательных пользователей.
С таким обширным набором функций создание бота становится легким делом. Вы можете легко интегрировать вашего бота на Node.JS в любую платформу, будь то веб-сайт, приложение, CRM, ERP-систему и любую другую.
Этот бот разработан для быстрого запуска. Начать очень просто. Прежде всего, вам нужно зарегистрироваться на нашем сервисе. Мы предлагаем бесплатную пробную версию, позволяющую вам опробовать все функции перед принятием решения о покупке. После регистрации загрузите код бота на свой сервер. Следуя инструкциям в этой статье, ваш бот будет работать в кратчайшие сроки.
Помните, если у вас возникнут вопросы или проблемы на пути, наша служба поддержки всегда здесь, чтобы помочь. Мы ценим каждого пользователя и стремимся обеспечить, чтобы ваш опыт работы с нашим API был максимально плавным и эффективным.