Перейти до основного вмісту

Zalo Personal (неофіційно)

Стан: експериментально. Ця інтеграція автоматизує особистий обліковий запис Zalo через нативний zca-js всередині OpenClaw.
Попередження: Це неофіційна інтеграція, яка може призвести до призупинення або блокування облікового запису. Використовуйте на власний ризик.

Вбудований плагін

Zalo Personal постачається як вбудований плагін у поточних випусках OpenClaw, тому звичайні зібрані збірки не потребують окремого встановлення. Якщо ви використовуєте старішу збірку або нестандартне встановлення без Zalo Personal, установіть його вручну:
  • Установлення через CLI: openclaw plugins install @openclaw/zalouser
  • Або з checkout вихідного коду: openclaw plugins install ./path/to/local/zalouser-plugin
  • Докладніше: Плагіни
Зовнішній бінарний файл CLI zca/openzca не потрібен.

Швидке налаштування (для початківців)

  1. Переконайтеся, що плагін Zalo Personal доступний.
    • Поточні зібрані випуски OpenClaw уже містять його в комплекті.
    • У старіших/нестандартних установленнях його можна додати вручну за допомогою наведених вище команд.
  2. Увійдіть (QR, на машині Gateway):
    • openclaw channels login --channel zalouser
    • Відскануйте QR-код у мобільному застосунку Zalo.
  3. Увімкніть канал:
{
  channels: {
    zalouser: {
      enabled: true,
      dmPolicy: "pairing",
    },
  },
}
  1. Перезапустіть Gateway (або завершіть налаштування).
  2. Доступ до приватних повідомлень типово використовує прив’язку; підтвердьте код прив’язки під час першого контакту.

Що це таке

  • Повністю працює в межах процесу через zca-js.
  • Використовує нативні слухачі подій для отримання вхідних повідомлень.
  • Надсилає відповіді безпосередньо через JS API (текст/медіа/посилання).
  • Призначено для сценаріїв використання з “особистим обліковим записом”, де Zalo Bot API недоступний.

Іменування

ID каналу — zalouser, щоб чітко показати, що це автоматизація особистого облікового запису користувача Zalo (неофіційно). Назву zalo ми залишаємо зарезервованою для потенційної майбутньої офіційної інтеграції Zalo API.

Пошук ID (directory)

Використовуйте CLI directory, щоб знаходити співрозмовників/групи та їхні ID:
openclaw directory self --channel zalouser
openclaw directory peers list --channel zalouser --query "name"
openclaw directory groups list --channel zalouser --query "work"

Обмеження

  • Вихідний текст розбивається на фрагменти приблизно по 2000 символів (обмеження клієнта Zalo).
  • Streaming типово заблоковано.

Керування доступом (приватні повідомлення)

channels.zalouser.dmPolicy підтримує: pairing | allowlist | open | disabled (типово: pairing). channels.zalouser.allowFrom приймає ID користувачів або імена. Під час налаштування імена зіставляються з ID за допомогою внутрішньопроцесного пошуку контактів плагіна. Підтвердження:
  • openclaw pairing list zalouser
  • openclaw pairing approve zalouser <code>

Доступ до груп (необов’язково)

  • Типово: channels.zalouser.groupPolicy = "open" (групи дозволено). Використовуйте channels.defaults.groupPolicy, щоб перевизначити типове значення, коли його не задано.
  • Обмеження через allowlist:
    • channels.zalouser.groupPolicy = "allowlist"
    • channels.zalouser.groups (ключами мають бути стабільні ID груп; імена за можливості зіставляються з ID під час запуску)
    • channels.zalouser.groupAllowFrom (керує тим, які відправники в дозволених групах можуть запускати бота)
  • Заблокувати всі групи: channels.zalouser.groupPolicy = "disabled".
  • Майстер налаштування може запитувати allowlist груп.
  • Під час запуску OpenClaw зіставляє імена груп/користувачів в allowlist з ID і записує це зіставлення в журнал.
  • Зіставлення групового allowlist типово працює лише за ID. Нерозпізнані імена ігноруються для автентифікації, якщо не ввімкнено channels.zalouser.dangerouslyAllowNameMatching: true.
  • channels.zalouser.dangerouslyAllowNameMatching: true — це аварійний режим сумісності, який знову вмикає зіставлення за змінною назвою групи.
  • Якщо groupAllowFrom не задано, під час виконання для перевірок групових відправників використовується резервний перехід до allowFrom.
  • Перевірки відправника застосовуються як до звичайних групових повідомлень, так і до керівних команд (наприклад, /new, /reset).
Приклад:
{
  channels: {
    zalouser: {
      groupPolicy: "allowlist",
      groupAllowFrom: ["1471383327500481391"],
      groups: {
        "123456789": { allow: true },
        "Work Chat": { allow: true },
      },
    },
  },
}

Керування згадками в групах

  • channels.zalouser.groups.<group>.requireMention визначає, чи потрібна згадка для відповідей у групі.
  • Порядок визначення: точний id/назва групи -> нормалізований slug групи -> * -> типове значення (true).
  • Це застосовується як до груп у allowlist, так і до відкритого режиму груп.
  • Авторизовані керівні команди (наприклад, /new) можуть обходити вимогу згадки.
  • Коли групове повідомлення пропускається через обов’язкову згадку, OpenClaw зберігає його як відкладену історію групи й додає до наступного обробленого групового повідомлення.
  • Ліміт історії групи типово дорівнює messages.groupChat.historyLimit (резервне значення 50). Його можна перевизначити для кожного облікового запису через channels.zalouser.historyLimit.
Приклад:
{
  channels: {
    zalouser: {
      groupPolicy: "allowlist",
      groups: {
        "*": { allow: true, requireMention: true },
        "Work Chat": { allow: true, requireMention: false },
      },
    },
  },
}

Кілька облікових записів

Облікові записи зіставляються з профілями zalouser у стані OpenClaw. Приклад:
{
  channels: {
    zalouser: {
      enabled: true,
      defaultAccount: "default",
      accounts: {
        work: { enabled: true, profile: "work" },
      },
    },
  },
}

Друкування, реакції та підтвердження доставки

  • OpenClaw надсилає подію друкування перед відправленням відповіді (best-effort).
  • Дія реакції на повідомлення react підтримується для zalouser у діях каналу.
    • Використовуйте remove: true, щоб видалити конкретний emoji реакції з повідомлення.
    • Семантика реакцій: Reactions
  • Для вхідних повідомлень, які містять метадані події, OpenClaw надсилає підтвердження доставки й перегляду (best-effort).

Усунення несправностей

Вхід не зберігається:
  • openclaw channels status --probe
  • Повторний вхід: openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser
Назву в allowlist/групі не вдалося зіставити:
  • Використовуйте числові ID в allowFrom/groupAllowFrom/groups або точні імена друзів/груп.
Оновилися зі старого налаштування на основі CLI:
  • Видаліть будь-які старі припущення про зовнішній процес zca.
  • Тепер канал повністю працює в OpenClaw без зовнішніх бінарних файлів CLI.

Пов’язане