Pular para o conteúdo
WbizTool

Envie mensagens de WhatsApp com Python

Envie textos, imagens e arquivos de WhatsApp a partir de um script Python, do seu próprio número conectado ao WbizTool como no WhatsApp Web. Use o pacote oficial wbiztool-client ou uma chamada simples com requests para o mesmo endpoint.

Teste grátis: 50 mensagens em quaisquer 30 dias, sem cartão.

Como funciona

  1. Pegue sua chave de API e conecte seu número

    Cadastre-se e conecte seu número de WhatsApp na página Números do WhatsApp com um código QR ou um código de login, como no WhatsApp Web. Em Configurações → Chaves de API, crie uma chave e copie seu Client ID (o guia de chaves de API abaixo mostra onde). O ID no cartão do número (como ID 678) é o seu whatsapp_client.

  2. Instale o cliente, ou use requests

    Rode pip install wbiztool-client para o cliente oficial. Se preferir não adicionar um pacote, a biblioteca requests funciona igual – os exemplos abaixo mostram os dois.

  3. Envie a mensagem

    Faça um POST com suas credenciais, o número de telefone e o texto para https://wbiztool.com/api/v1/send_msg/. Uma resposta com "status": 1 e um msg_id significa que a mensagem está na fila do seu número.

  4. Confira se ela saiu

    Passe uma URL em webhook para ser avisado quando a mensagem for enviada ou falhar, ou consulte o endpoint de status da mensagem com o msg_id.

Exemplos de código: Python

Instalar o cliente oficial
pip install wbiztool-client
Enviar um texto com o cliente oficial
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)
Enviar um texto com 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"))
Resposta
{"status": 1, "message": "Created", "msg_id": 9817263}
Enviar um PDF (upload de arquivo)
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())
Consultar o status da mensagem
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"])
Agendar uma mensagem para depois
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"))
Receber o webhook de status (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

O que você pode fazer

  • Textos, imagens e arquivos

    Defina msg_type como 0 para texto, 1 para imagem ou 2 para arquivo. Informe uma img_url ou file_url pública, ou envie o próprio arquivo com files= no requests.

  • Mensagens pessoais com os seus dados

    Monte msg com os seus próprios registros – um nome, um número de pedido, uma data de vencimento. A formatação do WhatsApp, como *negrito* e _itálico_, funciona, com até 3.000 caracteres.

  • Status por webhook ou por consulta

    Um webhook recebe um POST com o msg_id e SENT, FAILED, CANCELLED ou EXPIRED. Ou chame o status da mensagem: uma mensagem com falha vem com o erro, como Phone number invalid.

  • Agende para depois

    Faça um POST para /api/v1/schedule_msg/ com date (dd/mm/aaaa), time (HH:MM) e um timezone como Asia/Kolkata. strftime("%d/%m/%Y") e strftime("%H:%M") montam esses valores para você.

  • Descarte mensagens que chegariam tarde demais

    expire_after_seconds marca uma mensagem como expirada se ela não sair a tempo, o que serve para mensagens urgentes, como previsões de entrega.

  • Lembretes recorrentes

    A API de lembretes repete uma mensagem seguindo uma agenda cron, como às 10:00 do dia 1º de cada mês. Os lembretes precisam de um plano pago.

Bom saber

  • "status": 1 significa que a mensagem está na fila, não que foi entregue. Enviada é o estado final de sucesso; a API não informa se a mensagem foi entregue ou lida.
  • Os erros de envio de mensagem voltam com HTTP 400 (429 no limite diário); os erros de agendamento costumam voltar com HTTP 200 e "status": 0, então leia response.json() e confira status em vez do código HTTP. O cliente oficial lança requests.HTTPError: leia o motivo com e.response.json()["message"].
  • O cliente oficial ainda não cobre todos os endpoints corretamente: o schedule_message e o check_credentials() dele não funcionam com a API atual. Chame /api/v1/schedule_msg/ com requests como mostrado acima, e /api/v1/me/ do mesmo jeito.
  • Guarde a chave de API no seu servidor, por exemplo em uma variável de ambiente. Quem tiver a chave pode enviar dos seus números, então nunca a coloque em JavaScript do navegador, em um app de celular ou em código que você publica.
  • O teste grátis tem 50 mensagens em quaisquer 30 dias e 1 número, sem cartão. Os planos pagos começam em US$ 25 por mês nos EUA (o seu preço aparece em Preços) e enviam mensagens ilimitadas dentro do uso justo: até 1.000 por dia por número.
  • As mensagens saem do seu próprio número de WhatsApp, então as regras do próprio WhatsApp valem: mande mensagens para quem espera ter notícias suas.

Perguntas frequentes

Existe uma biblioteca Python oficial para a API do WbizTool?
Sim: wbiztool-client no PyPI (pip install wbiztool-client). Use o send_message e o get_message_status dela. Para agendar e verificar credenciais, chame os endpoints com requests.
Como envio um PDF ou uma imagem pelo Python?
Use msg_type 1 com img_url para uma imagem, ou msg_type 2 com file_url para um arquivo. Para enviar um arquivo do disco, poste-o como multipart form data em um campo chamado file e defina file_name com a extensão, como invoice-4821.pdf.
Como sei que a mensagem foi enviada?
Uma resposta com "status": 1 e um msg_id significa que ela está na fila. Passe uma URL em webhook para receber um POST com SENT, FAILED, CANCELLED ou EXPIRED, ou chame o endpoint de status da mensagem com o msg_id. Enviada é o estado final: a API não informa se a mensagem foi entregue ou lida.
Em que formato envio o número de telefone?
Envie o número com o código do país (919876543210), ou sem ele (9876543210) junto com country_code (91). Espaços, +, hífens e parênteses são removidos para você, então +91 98765-43210 também funciona.
Preciso da API oficial do WhatsApp Business ou de aprovação da Meta?
Não. O WbizTool envia do seu próprio número de WhatsApp ou WhatsApp Business, conectado como no WhatsApp Web. Não há aprovação da Meta nem modelos de mensagem para aprovar.
A cobrança é por mensagem?
Não. O teste grátis inclui 50 mensagens em quaisquer 30 dias. Os planos pagos enviam mensagens ilimitadas dentro do uso justo, até 1.000 por dia por número: Lite US$ 25, Standard US$ 59 e Advanced US$ 149 por mês nos EUA; Preços mostra o preço do seu país.

Leia os guias

Veja também

Envie hoje sua primeira mensagem automática de WhatsApp

Crie uma conta, escaneie o QR code e envie uma mensagem em menos de cinco minutos.

Comece grátis

Planos pagos a partir de US$ 25 por mês nos EUA. Preços