@mefodiytr/n8n-nodes-max
v0.3.0
Published
n8n community node for Max messenger integration. Fork of pfrankov/n8n-nodes-max with additional message and chat operations (pin/unpin/forward/edit_chat/send_action) and webhook deduplication.
Maintainers
Keywords
Readme
@mefodiytr/n8n-nodes-max
Это форк
Это расширенная версия n8n-nodes-max от Павла Франкова. Спасибо ему за отличную базу.
Что добавлено в 0.2.0:
- Дедупликация webhook-событий (защита от двойной доставки)
- Перевод логирования с
console.logна n8n logger - Pin / Unpin сообщений
- Forward сообщений между чатами
- Edit chat (название, иконка, описание)
- Send action (
typing_onи др. индикаторы)
Что добавлено в 0.3.0:
- Новая нода
Max Polling Trigger— long-polling-альтернатива webhook'у для сред без публичного HTTPS endpoint
Что планируется в 0.4.0+: members management, rate limit handling (429 + Retry-After), subscriptions / bot info ops.
Нода для интеграции мессенджера Max с платформой автоматизации n8n.
Установка
Для self-hosted n8n
- Установите пакет через npm в директории n8n:
npm install @mefodiytr/n8n-nodes-max- Перезапустите n8n для загрузки новой ноды
Для n8n Cloud
- Откройте настройки вашего workspace
- Перейдите в раздел "Community nodes"
- Нажмите "Install a community node"
- Введите
@mefodiytr/n8n-nodes-maxи нажмите "Install"
Альтернативный способ (переменная окружения)
Добавьте пакет в переменную окружения:
export N8N_CUSTOM_EXTENSIONS=@mefodiytr/n8n-nodes-maxПолезные ссылки:
Для разработки
- После
npm installавтоматически устанавливается Husky pre-commit hook. - Перед коммитом запускается Prettier для staged исходников (
*.{ts,js,mjs,cjs,json,md,yml,yaml}).
Релиз
- Подготовьте изменения и закоммитьте их обычным git-коммитом.
- Выберите semver-тип релиза и создайте commit+tag командой
npm version patch,npm version minorилиnpm version major. - Запушьте ветку и теги командой
git push origin master --follow-tags. - GitHub Actions опубликует пакет в npm по пушу тега
v*.*.*.
Для автопубликации в репозитории должен быть настроен секрет NPM_TOKEN.
Возможности
Сообщения
- Отправка текстовых сообщений с форматированием
- Автоматический fallback в plain text при ошибке Max API о неподдерживаемом Markdown
- Редактирование и удаление сообщений
- Для
Edit Messageнода отправляетmessage_idв query-параметре запросаPUT /messages?message_id=... - В
Edit MessageопцияClear Attachmentsудаляет текущие вложения сообщения, включая inline-клавиатуру - Отправка файлов (изображения, видео, аудио, документы)
- Для вложений в
Send Messageдоступны три источника:Binary Data,URLи готовыйTokenMAX - В
Send Messageтекст не обязателен, если отправляются вложения - Нода не ограничивает вложения по расширению файла: формат проверяется на стороне Max API
- Payload вложения зависит от типа файла: для
imageиспользуются поля из JSON-ответа upload-шага (token/photos/url), дляfileиспользуетсяtokenиз upload-ответа, а дляvideo/audioнода также поддерживает токен изPOST /uploads, если upload endpoint возвращаетretval - Если у вас уже есть
payload.tokenиз Max API, выберитеAttachment Source = Token: нода отправит вложение без повторного скачивания и upload - Автоматический ретрай отправки с медиа-вложением при временной ошибке
attachment.not.ready - Явная валидация ID получателя:
0отклоняется с подсказкой по полям изMax Trigger - Интерактивные клавиатуры с кнопками
- Pin / Unpin Message — закрепление и открепление сообщения в групповом чате (
PUT/DELETE /chats/{chatId}/pin); параметрNotify Membersконтролирует, рассылать ли уведомление участникам - Forward Message — пересылка существующего сообщения в другой чат (
POST /messages?chat_id=с body{link: {type: forward, message_id}})
Чаты
- Получение информации о чате
- Выход из групповых чатов
- Edit Chat — обновление title / description / icon (только для групповых чатов; иконка задаётся URL'ом, MAX скачивает её сам)
- Send Action — отправка индикаторов активности бота (
typing_on,sending_photo/video/audio/file,mark_seen); парногоtyping_offв API нет — клиент сам гасит индикатор по таймауту, и иногдаtyping_onвозвращает 200 OK без визуального индикатора (поведение клиента, не баг)
Триггеры
В пакете две ноды-триггера. Выбор зависит от того, есть ли у n8n публичный HTTPS endpoint.
Max Trigger (webhook)
- Получение событий в реальном времени:
- Новые сообщения в личных диалогах (
message_created) и чатах (message_chat_created) - Нажатия на кнопки
- События чатов
- Новые сообщения в личных диалогах (
- Поддержка webhook URL с интернационализированными доменами (IDN/Punycode) для корректной TLS-валидации
- Дедупликация webhook'ов: при ретрае MAX или гонке при апдейте подписки workflow запускается ровно один раз. Ключ строится по
update_type(см. ниже), состояние хранится вgetWorkflowStaticData('node'), TTL 12 часов для известных типов и 60 секунд для неизвестных - Логирование: события триггера и lifecycle подписки идут через
this.logger(debug/info/error), а неconsole.log— удобно фильтровать через стандартные средства n8n
Max Polling Trigger (long-polling)
Альтернатива webhook'у для сред без публичного HTTPS endpoint (закрытые сети, локальный n8n без проброса наружу).
- Использует
GET /updates?marker=&timeout=&limit=— соединение держится до 90 секунд, новые события приходят как только появляются - Marker (курсор) хранится в
getWorkflowStaticData('global')['maxPollingMarker']и переживает рестарт workflow - Backoff на временных ошибках:
1 → 2 → 4 → 8 → 16 → 30секунд, сбрасывается на первом успешном запросе - На
401 Unauthorized— останавливает polling и пишет error в лог (auto-restart бесполезен без новых credentials) - Дедупликация по composite key (та же логика, что в webhook-триггере) — secondary safety net на случай потери marker'а при рестарте
- Webhook и polling взаимоисключающие (ограничение MAX API): при активной webhook-подписке polling вернёт 0 update'ов. Параметр
Force Unsubscribe Webhooks on Activateуправляет поведением при активации:false(по умолчанию) — если подписки есть, нода падает с понятной ошибкой и инструкциейtrue— нода удаляет все активные подписки перед стартом polling
Когда использовать polling vs webhook
| Условие | Выбор |
| ----------------------------------------------------- | ---------------------------------- |
| n8n доступен по публичному HTTPS | Webhook (быстрее, меньше нагрузки) |
| n8n за NAT / в VPN / без публичного DNS | Polling |
| Нужна работа в разработке без ngrok / туннелей | Polling |
| Один воркспейс — несколько workflow на ту же подписку | Webhook |
| Latency критична (ms-уровень) | Webhook |
Настройка
- Создайте бота через @PrimeBot в Max мессенджере
- Получите токен доступа
- Добавьте токен в настройки ноды в n8n
Быстрый старт
Отправка сообщения
- Добавьте ноду Max в workflow
- Выберите операцию "Send Message"
- Укажите ID получателя; при необходимости добавьте текст
- Чтобы отправить только файл/медиа, оставьте
Message Textпустым и добавьте вложение вAdditional Fields → Attachments - Чтобы переиспользовать уже загруженный файл, выберите
Additional Fields → Attachments → Attachment Source = Tokenи вставьтеFile Token - Запустите workflow
Удаление inline-кнопок при редактировании
- Выберите операцию
Edit Message - Укажите
Message IDи новый текст - Включите
Clear Attachments, чтобы Max API получилattachments: []и удалил текущую inline-клавиатуру
Получение сообщений (webhook)
- Добавьте ноду Max Trigger
- Настройте webhook
- Выберите типы событий для отслеживания
Получение сообщений (long-polling)
- Добавьте ноду
Max Polling Trigger - Выберите типы событий
- При первой активации — если есть активные webhook-подписки, либо деактивируйте все
Max Triggerworkflows, либо включитеForce Unsubscribe Webhooks on Activate
