メインコンテンツへスキップ

WhatsApp(Webチャンネル)

ステータス: WhatsApp Web(Baileys)経由で本番運用対応。Gatewayがリンク済みセッションを管理します。

インストール(必要時)

  • オンボーディング(openclaw onboard)およびopenclaw channels add --channel whatsappでは、初めて選択したときにWhatsApp pluginのインストールを促します。
  • openclaw channels login --channel whatsappでも、pluginがまだ存在しない場合はインストールフローが提示されます。
  • Devチャンネル + gitチェックアウトでは、デフォルトでローカルpluginパスが使用されます。
  • Stable/Betaでは、デフォルトでnpmパッケージ@openclaw/whatsappが使用されます。
手動インストールも引き続き利用できます。
openclaw plugins install @openclaw/whatsapp

Pairing

未知の送信者に対するデフォルトのDMポリシーはpairingです。

Channel troubleshooting

チャンネル横断の診断と修復プレイブックです。

Gateway configuration

完全なチャンネル設定パターンと例です。

クイックセットアップ

1

Configure WhatsApp access policy

{
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      allowFrom: ["+15551234567"],
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15551234567"],
    },
  },
}
2

Link WhatsApp (QR)

openclaw channels login --channel whatsapp
特定のアカウントの場合:
openclaw channels login --channel whatsapp --account work
3

Start the gateway

openclaw gateway
4

Approve first pairing request (if using pairing mode)

openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
Pairingリクエストは1時間後に期限切れになります。保留中のリクエストはチャンネルごとに3件までです。
OpenClawでは、可能であればWhatsAppを別の番号で運用することを推奨しています。(チャンネルメタデータとセットアップフローはその構成向けに最適化されていますが、個人番号での構成もサポートされています。)

デプロイパターン

オンボーディングは個人番号モードをサポートしており、自分とのチャットに適したベースラインを書き込みます。
  • dmPolicy: "allowlist"
  • allowFromに自分の個人番号を含める
  • selfChatMode: true
ランタイムでは、自分とのチャット保護はリンク済みの自分の番号とallowFromをもとに動作します。
現在のOpenClawチャンネルアーキテクチャでは、メッセージングプラットフォームチャンネルはWhatsApp Webベース(Baileys)です。組み込みのチャットチャンネルレジストリには、別個のTwilio WhatsAppメッセージングチャンネルはありません。

ランタイムモデル

  • GatewayがWhatsAppソケットと再接続ループを管理します。
  • 送信には、対象アカウントに対するアクティブなWhatsAppリスナーが必要です。
  • ステータスチャットとブロードキャストチャットは無視されます(@status@broadcast)。
  • ダイレクトチャットではDMセッションルール(session.dmScope)が使われます。デフォルトのmainではDMはagentのメインセッションに統合されます。
  • グループセッションは分離されます(agent:<agentId>:whatsapp:group:<jid>)。

アクセス制御と有効化

channels.whatsapp.dmPolicyはダイレクトチャットアクセスを制御します。
  • pairing(デフォルト)
  • allowlist
  • openallowFrom"*"を含める必要があります)
  • disabled
allowFromはE.164形式の番号を受け付けます(内部で正規化されます)。マルチアカウント上書き: channels.whatsapp.accounts.<id>.dmPolicy(およびallowFrom)は、そのアカウントに対してチャンネルレベルのデフォルトより優先されます。ランタイム動作の詳細:
  • pairingsはチャンネルallow-storeに永続化され、設定済みのallowFromとマージされます
  • allowlistが設定されていない場合、リンク済みの自分の番号はデフォルトで許可されます
  • 送信元がfromMeのDMは自動pairingされません

個人番号と自分とのチャット動作

リンク済みの自分の番号がallowFromにも含まれている場合、WhatsAppの自分とのチャット保護が有効になります。
  • 自分とのチャットターンでは既読通知をスキップ
  • 本来なら自分自身にpingするmention-JID自動トリガー動作を無視
  • messages.responsePrefixが未設定の場合、自分とのチャット返信のデフォルトは[{identity.name}]または[openclaw]

メッセージ正規化とコンテキスト

受信したWhatsAppメッセージは共有の受信エンベロープでラップされます。引用返信が存在する場合、コンテキストは次の形式で追加されます。
[Replying to <sender> id:<stanzaId>]
<quoted body or media placeholder>
[/Replying]
返信メタデータフィールドも、利用可能な場合は設定されます(ReplyToIdReplyToBodyReplyToSender、sender JID/E.164)。
メディアのみの受信メッセージは、次のようなプレースホルダーで正規化されます。
  • <media:image>
  • <media:video>
  • <media:audio>
  • <media:document>
  • <media:sticker>
位置情報および連絡先ペイロードは、ルーティング前にテキストコンテキストへ正規化されます。
グループでは、未処理メッセージをバッファリングし、botが最終的にトリガーされたときにコンテキストとして注入できます。
  • デフォルト上限: 50
  • config: channels.whatsapp.historyLimit
  • フォールバック: messages.groupChat.historyLimit
  • 0で無効化
注入マーカー:
  • [Chat messages since your last reply - for context]
  • [Current message - respond to this]
既読通知は、受け付けられた受信WhatsAppメッセージに対してデフォルトで有効です。グローバルに無効化する場合:
{
  channels: {
    whatsapp: {
      sendReadReceipts: false,
    },
  },
}
アカウントごとの上書き:
{
  channels: {
    whatsapp: {
      accounts: {
        work: {
          sendReadReceipts: false,
        },
      },
    },
  },
}
自分とのチャットターンでは、グローバルに有効でも既読通知はスキップされます。

