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

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

Отправляйте тексты, изображения и файлы WhatsApp из скрипта на Python с вашего собственного номера, привязанного к WbizTool как WhatsApp Web. Используйте официальный пакет wbiztool-client или обычный вызов requests к тому же эндпоинту.

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

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

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

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

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

    Выполните pip install wbiztool-client, чтобы установить официальный клиент. Если не хотите добавлять пакет, библиотека requests работает так же хорошо – в примерах ниже показаны оба варианта.

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

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

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

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

Примеры кода: Python

Установка официального клиента
pip install wbiztool-client
Отправка текста официальным клиентом
from wbiztool_client import WbizToolClient

client = WbizToolClient(api_key="YOUR_API_KEY", client_id="12345")

result = client.send_message(
    phone="9876543210",
    country_code="91",
    msg="Hi Aman, your order #4821 has shipped.",
    whatsapp_client=678,
)
print(result)
Отправка текста через requests
import requests

response = requests.post(
    "https://wbiztool.com/api/v1/send_msg/",
    json={
        "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.",
    },
    timeout=60,
)
result = response.json()  # read the body even when the HTTP code is 400

if result.get("status") == 1:
    print("Queued with msg_id", result["msg_id"])
else:
    print("Failed:", result.get("message"))
Ответ
{"status": 1, "message": "Created", "msg_id": 9817263}
Отправка PDF (загрузка файла)
import requests

with open("invoice-4821.pdf", "rb") as f:
    response = requests.post(
        "https://wbiztool.com/api/v1/send_msg/",
        data={
            "client_id": 12345,
            "api_key": "YOUR_API_KEY",
            "whatsapp_client": 678,
            "msg_type": 2,
            "country_code": "91",
            "phone": "9876543210",
            "msg": "Your invoice for order #4821 is attached.",
            "file_name": "invoice-4821.pdf",
        },
        files={"file": f},
        timeout=120,
    )
print(response.json())
Проверка статуса сообщения
import requests

msg_id = 9817263
response = requests.post(
    f"https://wbiztool.com/api/v1/message/status/{msg_id}/",
    json={
        "client_id": 12345,
        "api_key": "YOUR_API_KEY",
    },
    timeout=60,
)
result = response.json()  # read the body even when the HTTP code is 400

if result.get("message") == "Unknown message id":
    print("No message with this ID in your workspace")
elif "status_text" not in result:
    print("Request failed:", result.get("message", "no message in response"))
elif result["status"] == 1:
    print("Sent")
elif result["status"] == 2:
    print("Failed:", result["error"])
else:
    print("Status:", result["status_text"])
Планирование сообщения на потом
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

import requests

send_at = datetime.now(ZoneInfo("Asia/Kolkata")) + timedelta(hours=2)

response = requests.post(
    "https://wbiztool.com/api/v1/schedule_msg/",
    json={
        "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": send_at.strftime("%d/%m/%Y"),
        "time": send_at.strftime("%H:%M"),
        "timezone": "Asia/Kolkata",
    },
    timeout=60,
)
result = response.json()  # schedule errors come back with HTTP 200 and "status": 0

if result.get("status") == 1:
    print("Scheduled with msg_id", result["msg_id"])
else:
    print("Failed:", result.get("message", "no message in response"))
Приём вебхука статуса (Flask)
from flask import Flask, request

app = Flask(__name__)

@app.post("/wbiztool-webhook")
def wbiztool_webhook():
    # WbizTool posts form fields, not JSON.
    msg_id = request.form["msg_id"]
    status = request.form["status"]  # SENT, FAILED, CANCELLED or EXPIRED
    print(msg_id, status)
    return "", 200

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

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

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

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

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

  • Статус через вебхук или по запросу

    Вебхук получает POST с msg_id и SENT, FAILED, CANCELLED или EXPIRED. Или вызовите эндпоинт статуса сообщения: неудачное сообщение возвращается с ошибкой, например Phone number invalid.

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

    Отправьте POST на /api/v1/schedule_msg/ с date (дд/мм/гггг), time (ЧЧ:ММ) и timezone, например Asia/Kolkata. strftime("%d/%m/%Y") и strftime("%H:%M") соберут их за вас.

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

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

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

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

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

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

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

Есть ли официальная библиотека Python для API WbizTool?
Да: wbiztool-client на PyPI (pip install wbiztool-client). Используйте его send_message и get_message_status. Для планирования и проверки учётных данных вызывайте эндпоинты через requests.
Как отправить PDF или изображение из Python?
Используйте msg_type 1 с img_url для изображения или msg_type 2 с file_url для файла. Чтобы отправить файл с диска, передайте его как multipart form data в поле file и укажите file_name с расширением, например invoice-4821.pdf.
Как узнать, что сообщение отправлено?
Ответ с "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 в месяц в США. Цены