OpenClawSkills
GitHub
チャンネル • 5分で読める

WhatsApp

WhatsApp(Webチャンネル)統合:ログイン、受信トレイ、返信、メディア、運用

ステータス:Baileys経由のWhatsApp Webのみサポート。セッションはGatewayで一元管理。

Tutorial.step

初心者向けクイック設定

1. 可能であれば別の電話番号を使用(推奨)。

2. ~/.openclaw/openclaw.jsonでWhatsAppを設定。

3. openclaw channels loginを実行してQRコードをスキャン(WhatsApp → 設定 → リンクされたデバイス)。

4. Gatewayを起動。

Minimum configuration example:

Json5
{
  channels: {
    whatsapp: {
      dmPolicy: "allowlist",
      allowFrom: ["+15551234567"],
    },
  },
}
Tutorial.step

Goals

- 同じGatewayプロセスで複数のWhatsAppアカウントをサポート(マルチアカウント)。

- 決定論的ルーティング:WhatsAppからのメッセージはWhatsAppに戻る(モデルにチャンネルを選ばせない)。

- モデルが十分な引用/返信コンテキストを確認でき、「どのメッセージに返信しているか」を理解できる。

Tutorial.step

設定の書き戻し(Config writes)

デフォルトでは、/config set|unsetでトリガーされた設定更新を設定ファイルに書き戻すことができます(commands.config: trueが必要)。

Disable:

Json5
{
  channels: { whatsapp: { configWrites: false } },
}
Tutorial.step

アーキテクチャ(誰が何をするか)

- GatewayはBaileysソケットと受信トレイループを担当。

- CLI / macOSアプリはGatewayと通信のみ行い、Baileysを直接使用しない。

- 送信にはアクティブリスナーが必要;そうでない場合は迅速に失敗(Webセッションがないため)。

Tutorial.step

電話番号の取得(2つのモード)

WhatsAppは認証に実際の電話番号を必要とします。VoIP/仮想番号は通常ブロックされます。OpenClawにはWhatsAppで実行するための2つの推奨方法があります:

#

Tutorial.step

Dedicated Number (Recommended)

OpenClawに別の番号を割り当てます。最高の体験:ルーティングが明確で、「自分にメッセージを送る」という奇妙なエッジケースがない。理想的な設定:予備/旧Androidスマホ + eSIM、Wi-Fiと電源に接続し、QRコードでリンク。

WhatsApp Business: 同じデバイスで異なる番号を使用してWhatsAppとWhatsApp Businessを同時にインストールできます。OpenClawをBusinessに入れるのは良い分離方法です。

設定例(専用番号、単一ユーザーallowlist):

Json5
{
  channels: {
    whatsapp: {
      dmPolicy: "allowlist",
      allowFrom: ["+15551234567"],
    },
  },
}

オプション:ペアリングモード

allowlistの代わりにペアリングを使用する場合、channels.whatsapp.dmPolicyをpairingに設定します。不明な送信者はペアリングコードを受け取ります。承認方法:

openclaw pairing approve whatsapp <code>

#

Tutorial.step

個人番号(フォールバック)

フォールバック:OpenClawを自分の番号で実行します。テスト中はWhatsAppの「自分にメッセージを送る」で自分にメッセージを送り、連絡先を邪魔しないようにできます。設定と実験中はメインスマホで認証コードを読む必要があります。self-chatモードを有効にする必要があります。

ウィザードが個人WhatsApp番号を尋ねたとき、「アシスタントにメッセージを送る番号」を入力します(owner/sender)。「アシスタント番号」ではありません(ここでは同じ番号だからです)。

Example config (personal number + self-chat):

Json
{
  "whatsapp": {
    "selfChatMode": true,
    "dmPolicy": "allowlist",
    "allowFrom": ["+15551234567"]
  }
}

self-chatモードでは、messages.responsePrefixが設定されていない場合、返信プレフィックスはデフォルトで[{identity.name}]になります(それ以外は[openclaw])。カスタマイズまたは無効化するには、明示的に設定してください(削除には""を使用)。

#

Tutorial.step

