{ "title": "Zalo Personal (unofficial)", "content": "Status: experimental. This integration automates a **personal Zalo account** via `zca-cli`.\n\n> **Warning:** This is an unofficial integration and may result in account suspension/ban. Use at your own risk.\n\nZalo Personal ships as a plugin and is not bundled with the core install.\n\n* Install via CLI: `openclaw plugins install @openclaw/zalouser`\n* Or from a source checkout: `openclaw plugins install ./extensions/zalouser`\n* Details: [Plugins](/plugin)\n\n## Prerequisite: zca-cli\n\nThe Gateway machine must have the `zca` binary available in `PATH`.\n\n* Verify: `zca --version`\n* If missing, install zca-cli (see `extensions/zalouser/README.md` or the upstream zca-cli docs).\n\n## Quick setup (beginner)\n\n1. Install the plugin (see above).\n2. Login (QR, on the Gateway machine):\n * `openclaw channels login --channel zalouser`\n * Scan the QR code in the terminal with the Zalo mobile app.\n3. Enable the channel:\n\n4. Restart the Gateway (or finish onboarding).\n5. DM access defaults to pairing; approve the pairing code on first contact.\n\n* Uses `zca listen` to receive inbound messages.\n* Uses `zca msg ...` to send replies (text/media/link).\n* Designed for “personal account” use cases where Zalo Bot API is not available.\n\nChannel id is `zalouser` to make it explicit this automates a **personal Zalo user account** (unofficial). We keep `zalo` reserved for a potential future official Zalo API integration.\n\n## Finding IDs (directory)\n\nUse the directory CLI to discover peers/groups and their IDs:\n\n* Outbound text is chunked to \\~2000 characters (Zalo client limits).\n* Streaming is blocked by default.\n\n## Access control (DMs)\n\n`channels.zalouser.dmPolicy` supports: `pairing | allowlist | open | disabled` (default: `pairing`).\n`channels.zalouser.allowFrom` accepts user IDs or names. The wizard resolves names to IDs via `zca friend find` when available.\n\n* `openclaw pairing list zalouser`\n* `openclaw pairing approve zalouser `\n\n## Group access (optional)\n\n* Default: `channels.zalouser.groupPolicy = \"open\"` (groups allowed). Use `channels.defaults.groupPolicy` to override the default when unset.\n* Restrict to an allowlist with:\n * `channels.zalouser.groupPolicy = \"allowlist\"`\n * `channels.zalouser.groups` (keys are group IDs or names)\n* Block all groups: `channels.zalouser.groupPolicy = \"disabled\"`.\n* The configure wizard can prompt for group allowlists.\n* On startup, OpenClaw resolves group/user names in allowlists to IDs and logs the mapping; unresolved entries are kept as typed.\n\nAccounts map to zca profiles. Example:\n\n* Install zca-cli and ensure it’s on `PATH` for the Gateway process.\n\n**Login doesn’t stick:**\n\n* `openclaw channels status --probe`\n* Re-login: `openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser`", "code_samples": [ { "code": "4. Restart the Gateway (or finish onboarding).\n5. DM access defaults to pairing; approve the pairing code on first contact.\n\n## What it is\n\n* Uses `zca listen` to receive inbound messages.\n* Uses `zca msg ...` to send replies (text/media/link).\n* Designed for “personal account” use cases where Zalo Bot API is not available.\n\n## Naming\n\nChannel id is `zalouser` to make it explicit this automates a **personal Zalo user account** (unofficial). We keep `zalo` reserved for a potential future official Zalo API integration.\n\n## Finding IDs (directory)\n\nUse the directory CLI to discover peers/groups and their IDs:", "language": "unknown" }, { "code": "## Limits\n\n* Outbound text is chunked to \\~2000 characters (Zalo client limits).\n* Streaming is blocked by default.\n\n## Access control (DMs)\n\n`channels.zalouser.dmPolicy` supports: `pairing | allowlist | open | disabled` (default: `pairing`).\n`channels.zalouser.allowFrom` accepts user IDs or names. The wizard resolves names to IDs via `zca friend find` when available.\n\nApprove via:\n\n* `openclaw pairing list zalouser`\n* `openclaw pairing approve zalouser `\n\n## Group access (optional)\n\n* Default: `channels.zalouser.groupPolicy = \"open\"` (groups allowed). Use `channels.defaults.groupPolicy` to override the default when unset.\n* Restrict to an allowlist with:\n * `channels.zalouser.groupPolicy = \"allowlist\"`\n * `channels.zalouser.groups` (keys are group IDs or names)\n* Block all groups: `channels.zalouser.groupPolicy = \"disabled\"`.\n* The configure wizard can prompt for group allowlists.\n* On startup, OpenClaw resolves group/user names in allowlists to IDs and logs the mapping; unresolved entries are kept as typed.\n\nExample:", "language": "unknown" }, { "code": "## Multi-account\n\nAccounts map to zca profiles. Example:", "language": "unknown" } ], "headings": [ { "level": "h2", "text": "Plugin required", "id": "plugin-required" }, { "level": "h2", "text": "Prerequisite: zca-cli", "id": "prerequisite:-zca-cli" }, { "level": "h2", "text": "Quick setup (beginner)", "id": "quick-setup-(beginner)" }, { "level": "h2", "text": "What it is", "id": "what-it-is" }, { "level": "h2", "text": "Naming", "id": "naming" }, { "level": "h2", "text": "Finding IDs (directory)", "id": "finding-ids-(directory)" }, { "level": "h2", "text": "Limits", "id": "limits" }, { "level": "h2", "text": "Access control (DMs)", "id": "access-control-(dms)" }, { "level": "h2", "text": "Group access (optional)", "id": "group-access-(optional)" }, { "level": "h2", "text": "Multi-account", "id": "multi-account" }, { "level": "h2", "text": "Troubleshooting", "id": "troubleshooting" } ], "url": "llms-txt#zalo-personal-(unofficial)", "links": [] }