プラグインが必要
Zalo はプラグインとして提供されており、コアインストールには同梱されていません。- CLI 経由でインストール:
openclaw plugins install @openclaw/zalo - または、オンボーディング中に Zalo を選択し、インストールプロンプトに従ってください。
- 詳細: プラグイン
クイックセットアップ (初心者向け)
- Zalo プラグインをインストールします:
- ソースチェックアウトから:
openclaw plugins install ./extensions/zalo - npm から (公開されている場合):
openclaw plugins install @openclaw/zalo - または、オンボーディングで Zalo を選択。
- ソースチェックアウトから:
- トークンを設定します:
- 環境変数:
ZALO_BOT_TOKEN=... - 構成ファイル:
channels.zalo.botToken: "..."。
- 環境変数:
- ゲートウェイを再起動します (またはオンボーディングを完了させます)。
- DM アクセスはデフォルトでペアリングモードです。最初の連絡時にペアリングコードを承認してください。
Zalo チャネルの概要
Zalo はベトナムで広く使われているメッセージングアプリです。そのボット API を使用することで、ゲートウェイは 1 対 1 の会話用ボットを運用できます。 確定的なルーティングが必要なカスタマーサポートや通知の用途に適しています。- ゲートウェイが所有する Zalo ボット API チャネルです。
- 確定的なルーティング: 返信は常に Zalo に戻ります。モデルがチャネルを選択することはありません。
- DM はエージェントのメインセッションを共有します。
- グループはポリシー制御 (
groupPolicy+groupAllowFrom) でサポートされ、デフォルトは安全のため許可リスト方式(フェールクローズ)になっています。
セットアップ手順
1) ボットトークンの作成 (Zalo Bot Platform)
- https://bot.zaloplatforms.com にアクセスしてサインインします。
- 新しいボットを作成し、設定を行います。
- ボットトークン (形式:
12345689:abc-xyz) をコピーします。
2) トークンの構成 (環境変数または構成ファイル)
構成例:ZALO_BOT_TOKEN=... (デフォルトアカウントにのみ適用されます)。
マルチアカウントのサポート: channels.zalo.accounts を使用して、アカウントごとにトークンとオプションの name を指定できます。
- ゲートウェイを再起動します。トークンが解決されると Zalo チャネルが開始されます。
- ボットへ最初にメッセージを送信した際に表示されるペアリングコードを承認してください。
仕組みと動作
- 受信メッセージは、メディアプレースホルダーと共に共通のチャネル形式に正規化されます。
- 返信は常に同じ Zalo チャットに送信されます。
- デフォルトはロングポーリング方式です。
channels.zalo.webhookUrlを設定することで webhook モードも利用可能です。
制限事項
- 送信テキストは Zalo API の制限により 2000 文字ごとに分割されます。
- メディアの送受信サイズは
channels.zalo.mediaMaxMb(デフォルト 5MB) で制限されます。 - ストリーミングは、2000 文字制限のため有用性が低く、デフォルトでブロックされています。
アクセス制御 (DM)
DM アクセス
- デフォルト:
channels.zalo.dmPolicy = "pairing"。未知の送信者にはペアリングコードが送信され、承認されるまでメッセージは無視されます (コードは 1 時間で期限切れになります)。 - 承認方法:
openclaw pairing list zaloopenclaw pairing approve zalo <CODE>
- 詳細については ペアリング を参照してください。
channels.zalo.allowFromは数値のユーザー ID を受け入れます(ユーザー名の検索は利用できません)。
アクセス制御 (グループ)
channels.zalo.groupPolicyでグループのインバウンド処理を制御します:open | allowlist | disabled。- デフォルトは安全のため
allowlist(許可リスト) です。 channels.zalo.groupAllowFromで、グループ内でボットをトリガーできる送信者 ID を制限します。groupAllowFromが未設定の場合、送信者チェックにはallowFromが使用されます。groupPolicy: "disabled"はすべてのグループメッセージをブロックします。groupPolicy: "open"は(メンション制約を満たせば)すべてのグループメンバーを許可します。- 注意:
channels.zalo構成が完全に欠落している場合でも、安全のためgroupPolicy="allowlist"が適用されます。
ロングポーリング vs webhook
- デフォルト: ロングポーリング (公開 URL は不要)。
- webhook モード:
channels.zalo.webhookUrlとchannels.zalo.webhookSecretを設定します。- シークレットは 8〜256 文字である必要があります。
- webhook URL は HTTPS である必要があります。
- Zalo は検証用に
X-Bot-Api-Secret-Tokenヘッダーを付けてイベントを送信します。 - ゲートウェイは
channels.zalo.webhookPath(デフォルトは URL のパス部分) でリクエストを処理します。 - リクエストの
Content-Typeはapplication/jsonである必要があります。 - 重複したイベント (
event_name + message_id) は、短期間の再送ウィンドウ内では無視されます。 - 急激なトラフィック増加にはパス/送信元ごとにレート制限が適用され、HTTP 429 を返す場合があります。
サポートされているメッセージ形式
- テキスト: 2000 文字の分割送信を含め完全サポート。
- 画像: 受信画像のダウンロードおよび処理、
sendPhotoによる送信をサポート。 - ステッカー: ログには記録されますが、エージェントによる応答は行われません。
- 未サポートの形式: ログには記録されます(例: 保護されたユーザーからのメッセージなど)。
機能一覧
| 機能 | ステータス |
|---|---|
| ダイレクトメッセージ | ✅ サポート済み |
| グループ | ⚠️ ポリシー制御によりサポート (デフォルトは許可リスト) |
| メディア (画像) | ✅ サポート済み |
| リアクション | ❌ 未サポート |
| スレッド | ❌ 未サポート |
| 投票 | ❌ 未サポート |
| ネイティブコマンド | ❌ 未サポート |
| ストリーミング | ⚠️ ブロック (2000 文字制限のため) |
配信ターゲット (CLI/Cron)
- ターゲットとしてチャット ID を使用します。
- 例:
openclaw message send --channel zalo --target 123456789 --message "こんにちは"。
トラブルシューティング
ボットが応答しない:- トークンが有効か確認してください:
openclaw channels status --probe - 送信者が承認されているか(ペアリングまたは allowFrom)確認してください。
- ゲートウェイのログを確認してください:
openclaw logs --follow
- webhook URL が HTTPS を使用しているか確認してください。
- シークレットトークンが 8〜256 文字か確認してください。
- ゲートウェイの HTTP エンドポイントが設定されたパスで到達可能か確認してください。
- ロングポーリングが動作していないか確認してください(排他的な関係です)。
構成リファレンス (Zalo)
完全な構成: 構成 プロバイダーオプション:channels.zalo.enabled: チャネルの起動を有効/無効にします。channels.zalo.botToken: Zalo Bot Platform から取得したボットトークン。channels.zalo.tokenFile: ファイルからトークンを読み取ります。channels.zalo.dmPolicy:pairing | allowlist | open | disabled(デフォルト: pairing)。channels.zalo.allowFrom: DM 許可リスト (数値ユーザー ID)。openには"*"が必要です。channels.zalo.groupPolicy:open | allowlist | disabled(デフォルト: allowlist)。channels.zalo.groupAllowFrom: グループ送信者の許可リスト (ユーザー ID)。未設定時はallowFromにフォールバックします。channels.zalo.mediaMaxMb: 送受信メディアのサイズ上限 (MB, デフォルト 5)。channels.zalo.webhookUrl: webhook モードを有効化 (HTTPS 必須)。channels.zalo.webhookSecret: webhook シークレット (8〜256 文字)。channels.zalo.webhookPath: ゲートウェイ上の webhook 受付パス。channels.zalo.proxy: API リクエストに使用するプロキシ URL。
channels.zalo.accounts.<id>.botToken: アカウントごとのトークン。channels.zalo.accounts.<id>.name: 表示名。channels.zalo.accounts.<id>.enabled: アカウントの有効/無効。channels.zalo.accounts.<id>.dmPolicy: アカウントごとの DM ポリシー。channels.zalo.accounts.<id>.allowFrom: アカウントごとの許可リスト。channels.zalo.accounts.<id>.groupPolicy: アカウントごとのグループポリシー。channels.zalo.accounts.<id>.webhookUrl: アカウントごとの webhook URL。channels.zalo.accounts.<id>.webhookSecret: アカウントごとの webhook シークレット。channels.zalo.accounts.<id>.webhookPath: アカウントごとの webhook 受付パス。channels.zalo.accounts.<id>.proxy: アカウントごとのプロキシ URL。