番号ソースの推奨

- あなたの国のキャリアからのローカルeSIM(最も安定)

- オーストリア:''hot.at''

- 英国:''giffgaff''(無料SIM、契約なし)

- プリペイドSIM — 1回の認証SMSを受け取るだけでOK

回避: TextNow、Google Voice、ほとんどの「無料SMS受信」サービス(WhatsAppは激しくブロック)。

ヒント: 番号は1回の認証SMSを受け取るだけで十分です。その後、WhatsApp Webセッションはcreds.jsonを通じて維持されます。

Tutorial.step

Twilioを使用しない理由

- 以前のOpenClawはTwilioのWhatsApp Business統合をサポートしていました。

- WhatsApp Business番号は個人アシスタントには適していません。

- Metaは24時間返信ウィンドウを強制;24時間以上非アクティブな場合、Business番号は新しいメッセージを開始できません。

- 高頻度/チャットな使用はより激しいブロックをトリガーします。Businessアカウントは多くの個人アシスタントメッセージを送信するためのものではないためです。

- 結果:配信が不安定で頻繁にブロックされるため、サポートが削除されました。

Tutorial.step

ログインと認証情報

- ログインコマンド:openclaw channels login(QRコードスキャン:リンクされたデバイス)。

- Multi-account login: openclaw channels login --account <id> (<id> = accountId).

- デフォルトアカウント:--accountを省略した場合、defaultが存在すればそれを使用し、それ以外はソート順で最初の設定されたアカウントidを使用。

- Credentials storage: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json.

- バックアップコピー:creds.json.bak(破損時に復元に使用)。

- 旧バージョン互換:古いインストールはBaileysファイルを~/.openclaw/credentials/の下に直接配置します。

- Logout: openclaw channels logout (or --account <id>) deletes WhatsApp auth state (but keeps shared oauth.json).

- 未ログインのソケットはエラーになり再リンクを促します。

Tutorial.step

インバウンドフロー(DM + グループ)

- WhatsAppイベントはBaileysのmessages.upsertから来ます。

- テスト/再起動中にイベントハンドラーが蓄積しないよう、シャットダウン時に受信トレイリスナーをアンマウントします。

- ステータス/ブロードキャストチャットは無視します。

- DMはE.164を使用;グループはグループJIDを使用。

- DMポリシー: channels.whatsapp.dmPolicyがDMアクセスを制御(デフォルトpairing)。

- pairing: unknown senders receive pairing code (openclaw pairing approve whatsapp <code>; expires in 1 hour).

- open:channels.whatsapp.allowFromに"*"が含まれている必要があります。

- バインドされたWhatsApp番号は暗黙的に信頼されます:自己送信メッセージはdmPolicyとallowFromチェックをスキップします。

#

Tutorial.step

個人番号モード(フォールバック)

個人WhatsApp番号でOpenClawを実行する場合、channels.whatsapp.selfChatModeを有効にします(上記の例を参照)。

Behavior:

- 送信DMはペアリング返信をトリガーしません(連絡先へのスパムを回避)。

- インバウンド不明な送信者はchannels.whatsapp.dmPolicyに従います。

- self-chatモード(allowListに自分の番号が含まれる)は自動既読受信を回避し、メンションJIDを無視します。

- 非self-chat DMは既読受信を送信します。

Tutorial.step

Read Receipts

デフォルトでは、Gatewayはメッセージが受け入れられた後、WhatsAppインバウンドメッセージを既読(青いチェックマーク)としてマークします。

グローバル無効化:

Json5
{
  channels: { whatsapp: { sendReadReceipts: false } },
}

アカウントごとの無効化:

Json5
{
  channels: {
    whatsapp: {
      accounts: {
        personal: { sendReadReceipts: false },
      },
    },
  },
}

Notes:

- self-chatモードは常に既読受信をスキップします。

Tutorial.step

WhatsApp FAQ:メッセージとペアリング

WhatsAppをリンクした後、OpenClawはランダムな連絡先にメッセージを送りますか?

