問題の説明
OpenClaw の WhatsApp チャンネルを使用する際、接続が頻繁に切断される場合があり、ターミナルに以下のようなログが繰り返し表示されます。
[openclaw:whatsapp] Connection closed. Reason: 408 (Connection timed out)
[openclaw:whatsapp] Reconnecting in 5s... (attempt 3/10)
または、より深刻な切断の場合:
[openclaw:whatsapp] Connection closed. Reason: 515 (Stream error)
[openclaw:whatsapp] Session invalidated. Please re-scan QR code.
OpenClaw の WhatsApp チャンネルは Baileys ライブラリに基づいて実装されています。これは非公式の WhatsApp Web API クライアントです。WhatsApp は公式の Bot API を提供していないため(Business API は有料申請が必要)、Baileys は Web クライアントをシミュレートして接続しており、接続の安定性はさまざまな要因の影響を受けます。
よくある原因
1. マルチデバイスログインの競合
WhatsApp のマルチデバイス機能には接続数の制限があります。複数の場所で同時に OpenClaw インスタンスを実行して同じ WhatsApp アカウントに接続している場合、またはブラウザ上で同時に WhatsApp Web を使用している場合、セッションの競合が発生する可能性があります。
2. セッション認証情報の期限切れまたは破損
Baileys はセッション認証情報をローカルファイルに保存します。これらのファイルが破損または期限切れになると、接続は回復できず、QR コードの再スキャンによるペアリングが必要になります。
3. ネットワークの不安定
WhatsApp のサーバーは接続品質に敏感です。高レイテンシ、頻繁なパケットロス、またはプロキシの不安定さが接続タイムアウトの原因になることがあります。
4. WhatsApp サーバー側の更新
WhatsApp は定期的にプロトコルを更新し、Baileys ライブラリもそれに応じて更新して互換性を維持する必要があります。古いバージョンの Baileys を使用すると、接続が拒否される可能性があります。
診断手順
OpenClaw の WhatsApp チャンネルログを確認し、詳細デバッグモードを有効にします。
DEBUG=openclaw:whatsapp* openclaw start
セッションストレージディレクトリが存在し、内容があることを確認します。
ls -la ~/.openclaw/sessions/whatsapp/
正常な場合、このディレクトリには creds.json と複数の app-state-sync-*.json ファイルが含まれているはずです。
Baileys ライブラリのバージョンを確認します。
npm list -g @whiskeysockets/baileys
解決策
方法1:デバイスの再ペアリング
古いセッションデータをクリアし、QR コードを再スキャンします。
# OpenClaw を停止
openclaw stop
# 古いセッションをバックアップ(念のため)
mv ~/.openclaw/sessions/whatsapp ~/.openclaw/sessions/whatsapp.bak
# 再起動すると新しい QR コードが生成される
openclaw start
起動後、ターミナルに QR コードが表示されます。スマートフォンの WhatsApp でスキャンしてください。スマートフォンの WhatsApp で「リンクされたデバイス」に移動し、まず古いリンク済みデバイスをすべて削除してから、再度スキャンしてリンクします。
方法2:セッションストレージの最適化
デフォルトのファイルシステムストレージは、高頻度の読み書き時にレースコンディションが発生する可能性があります。~/.openclaw/openclaw.json でより信頼性の高いストレージ方式を設定します。
{
"channels": {
"whatsapp": {
"sessionStore": {
"type": "sqlite",
"path": "~/.openclaw/sessions/whatsapp.db"
}
}
}
}
SQLite ストレージはトランザクション保証を提供し、セッションファイルの破損の可能性を減らします。
方法3:再接続戦略の設定
設定ファイルで再接続パラメータを調整し、接続の回復をより信頼性の高いものにします。
{
"channels": {
"whatsapp": {
"reconnect": {
"maxRetries": 20,
"baseDelay": 3000,
"maxDelay": 60000,
"backoffFactor": 1.5
},
"keepAlive": {
"intervalMs": 25000,
"timeoutMs": 60000
}
}
}
}
keepAlive 設定は定期的にハートビートパケットを送信して接続をアクティブに維持します。reconnect の指数バックオフ戦略により、頻繁な再接続による WhatsApp サーバーからの制限を回避できます。
方法4:Baileys 依存の更新
最新バージョンの Baileys ライブラリを使用していることを確認します。
npm update -g openclaw
OpenClaw の最新バージョンがまだ古い Baileys を使用している場合は、OpenClaw の GitHub Issues で更新の進捗を確認できます。
方法5:ネットワーク環境の確認
プロキシや VPN の背後で OpenClaw を実行している場合、WebSocket 接続がプロキシによって中断されていないことを確認します。
# WhatsApp サーバーへの接続をテスト
curl -v https://web.whatsapp.com
一部の企業ファイアウォールは WebSocket の長時間接続をブロックすることがあります。その場合は、ネットワーク制限のない環境に OpenClaw をデプロイすることを検討してください。
予防措置
切断の発生頻度を減らすために、以下のベストプラクティスに従うことを推奨します。
- 同じ WhatsApp アカウントは 1 つの OpenClaw インスタンスでのみ使用する
- OpenClaw とシステム時刻を同期させる(NTP の時刻ズレが認証失敗を引き起こす可能性がある)
~/.openclaw/sessions/whatsapp/ディレクトリを定期的にバックアップする- プロセスマネージャー(PM2 や systemd など)で OpenClaw プロセスを管理し、クラッシュ後の自動再起動を確保する