whatsapp について
whatsapp(pywhats)は、非公式のクライアントとして、非同期 Python と CLI から WhatsApp のリンク済み端末を操作します。テキストと画像の送信、イベント監視、複数アカウントのセッションに対応します。
主な機能
- 01QR コードでのペアリングとセッション再開
- 021 対 1 のテキスト・画像送信
- 03グループへのテキスト送信と情報取得
- 04JSON イベントストリームの監視
- 05プレゼンス、既読、入力状態の管理
活用シーン
- 01スクリプトから個別チャットへテキストや画像を送信
- 02グループへのメッセージ送信と情報取得
- 03チャットイベントを監視して受信メッセージを処理
- 04複数の WhatsApp アカウント間でセッションを切り替え
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sanjay3290/ ai-skills --skill whatsappインストール後、Claude Code で/whatsappを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdreferences/api.mdscripts/_bootstrap.shwa.py詳細
WhatsApp(pywhats)
pywhats を使い、非同期 Python から WhatsApp アカウントをリンク済みコンパニオンデバイス(WhatsApp Web のようなもの)として操作します(プレアルファ版、テキスト/画像のみ)。これは非公式のマルチデバイスクライアントであり、公式の WhatsApp Business/Cloud API ではありません。
CLI のエントリーポイント:scripts/wa.py(初回実行時に管理対象の venv を自動でセットアップします)。
基本的な仕組み
- ペアリング=QR コードの初回スキャンです。
wa.py pairを実行すると ASCII QR コードが表示されます。WhatsApp → リンク済みデバイスからスキャンしてください。認証情報は$PYWHATS_HOME/<session>.session(および.signal.db)に保存されます。 - 再接続はサイレントです。 以降のコマンドは同じセッションで再接続するため、QR コードは不要です。
- チャットの宛先には JID を使います。 電話番号のみの
15550001234は[email protected]に変換されます。グループには[email protected]を使います。 - 受信にはイベントを使います。
wa.py listenはイベントごとに JSON オブジェクトを 1 つ出力します。
⚠️ ハンドラー内で Client 呼び出しを直接 await しないでください
イベントハンドラーは受信ループ内でインライン実行されます。ハンドラー内で send_*、mark_read、get_group_info、download_media などを await すると、接続がデッドロックします。必ず asyncio.create_task(...) を使ってください。listen サブコマンドは --read に対してすでにこの方法を使っています。
コマンド
scripts/wa.py pair # one-time QR pair
scripts/wa.py send-text 15550001234 "hello" # 1:1 text
scripts/wa.py send-image 15550001234 photo.jpg --caption hi # 1:1 image
scripts/wa.py group-info [email protected] # group metadata JSON
scripts/wa.py group-send [email protected] "hi all" # group text
scripts/wa.py mark-read 15550001234 MSGID [--sender JID] # blue ticks
scripts/wa.py presence available # global presence
scripts/wa.py typing 15550001234 composing [--media audio] # typing indicator
scripts/wa.py listen --read --events message,receipt # JSONL event stream
scripts/wa.py --session work send-text 15550001234 "hi" # named session
| コマンド | 動作 |
|---|---|
pair | ASCII QR コードで新規リンクします。ペアリング済みの場合は何もしません |
send-text <to> <text> | 1 対 1 のテキストを送信し、メッセージ ID を出力します |
send-image <to> <path> [--caption C] | 画像(jpg/png/webp、≤16MB)を送信し、ID を出力します |
group-info <gid> | グループの JSON(件名、所有者、参加者など)を出力します |
group-send <gid> <text> | メンバーを解決してからグループにテキストを送信し、ID を出力します |
mark-read <chat> <ids...> | 既読にします。グループでは --sender を指定します |
presence <available|unavailable> | 全体のプレゼンス |
typing <to> <composing|paused> | チャットのプレゼンス。--media audio は任意です |
listen | JSON Lines を継続的に出力します。--read、--events、--subscribe JID を指定できます(プレゼンスイベントには必須) |
グローバルオプション:--session NAME(デフォルトは default。環境変数 PYWHATS_SESSION でも指定できます) — サブコマンドの前に指定します:wa.py --session work pair。
セッション/複数アカウント
$PYWHATS_HOME/ # default: ~/.pywhats
venv/ # managed Python + pywhats
default.session # --session default
default.session.signal.db
work.session # --session work
PYWHATS_HOME でホームディレクトリを変更できます。ペアリングされていないセッション、またはログアウト済みのセッションでは、wa.py --session <name> pair を再実行するよう明確なメッセージが表示されます。
スキャン直後にデバイスがログアウトしたと pair が報告した場合は、WhatsApp によるデバイス整理の結果であり、スキルの不具合ではありません。無効になったセッションは自動的に削除されます。表示される復旧手順(リンク済みデバイスを削除し、15~20 分待ってから、1 回だけペアリングする)に従ってください。
詳細リファレンス
references/api.md — すべての Client メソッド、すべてのイベントペイロード、JID の構築方法、および download_media に関する注意事項。