いいえ。デフォルトのDMポリシーはpairingです:不明な送信者はペアリングコードのみを受け取り、そのメッセージは処理されません。OpenClawは受け取ったチャットのみに返信するか、明示的にトリガーした送信(agent/CLI)のみを行います。

WhatsAppのペアリングはどのように機能しますか?

ペアリングは不明な送信者のためのDMゲートキーパーです:

- 新しい送信者の最初のDMは短いコードを受け取ります(メッセージは処理されません)。

- Approve: openclaw pairing approve whatsapp <code> (list: openclaw pairing list whatsapp).

- ペアリングコードは1時間で期限切れ;チャンネルごとの保留リクエストのデフォルト上限は3つ。

1つのWhatsApp番号を複数の人が異なるOpenClawインスタンスで使用できますか?

はい:''bindings''を通じて異なる送信者を異なるエージェントにルーティングします(peer ''kind: "dm"''、送信者は''+1555...''のようなE.164)。ただし、返信は''同じWhatsAppアカウント''から来ており、DMは各エージェントのメインセッションに折りたたまれるため、''1人1エージェント''を推奨します。DMアクセス制御(''dmPolicy''/''allowFrom'')はWhatsAppアカウントごとにグローバルに適用されます。''Multi-Agent Routing''を参照してください。

ウィザードはなぜ電話番号を尋ねるのですか?

ウィザードはそれを使用してowner/allowlistを設定し、自分のDMが許可されることを保証します。自動送信には使用されません。個人番号で実行する場合、同じ番号を入力してchannels.whatsapp.selfChatModeを有効にしてください。

Tutorial.step

メッセージ正規化(モデルが見るもの)

- Bodyは現在のメッセージ本文(エンベロープ付き)。

- 引用/返信コンテキストは常に追加されます:

[Replying to +1555 id:ABC123]
&lt;quoted text or &lt;media:...&gt;&gt;
[/Replying]

- 返信メタデータも設定されます:

- ReplyToId = stanzaId

- ReplyToBody = 引用本文またはメディアプレースホルダー

- ReplyToSender = 利用可能な場合はE.164

- 純粋なメディアインバウンドメッセージはプレースホルダーを使用します:

- <media:image|video|audio|document|sticker>

Tutorial.step

グループ

- Group session key: agent:<agentId>:whatsapp:group:<jid>.

- グループポリシー:channels.whatsapp.groupPolicy = open|disabled|allowlist(デフォルトallowlist)。

- トリガーモード:

- mention(デフォルト):@メンションまたは正規表現の一致が必要。

- always:常にトリガー。

- /activation mention|alwaysはオーナーのみ使用可能で、別のメッセージとして送信する必要があります。

- owner = channels.whatsapp.allowFrom(未設定の場合はself E.164)。

- 履歴注入(保留のみ):

- 最近の未処理メッセージ(デフォルト50件)が挿入されます:

[Chat messages since your last reply - for context]

- 現在のメッセージが挿入されます:

[Current message - respond to this]

- 末尾に送信者情報が追加されます:[from: Name (+E164)]

- グループメタデータは5分間キャッシュされます(件名 + メンバー)。

Tutorial.step

返信配信(スレッド)

- 現在のgatewayのWhatsApp Web送信は通常のメッセージのみを送信します(引用返信スレッド化なし)。

- 返信タグはこのチャンネルでは無視されます。

Tutorial.step

確認リアクション(受信時に自動リアクション)

WhatsAppはメッセージを受け取った直後に(ボットが返信を生成する前に)絵文字リアクションを自動的に送信でき、ユーザーにすぐに「メッセージを受け取りました」と知らせることができます。

Configuration:

Json
{
  "whatsapp": {
    "ackReaction": {
      "emoji": "👀",
      "direct": true,
      "group": "mentions"
    }
  }
}

オプション:

- emoji(string):確認用の絵文字(例:"👀"、"✅"、"📨")。空または省略は無効を意味します。

- direct(boolean):DMで有効(デフォルト:true)。

- group(string|boolean):グループで有効。"mentions" = メンションされた場合のみ;true = 常に;false = 無効(デフォルト:"mentions")。