WhatsApp(Webチャンネル)統合:ログイン、受信トレイ、返信、メディア、運用
ステータス:Baileys経由のWhatsApp Webのみサポート。セッションはGatewayで一元管理。
初心者向けクイック設定
1. 可能であれば別の電話番号を使用(推奨)。
2. ~/.openclaw/openclaw.jsonでWhatsAppを設定。
3. openclaw channels loginを実行してQRコードをスキャン(WhatsApp → 設定 → リンクされたデバイス)。
4. Gatewayを起動。
Minimum configuration example:
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}Goals
- 同じGatewayプロセスで複数のWhatsAppアカウントをサポート(マルチアカウント)。
- 決定論的ルーティング:WhatsAppからのメッセージはWhatsAppに戻る(モデルにチャンネルを選ばせない)。
- モデルが十分な引用/返信コンテキストを確認でき、「どのメッセージに返信しているか」を理解できる。
設定の書き戻し(Config writes)
デフォルトでは、/config set|unsetでトリガーされた設定更新を設定ファイルに書き戻すことができます(commands.config: trueが必要)。
Disable:
{
channels: { whatsapp: { configWrites: false } },
}アーキテクチャ(誰が何をするか)
- GatewayはBaileysソケットと受信トレイループを担当。
- CLI / macOSアプリはGatewayと通信のみ行い、Baileysを直接使用しない。
- 送信にはアクティブリスナーが必要;そうでない場合は迅速に失敗(Webセッションがないため)。
電話番号の取得(2つのモード)
WhatsAppは認証に実際の電話番号を必要とします。VoIP/仮想番号は通常ブロックされます。OpenClawにはWhatsAppで実行するための2つの推奨方法があります:
#
Dedicated Number (Recommended)
OpenClawに別の番号を割り当てます。最高の体験:ルーティングが明確で、「自分にメッセージを送る」という奇妙なエッジケースがない。理想的な設定:予備/旧Androidスマホ + eSIM、Wi-Fiと電源に接続し、QRコードでリンク。
WhatsApp Business: 同じデバイスで異なる番号を使用してWhatsAppとWhatsApp Businessを同時にインストールできます。OpenClawをBusinessに入れるのは良い分離方法です。
設定例(専用番号、単一ユーザーallowlist):
{
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551234567"],
},
},
}オプション:ペアリングモード
allowlistの代わりにペアリングを使用する場合、channels.whatsapp.dmPolicyをpairingに設定します。不明な送信者はペアリングコードを受け取ります。承認方法:
openclaw pairing approve whatsapp <code>
#
個人番号(フォールバック)
フォールバック:OpenClawを自分の番号で実行します。テスト中はWhatsAppの「自分にメッセージを送る」で自分にメッセージを送り、連絡先を邪魔しないようにできます。設定と実験中はメインスマホで認証コードを読む必要があります。self-chatモードを有効にする必要があります。
ウィザードが個人WhatsApp番号を尋ねたとき、「アシスタントにメッセージを送る番号」を入力します(owner/sender)。「アシスタント番号」ではありません(ここでは同じ番号だからです)。
Example config (personal number + self-chat):
{
"whatsapp": {
"selfChatMode": true,
"dmPolicy": "allowlist",
"allowFrom": ["+15551234567"]
}
}self-chatモードでは、messages.responsePrefixが設定されていない場合、返信プレフィックスはデフォルトで[{identity.name}]になります(それ以外は[openclaw])。カスタマイズまたは無効化するには、明示的に設定してください(削除には""を使用)。
#
番号ソースの推奨
- あなたの国のキャリアからのローカルeSIM(最も安定)
- オーストリア:''hot.at''
- 英国:''giffgaff''(無料SIM、契約なし)
- プリペイドSIM — 1回の認証SMSを受け取るだけでOK
回避: TextNow、Google Voice、ほとんどの「無料SMS受信」サービス(WhatsAppは激しくブロック)。
ヒント: 番号は1回の認証SMSを受け取るだけで十分です。その後、WhatsApp Webセッションはcreds.jsonを通じて維持されます。
Twilioを使用しない理由
- 以前のOpenClawはTwilioのWhatsApp Business統合をサポートしていました。
- WhatsApp Business番号は個人アシスタントには適していません。
- Metaは24時間返信ウィンドウを強制;24時間以上非アクティブな場合、Business番号は新しいメッセージを開始できません。
- 高頻度/チャットな使用はより激しいブロックをトリガーします。Businessアカウントは多くの個人アシスタントメッセージを送信するためのものではないためです。
- 結果:配信が不安定で頻繁にブロックされるため、サポートが削除されました。
ログインと認証情報
- ログインコマンド: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).
- 未ログインのソケットはエラーになり再リンクを促します。
インバウンドフロー(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チェックをスキップします。
#
個人番号モード(フォールバック)
個人WhatsApp番号でOpenClawを実行する場合、channels.whatsapp.selfChatModeを有効にします(上記の例を参照)。
Behavior:
- 送信DMはペアリング返信をトリガーしません(連絡先へのスパムを回避)。
- インバウンド不明な送信者はchannels.whatsapp.dmPolicyに従います。
- self-chatモード(allowListに自分の番号が含まれる)は自動既読受信を回避し、メンションJIDを無視します。
- 非self-chat DMは既読受信を送信します。
Read Receipts
デフォルトでは、Gatewayはメッセージが受け入れられた後、WhatsAppインバウンドメッセージを既読(青いチェックマーク)としてマークします。
グローバル無効化:
{
channels: { whatsapp: { sendReadReceipts: false } },
}アカウントごとの無効化:
{
channels: {
whatsapp: {
accounts: {
personal: { sendReadReceipts: false },
},
},
},
}Notes:
- self-chatモードは常に既読受信をスキップします。
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を有効にしてください。
メッセージ正規化(モデルが見るもの)
- Bodyは現在のメッセージ本文(エンベロープ付き)。
- 引用/返信コンテキストは常に追加されます:
[Replying to +1555 id:ABC123]
<quoted text or <media:...>>
[/Replying]- 返信メタデータも設定されます:
- ReplyToId = stanzaId
- ReplyToBody = 引用本文またはメディアプレースホルダー
- ReplyToSender = 利用可能な場合はE.164
- 純粋なメディアインバウンドメッセージはプレースホルダーを使用します:
- <media:image|video|audio|document|sticker>
グループ
- 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分間キャッシュされます(件名 + メンバー)。
返信配信(スレッド)
- 現在のgatewayのWhatsApp Web送信は通常のメッセージのみを送信します(引用返信スレッド化なし)。
- 返信タグはこのチャンネルでは無視されます。
確認リアクション(受信時に自動リアクション)
WhatsAppはメッセージを受け取った直後に(ボットが返信を生成する前に)絵文字リアクションを自動的に送信でき、ユーザーにすぐに「メッセージを受け取りました」と知らせることができます。
Configuration:
{
"whatsapp": {
"ackReaction": {
"emoji": "👀",
"direct": true,
"group": "mentions"
}
}
}オプション:
- emoji(string):確認用の絵文字(例:"👀"、"✅"、"📨")。空または省略は無効を意味します。
- direct(boolean):DMで有効(デフォルト:true)。
- group(string|boolean):グループで有効。"mentions" = メンションされた場合のみ;true = 常に;false = 無効(デフォルト:"mentions")。