Простой и надежный WhatsApp-бот на Flask для учета рабочих смен сотрудников через 360dialog API.
- ✅ Учет рабочих смен (дневная, ночная, выходной)
- ✅ Интерактивные кнопки и списки WhatsApp
- ✅ Просмотр последних записей
- ✅ Автоматическая проставка даты
- ✅ Простая настройка через .env файл
- ✅ Webhook для получения сообщений от 360dialog
Требования:
- Python 3.10 или выше
- Аккаунт 360dialog (получить на hub.360dialog.com)
- ngrok для локальной разработки (скачать с ngrok.com)
Установка зависимостей:
# Создание виртуального окружения
python -m venv .venv
# Активация (Windows PowerShell)
.\.venv\Scripts\Activate.ps1
# Активация (Windows cmd)
.venv\Scripts\activate.bat
# Установка пакетов
pip install -r requirements.txtСкопируйте файл с примером переменных окружения:
copy env.example .envОткройте .env и заполните обязательные параметры:
# API ключ от 360dialog (получить в панели hub.360dialog.com)
D360_API_KEY=your_actual_api_key_here
# Токен для верификации webhook (придумайте свой секретный токен)
VERIFY_TOKEN=my_secret_verify_token_12345
# Порт Flask-сервера (по умолчанию 8000)
PORT=8000
# Режим работы (dev/prod)
MODE=devВариант A: Автоматический запуск (Windows)
Просто запустите run.bat — он автоматически:
- Активирует виртуальное окружение
- Запустит Flask-сервер
- Откроет ngrok в отдельном окне
run.batВариант B: Ручной запуск
Терминал 1 — Flask сервер:
python bot.pyТерминал 2 — ngrok туннель:
ngrok http 8000После запуска ngrok скопируйте HTTPS URL (например: https://abc123.ngrok.io)
- Войдите в панель hub.360dialog.com
- Перейдите в раздел Webhooks или Configuration
- Установите Webhook URL:
https://your-ngrok-url.ngrok.io/webhook - Установите Verify Token: значение из вашего
.envфайла (например:my_secret_verify_token_12345) - Включите события:
- ✅ Incoming messages (входящие сообщения)
- ✅ Message status (статусы сообщений)
- Сохраните настройки
- Откройте WhatsApp и напишите сообщение на номер, подключенный к 360dialog
- Отправьте текст: "меню" или "start"
- Бот должен ответить интерактивными кнопками:
- "Заполнить за сегодня"
- "Заполнить за период"
- "Мой статус"
- Нажмите "Заполнить за сегодня"
- Выберите смену из списка (Дневная / Ночная / Выходной)
- Получите подтверждение: "Смена записана ✅"
- Нажмите "Мой статус" чтобы увидеть последние 3 записи
.
├── bot.py # Главный файл Flask приложения
├── constants.py # Константы и ID кнопок
├── menu_handlers.py # Обработчики меню и логика
├── requirements.txt # Зависимости Python
├── .env # Переменные окружения (не в git)
├── env.example # Пример .env файла
├── run.bat # Скрипт автозапуска (Windows)
├── start_ngrok.bat # Скрипт запуска ngrok
├── data/
│ ├── .gitkeep # Маркер для Git
│ └── attendance.json # JSON файл с записями смен
├── storage/
│ ├── __init__.py
│ └── attendance.py # Модуль работы с учетом смен
├── utils/
│ ├── __init__.py
│ └── api_360.py # Клиент 360dialog API
└── scripts/
├── __init__.py
└── mock_payloads.py # Тестовые скрипты
Для тестирования без реального WhatsApp используйте эмулятор:
# Полный сценарий
python scripts/mock_payloads.py full
# Отправка текста
python scripts/mock_payloads.py text "меню"
# Нажатие кнопки
python scripts/mock_payloads.py button FILL_TODAY
# Выбор из списка
python scripts/mock_payloads.py list SHIFT_DAY
# Примеры curl команд
python scripts/mock_payloads.py curl# Отправка текстового сообщения
curl -X POST http://localhost:8000/webhook \
-H "Content-Type: application/json" \
-d '{"entry":[{"changes":[{"value":{"messages":[{"from":"79991234567","type":"text","text":{"body":"меню"}}]}}]}]}'
# Health check
curl http://localhost:8000/healthВерификация вебхука от 360dialog. Проверяет hub.verify_token и возвращает hub.challenge.
Прием входящих сообщений от 360dialog. Обрабатывает:
- Текстовые сообщения
- Интерактивные кнопки (button_reply)
- Интерактивные списки (list_reply)
Health check endpoint, возвращает статус сервиса.
Корневая страница, подтверждает что сервер запущен.
| Переменная | Обязательна | Описание | Пример |
|---|---|---|---|
D360_API_KEY |
✅ Да | API ключ от 360dialog | abc123... |
VERIFY_TOKEN |
✅ Да | Токен для верификации вебхука | my_secret_token |
PORT |
❌ Нет | Порт Flask сервера | 8000 (по умолчанию) |
MODE |
❌ Нет | Режим работы (dev/prod) | dev (по умолчанию) |
WhatsApp Business API накладывает ограничение на исходящие сообщения:
- Session Message — можно отправить в течение 24 часов после последнего входящего сообщения от пользователя
- Template Message — требуется для отправки вне окна 24 часа (нужно создавать шаблоны в панели 360dialog и проходить модерацию)
В данном боте:
- Все исходящие сообщения отправляются как session messages
- Бот работает только в пределах 24-часового окна
- Если окно закрыто, бот не сможет инициировать диалог
- Для старта диалога вне окна нужны template messages (в текущей версии не реализовано)
Рекомендация: Пользователи должны сами писать боту для начала взаимодействия.
Проблема: 360dialog не может верифицировать вебхук.
Решение:
- Проверьте что
VERIFY_TOKENв.envсовпадает с токеном в панели 360dialog - Убедитесь что сервер запущен и доступен через ngrok
- Проверьте что URL в 360dialog правильный:
https://your-url.ngrok.io/webhook
Проблема: Бот не реагирует на сообщения.
Решение:
- Проверьте что вебхук настроен в 360dialog
- Убедитесь что события "Incoming messages" включены
- Проверьте логи Flask (
python bot.py) — должны быть записи о входящих POST запросах - Проверьте что ngrok туннель активен (откройте http://localhost:4040)
- Убедитесь что в ответе на POST /webhook возвращается 200 OK
Проблема: Кнопки приходят, но при нажатии ничего не происходит.
Решение:
- Проверьте логи Flask — должна быть запись об обработке
interactive.button_replyилиinteractive.list_reply - Убедитесь что ID кнопок в
constants.pyсовпадают с ожидаемыми - Проверьте что
handle_main_menu_button()иhandle_shift_selection()вызываются
Проблема: Смена выбрана, но не сохранилась.
Решение:
- Проверьте права записи в папку
data/ - Проверьте логи — должна быть запись "💾 Смена сохранена..."
- Вручную проверьте содержимое
data/attendance.json - Убедитесь что нет ошибок в
storage/attendance.py
Проблема: ngrok закрывается через некоторое время.
Решение:
- Бесплатная версия ngrok сбрасывает туннель через 2 часа
- Перезапустите ngrok и обновите URL в 360dialog
- Для production используйте постоянный домен или платный ngrok
Проблема: Бот не запускается, ошибка "D360_API_KEY не найден".
Решение:
- Убедитесь что файл
.envсуществует в корне проекта - Проверьте что в
.envесть строкаD360_API_KEY=ваш_ключ - Убедитесь что нет лишних пробелов или кавычек вокруг значения
Бот выводит подробные логи в консоль:
📥— Входящие запросы (GET/POST)📤— Исходящие сообщения✅— Успешные операции❌— Ошибки⚠️— Предупреждения💬— Обработка сообщений🔘— Обработка кнопок📋— Обработка списков💾— Сохранение данных
- Не коммитьте .env файл в git — в нём хранятся секретные ключи
- Используйте сложный
VERIFY_TOKEN(случайная строка, минимум 20 символов) - В production используйте HTTPS (не HTTP)
- Ограничьте доступ к серверу файрволлом
Для production окружения рекомендуется:
- Не использовать ngrok — поднимите сервер на VPS с публичным IP
- Настроить HTTPS — используйте Let's Encrypt + nginx/caddy
- Запустить через systemd/supervisor — автоматический перезапуск при падении
- Настроить логирование — rotated logs в файл
- Использовать gunicorn вместо встроенного Flask сервера:
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 bot:appПри возникновении проблем:
- Проверьте раздел FAQ выше
- Изучите логи в консоли Flask
- Проверьте логи вебхуков в панели 360dialog
- Используйте
scripts/mock_payloads.pyдля локального тестирования
MIT License — используйте свободно в коммерческих и некоммерческих целях.
Версия: 1.0.0
Дата: 2025-11-09
Автор: TERRA Bot Team