zca-js を介して個人用 Zalo アカウントを自動化します。
インストール
Zalo Personal は公式の外部 Plugin であり、コアにはバンドルされていません。使用前にインストールしてください。- バージョンを固定:
openclaw plugins install @openclaw/zalouser@<version> - ソースチェックアウトから:
openclaw plugins install ./path/to/local/zalouser-plugin - 詳細: Plugin
クイックセットアップ
- Plugin をインストールします(上記参照)。
- ログインします(QR、Gateway マシン上)。
openclaw channels login --channel zalouser- Zalo モバイルアプリで QR コードをスキャンします。
- チャネルを有効にします。
- Gateway を再起動します(またはセットアップを完了します)。
- DM アクセスのデフォルトはペアリングです。初回の連絡時にペアリングコードを承認してください。
概要
zca-jsライブラリを介して、完全にプロセス内で実行されます(外部zca/openzcaバイナリは不要です)。- 受信メッセージの受け取りには、ネイティブイベントリスナー(
message、error)を使用します。 - JS API を介して返信を直接送信します(テキスト、メディア、リンク)。
- Zalo Bot API を利用できない「個人アカウント」のユースケース向けに設計されています。
命名
チャネル ID はzalouser です。これは、個人用 Zalo ユーザーアカウントを自動化する非公式機能であることを明示するためです。zalo は、将来の公式 Zalo API 連携用として予約されています。
ID の検索(ディレクトリ)
制限
- 送信テキストは 2000 文字単位に分割されます(Zalo クライアントの制限)。
- ストリーミングはサポートされていません。
- 処理済みの受信メッセージ ID は 30 日間保持され、アカウントごとに最新 1000 件までに制限されます。
受信処理の耐久性
OpenClaw は、各生のzca-js メッセージコールバックを処理前に保存します。保留中のメッセージは Gateway の再起動後にアカウントキューから再開され、処理はダイレクトチャットまたはグループごとに直列化されたままになります。
zca-js ソケットリスナーは配信確認を公開せず、再接続後に古いメッセージを自動的に再生することもありません。そのため、永続キューが保護できるのは、コールバックが OpenClaw に到達した後のローカルクラッシュ期間です。ソケットから配信されなかったメッセージは復元できません。再生用トゥームストーンは主に、同じ Zalo メッセージ ID を持つコールバックが繰り返された場合に備えるための保護策です。
アクセス制御(DM)
channels.zalouser.dmPolicy: pairing | allowlist | open | disabled(デフォルト: pairing)。
channels.zalouser.allowFrom には、安定した Zalo ユーザー ID を使用してください。静的な送信者アクセスグループ(accessGroup:<name>)を参照することもできます。対話型セットアップでは、入力した名前を Plugin のプロセス内連絡先検索によって ID に解決できます。
未加工の名前が設定に残っている場合、起動時に解決されるのは channels.zalouser.dangerouslyAllowNameMatching: true が有効な場合のみです。このオプトインがない場合、実行時の送信者チェックは ID のみを使用し、未加工の名前は認可で無視されます。
次の方法で承認します。
openclaw pairing list zalouseropenclaw pairing approve zalouser <code>
グループアクセス(任意)
- デフォルト:
channels.zalouser.groupPolicy = "allowlist"(グループには明示的な許可リストエントリが必要です)。 - すべてのグループを開放:
channels.zalouser.groupPolicy = "open"。 - すべてのグループをブロック:
channels.zalouser.groupPolicy = "disabled"。 groupPolicy = "allowlist"の場合:channels.zalouser.groupsのキーには安定したグループ ID を使用してください。名前が起動時に ID に解決されるのは、channels.zalouser.dangerouslyAllowNameMatching: trueが有効な場合のみです。channels.zalouser.groupAllowFromは、許可されたグループ内でどの送信者がボットを起動できるかを制御します。静的な送信者アクセスグループはaccessGroup:<name>で参照できます。
- 設定ウィザードでは、グループ許可リストの入力を求めることができます。
- グループ許可リストの照合は、デフォルトでは ID のみを使用します。
channels.zalouser.dangerouslyAllowNameMatching: trueが有効でない限り、解決されていない名前は認証で無視されます。 channels.zalouser.dangerouslyAllowNameMatching: trueは、変更可能な起動時の名前解決と実行時のグループ名照合を再び有効にする、緊急時用の互換モードです。groupAllowFromは、通常のグループメッセージではallowFromにフォールバックしません。許可リストに登録されたグループでこれを空のままにすると、そのグループはすべての送信者に開放されます。認可済みの制御コマンド(例:/new)は例外です。groupAllowFromが空の場合、コマンド送信者のチェックはallowFromにフォールバックします。
channels.zalouser.groups.<id>.allow は従来のフィールド名です。現在の設定では enabled を使用します。openclaw doctor --fix は allow を enabled に自動的に移行します。グループメンションによる制御
channels.zalouser.groups.<group>.requireMentionは、グループへの返信にメンションが必要かどうかを制御します。- 解決順序: グループ ID ->
group:<id>エイリアス -> グループ名/スラッグ(名前ベースの候補が適用されるのはdangerouslyAllowNameMatching: trueの場合のみ)->*-> デフォルト(true)。 - 許可リストに登録されたグループと、グループ開放モードの両方に適用されます。
- ボットのメッセージを引用すると、グループを起動する暗黙的なメンションとして扱われます。
- 認可済みの制御コマンド(例:
/new)は、メンションによる制御を回避できます。 - メンションが必要なためグループメッセージがスキップされた場合、OpenClaw はそのメッセージを保留中のグループ履歴として保存し、次に処理されるグループメッセージに含めます。
- グループ履歴の上限:
channels.zalouser.historyLimit、次にmessages.groupChat.historyLimit、その後はフォールバック値の50。
複数アカウント
アカウントは OpenClaw の状態内のzalouser プロファイルにマッピングされます。例:
環境変数
プロファイルの選択には環境変数も使用できます。
プロファイル名は、OpenClaw の状態に保存された Zalo ログイン認証情報を選択します。解決順序:
- 設定内の明示的な
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
allowFrom/groupAllowFromには数値 ID を使用し、groupsには安定したグループ ID を使用してください。友人名またはグループ名との完全一致が意図的に必要な場合は、channels.zalouser.dangerouslyAllowNameMatching: trueを有効にします。
zca/CLI ベースのセットアップからアップグレードした場合:
- 外部
zcaプロセスを前提とする設定をすべて削除してください。現在、このチャネルは外部 CLI バイナリを使用せず、zca-jsを介して完全にプロセス内で実行されます。
関連項目
- チャネルの概要 - サポートされているすべてのチャネル
- ペアリング - DM の認証とペアリングの流れ
- グループ - グループチャットの動作とメンションによる制御
- チャネルルーティング - メッセージのセッションルーティング
- セキュリティ - アクセスモデルと堅牢化