Отлично! Переходим к интеграции с
WhatsApp — одной из самых массовых платформ для уведомлений и взаимодействия с пользователями.
---
# 📱 WhatsApp-бот для онлайн-обучения модели
#> ❗ Официальный
WhatsApp #business #API не позволяет
#подключаться #напрямую без
#верификации #бизнеса, но мы
#будем #использовать Twilio API, который официально интегрируется с WhatsApp и позволяет:
> - Отправлять/получать сообщения
> - Принимать команды (`/status`, `/predict`)
> - Отправлять алерты о дрейфе
> - Работать в продакшене
---
## ✅ Что нужно
| Ресурс | Где взять |
|-------|----------|
|
Twilio Account | twilio.com
https://twilio.com (есть бесплатный tier) |
|
WhatsApp Sandbox | В консоли Twilio → Programmable Messaging → WhatsApp |
|
Телефон для теста | Добавить номер в санбокс (можно временный) |
|
ngrok | Для проброса localhost (если локально) |
---
## 1. Установка зависимостей
Добавь в `requirements.txt`:
```txt
twilio
requests
python-dotenv
```
---
## 2. Настройка Twilio
1. Зарегистрируйся:
https://twilio.com https://twilio.com
2. Перейди:
Console → Programmable Messaging → WhatsApp → Sandbox
3. Следуй инструкции: отправь `join <ваш-код>` на указанный номер WhatsApp
4. Запомни:
-
Sandbox URL: `
https://api.twilio.com/...`
-
Account SID
-
Auth Token
-
WhatsApp Sandbox Number (вида `whatsapp:+14155238886`)
---
## 3. `.env` — переменные окружения
```env
# Twilio
TWILIO_ACCOUNT_SID=ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TWILIO_AUTH_TOKEN=your_auth_token
TWILIO_WHATSAPP_NUMBER=whatsapp:+14155238886
# API
API_URL=
http://api:8000
# Telegram (опционально)
TELEGRAM_BOT_TOKEN=7391234567:AAHabcde...
ADMIN_CHAT_ID=123456789
# Внутренние
WHATSAPP_ADMIN_PHONE=whatsapp:+79991234567 # ваш номер в WhatsApp
```
---
## 4. `whatsapp_bot/bot.py`
```python
# whatsapp_bot/bot.py
from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse
import requests
import os
from dotenv import load_dotenv
import logging
load_dotenv()
# Настройки
app = Flask(__name__)
API_URL = os.getenv("API_URL", "
http://api:8000")
ADMIN_PHONE = os.getenv("WHATSAPP_ADMIN_PHONE")
# Логирование
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def send_whatsapp_message(to: str, body: str):
"""Отправка сообщения через Twilio (симуляция — в реальности нужен requests.post)"""
# В реальном случае:
# from twilio.rest import Client
# client = Client(os.getenv("TWILIO_ACCOUNT_SID"), os.getenv("TWILIO_AUTH_TOKEN"))
# client.messages.create(from_=os.getenv("TWILIO_WHATSAPP_NUMBER"), to=to, body=body, messaging_service_sid='MG...')
logger.info(f"📤 WhatsApp -> {to}: {body}")
@app.route("/whatsapp", methods=['POST'])
def whatsapp_reply():
incoming_msg = request.values.get('Body', '').strip()
sender = request.values.get('From') # вида 'whatsapp:+79991234567'
resp = MessagingResponse()
msg = resp.message()
try:
if incoming_msg.lower() in ['привет', 'hi', 'hello', 'start']:
reply = (
"🤖 *Привет! Я WhatsApp-бот для онлайн-модели.*\n\n"
"Команды:\n"
"`/status` — статус модели\n"
"`/predict 0.1, -0.5, 2.0` — предсказать\n"
"`/help` — помощь"
)
msg.body(reply)
msg.body("P.S. Используй Markdown: *жирный*, _курсив_")
elif incoming_msg.lower() == '/help':
reply = (
"📌 *Доступные команды:*\n"
"`/status` — состояние модели\n"
"`/predict 0.1, -0.5, 2.0` — предсказание\n"
"`/alert test` — тестовый алерт (админ)"
)
msg.body(reply)
elif incoming_msg.lower() == '/status':
try: