Aller au contenu
WbizTool

Envoyez des messages WhatsApp avec Python

Envoyez des textes, images et fichiers WhatsApp depuis un script Python, à partir de votre propre numéro relié à WbizTool comme WhatsApp Web. Utilisez le package officiel wbiztool-client ou un simple appel requests vers le même endpoint.

Essai gratuit : 50 messages sur n’importe quelle période de 30 jours, sans carte bancaire.

Comment ça marche

  1. Obtenez votre clé API et reliez votre numéro

    Inscrivez-vous, puis reliez votre numéro WhatsApp sur la page Numéros WhatsApp avec un code QR ou un code de connexion, comme WhatsApp Web. Dans Paramètres → Clés API, créez une clé et copiez votre Client ID (le guide des clés API ci-dessous montre où). L’ID affiché sur la carte du numéro (par exemple ID 678) est votre whatsapp_client.

  2. Installez le client, ou utilisez requests

    Lancez pip install wbiztool-client pour le client officiel. Si vous préférez ne pas ajouter de package, la bibliothèque requests fonctionne tout aussi bien – les exemples ci-dessous montrent les deux.

  3. Envoyez le message

    Faites un POST de vos identifiants, du numéro de téléphone et du texte vers https://wbiztool.com/api/v1/send_msg/. Une réponse avec "status": 1 et un msg_id signifie que le message est en file d’attente sur votre numéro.

  4. Vérifiez qu’il est parti

    Passez une URL webhook pour être prévenu quand le message est envoyé ou échoue, ou interrogez l’endpoint de statut du message avec le msg_id.

Exemples de code Python

Installer le client officiel
pip install wbiztool-client
Envoyer un texte avec le client officiel
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)
Envoyer un texte avec 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"))
Réponse
{"status": 1, "message": "Created", "msg_id": 9817263}
Envoyer un PDF (téléversement de fichier)
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())
Vérifier le statut du message
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"])
Planifier un message pour plus tard
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"))
Recevoir le webhook de statut (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

Ce que vous pouvez faire

  • Textes, images et fichiers

    Réglez msg_type sur 0 pour du texte, 1 pour une image ou 2 pour un fichier. Indiquez une img_url ou une file_url publique, ou téléversez le fichier lui-même avec files= dans requests.

  • Messages personnalisés à partir de vos données

    Construisez msg à partir de vos propres données – un nom, un numéro de commande, une échéance. La mise en forme WhatsApp comme *gras* et _italique_ fonctionne, jusqu’à 3 000 caractères.

  • Statut par webhook ou sur demande

    Un webhook reçoit un POST avec le msg_id et SENT, FAILED, CANCELLED ou EXPIRED. Ou appelez l’endpoint de statut du message : un message en échec est accompagné de son erreur, comme Phone number invalid.

  • Planifier pour plus tard

    Faites un POST vers /api/v1/schedule_msg/ avec date (jj/mm/aaaa), time (HH:MM) et un timezone comme Asia/Kolkata. strftime("%d/%m/%Y") et strftime("%H:%M") les construisent pour vous.

  • Abandonner les messages trop tardifs

    expire_after_seconds marque un message comme expiré s’il n’est pas parti à temps, ce qui convient aux messages urgents comme une heure de livraison prévue.

  • Rappels récurrents

    L’API de rappels répète un message selon un planning cron, par exemple à 10 h le 1er de chaque mois. Les rappels nécessitent un forfait payant.

Bon à savoir

  • "status": 1 signifie que le message est en file d’attente, pas qu’il est remis. Sent est l’état final de réussite ; l’API n’indique pas si le message a été remis ou lu.
  • Les erreurs d’envoi de message reviennent avec HTTP 400 (429 à la limite quotidienne) ; les erreurs de planification reviennent en général avec HTTP 200 et "status": 0 : lisez donc response.json() et vérifiez status plutôt que le code HTTP. Le client officiel lève requests.HTTPError : lisez la raison avec e.response.json()["message"].
  • Le client officiel ne couvre pas encore correctement tous les endpoints : ses schedule_message et check_credentials() ne fonctionnent pas avec l’API actuelle. Appelez /api/v1/schedule_msg/ avec requests comme ci-dessus, et /api/v1/me/ de la même façon.
  • Gardez la clé API sur votre serveur, par exemple dans une variable d’environnement. Quiconque la possède peut envoyer depuis vos numéros : ne la mettez jamais dans du JavaScript côté navigateur, dans une application mobile ou dans du code que vous publiez.
  • L’essai gratuit inclut 50 messages sur n’importe quelle période de 30 jours et 1 numéro, sans carte bancaire. Les forfaits payants commencent à 25 $ par mois aux États-Unis (votre prix figure sur la page Tarifs) et envoient des messages illimités dans le cadre d’un usage raisonnable : jusqu’à 1 000 par jour et par numéro.
  • Les messages partent de votre propre numéro WhatsApp, donc les règles de WhatsApp s’appliquent : écrivez aux personnes qui s’attendent à avoir de vos nouvelles.

Questions fréquentes

Existe-t-il une bibliothèque Python officielle pour l’API WbizTool ?
Oui : wbiztool-client sur PyPI (pip install wbiztool-client). Utilisez ses send_message et get_message_status. Pour planifier et vérifier les identifiants, appelez les endpoints avec requests.
Comment envoyer un PDF ou une image depuis Python ?
Utilisez msg_type 1 avec img_url pour une image, ou msg_type 2 avec file_url pour un fichier. Pour envoyer un fichier depuis le disque, envoyez-le en multipart form data dans un champ nommé file, et indiquez file_name avec son extension, comme invoice-4821.pdf.
Comment savoir si le message a été envoyé ?
Une réponse avec "status": 1 et un msg_id signifie qu’il est en file d’attente. Passez une URL webhook pour recevoir un POST avec SENT, FAILED, CANCELLED ou EXPIRED, ou appelez l’endpoint de statut du message avec le msg_id. Sent est l’état final : l’API n’indique pas si le message a été remis ou lu.
Quel format de numéro de téléphone envoyer ?
Envoyez le numéro avec son indicatif pays (919876543210), ou sans (9876543210) avec country_code (91). Les espaces, le +, les tirets et les parenthèses sont retirés pour vous : +91 98765-43210 fonctionne aussi.
Ai-je besoin de l’API WhatsApp Business ou d’une validation Meta ?
Non. WbizTool envoie depuis votre propre numéro WhatsApp ou WhatsApp Business, relié comme WhatsApp Web. Pas de validation Meta, et aucun modèle de message à faire approuver.
Est-ce payant au message ?
Non. L’essai gratuit inclut 50 messages sur n’importe quelle période de 30 jours. Les forfaits payants envoient des messages illimités dans le cadre d’un usage raisonnable, jusqu’à 1 000 par jour et par numéro : Lite 25 $, Standard 59 $ et Advanced 149 $ par mois aux États-Unis ; la page Tarifs affiche le prix de votre pays.

Lire les guides

Voir aussi

Envoyez votre premier message WhatsApp automatisé dès aujourd'hui

Créez un compte, scannez le QR code et envoyez un message en moins de cinq minutes.

Essai gratuit

Forfaits payants à partir de 25 $ par mois aux États-Unis. Tarifs