VK-бот для управления 3D-принтером (Klipper/Moonraker)
Полноценный бот для сообщества ВКонтакте, который позволяет управлять 3D-принтером под управлением Klipper + Moonraker: смотреть статус, температуры, управлять питанием (принтер, свет, хост), запускать печать из списка файлов, делать фото и видео (с управлением светом), получать уведомления о состоянии печати.
Оглавление
- Требования
- Установка пакетов и зависимостей
- Настройка сообщества ВКонтакте и получение токена
- [Получение API-ключа Moonraker (опционально)(#получение-apiключа-moonraker-опционально)
- Настройка Яндекс.Диска для видео (опционально)
- Настройка переменных окружения (.env)
- Запуск бота вручную
- Проверка работоспособности
- Команды бота
- Автозапуск при старте системы (systemd)
- Устранение неполадок
Требования
- Сервер с установленным Klipper + Moonraker (например, Orange Pi, Raspberry Pi).
- Камера, поддерживающая MJPEG-поток (например, через crowsnest или mjpg-streamer).
- Python 3.9+,
pip,git,ffmpeg. - Сообщество ВКонтакте (тип «Группа» или «Публичная страница»).
- Яндекс.Диск (опционально, для отправки видео).
- Доступ к Moonraker API (обычно через
localhost:7125).
Установка пакетов и зависимостей
Подключитесь к вашему серверу (например, через SSH) и выполните команды:
# Обновление системы и установка базовых пакетов
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-pip python3-venv git ffmpeg
# Проверка версии Python (должна быть 3.9+)
python3 --version
Настройка сообщества ВКонтакте и получение токена
-
Создайте сообщество (если ещё нет):
- Перейдите на vk.com/groups → «Создать сообщество».
- Задайте название, тип (группа или публичная страница).
-
Включите сообщения бота:
- Управление → Настройки для бота → «Возможности ботов» → Включить.
- Также включите «Сообщения сообщества».
-
Получите ключ доступа (токен):
- Управление → Работа с API → «Ключи доступа».
- Нажмите «Создать ключ».
- Отметьте галочки:
- ✅ Разрешить приложению доступ к управлению сообществом
- ✅ Разрешить приложению доступ к сообщениям сообщества
- ✅ Разрешить приложению доступ к документам сообщества (для отправки видео)
- Скопируйте полученный токен (начинается с
vk1.a.).
-
Узнайте ID сообщества:
- Откройте страницу сообщества, в адресной строке
vk.com/club123456789— число послеclubи естьGROUP_ID.
- Откройте страницу сообщества, в адресной строке
Получение API-ключа Moonraker (опционально)
Если в вашем moonraker.conf не настроен api_key, можно оставить поле пустым. Если нужен ключ:
# В файле конфигурации Moonraker (обычно ~/printer_data/config/moonraker.conf)
# Добавьте или раскомментируйте строку:
api_key: ваш_сложный_ключ
# После изменения перезапустите Moonraker:
sudo systemctl restart moonraker
Настройка Яндекс.Диска для видео (опционально)
Если вы хотите, чтобы бот отправлял видео (через команду «видео»), нужно настроить загрузку на Яндекс.Диск.
-
Создайте приложение на oauth.yandex.ru:
- Название: любое (например,
3D Printer Bot). - Платформа: «Веб‑сервисы».
- Redirect URI:
https://oauth.yandex.ru/verification_code(подойдёт любой). - Права:
- ✅ Яндекс.Диск REST API → Запись в любом месте на Диске
- ✅ Яндекс.Диск REST API → Доступ к информации о публичных ресурсах
- Сохраните
Client ID.
- Название: любое (например,
-
Получите токен:
-
Перейдите по ссылке:
https://oauth.yandex.ru/authorize?response_type=token&client_id=ВАШ_CLIENT_ID - Подтвердите доступ, скопируйте полученный токен (выглядит как
y0_AgAAAA...).
-
-
Опционально: создайте папку на Яндекс.Диске для видео и запишите её ID (по умолчанию бот загружает в корень).
Настройка переменных окружения (.env)
Создайте файл .env в корне проекта:
nano .env
Содержимое (замените на свои значения):
VK_TOKEN=vk1.a.XXXX...
MOONRAKER_URL=http://localhost:7125
MOONRAKER_API_KEY=
YANDEX_DISK_TOKEN=y0_AgAAAA...
GROUP_ID=123456789
VK_TOKEN– токен сообщества.MOONRAKER_URL– адрес Moonraker (обычноhttp://localhost:7125).MOONRAKER_API_KEY– если не требуется, оставьте пустым.YANDEX_DISK_TOKEN– если не используете видео, можно оставить пустым (но бот будет выдавать ошибку при команде «видео»).GROUP_ID– числовой идентификатор сообщества (безclub).
Сохраните файл (Ctrl+O, Enter, Ctrl+X).
Создание виртуального окружения и установка зависимостей
# В папке проекта
python3 -m venv venv
source venv/bin/activate # активируем окружение
# Устанавливаем необходимые библиотеки
pip install --upgrade pip
pip install vkbottle python-dotenv aiohttp yadisk
# yadisk нужен только для видео, можно не ставить, если видео не используется.
Если видео не планируется, достаточно:
pip install vkbottle python-dotenv aiohttp
Запуск бота вручную
# Убедитесь, что находитесь в папке проекта и активировали venv
source venv/bin/activate
python bot.py
В терминале появится:
INFO:__main__:Бот запущен
INFO:vkbottle:Loop will be run forever
Теперь бот работает и отвечает на команды в сообществе.
Проверка работоспособности
Напишите в сообщество «начать» – бот отправит приветствие и клавиатуру.
Проверьте основные команды:
- «статус» – фото + информация о принтере (температуры, вентиляторы, прогресс печати).
- «файлы» – список G-код файлов, кнопки для запуска печати.
- «система» – подменю управления питанием принтера, света и выключения хоста.
- «видео» (если настроен Яндекс.Диск) – записывает 5-секундное видео, загружает на Диск, возвращает ссылку.
Команды бота
Все команды отправляются текстом в чат с сообществом. Также доступны клавиатуры с кнопками.
Главное меню (кнопки)
| Кнопка | Действие |
|---|---|
| статус | Отправить фото с камеры (с включением/выключением света) и подробный отчёт: состояние принтера, |
прогресс печати (если идёт), температуры экструдера и стола, температуру MCU и хоста, состояния вентиляторов (обдув модели, экструдера, драйверов, корпусный), состояние устройств питания (TronxyX5SA, Light), сообщение с дисплея (M117). | | система | Перейти в подменю управления питанием. | | файлы | Показать список последних 10 G-код файлов с датами модификации. Для каждого файла формируется кнопка «печать <имя>». | | видео (если настроен Яндекс.Диск) | Записать 5-секундное видео с камеры (с включением света за 2 секунды до записи), загрузить на Яндекс.Диск (перезапись файла video.mp4) и отправить прямую ссылку на скачивание. |
Системное подменю (кнопки)
| Кнопка | Действие |
|---|---|
| Принтер | Включить/выключить питание принтера (устройство TronxyX5SA). Запрашивает подтверждение. |
| Свет | Включить/выключить свет (устройство Light). Запрашивает подтверждение. |
| Выключить хост | Выключить хост (Orange Pi). Запрашивает подтверждение. |
| назад | Вернуться в главное меню. |
Кнопки управления печатью (появляются в главном меню, когда печать активна или на паузе)
| Кнопка | Действие |
|---|---|
| ⏸ Пауза / ▶ Возобновить | Приостановить или возобновить текущую печать. Запрашивает подтверждение. |
| 🛑 Стоп | Остановить печать. Запрашивает подтверждение. |
Дополнительные команды (текстовые)
| Команда | Действие |
|---|---|
начать, старт, привет, start, Начать |
Показать главное меню с полным приветствием. |
назад |
Вернуться в главное меню из любого подменю. |
печать <имя_файла> |
(Не вводится вручную) – кнопка, создаваемая для каждого файла. Запускает печать выбранного файла после подтверждения. |
Автозапуск при старте системы (systemd)
Чтобы бот запускался автоматически после перезагрузки хоста, создайте systemd-сервис.
-
Создайте файл сервиса:
sudo nano /etc/systemd/system/vk-moonraker-bot.service -
Вставьте содержимое (поправьте пути и пользователя, если нужно):
[Unit] Description=VK Bot for Moonraker After=network.target moonraker.service Wants=moonraker.service [Service] Type=simple User=klipper Group=klipper WorkingDirectory=/home/klipper/vk_moonraker_bot Environment="PATH=/home/klipper/vk_moonraker_bot/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ExecStart=/home/klipper/vk_moonraker_bot/venv/bin/python /home/klipper/vk_moonraker_bot/bot.py Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target -
Перезагрузите systemd и включите сервис:
sudo systemctl daemon-reload sudo systemctl enable vk-moonraker-bot.service sudo systemctl start vk-moonraker-bot.service -
Проверьте статус:
sudo systemctl status vk-moonraker-bot.service -
Просмотр логов:
sudo journalctl -u vk-moonraker-bot -f
Управление сервисом
Бот будет запускаться автоматически после сети и Moonraker. При падении сервис будет перезапускаться через 10 секунд.
Для управления используйте стандартные команды systemctl:
-
Остановить:
sudo systemctl stop vk-moonraker-bot -
Запустить:
sudo systemctl start vk-moonraker-bot -
Перезапустить:
sudo systemctl restart vk-moonraker-bot -
Отключить автозапуск:
sudo systemctl disable vk-moonraker-bot
Теперь бот будет стартовать вместе с хостом и автоматически восстанавливаться после сбоев.
Если нужно удалить сервис автозапуска
sudo systemctl stop vk-moonraker-bot
sudo systemctl disable vk-moonraker-bot
sudo rm /etc/systemd/system/vk-moonraker-bot.service
sudo systemctl daemon-reload
Устранение неполадок
- Бот не отвечает на сообщения: проверьте, что в сообществе включены «Сообщения сообщества» и «Возможности ботов». Убедитесь, что токен имеет нужные права.
- Ошибка импорта модулей: активируйте виртуальное окружение (
source venv/bin/activate) и установите недостающие пакеты. - Фото не отправляется: убедитесь, что камера работает по адресу
http://localhost:8080/?action=snapshot. Проверьте права токена на загрузку фото. - Видео не загружается: проверьте токен Яндекс.Диска и права приложения. Убедитесь, что
ffmpegустановлен и путь к потоку камеры верный (http://localhost:8080/?action=stream). - Ошибка 403 при публикации на Яндекс.Диске: убедитесь, что у приложения есть право
Доступ к информации о публичных ресурсах. - Принтер выключен, но бот пытается получить данные: в коде уже есть проверка питания устройства
TronxyX5SA– если питание отключено, бот не запрашивает данные Klipper.
Дополнительные замечания
- Имена устройств питания (
TronxyX5SA,Light) должны совпадать с именами вmoonraker.conf(секции[power ...]). - Камера: рекомендуется использовать crowsnest. В конфиге crowsnest задайте
mode: mjpegиport: 8080. - Безопасность: не публикуйте файл
.envи не передавайте токены третьим лицам.