配信、チャンク化、メディア

  • デフォルトのチャンク上限: channels.whatsapp.textChunkLimit = 4000
  • channels.whatsapp.chunkMode = "length" | "newline"
  • newlineモードでは段落境界(空行)を優先し、その後で長さ安全なチャンク化にフォールバックします
  • 画像、動画、音声(PTTボイスノート)、ドキュメントのペイロードをサポート
  • audio/oggは、ボイスノート互換性のためaudio/ogg; codecs=opusに書き換えられます
  • アニメーションGIF再生は、動画送信時のgifPlayback: trueでサポートされます
  • 複数メディア返信ペイロードを送信する際、キャプションは最初のメディア項目に適用されます
  • メディアソースにはHTTP(S)、file://、ローカルパスを使用できます
  • 受信メディア保存上限: channels.whatsapp.mediaMaxMb(デフォルト50
  • 送信メディア送信上限: channels.whatsapp.mediaMaxMb(デフォルト50
  • アカウントごとの上書きにはchannels.whatsapp.accounts.<accountId>.mediaMaxMbを使用します
  • 画像は制限内に収めるため自動最適化されます(リサイズ/品質スイープ)
  • メディア送信失敗時には、先頭項目フォールバックとしてテキスト警告を送信し、応答が黙って失われることを防ぎます

リアクションレベル

channels.whatsapp.reactionLevelは、agentがWhatsAppで絵文字リアクションをどの程度広く使用するかを制御します。
レベルAckリアクションagent起点リアクション説明
"off"いいえいいえリアクションを一切行いません
"ack"はいいいえAckリアクションのみ(返信前の受領)
"minimal"はいはい(保守的)Ack + 保守的ガイダンス付きagentリアクション
"extensive"はいはい(推奨)Ack + 推奨ガイダンス付きagentリアクション
デフォルト: "minimal" アカウントごとの上書きにはchannels.whatsapp.accounts.<id>.reactionLevelを使用します。
{
  channels: {
    whatsapp: {
      reactionLevel: "ack",
    },
  },
}

確認応答リアクション

WhatsAppは、channels.whatsapp.ackReactionを介して受信時の即時ackリアクションをサポートします。 AckリアクションはreactionLevelで制御され、reactionLevel"off"のときは抑制されます。
{
  channels: {
    whatsapp: {
      ackReaction: {
        emoji: "👀",
        direct: true,
        group: "mentions", // always | mentions | never
      },
    },
  },
}
動作上の注意:
  • 受信が受理された直後に送信されます(返信前)
  • 失敗はログに記録されますが、通常の返信配信は妨げません
  • グループモードmentionsでは、mentionトリガーのターンにリアクションします。グループ有効化alwaysはこのチェックをバイパスします
  • WhatsAppではchannels.whatsapp.ackReactionを使用します(legacyのmessages.ackReactionはここでは使用しません)

マルチアカウントと認証情報

  • アカウントIDはchannels.whatsapp.accountsから取得されます
  • デフォルトアカウント選択: defaultがあればそれ、なければ最初に設定されたアカウントID(ソート順)
  • アカウントIDは内部でルックアップ用に正規化されます
  • 現在の認証パス: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • バックアップファイル: creds.json.bak
  • ~/.openclaw/credentials/内のlegacyデフォルト認証も、デフォルトアカウントフローでは引き続き認識/移行されます
openclaw channels logout --channel whatsapp [--account <id>]は、そのアカウントのWhatsApp認証状態を消去します。legacy認証ディレクトリでは、Baileys認証ファイルは削除されますがoauth.jsonは保持されます。

ツール、アクション、config書き込み

  • AgentツールサポートにはWhatsAppリアクションアクション(react)が含まれます。
  • アクションゲート:
    • channels.whatsapp.actions.reactions
    • channels.whatsapp.actions.polls
  • チャンネル起点のconfig書き込みはデフォルトで有効です(channels.whatsapp.configWrites=falseで無効化)。

トラブルシューティング

症状: チャンネルステータスが未リンクと表示されます。修正:
openclaw channels login --channel whatsapp
openclaw channels status
症状: アカウントはリンク済みだが、切断や再接続試行が繰り返されます。修正:
openclaw doctor
openclaw logs --follow
必要に応じて、channels loginで再リンクしてください。
対象アカウントに対するアクティブなgatewayリスナーが存在しない場合、送信は即座に失敗します。Gatewayが動作中で、アカウントがリンク済みであることを確認してください。
次の順序で確認してください。
  • groupPolicy
  • groupAllowFrom / allowFrom
  • groups allowlistエントリー
  • mentionゲーティング(requireMention + mention patterns)
  • openclaw.json(JSON5)内の重複キー: 後ろのエントリーが前のものを上書きするため、スコープごとにgroupPolicyは1つだけにしてください
WhatsApp gatewayランタイムではNodeを使用してください。Bunは、安定したWhatsApp/Telegram gateway運用と互換性がないとして扱われます。

設定リファレンスへのポインター

主要リファレンス: 重要なWhatsAppフィールド:
  • アクセス: dmPolicyallowFromgroupPolicygroupAllowFromgroups
  • 配信: textChunkLimitchunkModemediaMaxMbsendReadReceiptsackReactionreactionLevel
  • マルチアカウント: accounts.<id>.enabledaccounts.<id>.authDir、アカウントレベル上書き
  • 運用: configWritesdebounceMsweb.enabledweb.heartbeatSecondsweb.reconnect.*
  • セッション動作: session.dmScopehistoryLimitdmHistoryLimitdms.<id>.historyLimit

関連