Перейти к содержимому
WbizTool

Отправка сообщений WhatsApp на Node.js

Отправляйте тексты, изображения и файлы WhatsApp из приложения на Node.js с вашего собственного номера, привязанного к WbizTool как WhatsApp Web. Используйте официальный пакет wbiztool-client или fetch, встроенный в Node.js 18 и новее.

Бесплатный пробный период: 50 сообщений за любые 30 дней, без карты.

Как это работает

  1. Получите API-ключ и привяжите номер

    Зарегистрируйтесь, затем привяжите номер WhatsApp на странице «Номера WhatsApp» по QR-коду или коду привязки, как WhatsApp Web. В разделе «Настройки → API-ключи» создайте ключ и скопируйте свой Client ID (где их найти, показано в руководстве по API-ключам ниже). ID на карточке номера (например, ID 678) – это ваш whatsapp_client.

  2. Установите клиент или используйте fetch

    Выполните npm install wbiztool-client, чтобы установить официальный клиент. Или вызывайте API через fetch, которому в Node.js 18 и новее не нужен никакой пакет.

  3. Отправьте сообщение

    Отправьте POST с учётными данными, номером телефона и текстом на https://wbiztool.com/api/v1/send_msg/. Ответ с "status": 1 и msg_id означает, что сообщение поставлено в очередь на вашем номере.

  4. Проверьте, что оно ушло

    Передайте URL в webhook, чтобы узнать, когда сообщение отправлено или не отправлено, или запросите эндпоинт статуса сообщения с msg_id.

Примеры кода: Node.js

Установка официального клиента
npm install wbiztool-client
Отправка текста официальным клиентом
const { WbizToolClient } = require("wbiztool-client");

const client = new WbizToolClient({
  clientId: 12345,
  apiKey: "YOUR_API_KEY",
  whatsappClient: 678,
});

(async () => {
  // Errors throw, with the API's response in the error message.
  const result = await client.sendMessage({
    phone: "9876543210",
    countryCode: "91",
    message: "Hi Aman, your order #4821 has shipped.",
  });
  console.log(result);
})().catch(console.error);
Отправка текста через fetch
// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    client_id: 12345,
    api_key: "YOUR_API_KEY",
    whatsapp_client: 678,
    msg_type: 0,
    country_code: "91",
    phone: "9876543210",
    msg: "Hi Aman, your order #4821 has shipped and will arrive on Thursday.",
  }),
});
const result = await response.json(); // read the body even when the HTTP code is 400

if (result.status === 1) {
  console.log("Queued with msg_id", result.msg_id);
} else {
  console.error("Failed:", result.message);
}
Ответ
{"status": 1, "message": "Created", "msg_id": 9817263}
Отправка PDF (загрузка файла)
// Node.js 20+ (built-in fetch, FormData and fs.openAsBlob). Save as .mjs to use top-level await.
import { openAsBlob } from "node:fs";

const form = new FormData();
form.append("client_id", "12345");
form.append("api_key", "YOUR_API_KEY");
form.append("whatsapp_client", "678");
form.append("msg_type", "2");
form.append("country_code", "91");
form.append("phone", "9876543210");
form.append("msg", "Your invoice for order #4821 is attached.");
form.append("file_name", "invoice-4821.pdf");
form.append("file", await openAsBlob("./invoice-4821.pdf"), "invoice-4821.pdf");

// Don't set Content-Type yourself; fetch adds the multipart boundary.
const response = await fetch("https://wbiztool.com/api/v1/send_msg/", { method: "POST", body: form });
console.log(await response.json());
Проверка статуса сообщения
// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const msgId = 9817263;
const response = await fetch(`https://wbiztool.com/api/v1/message/status/${msgId}/`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    client_id: 12345,
    api_key: "YOUR_API_KEY",
  }),
});
const result = await response.json(); // read the body even when the HTTP code is 400

if (result.message === "Unknown message id") {
  console.log("No message with this ID in your workspace");
} else if (!("status_text" in result)) {
  console.error("Request failed:", result.message ?? "no message in response");
} else if (result.status === 1) {
  console.log("Sent");
} else if (result.status === 2) {
  console.log("Failed:", result.error);
} else {
  console.log("Status:", result.status_text);
}
Планирование сообщения на потом
// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const tz = "Asia/Kolkata";
const sendAt = new Date(Date.now() + 2 * 60 * 60 * 1000); // two hours from now
// Format the date and time in the timezone you send, not your server's.
const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(sendAt); // "24/12/2026"
const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(sendAt); // "09:00"

const response = await fetch("https://wbiztool.com/api/v1/schedule_msg/", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    client_id: 12345,
    api_key: "YOUR_API_KEY",
    whatsapp_client: 678,
    msg_type: 0,
    country_code: "91",
    phone: "9876543210",
    msg: "Hi Aman, a reminder that your appointment starts in 30 minutes.",
    date,
    time,
    timezone: tz,
  }),
});
const result = await response.json(); // schedule errors come back with HTTP 200 and "status": 0

if (result.status === 1) {
  console.log("Scheduled with msg_id", result.msg_id);
} else {
  console.error("Failed:", result.message ?? "no message in response");
}
Приём вебхука статуса (Express)
const express = require("express");

