Автоматизация WhatsApp на Python
- Как работать с WhatsApp API с использованием Python;
- Интеграцию с Whapi.Cloud для автоматизации различных задач;
- Использование вебхуков для обработки и автоответа на сообщения;
- Подключение вашего WhatsApp-бота к ChatGPT для диалогов на базе ИИ;

А чтобы упростить работу, вы можете воспользоваться нашими готовыми скриптами Python ботов, которые мы опубликовали на GitHub. В этих проектах подробно описан процесс настройки и тестирования, а внутри кода вы найдете полезные комментарии. Это отличный старт для начинающих разработчиков.
Подготовка к разработке бота
- Python. Установите Python, если он ещё не установлен. Скачайте последнюю версию (рекомендуется 3.6 или выше) с официального сайта и следуйте инструкциям.
- Flask. Flask — это лёгкий веб-фреймворк на Python, который мы будем использовать для настройки сервера и обработки вебхуков. Вы всегда сможете установить Flask следующей командой: pip install Flask
- API Токен. Зарегистрируйтесь в Whapi.Cloud, чтобы получить API токен. Этот токен позволит вашему боту взаимодействовать с WhatsApp через API. После регистрации вам предоставят бесплатный канал с некоторыми лимитами. Этого хватит для тестирования вашей разработки. Whapi.Cloud - провайдер, который выделяется своей стабильностью, низкой стоимостью и большим количеством функций. Инструкции по получению токена мы приведем ниже.
- Настроенный вебхук. Чтобы бот мог обрабатывать входящие сообщения и события из WhatsApp, вам потребуется URL вашего сервера (локального или внешнего) для обработки уведомлений от WhatsApp. В статье мы подробно разберем, как это сделать и где взять такую ссылку.
Получение токена для WhatsApp API
Регистрация и подключение номера
- 1. Перейдите в дашборд и откройте страницу канала Default Channel, который уже создан для вас.
- 2. На первом шаге вы увидите QR-код с инструкцией.
- 3. Откройте WhatsApp на вашем устройстве, перейдите в Настройки → Связанные устройства → Подключить устройство → Сканировать QR-код.
- 4. После успешного подключения задайте имя каналу (например, "Мой Чат-бот"), чтобы удобнее работать в дальнейшем.




Получение API-токена

Инструменты для работы с API
- Удобный Хаб для разработчика: Специализированная платформа с документацией и примерами, позволит получить на все эндпоинты фрагменты кода на разных языках программирования.
- Postman-коллекция: Готовые запросы для тестирования API через Постман.
- Swagger-файл: Подробное описание всех методов API, с возможностью тестирования прямо на странице канала.
Что такое Webhook и как его настроить?
Что такое вебхук?
- Мгновенные уведомления. Все события обрабатываются практически в реальном времени.
- Высокая пропускная способность. Скорость получения уведомлений ограничена только производительностью вашего сервера.
- Гибкость. Вы можете получать только те события, которые вам действительно нужны, например: Личные сообщения; Сообщения в группах; Изменения статусов сообщений; Изменения участников групп; Уведомления о пропущенных вызовах; Статусы каналов и многое другое.
Как и где получить URL для вебхука?
- 1) Скачайте Ngrok с официального сайта и распакуйте его. Теперь откройте терминал и перейдите в папку, где хранится Ngrok.
- 2) Запустите ./ngrok http НОМЕР_ПОРТА, заменяя НОМЕР_ПОРТА на порт, на котором ваш Flask сервер работает локально (например 80).
- 3) Теперь у вас должен быть публичный URL, который вы можете использовать как URL для вебхука. Именно его и нужно скопировать для дальнейшей работы.


Установка вебхука на канал
- Перейдите в настройки канала. На странице канала нажмите кнопку настроек (в правом верхнем углу).
- Настройте вебхук. Укажите ваш URL в разделе вебхуков, используя предвыбранные настройки. Вы можете настроить несколько вебхуков для разных событий, если это необходимо. Так же, вы сможете менять эти настройки через API.
- Сохраните изменения. После этого все уведомления о событиях в WhatsApp будут отправляться на указанный вами сервер.
Создание основы бота WhatsApp на 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")
Отправка текстового сообщения
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)
Получение сообщений через 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)
Расширенные возможности
Отправка изображения
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)
Отправка файла
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)
Создание WhatsApp Группы на 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)
Интеграция с ChatGPT: ИИ для вашего бота в WhatsApp
Шаг 1: Добавьте зависимости для ChatGPT
openai>=1.91.0,<2.0.0
httpx>=0.28.1,<1.0.0
httpcore>=1.0.9,<2.0.0
- openai — официальный SDK для отправки запросов в OpenAI и получения ответов от ChatGPT.
- httpx — современная асинхронная HTTP-библиотека, которую OpenAI использует для вызовов API.
- httpcore — низкоуровневая библиотека сетевого транспорта, используемая httpx. Её необходимо явно закрепить по версии, чтобы избежать конфликтов.
pip install -r requirements.txt
Шаг 2: Получите свой OpenAI API-ключ
OPENAI_API_KEY=your_api_key_here
Шаг 3: Добавьте AI-логику в вашего бота
- - получает входящие webhook-события от Whapi.Cloud,
- - проверяет, начинается ли сообщение с /ai,
- - отправляет запрос пользователя в ChatGPT через OpenAI API,
- - возвращает сгенерированный AI-ответ пользователю в 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
Устранение неполадок
Бот не реагирует на входящие сообщения
- Убедитесь, что вы отправляете сообщения на номер, на котором запущен бот, с другого телефона. Бот не сможет реагировать на сообщения, отправленные с того же номера.
- Если бот не реагирует на сообщения с других номеров, проверьте работу вебхуков. Используйте сервисы для симуляции вебхуков, например, Webhook.site, чтобы удостовериться, по какому пути приходят callback запросы. После этого проверьте соответствует ли путь, указанному вами в конфигурации. Так же, убедитесь, что ваш сервер отвечает 200Ok.
Бот отправляет сообщения без остановки
Бот работает в некоторых чатах, а в других — нет
Деплой и использование серверов
Firebase
- Создайте проект в Firebase Console;
- Установите Firebase CLI, следуя инструкциям;
- Инициализируйте Firebase в директории вашего проекта с помощью команды firebase init;
- Разверните вашего бота, используя команду firebase deploy --only functions.
AWS (Amazon Web Services)
- Зарегистрируйтесь или войдите в AWS Management Console;
- Создайте новую функцию Lambda через консоль AWS, выбрав в качестве триггера API Gateway;
- Загрузите код вашего бота в Lambda функцию;
- Настройте API Gateway для взаимодействия вашего бота с внешним миром.
Heroku
- Создайте аккаунт на Heroku;
- Установите Heroku CLI и войдите в систему;
- Создайте новое приложение на Heroku через консоль или используя команду heroku create;
- Свяжите ваш Git репозиторий с Heroku и выполните деплой с помощью команд git push heroku master;
- Установите URL вебхука, предоставленный Heroku.