Automatizarea WhatsApp cu Python
- Cum să lucrezi cu API-ul WhatsApp folosind Python;
- Integrarea cu Whapi.Cloud pentru automatizarea diverselor sarcini;
- Utilizarea webhook-urilor pentru gestionarea și răspunsul automat la mesaje;
- Conectarea botului WhatsApp la ChatGPT pentru conversații bazate pe inteligență artificială;

Pentru a simplifica munca, puteți folosi scripturile noastre gata făcute pentru boți Python, pe care le-am publicat pe GitHub. Aceste proiecte descriu în detaliu procesul de configurare și testare, iar în interiorul codului veți găsi comentarii utile. Este un început excelent pentru dezvoltatorii începători.
Pregătirea pentru dezvoltarea botului
- Python. Instalați Python dacă nu este deja instalat. Descărcați cea mai recentă versiune (recomandat 3.6 sau mai recentă) de pe site-ul oficial și urmați instrucțiunile.
- Flask. Flask este un framework web ușor pentru Python, pe care îl vom folosi pentru configurarea serverului și gestionarea webhook-urilor. Puteți instala Flask cu comanda: pip install Flask.
- Token API. Înregistrați-vă pe Whapi.Cloud pentru a obține un token API. Acest token vă permite să interacționați cu WhatsApp prin API. După înregistrare, vi se va oferi un canal gratuit cu anumite limite, suficient pentru testarea dezvoltării dvs. Whapi.Cloud se remarcă prin stabilitatea, costurile reduse și multitudinea de funcții. Instrucțiunile pentru obținerea tokenului sunt detaliate mai jos.
- Webhook configurat. Pentru ca botul să poată procesa mesajele primite și evenimentele din WhatsApp, aveți nevoie de un URL al serverului dvs. (local sau extern) pentru a gestiona notificările de la WhatsApp. În articol vom explica în detaliu cum să faceți acest lucru și de unde să obțineți un astfel de link.
Obținerea tokenului pentru WhatsApp API
Înregistrarea și conectarea unui număr
- 1. Accesați dashboard-ul și deschideți pagina canalului Default Channel, care a fost deja creat pentru dvs.
- 2. La primul pas veți vedea un QR cod cu instrucțiuni.
- 3. Deschideți WhatsApp pe dispozitivul dvs., accesați Setări → Dispozitive conectate → Conectare dispozitiv → Scanați codul QR.
- 4. După conectare, atribuiți un nume canalului (de exemplu, "Botul Meu"), pentru a-l gestiona mai ușor pe viitor.




Obținerea tokenului API

Instrumente pentru lucrul cu API-ul
- Hub pentru dezvoltatori: O platformă specializată cu documentație și exemple, care permite obținerea fragmentelor de cod pentru toate endpoint-urile în diverse limbaje de programare.
- Colecție Postman: Cereri gata pregătite pentru testarea API-ului prin Postman.
- Fișier Swagger: O descriere detaliată a tuturor metodelor API, cu posibilitatea de testare direct pe pagina canalului.
Ce este un Webhook și cum se configurează?
Ce este un webhook?
- Notificări instantanee. Toate evenimentele sunt procesate aproape în timp real.
- Capacitate mare de procesare. Viteza de primire a notificărilor este limitată doar de performanța serverului dvs.
- Flexibilitate. Puteți primi doar acele evenimente care vă sunt cu adevărat necesare, cum ar fi: Mesaje personale; Mesaje în grupuri; Modificări ale statusului mesajelor; Modificări ale participanților grupului; Notificări despre apeluri pierdute; Statusuri ale canalelor și multe altele.
Cum și unde obținem un URL pentru webhook?
- 1) Descărcați Ngrok de pe site-ul oficial și extrageți fișierul. Apoi, deschideți terminalul și navigați la folderul unde se află Ngrok.
- 2) Rulați ./ngrok http NUMĂR_PORT, înlocuind NUMĂR_PORT cu portul pe care serverul dvs. Flask rulează local (de exemplu, 80).
- 3) Acum ar trebui să aveți un URL public pe care îl puteți folosi ca URL pentru webhook. Acesta este URL-ul pe care trebuie să îl copiați pentru utilizare ulterioară.


