Часть 1: Если у вас нет времени на чтение
Данная реализация бота включает в себя наиболее часто используемые функции. Это позволит вам адаптировать исходный код под ваши задачи и потребности или использовать его в качестве основы для создания любой другой интеграции. Мы оставили комментарии рядом с каждой функцией, чтобы вам было проще понять код. В исходном коде бота вы найдете следующие функции:
- Ответ на неизвестную команду, это может быть инструкция или ваше приветственное сообщение;
- Отправка обычного сообщения;
- Отправка изображения;
- Отправка файла;
- Отправка видео;
- Отправка контакта (vCard);
- Отправка товара;
- Создание новой группы, отправка приглашения и отправка сообщения в группу;
- Получение и чтение входящих сообщений;
Для работы бота НЕ ТРЕБУЕТСЯ, чтобы телефон был включен или находился в сети. Подключите номер и комфортно протестируйте интеграцию!
А если вам нужна помощь, просто напишите нам в чат поддержки на любой странице сайта.
Если вы решаете, какого провайдера выбрать, или не до конца понимаете разницу между WhatsApp Business API и WhatsApp API, вам будет полезно изучить наше руководство, в котором мы сравним провайдеров, функционал, цены и существующие на сегодняшний день решения. Это будет полезно всем, чтобы решить, какой API и какого провайдера выбрать. Итак, погрузитесь в нашу статью "Как выбрать WhatsApp API. Сравнение."
А если вам нужна помощь, просто напишите нам в чат поддержки на любой странице сайта.
Если вы решаете, какого провайдера выбрать, или не до конца понимаете разницу между WhatsApp Business API и WhatsApp API, вам будет полезно изучить наше руководство, в котором мы сравним провайдеров, функционал, цены и существующие на сегодняшний день решения. Это будет полезно всем, чтобы решить, какой API и какого провайдера выбрать. Итак, погрузитесь в нашу статью "Как выбрать WhatsApp API. Сравнение."
Часть 2: Автоматизация WhatsApp с использованием Python
WhatsApp не только мессенджер для общения, но и мощный инструмент для бизнеса. Возможность автоматизации взаимодействия с клиентами через чат-боты становится все более актуальной. Выбор Python для этой задачи обусловлен его гибкостью и мощными инструментами разработки, а Whapi.Cloud позволяет автоматизировать практически любую функцию WhatsApp.
В этом руководстве мы рассмотрим:
- Взаимодействие с WhatsApp API на Python;
- Интеграция с Whapi.Cloud и автоматизация любой функциональности;
- Использование Flask для обработки входящих сообщений и ответов на них;
Подготовка к разработке
Прежде чем начать разработку чат-бота, убедимся, что у нас есть все необходимое.
- Установка Python. Если вы еще не установили Python, посетите официальный сайт Python и следуйте инструкциям по установке. Мы рекомендуем использовать версию Python 3.6 или выше.
- Токен от Whapi.Cloud WhatsApp API. Вам понадобится учетная запись Whapi.Cloud для получения токен, который позволит вашему боту взаимодействовать с WhatsApp через API. После регистрации вы получите бесплатный канал с уникальным токеном. На сегодняшний день Whapi.Cloud наиболее функциональный и стабильный провайдер, предоставляющий недорогой доступ к API WhatsApp.
- Установка Flask. Flask - это легковесный веб-фреймворк на Python, который мы будем использовать для настройки нашего сервера и обработки вебхуков из WhatsApp. Вы можете установить Flask следующей командой: pip install Flask
- Настройка вебхука. Чтобы ваш сервер мог принимать входящие сообщения и события из WhatsApp, вам нужно настроить вебхук. На Whapi.Cloud вы сможете указать несколько хуков (URL вашего сервера) под различные события, куда будут отправляться уведомления. Мы коснемся этой темы подробнее ниже в статье.
- Рабочая среда. Рекомендуется использовать виртуальное окружение (например, virtualenv) для изоляции зависимостей и обеспечения портативности вашего проекта.
Интеграция с WhatsApp API через Whapi.Cloud на Python
Зарегистрируйтесь в сервисе. Этот шаг прост и не требует ввода данных кредитной карты. После регистрации у вас будет 5 дней полного доступа к API, чего будет достаточно для тестирования всех методов и функций. Если же вам этого не хватит, обратитесь в поддержку сервиса через виджет веб-чата, вам снимут ограничения для комфортного тестирования.
Следующим шагом будет подключение вашего номера WhatsApp. Не переживайте, вы можете отключиться в любое время, но это необходимо для тестирования автоматизации. Для подключения перейдите в свой личный кабинет на страницу канала Default Channel, который уже создан для вас. На первом шаге вы найдете QR-код с инструкцией. Откройте свой WhatsApp на вашем мобильном устройстве, перейдите в Настройки -> Связанные устройства -> Подключить устройство -> Сканировать QR-код.
Во время подключения, на этапах два и три, вам предоставится возможность настроить свой канал.
Задайте имя каналу для удобства (к слову, наш API сразу определит, используете ли вы обычную или бизнес-версию приложения с расширенными функциями). Далее будут доступны настройки вебхуков и других параметров по вашему усмотрению. Однако, эти действия можно выполнить позже и пропустить данный этап.
После активации канала в разделе с информацией о лимитах найдите свой API-токен. Данный токен критически важен для аутентификации при обращении к API. Обычно он передается в заголовках запросов в качестве Bearer Token или же как параметр, в зависимости от способа обращения к API.
API Whapi.Cloud предоставляет большое количество методов для взаимодействия с WhatsApp, действительно позволяя вам автоматизировать ключевые возможности и функции мессенджера. На странице канала вы можете изучить и опробовать все доступные методы. Для удобства разработки вам предоставлен специализированный хаб для разработчика, где каждая функция снабжена примерами кода и возможностью тестирования на месте, демонстрируя результаты и ответы от сервера.
Это максимально упрощает и ускоряет процесс интеграции, вам понравится! Одним из преимуществ Whapi.Cloud является простота и скорость подключения, что позволяет начать взаимодействие с WhatsApp всего за несколько минут.
Задайте имя каналу для удобства (к слову, наш API сразу определит, используете ли вы обычную или бизнес-версию приложения с расширенными функциями). Далее будут доступны настройки вебхуков и других параметров по вашему усмотрению. Однако, эти действия можно выполнить позже и пропустить данный этап.
После активации канала в разделе с информацией о лимитах найдите свой API-токен. Данный токен критически важен для аутентификации при обращении к API. Обычно он передается в заголовках запросов в качестве Bearer Token или же как параметр, в зависимости от способа обращения к API.
API Whapi.Cloud предоставляет большое количество методов для взаимодействия с WhatsApp, действительно позволяя вам автоматизировать ключевые возможности и функции мессенджера. На странице канала вы можете изучить и опробовать все доступные методы. Для удобства разработки вам предоставлен специализированный хаб для разработчика, где каждая функция снабжена примерами кода и возможностью тестирования на месте, демонстрируя результаты и ответы от сервера.
Это максимально упрощает и ускоряет процесс интеграции, вам понравится! Одним из преимуществ Whapi.Cloud является простота и скорость подключения, что позволяет начать взаимодействие с WhatsApp всего за несколько минут.
Что такое Webhook и как его настроить?
Ваш WhatsApp-бот и наш API-шлюз должны общаться, чтобы когда что-то меняется в одной системе, другая система знала об этом. Например, отслеживание изменений статуса сообщений, таких как "отправлено", "доставлено" и "прочитано".
Здесь на помощь приходит вебхук! Специально настроенный вебхук позволяет вашему серверу мгновенно узнавать о определенных событиях. В зависимости от ваших настроек вы можете получать уведомления о сообщениях, их статусе, статусе канала, телефона и даже пропущенных вызовах. Одним из преимуществ Whapi.Cloud является возможность гибко и автоматически настраивайть и управлять хуками по вашему желанию, а множество дополнительных настроек упростит вам работу.
Мы подробно рассмотрели все нюансы работы с вебхуками в нашей базе знаний: Смотреть статью о вебхуках
Перейдите в настройки вашего канала (кнопка справа сверху). Первым же блоком идёт раздел вебхуков. Укажите URL вашего сервера, куда будут отправляться уведомления. Добавьте другие хуки, если в этом будет необходимость. При получении сообщения на настроенный URL webhook будет отправлен POST-запрос с данными сообщения, что позволит вашему боту обрабатывать входящие сообщения и отвечать на них соответствующим образом. Мы узнаем, как обрабатывать входящие данные, чуть позже.
Создание основы бота WhatsApp на Python
В этой главе мы рассмотрим, как использовать API Whapi.Cloud с помощью Python. Это позволит нам отправлять, получать и управлять сообщениями в WhatsApp.
Отправка сообщений WhatsApp на Python
Давайте начнем с простого – отправим текстовое сообщение.
import requests
url = "https://gate.whapi.cloud/messages/text?token=bg3FeZJ6jWGw32g03PRnoNkKO7k03GtX"
payload = {
"typing_time": 0,
"to": "[email protected]",
"body": "Hello, world!"
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Получение сообщений через Flask Webhook
Чтобы получать сообщения, вам нужно настроить маршрут Flask, который будет действовать как конечная точка вебхука. Не забудьте обновить URL вебхука на Whapi.Cloud с созданным вами конечным URL. В этом примере это будет http://your_domain_or_ip/webhook.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def whatsapp_webhook():
incoming_message = request.json
# Process the message here
return jsonify(status='success'), 200
Настроить вебхуки можно как через интерфейс в личном кабинете, так и программно через API. Ниже приведен Python-фрагмент настройки через API:
import requests
url = "https://gate.whapi.cloud/settings?token=YOUR_TOKEN"
payload = {
"callback_persist": True,
"webhooks": [
{
"events": [
{
"type": "messages",
"method": "post"
},
{
"type": "ack",
"method": "post"
}
],
"mode": "body",
"url": "Webhook URL, http or https"
}
]
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)
Исходный код WhatsApp бота на Python
Ниже представлено простое приложение Flask, которое использует предоставленный Python-скрипт для отправки сообщений через API Whapi.Cloud. Он прослушивает входящие сообщения и отправляет соответствующие ответы на основе содержания. Создадим файл .env с заранее сохраненными настройками конфигурации.
TOKEN=Your_token # API token from your channel
API_URL=https://gate.whapi.cloud # API endpoint URL
BOT_URL=https://your_bot_url_here/messages # Webhook Link to your server. At ( {server link}/messages ), when POST is requested, processing occurs
PRODUCT_ID=6559353560856703 # The ID of the product we will send for the example. Create a product in your WhatsApp and find out the product ID: https://whapi.readme.io/reference/getproducts
[email protected] # The ID of the group to which we will send the message. Use to find out the ID: https://whapi.readme.io/reference/getgroups
PORT=80 # example, 80 or 443
Напомню, что весь исходный код этого проекта можно скачать с ГитХаба: https://github.com/Whapi-Cloud/python-whatsapp-chatbot
from flask import Flask, request, jsonify
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
import os
from dotenv import load_dotenv
load_dotenv() # Load environment variables from a .env file
app = Flask(__name__)
COMMANDS = {
'TEXT': 'Simple text message',
'IMAGE': 'Send image',
'DOCUMENT': 'Send document',
'VIDEO': 'Send video',
'CONTACT': 'Send contact',
'PRODUCT': 'Send product',
'GROUP_CREATE': 'Create group',
'GROUP_TEXT': 'Simple text message for the group',
'GROUPS_IDS': "Get the id's of your three groups"
}
FILES = {
'IMAGE': './files/file_example_JPG_100kB.jpg',
'DOCUMENT': './files/file-example_PDF_500_kB.pdf',
'VIDEO': './files/file_example_MP4_480_1_5MG.mp4',
'VCARD': './files/sample-vcard.txt'
}
def send_whapi_request(endpoint, params=None, method='POST'):
headers = {
'Authorization': f"Bearer {os.getenv('TOKEN')}"
}
url = f"{os.getenv('API_URL')}/{endpoint}"
if params:
if 'media' in params:
details = params.pop('media').split(';')
with open(details[0], 'rb') as file:
m = MultipartEncoder(fields={**params, 'media': (details[0], file, details[1])})
headers['Content-Type'] = m.content_type
response = requests.request(method, url, data=m, headers=headers)
elif method == 'GET':
response = requests.get(url, params=params, headers=headers)
else:
headers['Content-Type'] = 'application/json'
response = requests.request(method, url, json=params, headers=headers)
else:
response = requests.request(method, url, headers=headers)
print('Whapi response:', response.json())
return response.json()
def set_hook():
if os.getenv('BOT_URL'):
settings = {
'webhooks': [
{
'url': os.getenv('BOT_URL'),
'events': [
{'type': "messages", 'method': "post"}
],
'mode': "method"
}
]
}
send_whapi_request('settings', settings, 'PATCH')
@app.route('/messages', methods=['POST'])
def handle_new_messages():
try:
messages = request.json.get('messages', [])
endpoint = None
for message in messages:
if message.get('from_me'):
continue
sender = {'to': message.get('chat_id')}
command_input = message.get('text', {}).get('body', '').strip()
command = list(COMMANDS.keys())[int(command_input) - 1] if command_input.isdigit() else None
if command == 'TEXT':
sender['body'] = 'Simple text message'
endpoint = 'messages/text'
elif command == 'IMAGE':
sender['caption'] = 'Text under the photo.'
sender['media'] = FILES['IMAGE'] + ';image/jpeg'
endpoint = 'messages/image'
elif command == 'DOCUMENT':
sender['caption'] = 'Text under the document.'
sender['media'] = FILES['DOCUMENT'] + ';application/pdf'
endpoint = 'messages/document'
elif command == 'VIDEO':
sender['caption'] = 'Text under the video.'
sender['media'] = FILES['VIDEO'] + ';video/mp4'
endpoint = 'messages/video'
elif command == 'CONTACT':
sender['name'] = 'Whapi Test'
with open(FILES['VCARD'], 'r') as vcard_file:
sender['vcard'] = vcard_file.read()
endpoint = 'messages/contact'
elif command == 'PRODUCT':
# Example: You need to replace config.product with an actual product ID
product_id = os.getenv('PRODUCT_ID') # Replace with your product ID
endpoint = f'business/products/{product_id}'
elif command == 'GROUP_CREATE':
# Example: You need to replace config.phone with an actual phone number
participants = [message.get('chat_id').split('@')[0]] # Replace with the phone number
response = send_whapi_request('groups', {'subject': 'Whapi.Cloud Test', 'participants': participants})
sender['body'] = f"Group created. Group id: {response.get('group_id')}" if response.get('group_id') else 'Error'
endpoint = 'messages/text'
elif command == 'GROUP_TEXT':
sender['to'] = os.getenv('GROUP_ID') # Replace with your group ID
sender['body'] = 'Simple text message for the group'
endpoint = 'messages/text'
elif command == 'GROUPS_IDS':
groups_response = send_whapi_request('groups', {'count': 3}, 'GET')
groups = groups_response.get('groups', [])
sender['body'] = ',\n '.join(f"{group['id']} - {group['name']}" for group in groups) if groups else 'No groups'
endpoint = 'messages/text'
else:
sender['body'] = "Hi. Send me a number from the list. Don't forget to change the actual data in the code!\n\n" + \
'\n'.join(f"{i + 1}. {text}" for i, text in enumerate(COMMANDS.values()))
endpoint = 'messages/text'
if endpoint is None:
return 'Ok', 200
response = send_whapi_request(endpoint, sender)
print(f"Response from Whapi: {response}")
return 'Ok', 200
except Exception as e:
print(e)
return str(e), 500
@app.route('/', methods=['GET'])
def index():
return 'Bot is running'
if __name__ == '__main__':
set_hook()
port = os.getenv('PORT') or (443 if os.getenv('BOT_URL', '').startswith('https:') else 80)
app.run(port=port, debug=True)
Чтобы это работало: 1. Запустите приложение Flask. 2. Настройте свой канал WhatsApp для приёма сообщений на ваш webhook. 3. Попробуйте отправить сообщение "hello" вашему WhatsApp-боту и посмотрите, как он отреагирует.
Поскольку ответы имеют формат JSON, вы легко можете расширить возможности вашего бота. Например, вы можете включать дополнительную информацию в ответ, учитывая временную метку доставки или текущий статус получателя (онлайн, офлайн и т. д.), ваш бот легко может адаптироваться для использования этих данных. В документации и в Хабе для разработчиков мы заложили полные сведения о том, какой ответ с какими параметрами вам стоит ожидать на любой запрос. Список всех параметров доступен в документации. Используйте эти данные для расширения своего функционала.
Расширенные возможности
В нашей подробной документации вы найдете пошаговые инструкции и примеры использования методов, которые позволяют вам отправлять разнообразное содержимое, начиная от файлов любого формата, местоположений и контактов до стикеров, опросов и товаров. Кроме того, вы можете динамически взаимодействовать с сообщениями (реагировая эмодзи), цитировать их, отмечать как прочитанные, делать диалоги закрепленными, удалять или ставить статус печатает в ответ.
Whapi.Cloud действительно имеет широкий функционал и в работе с автоматизацией групп. Вы можете автоматически создавать/удалять группы, добавлять туда участников, получать сведения о группах и их участников, назначать администраторов, изменять любые настройки группы, генерировать ссылки на приглашения, блокировать пользователей и т.д. Все методы описаны в документации Whapi.Cloud.
Имея такой обширный спектр возможностей, создание бота, соответствующего любому уровню сложности и цели, становится легким делом. Без проблем интегрируйте вашего бота на PHP в любую платформу, будь то сайт, приложение, CRM, ERP система и многое другое.
Отправить сообщение с медиа-изображением
Повышение взаимодействия пользователей с вашим ботом WhatsApp становится значительно проще, когда вы включаете медиасообщения. Отправляя изображения, вы не только делаете общение более насыщенным и интерактивным, но и предоставляете компаниям возможность визуально демонстрировать свои продукты или сообщения. Это значительно обогащает опыт общения, превосходя ограничения взаимодействия только текстом. Давайте разберемся в процессе отправки изображения через API Whatsapp с использованием Python:
import requests
url = "https://gate.whapi.cloud/messages/image?token=bg3FeZJ6jWGw32g03PRnoNkKO7k03GtX"
payload = {
"to": "[email protected]",
"media": "data:image/png;name=android-chrome-192x192.png;base64,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"
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Отправить файл через API WhatsApp
С ботом для WhatsApp распространение файлов становится бесшовным процессом, предоставляя пользователям быстрый и безопасный способ делиться важными документами. Интегрируя эту функцию, вы обогащаете пользовательский опыт, представляя разнообразные варианты общения, выходящие за рамки простого текста и визуала. Давайте рассмотрим методику отправки файла через API Whatsapp с использованием Python:
import requests
url = "https://gate.whapi.cloud/messages/document?token=bg3FeZJ6jWGw32g03PRnoNkKO7k03GtX"
payload = {
"to": "[email protected]",
"media": "data:application/octet-stream;name=site.webmanifest;base64,ewogICAgIm5hbWUiOiAiIiwKICAgICJzaG9ydF9uYW1lIjogIiIsCiAgICAiaWNvbnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAic3JjIjogIi9hbmRyb2lkLWNocm9tZS0xOTJ4MTkyLnBuZyIsCiAgICAgICAgICAgICJzaXplcyI6ICIxOTJ4MTkyIiwKICAgICAgICAgICAgInR5cGUiOiAiaW1hZ2UvcG5nIgogICAgICAgIH0KICAgIF0sCiAgICAidGhlbWVfY29sb3IiOiAiI2ZmZmZmZiIsCiAgICAiYmFja2dyb3VuZF9jb2xvciI6ICIjZmZmZmZmIiwKICAgICJkaXNwbGF5IjogInN0YW5kYWxvbmUiCn0K"
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Заключение и рекомендации
После настройки бота и обеспечения его правильной работы локально, вы можете его развернуть. Хотя Flask идеально подходит для разработки, рассмотрите возможность развертывания на платформах, таких как Gunicorn или uWSGI, для производственной среды. Когда ваш бот активен, он будет отвечать на каждое входящее сообщение WhatsApp.
Благодаря обширной экосистеме библиотек Python, всегда есть место для улучшений. Вы можете интегрировать обработку естественного языка (NLP) для умных взаимодействий, подключать базы данных для постоянного хранения или даже реализовать возможности запланированной рассылки сообщений.
Создание бота для WhatsApp с использованием Python и его соединение с Whapi.Cloud упрощает процесс обмена сообщениями. Это руководство показывает, что шаг за шагом каждый, даже без особых знаний в Python или API, может это сделать.
Этот бот разработан по принципу "plug-and-play". Начать работу очень просто. Прежде всего, вам нужно зарегистрироваться на нашем сервисе. Мы предлагаем бесплатную пробную версию, позволяя вам опробовать все функции перед принятием решения о покупке. После регистрации загрузите код бота на ваш сервер. Следуя инструкциям в этой статье, ваш бот будет работать в кратчайшие сроки.
Помните, если у вас возникнут какие-либо вопросы или проблемы на пути, наша служба поддержки всегда готова помочь. Мы ценим каждого пользователя и стремимся обеспечить, чтобы ваш опыт работы с нашим API был максимально гладким и эффективным.