const app = express();

// WbizTool posts form fields, not JSON.
app.post("/wbiztool-webhook", express.urlencoded({ extended: false }), (req, res) => {
  const { msg_id, status } = req.body; // status: SENT, FAILED, CANCELLED or EXPIRED
  console.log(msg_id, status);
  res.sendStatus(200);
});

app.listen(3000);

Что можно делать

  • Тексты, изображения и файлы

    Укажите msg_type 0 для текста, 1 для изображения или 2 для файла. Передайте публичный img_url или file_url либо загрузите файл как multipart form data в поле file.

  • Личные сообщения из ваших данных

    Заполняйте msg из своих записей – имя, номер заказа, срок оплаты. Работает форматирование WhatsApp, например *жирный* и _курсив_, до 3 000 символов.

  • Вебхуки для каждого статуса

    Передайте webhook, и ваш сервер получит POST в формате form-encoded, например msg_id=9817263&status=SENT, когда сообщение отправлено, не отправлено, отменено или истекло.

  • Планирование на потом

    Отправьте POST на /api/v1/schedule_msg/ с date (дд/мм/гггг), time (ЧЧ:ММ) и timezone. Форматируйте дату через Intl.DateTimeFormat в том же часовом поясе, а не в часовом поясе сервера.

  • Отбрасывайте опоздавшие сообщения

    expire_after_seconds помечает сообщение как истёкшее, если оно не ушло вовремя, – это подходит для срочных сообщений, например о времени доставки.

  • Повторяющиеся напоминания

    API напоминаний повторяет сообщение по расписанию cron, например 1-го числа каждого месяца в 10:00. Напоминаниям нужен платный тариф.

Полезно знать

  • "status": 1 означает, что сообщение в очереди, а не доставлено. «Отправлено» – конечное успешное состояние; API не сообщает, доставлено ли сообщение и прочитано ли оно.
  • Ошибки отправки сообщения приходят с HTTP 400 (429 при дневном лимите); ошибки планирования обычно приходят с HTTP 200 и "status": 0, поэтому всегда разбирайте тело ответа и проверяйте status, а не response.ok.
  • scheduleMessage официального клиента отправляет поле, которое эндпоинт планирования не читает. Вместо него вызывайте /api/v1/schedule_msg/ через fetch, как показано выше.
  • Храните API-ключ на сервере, например в переменной окружения. Любой, у кого он есть, может отправлять с ваших номеров, поэтому никогда не размещайте его в JavaScript в браузере, в мобильном приложении или в публикуемом коде.
  • Чтобы написать в группу WhatsApp вместо номера, см. пример отправки сообщений в группы: это работает на любом тарифе, включая пробный период.
  • В пробном периоде – 50 сообщений за любые 30 дней и 1 номер, без карты. На платных тарифах – от $25 в месяц в США (ваша цена – на странице «Цены») – сообщения безлимитные в рамках честного использования: до 1 000 в день с одного номера.
  • Сообщения уходят с вашего собственного номера WhatsApp, поэтому действуют правила самого WhatsApp: пишите тем, кто ждёт ваших сообщений.

Вопросы и ответы

Есть ли официальный пакет Node.js для API WbizTool?
Да: wbiztool-client на npm (npm install wbiztool-client). Его sendMessage отправляет сообщение. Для планирования и проверки статуса вызывайте эндпоинты через fetch, как показано выше.
Можно ли вызывать API из браузера?
Не стоит: запрос содержит ваш API-ключ, а любой, у кого он есть, может отправлять с ваших номеров. Вызывайте API со своего сервера на Node.js и храните ключ в переменной окружения.
Как узнать, что сообщение отправлено?
Ответ с "status": 1 и msg_id означает, что оно в очереди. Передайте URL в webhook, чтобы получить POST с SENT, FAILED, CANCELLED или EXPIRED, или вызовите эндпоинт статуса сообщения с msg_id. «Отправлено» – конечное состояние: API не сообщает о доставке или прочтении.
В каком формате указывать номер телефона?
Передайте номер с кодом страны (79161234567) или без него (9161234567) вместе с country_code (7). Пробелы, +, дефисы и скобки удаляются автоматически, поэтому +7 (916) 123-45-67 тоже подойдёт.
Нужны ли WhatsApp Business API или одобрение Meta?
Нет. WbizTool отправляет с вашего собственного номера WhatsApp или WhatsApp Business, привязанного как WhatsApp Web. Одобрение Meta не нужно, и согласовывать шаблоны сообщений тоже не надо.
Есть ли плата за каждое сообщение?
Нет. Пробный период включает 50 сообщений за любые 30 дней. На платных тарифах сообщения безлимитные в рамках честного использования, до 1 000 в день с одного номера: Lite – $25, Standard – $59 и Advanced – $149 в месяц в США; на странице «Цены» показана цена для вашей страны.

Читайте руководства

Смотрите также

Отправьте своё первое автоматическое сообщение в WhatsApp уже сегодня

Создайте аккаунт, отсканируйте QR-код и отправьте сообщение менее чем за пять минут.

Начать бесплатно

Платные тарифы – от $25 в месяц в США. Цены