Configurarea webhook-ului pe un canal
- Accesați setările canalului. Pe pagina canalului, apăsați butonul de setări (în colțul din dreapta sus).
- Configurați webhook-ul. Introduceți URL-ul dvs. în secțiunea webhook-urilor, folosind setările predefinite. Puteți configura mai multe webhook-uri pentru evenimente diferite, dacă este necesar. De asemenea, puteți modifica aceste setări prin API.
- Salvați modificările. După aceasta, toate notificările despre evenimentele din WhatsApp vor fi trimise către serverul specificat de dvs.
Crearea unei baze pentru botul WhatsApp în Python
Flask==3.0.0
requests==2.27.1
requests-toolbelt==0.9.1
python-dotenv==0.20.0
pip install -r requirements.txt
API_TOKEN=8FjpwmyFUulh7emXOprrET3xKrwJ984O # API token from your channel
API_URL=https://gate.whapi.cloud # API endpoint URL
PORT=80 # example, 80 or 443
#URL_LINK= The Webhook link to your server {link to server}/hook.
from dotenv import load_dotenv
import os
load_dotenv()
api_token = os.getenv("API_TOKEN")
Trimiterea unui mesaj text
import requests
# URL for sending text messages. Can be pulled from .env
url = "https://gate.whapi.cloud/messages/text"
# Data for sending a message
payload = {
"to": "919984351847", # Enter the recipient's number in international format
"body": "Hello! This is a test message." # Text of message
}
# Headers, including authorization token
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": f"Bearer {api_token}" # Use the token from the .env file
}
# Sending a POST request
response = requests.post(url, json=payload, headers=headers)
# Output server response
print(response.status_code)
print(response.text)
Primirea mesajelor prin Flask Webhook
from flask import Flask, request, jsonify
app = Flask(__name__)
# Route for processing incoming messages
@app.route('/hook', methods=['POST'])
def webhook():
# Retrieving data from a request
data = request.json
# Logging an incoming message
print("Received message:", data)
# Example of incoming message processing
if "messages" in data:
for message in data["messages"]:
sender = message["from"] # Sender's number
text = message.get("body", "") # Text of message
print(f"Message from {sender}: {text}")
# Logic for replying to a message
# Check out our examples on GitHub, where we use more branching on commands for the bot
if text.lower() == "hello":
send_response(sender, "Hi there! How can I help you?")
elif text.lower() == "bye":
send_response(sender, "Goodbye!")
return jsonify({"status": "success"}), 200
# Function for sending a reply
def send_response(to, body):
import requests
url = "https://gate.whapi.cloud/messages/text"
payload = {
"to": to,
"body": body
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": f"Bearer {api_token}" # Use the token from the .env file
}
response = requests.post(url, json=payload, headers=headers)
print(f"Response to {to}: {response.status_code}, {response.text}")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
Funcționalități avansate
Trimiterea unei imagini
import requests
url = "https://gate.whapi.cloud/messages/image"
payload = {
"to": "919984351847",
"media": "https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg",
"caption": "An example image"
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": "Bearer Your_Token"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Trimiterea unui fișier
import requests
url = "https://gate.whapi.cloud/messages/document"
payload = {
"to": "919984351847",
"media": "data:application/pdf;base64,JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PC9UaXRsZSAoVGVybXMgb2YgU2VydmljZSBXaGFwaS5DbG91ZCkKL0NyZWF0b3IgKE1vemlsbGEvNS4wIFwoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0XCkgQXBwbGVXZWJLaXQvNTM3LjM2IFwoS0h............",
"filename": "Terms of Service Whapi.Cloud.pdf",
"caption": "Hello, I am attaching an important file to my message"
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": "Bearer Your_Token"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Crearea unui Grup WhatsApp în Python
import requests
url = "https://gate.whapi.cloud/groups"
payload = {
"participants": ["919984351847", "919984351848", "919984351849"],
"subject": "Group Subject 3"
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": "Bearer Your_Token"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Integrare cu ChatGPT: AI pentru botul tău WhatsApp
Pasul 1: Adaugă Dependențele ChatGPT
openai>=1.91.0,<2.0.0
httpx>=0.28.1,<1.0.0
httpcore>=1.0.9,<2.0.0
- openai – SDK-ul oficial pentru trimiterea cererilor către OpenAI și primirea răspunsurilor de la ChatGPT.
- httpx – o bibliotecă modernă, asincronă, pentru cereri HTTP, pe care openai o folosește intern pentru apeluri API.
- httpcore – o bibliotecă de transport la nivel de rețea folosită de httpx. Trebuie fixată explicit pentru a evita conflictele de versiune.
pip install -r requirements.txt
Pasul 2: Obține Cheia API OpenAI
OPENAI_API_KEY=your_api_key_here
Pasul 3: Adaugă Logica AI în Botul Tău
- – primește evenimente webhook de la Whapi.Cloud,
- – detectează dacă mesajul începe cu /ai,
- – trimite cererea utilizatorului către ChatGPT prin API-ul OpenAI,
- – returnează răspunsul generat de AI utilizatorului pe WhatsApp.
# Import necessary libraries for web server, HTTP requests, OpenAI API, environment variables, and .env file loading
from flask import Flask, request, jsonify # Flask is used to create the web server and handle HTTP requests
import requests # Used to send HTTP requests to the WhatsApp API
from openai import OpenAI # OpenAI client for interacting with ChatGPT
import os # For accessing environment variables
from dotenv import load_dotenv # For loading variables from a .env file
# Load environment variables from a .env file into the environment
load_dotenv()
# Create a Flask web application instance
app = Flask(__name__)
# Retrieve required configuration values from environment variables
API_TOKEN = os.getenv("API_TOKEN") # Token for authenticating with WhatsApp API
API_URL = os.getenv("API_URL") # Base URL for WhatsApp API
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") # API key for OpenAI
# Ensure all required environment variables are set, otherwise stop the program with an error
if not API_TOKEN or not API_URL or not OPENAI_API_KEY:
raise RuntimeError("Missing required environment variables: API_TOKEN, API_URL, or OPENAI_API_KEY")
# Initialize the OpenAI client with the provided API key
openai_client = OpenAI(api_key=OPENAI_API_KEY)
# Function to send a prompt to ChatGPT and get a response
# Takes a string prompt and returns the model's reply as a string
def ask_openai(prompt):
response = openai_client.chat.completions.create(
model="gpt-3.5-turbo", # Specify which OpenAI model to use
messages=[{"role": "user", "content": prompt}] # Provide the user's message to the model
)
# Extract and return the text of the model's reply
return response.choices[0].message.content.strip()
# Function to send a text message to a WhatsApp user via the WhatsApp API
# 'to' is the recipient's chat ID, 'body' is the message text
def send_message(to, body):
headers = {
"Authorization": f"Bearer {API_TOKEN}", # Add authentication token to the request
"Content-Type": "application/json" # Specify that we're sending JSON data
}
payload = {"to": to, "body": body} # Prepare the message data
# Send the message to the WhatsApp API endpoint
response = requests.post(f"{API_URL}/messages/text", json=payload, headers=headers)
print("Whapi response:", response.status_code, response.text) # Log the API response for debugging
# Define a webhook endpoint to receive incoming WhatsApp messages
@app.route("/hook/messages", methods=["POST"])
def webhook():
data = request.json # Parse the incoming JSON data
print("Incoming:", data) # Log the incoming data for debugging
# Loop through all received messages (could be more than one in a single webhook call)
for msg in data.get("messages", []):
if msg.get("from_me"):
continue # Skip messages sent by the bot itself
sender = msg.get("chat_id") # Get the sender's chat ID
# Safely extract the message text, handling cases where 'text' might be missing
text = (msg.get("text") or {}).get("body", "").strip()
# If the message starts with '/ai ', treat it as a prompt for ChatGPT
if text.lower().startswith("/ai "):
prompt = text[4:].strip() # Extract the user's prompt after '/ai '
if not prompt:
send_message(sender, "Please provide a prompt after /ai.") # Ask user to provide a prompt
else:
try:
reply = ask_openai(prompt) # Get response from ChatGPT
send_message(sender, reply) # Send the response back to the user
except Exception as e:
send_message(sender, f"Error: {e}") # Inform user if something went wrong
else:
# If the message doesn't start with '/ai ', send instructions to the user
send_message(sender, "Hi! To ask me something, type:\n/ai your question")
# Respond to WhatsApp API to confirm receipt of the webhook
return jsonify({"status": "received"})
# Optional: health check endpoint to verify the bot is running
@app.route("/", methods=["GET"])
def index():
return "Bot is running"
# Function to register the webhook URL with the WhatsApp API
def register_webhook():
if os.getenv("BOT_URL"):
headers = {"Authorization": f"Bearer {API_TOKEN}"}
payload = {
"webhooks": [
{
"url": os.getenv("BOT_URL"), # The public URL where Whapi should send messages
"events": [{"type": "messages", "method": "post"}], # Listen for message events
"mode": "method"
}
]
}
# Register the webhook
response = requests.patch(f"{API_URL}/settings", json=payload, headers=headers)
print("Webhook setup:", response.status_code, response.text) # Log the result
# If this script is run directly (not imported), start the bot
if __name__ == "__main__":
register_webhook() # Optionally register the webhook on startup
port = int(os.getenv("PORT", 80)) # Use the PORT environment variable or default to 80
app.run(host="0.0.0.0", port=port) # Start the Flask web server, accessible from any network interface
Depanarea problemelor
Botul nu răspunde la mesajele primite
- Asigurați-vă că trimiteți mesaje la numărul pe care rulează botul, de pe un alt telefon. Botul nu va putea reacționa la mesajele trimise de pe același număr.
- Dacă botul nu reacționează la mesaje de pe alte numere, verificați funcționarea webhook-urilor. Utilizați servicii pentru simularea webhook-urilor, de exemplu, Webhook.site, pentru a vă asigura că cererile de callback vin pe calea corectă. După aceea, verificați dacă calea corespunde celei configurate de dvs. De asemenea, asigurați-vă că serverul dvs. răspunde cu 200Ok.
Botul trimite mesaje fără oprire
Botul funcționează în unele chat-uri, dar în altele nu
Implementare și utilizarea serverelor
Firebase
- Creați un proiect în Consola Firebase;
- Instalați Firebase CLI, urmând instrucțiunile;
- Inițializați Firebase în directorul proiectului dvs. folosind comanda firebase init;
- Desfășurați botul folosind comanda firebase deploy --only functions.
AWS (Amazon Web Services)
- Înregistrați-vă sau autentificați-vă în Consola de Management AWS;
- Creați o nouă funcție Lambda prin consola AWS, alegând API Gateway ca declanșator;
- Încărcați codul botului dvs. în funcția Lambda;
- Configurați API Gateway pentru a interacționa cu botul dvs. în lumea externă.
Heroku
- Creați un cont pe Heroku;
- Instalați Heroku CLI și autentificați-vă;
- Creați o nouă aplicație pe Heroku folosind consola sau comanda heroku create;
- Asociați repoziția dvs. Git cu Heroku și efectuați desfășurarea folosind comenzi git push heroku master;
- Configurați URL-ul webhook furnizat de Heroku.