Status: экспериментально. Эта интеграция автоматизирует личный аккаунт Zalo через встроенный zca-js внутри OpenClaw.
Это неофициальная интеграция, которая может привести к приостановке действия аккаунта или блокировке. Используйте на свой риск.
Встроенный plugin
Zalo Personal поставляется как встроенный plugin в текущих релизах OpenClaw, поэтому обычным
пакетным сборкам не требуется отдельная установка.
Если вы используете более старую сборку или пользовательскую установку, из которой исключен Zalo Personal,
установите npm-пакет напрямую:
- Установка через CLI:
openclaw plugins install @openclaw/zalouser
- Закрепленная версия:
openclaw plugins install @openclaw/zalouser@2026.5.2
- Или из исходного checkout:
openclaw plugins install ./path/to/local/zalouser-plugin
- Подробнее: Plugins
Внешний CLI-бинарник zca/openzca не требуется.
Быстрая настройка (для начинающих)
- Убедитесь, что plugin Zalo Personal доступен.
- Текущие пакетные релизы OpenClaw уже включают его.
- Более старые/пользовательские установки могут добавить его вручную командами выше.
- Войдите (QR, на машине Gateway):
openclaw channels login --channel zalouser
- Отсканируйте QR-код мобильным приложением Zalo.
- Включите канал:
{
channels: {
zalouser: {
enabled: true,
dmPolicy: "pairing",
},
},
}
- Перезапустите Gateway (или завершите настройку).
- Доступ к личным сообщениям по умолчанию использует сопряжение; подтвердите код сопряжения при первом контакте.
Что это такое
- Полностью выполняется внутри процесса через
zca-js.
- Использует нативные слушатели событий для получения входящих сообщений.
- Отправляет ответы напрямую через JS API (текст/медиа/ссылка).
- Предназначено для сценариев с “личным аккаунтом”, где Zalo Bot API недоступен.
Именование
ID канала: zalouser, чтобы явно указать, что это автоматизирует личный аккаунт пользователя Zalo (неофициально). Мы сохраняем zalo зарезервированным для потенциальной будущей официальной интеграции с Zalo API.
Поиск ID (каталог)
Используйте CLI каталога, чтобы находить собеседников/группы и их ID:
openclaw directory self --channel zalouser
openclaw directory peers list --channel zalouser --query "name"
openclaw directory groups list --channel zalouser --query "work"
Ограничения
- Исходящий текст разбивается на фрагменты примерно по 2000 символов (ограничения клиента Zalo).
- Потоковая передача по умолчанию заблокирована.
Контроль доступа (личные сообщения)
channels.zalouser.dmPolicy поддерживает: pairing | allowlist | open | disabled (по умолчанию: pairing).
channels.zalouser.allowFrom должен использовать стабильные ID пользователей Zalo. Он также может ссылаться на статические группы доступа отправителей (accessGroup:<name>). Во время интерактивной настройки введенные имена можно разрешить в ID с помощью внутрипроцессного поиска контактов plugin.
Если необработанное имя остается в конфигурации, при запуске оно разрешается только когда включено channels.zalouser.dangerouslyAllowNameMatching: true. Без этого явного включения проверки отправителей во время выполнения выполняются только по ID, а необработанные имена игнорируются для авторизации.
Подтвердите через:
openclaw pairing list zalouser
openclaw pairing approve zalouser <code>
Доступ к группам (необязательно)
- По умолчанию:
channels.zalouser.groupPolicy = "open" (группы разрешены). Используйте channels.defaults.groupPolicy, чтобы переопределить значение по умолчанию, когда оно не задано.
- Ограничьте списком разрешенных:
channels.zalouser.groupPolicy = "allowlist"
channels.zalouser.groups (ключами должны быть стабильные ID групп; имена разрешаются в ID при запуске только когда включено channels.zalouser.dangerouslyAllowNameMatching: true)
channels.zalouser.groupAllowFrom (управляет тем, какие отправители в разрешенных группах могут запускать бота; на статические группы доступа отправителей можно ссылаться через accessGroup:<name>)
- Заблокировать все группы:
channels.zalouser.groupPolicy = "disabled".
- Мастер настройки может запросить списки разрешенных групп.
- При запуске OpenClaw разрешает имена групп/пользователей в списках разрешенных в ID и логирует сопоставление только когда включено
channels.zalouser.dangerouslyAllowNameMatching: true.
- Сопоставление списка разрешенных групп по умолчанию выполняется только по 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).
- Это применяется как к группам из списка разрешенных, так и к открытому режиму групп.
- Цитирование сообщения бота считается неявным упоминанием для активации в группе.
- Авторизованные управляющие команды (например,
/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" },
},
},
},
}
Переменные окружения
Plugin Zalo Personal также может читать выбор профиля из переменных окружения:
ZALOUSER_PROFILE: имя профиля для использования, когда profile не задан в конфигурации канала или аккаунта.
ZCA_PROFILE: устаревшее резервное имя профиля, используется только когда ZALOUSER_PROFILE не задан.
Имена профилей выбирают сохраненные учетные данные входа в Zalo в состоянии OpenClaw. Порядок разрешения:
- Явный
profile в конфигурации.
ZALOUSER_PROFILE.
ZCA_PROFILE.
- ID аккаунта для нестандартных аккаунтов или
default для аккаунта по умолчанию.
Для настроек с несколькими аккаунтами предпочитайте задавать profile для каждого аккаунта в конфигурации, чтобы
одна переменная окружения не заставляла несколько аккаунтов использовать одну и ту же
сессию входа.
Набор текста, реакции и подтверждения доставки
- OpenClaw отправляет событие набора текста перед отправкой ответа (по возможности).
- Действие реакции на сообщение
react поддерживается для zalouser в действиях канала.
- Используйте
remove: true, чтобы удалить конкретный эмодзи реакции из сообщения.
- Семантика реакций: Реакции
- Для входящих сообщений, которые включают метаданные событий, OpenClaw отправляет подтверждения доставлено + просмотрено (по возможности).
Устранение неполадок
Вход не сохраняется:
openclaw channels status --probe
- Повторный вход:
openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser
Имя из списка разрешенных/группы не разрешилось:
- Используйте числовые ID в
allowFrom/groupAllowFrom и стабильные ID групп в groups. Если вам намеренно нужны точные имена друзей/групп, включите channels.zalouser.dangerouslyAllowNameMatching: true.
Обновление со старой настройки на основе CLI:
- Удалите любые старые предположения о внешнем процессе
zca.
- Теперь канал полностью работает внутри OpenClaw без внешних CLI-бинарников.
Связанные материалы