whatsapp について
whatsapp は、通知やメディア共有、返信対応などに使う、Green API 経由で WhatsApp メッセージを送受信する自動化スキルです。統一されたコマンドラインスクリプトで複数のメッセージや添付ファイルを扱い、返信監視の手順も備えています。
主な機能
- 01テキスト、画像、動画、音声、ファイルの送信
- 02連絡先やグループへのメッセージ送信
- 03メッセージとメディア情報の取得
- 04新着返信の重複排除付き監視
- 05送信前のメッセージ確認
活用シーン
- 01通知、リマインダー、ワークショップ後の連絡
- 02連絡先への画像や文書の共有
- 03受信した音声メッセージの取得と文字起こし
- 04顧客の承認やフィードバックを待ってから作業を続行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aviz85/ claude-skills-library --skill whatsappインストール後、Claude Code で/whatsappを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
SETUP.mdscripts/.env.exampleget-group-members.tsget-messages.tspackage.jsonsend-image.tssend-message.tssend-voice.tstsconfig.jsonwatch-replies.sh詳細
WhatsApp 自動化
Green API を使用して統一スクリプト経由でメッセージを送信します(プライマリ)。設定されている場合は、WAHA をフォールバックとして使用します。
クイックスタート — 統一スクリプト
cd ~/.claude/skills/whatsapp/scripts
# Text message
npx ts-node send-message.ts "Hello!" --to 972501234567
# Multiline text from shell: use $'...'
npx ts-node send-message.ts $'Line 1\n\nLine 2\n- Bullet A\n- Bullet B' --to 972501234567
# Image with caption
npx ts-node send-message.ts --to 972501234567 --image /path/to/image.jpg --caption "Check this out!"
# Video with caption
npx ts-node send-message.ts --to 972501234567 --video /path/to/video.mp4 --caption "Watch this!"
# Any media file (auto-detect)
npx ts-node send-message.ts --to 972501234567 --media /path/to/any-file --caption "Here!"
# Voice message
npx ts-node send-message.ts --to 972501234567 --voice /path/to/audio.ogg
# File/document
npx ts-node send-message.ts --to 972501234567 --file /path/to/doc.pdf --caption "Here's the doc"
# Send to group
npx ts-node send-message.ts "Group message" --group [email protected]
# Reply to a specific message (quoted reply)
npx ts-node send-message.ts "Reply!" --group [email protected] --quote BAE5367237E13A1B
# Voice as quoted reply
npx ts-node send-message.ts --group [email protected] --voice /tmp/voice.mp3 --quote BAE5367237E13A1B
# Dry run (preview)
npx ts-node send-message.ts "Test" --to 972501234567 --dry-run
デフォルトの電話番号
| エイリアス | 電話番号 | 用途 |
|---|---|---|
| myself / me / test | $MY_PHONE(config.sh から取得) | デフォルトの送信先 |
動画と音声の送信 — AAC にエンコード
MP4 に MP3 の音声トラックを多重化した動画は、WhatsApp(および Facebook)では音声なしで再生されます。ファイルは有効で、デスクトッププレーヤーでは音声が再生されますが、モバイルアプリでは音声が再生されません。動画の音声には必ず AAC を使用してください。
# Re-encode ONLY the audio to AAC, leave the video untouched; +faststart for streaming
ffmpeg -y -i in.mp4 -c:v copy -c:a aac -b:a 192k -movflags +faststart out.mp4
# Verify it isn't silent before sending
ffmpeg -i out.mp4 -af volumedetect -f null /dev/null 2>&1 | grep mean_volume
ボイスメッセージの場合は、まずソースを OGG/Opus に変換してください。コンテナ内の生の MP3 は、アプリで正常に再生されないことがあります。
スクリプトのオプション
| オプション | 説明 |
|---|---|
"message" | テキストメッセージ(最初の位置引数) |
--to, --phone <NUMBER> | 電話番号(イスラエル形式も使用できます) |
--group <ID> | グループ ID(形式:[email protected]) |
--image <PATH> | 画像ファイルを添付 |
--video <PATH> | 動画ファイルを添付(MP4 など) |
--media <PATH> | 任意のメディアファイルを添付(自動検出) |
--voice <PATH> | ボイスメッセージを送信(OGG/MP3) |
--file <PATH> | ドキュメント/ファイルを添付 |
--caption <TEXT> | メディアファイルのキャプション |
--quote <MSG_ID> | 特定のメッセージに返信(quotedMessageId) |
--dry-run | 送信せずにプレビュー |
複数行の書式設定
シェルから改行を含む WhatsApp メッセージを送信する場合、最終的なメッセージに実際の改行を含めたいときは、通常の引用符で囲んだ文字列にリテラルの \n を渡さないでください。
代わりに、シェルの ANSI-C クォートを使用してください。
npx ts-node send-message.ts $'Hi\n\nLine 2\n- Item 1\n- Item 2' --group [email protected]
理由:
"text with \n"は\とnの文字を送信します。ただし、スクリプトがこれらを実際の改行に自動変換します$'text with \n'は実際の改行をそのまま送信します
どちらの形式も使用できます。スクリプトは送信前に、リテラルの \n を実際の改行に正規化します。
$'...' 内のアポストロフィ: \' をそのまま使用してください。'\'' の方法は使用しないでください。'\'' のパターンを使うと ANSI-C クォートが終了し、それ以降は通常のシングルクォートになるため、\n がリテラルとして扱われます。
# CORRECT — apostrophe inside $'...'
$'I\'ve added a check.\n\nNext line.'
# WRONG — breaks ANSI-C quoting, \n becomes literal after the apostrophe
$'I'\''ve added a check.\n\nNext line.'
構成された WhatsApp メッセージでは、次の形式を推奨します。
- 短い冒頭の行
- 空行
- 短い箇条書き
- 空行
- 締めくくりの行
書式ルール — 言語に合わせる
英語のメッセージ: 通常の箇条書き/ダッシュを使用してください。英語のテキストでは、ヘブライ文字(א. ב. ג.)を使用しないでください。
- First item
- Second item
- Third item
ヘブライ語のメッセージ: RTL 表示を正しく行うため、各行はヘブライ文字で始めてください。箇条書きにはヘブライ文字を使用してください。
א. פריט ראשון
ב. פריט שני
ג. פריט שלישי
混在させないでください: 英語のメッセージにヘブライ文字を入れないでください。また、ヘブライ語のメッセージにダッシュや数字を入れないでください。
次のようにしないでください:
- פריט ראשון
1. פריט שני
* פריט שלישי
ダッシュ、数字、アスタリスク、英語など、ヘブライ文字以外で始まる行は、WhatsApp での RTL 配置を崩します。最初に表示される文字が必ずヘブライ文字になるようにしてください。
プロバイダーのロジック
| コンテンツの種類 | プライマリ | フォールバック |
|---|---|---|
| テキスト | Green API | WAHA(設定されている場合) |
| 画像 | Green API | - |
| 動画 | Green API | - |
| 音声 | Green API | - |
| ファイル | Green API | - |
注: WAHA は現在インストールされていません。すべてのメッセージ形式を Green API が処理します。
設定
認証情報は scripts/.env にあります。
# Green API (primary provider)
GREEN_API_URL=https://7103.api.greenapi.com
GREEN_API_INSTANCE=your_instance
GREEN_API_TOKEN=your_token
# WAHA (optional fallback — uncomment if installed)
# WAHA_URL=http://localhost:3001
# WAHA_API_KEY=your_key
# WAHA_SESSION=default
電話番号の形式
| 入力 | 正規化後 |
|---|---|
972501234567 | [email protected] |
0501234567 | [email protected] |
501234567 | [email protected] |
直接 API(WAHA)
テキストメッセージのみ:
source ~/.claude/skills/whatsapp/config.sh
curl -s -X POST "$WAHA_URL/api/sendText" \
-H "X-Api-Key: $WAHA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session": "default",
"chatId": "[email protected]",
"text": "Hello!"
}'
セッションの状態を確認
source ~/.claude/skills/whatsapp/config.sh
curl -s -H "X-Api-Key: $WAHA_API_KEY" "$WAHA_URL/api/sessions/default"
名前で連絡先を検索
ユーザーが電話番号なしで「[名前] に WhatsApp を送って」と言った場合:
get-contactスキルを使用して CRM を検索します- 見つからない場合 → ユーザーに電話番号を尋ねます
- 複数見つかった場合 → ユーザーに選択してもらいます
- 1 件見つかった場合 → 送信前に確認します
送信前に必ず連絡先を確認してください。
名前またはプロジェクトでグループを検索する
ユーザーが「[project] グループに送って」と言った場合は、Green API を直接検索します(WAHA がダウンしている場合があります)。
TOKEN=$(grep "GREEN_API_TOKEN" ~/.claude/skills/whatsapp/scripts/.env | cut -d'=' -f2)
INSTANCE=$(grep "GREEN_API_INSTANCE" ~/.claude/skills/whatsapp/scripts/.env | cut -d'=' -f2)
curl -s "https://7103.api.greenapi.com/waInstance$INSTANCE/getChats/$TOKEN" | python3 -c "
import json,sys
data=json.load(sys.stdin)
for c in (data if isinstance(data,list) else []):
if '@g.us' in c.get('id',''):
print(c.get('id'), '|', c.get('name',''))
"
次に、send-message.ts --group <ID> を使って送信します。
送信前に WAHA セッションを確認しないでください — スクリプトがフォールバックを自動的に処理します。
プロバイダーに関する注意事項
Green API がプライマリプロバイダーです。WAHA はインストールされておらず、明示的に設定されている場合にのみフォールバックとして使用されます。
send-message.ts を実行するだけで、Green API を直接使用します。
メッセージの取得(get-messages.ts)
任意の連絡先から、受信メッセージ、音声録音、メディアを取得します。
# Get recent messages from a contact
npx ts-node get-messages.ts --chat 972526062921 --count 5
# Get messages from last 2 hours
npx ts-node get-messages.ts --chat 972526062921 --minutes 120
# Get all messages from a time range
npx ts-node get-messages.ts --start "2h ago" --end "now"
# Output as JSON (includes download URLs for media)
npx ts-node get-messages.ts --chat 972526062921 --json
取得できるもの:
- 内容全体を含むテキストメッセージ
- 音声メッセージとダウンロード URL(OGA/OGG 形式)— 個別に文字起こしできます
- 画像とダウンロード URL、メタデータ
- タイムスタンプ、送信者情報、ファイル名
- すべてのメッセージタイプ(拡張テキスト、リアクション、メディア)
引用/返信メッセージはインラインで表示されます — get-messages.ts は、↳ Reply to というプレフィックスを付けて、引用されたコンテキストを自動的に表示するようになりました。extendedTextMessage と quotedMessage の両方のタイプに対応しています。
メッセージタイプ:textMessage、extendedTextMessage(.text を含む)、quotedMessage(.quotedMessage.textMessage を含む返信)、reactionMessage、imageMessage
音声メッセージのワークフロー:
get-messages.ts --jsonでメッセージを取得しますaudioMessageタイプからdownloadUrlを抽出します- OGA ファイルをダウンロードします
- WAV に変換します:
ffmpeg -i file.oga -ar 16000 file.wav - 文字起こしを行います:
/transcribe --language he /path/to/file.wav
返信を待つ — Monitor との連携
メッセージを送信した後、作業を続ける前に連絡先からの返信が必要なことがあります。承認、決定、フィードバック、「いくら払えばいい?」などです。作業を中断してユーザーにチャットを確認してもらう代わりに、待機を Monitor ツールに任せて作業を続けます。新しい返信はそれぞれ通知として届きます。
scripts/watch-replies.sh を使います。このスクリプトは、実際に新しい受信メッセージをポーリングし(ID で重複を排除し、テキスト/リアクション/メディアを処理)、返信ごとに 1 行を出力します。これは Monitor がそのまま読み取れる形式です。終了するのは、停止された場合のみです(Monitor のタイムアウト/TaskStop)。
# usage
scripts/watch-replies.sh --chat <number|groupId> [--since <epoch>] [--interval 30] [--label REPLY]
作業を続けながら返信の通知を受け取れるよう、Bash ではなく Monitor ツールを通じて起動します。
command:~/.claude/skills/whatsapp/scripts/watch-replies.sh --chat 972501234567 --since "$(date +%s)" --label CLIENTtimeout_ms:待機する時間(例:1 時間の場合は3600000)。- 必ず
--sinceを送信した時点の時刻に設定してください($(date +%s))。そうしないと、古い履歴が新着として再び通知されます。
⚠️ Monitor の
command内にインラインのポーラーを自作しないでください。 グループ ID や JSON 本文をシェルに直接渡すと、zsh で問題が発生します。@g.usがbad math expression: illegal character: @を引き起こし、モニターが終了コード 1 で終了します。watch-replies.shではチャットを引数(--chat <id>)として渡すため、グループ ID も安全に扱えます。必ずこのスクリプトを使い、Monitor のコマンド内でグループ ID と curl/python を直接指定しないでください。
状況に応じて使うかどうかを判断する
返信によって次の行動が変わる場合に使います。
- 次の手順の前に承認が必要なもの(下書き、プレビュー、見積もり)を送信した場合。
- 質問をして、その回答に基づいて行動する場合。
- 反復的なやり取り(修正を送信 → 相手が確認 → 次の修正を送信)の場合。
- 長時間の作業を始め、作業を止めずに返信を受け取りたい場合。
確認、参考情報、「完了」など、返信を期待しない一方的な送信では使いません。返信が期待されないため、監視するものがありません。
会話を続ける
多くの場合、適切なのはやり取りを続けることです。返信が届いたら応答し、次のやり取りに備えて新しい --since を指定して新しい監視を開始します。これが実際の会話の往復です。サンプルを送信 → 相手が承認 → 修正を送信 → 再び待機、という流れを、スレッドが自然に終わるまで続けます(最終承認、お礼、支払いの完了、またはユーザーからの終了指示)。各ラウンドでは、送信 → 監視 → 返信 → 再監視します。やり取りが本当に終わり、監視を止めるべきタイミングは、状況に応じて判断してください。
規律
- 各ウォッチャーには専用の重複排除ファイルがあるため、同じチャットで2つのウォッチャーを動かすと二重に実行されます。新しいウォッチャーを起動する前に、古いウォッチャーを
TaskStopしてください。 - リアクションは
(reaction 👍)、メディアは[imageMessage]として表示されます。画像のURL/キャプション/音声ファイルが必要な場合は、get-messages.ts --jsonで完全なレコードを取得してください。
使用する場面
- 通知やアラートの送信
- 画像やポスターの共有
- 音声メッセージ
- ドキュメントの共有
- リマインダーの自動送信
- ワークショップ後のフォローアップ
- 顧客から音声メッセージを取得して文字起こしする
- 連絡先からのメディア添付ファイルを確認する