Macのイベント駆動でClaudeCodeを立ち上げ、Macを操作させる
public.icon
お題として、Wifiに接続したら、ClaudeCodeがSpotifyを使って、その時間帯に応じた音楽を再生してくれるというデモ
https://i.gyazo.com/488e1fcb73171d8f1d4f09a90e7db8e3.gif
code:zenn
---
title: "AppleScript × Claude Code で実現する「自律型AI DJ」— Wi-Fi接続で自動選曲する仕組みを作った"
emoji: "🎵"
type: "tech"
topics: "ClaudeCode", "AppleScript", "Hammerspoon", "Spotify", "自動化"
published: false
---
## はじめに
「PCを開いたら、時間帯に合った音楽が自動で流れたら最高じゃない?」
そんな発想から、**AppleScript × Claude Code × Hammerspoon** を組み合わせて、Wi-Fi接続をトリガーに自動で選曲・再生する仕組みを作りました。
この記事では、試行錯誤の過程も含めて、実装方法を解説します。
## 完成したもの
`
Wi-Fi接続
↓
Hammerspoon が検知
↓
Claude Code が起動
↓
時間帯を判断 + 曲を選択
↓
AppleScript で Spotify 再生
`
**デモ:** Wi-Fiに接続すると、ターミナルが開き、Claude Codeが時間帯に応じた曲を選んでSpotifyで再生してくれます。
## なぜ AppleScript × Claude Code なのか
### AppleScript 単体の限界
AppleScriptは強力なGUI自動化ツールですが、以下の限界があります:
- 条件分岐・判断ロジックが貧弱
- 自然言語の理解ができない
- 「今の時間帯に合った曲」のような曖昧な判断ができない
### Claude Code 単体の限界
Claude Codeは高度な判断ができますが:
- 自発的に動けない(トリガーが必要)
- macOS固有のアプリ操作は苦手
### 組み合わせることで
| 役割 | 担当 |
|------|------|
| トリガー検知 | Hammerspoon |
| 判断・選曲 | Claude Code |
| アプリ操作 | AppleScript |
**「APIがないアプリ」に「知性」を注入できる** のがこの組み合わせの強みです。
## 必要なもの
- macOS
- Hammerspoon(https://www.hammerspoon.org/)(無料)
- Claude Code(https://claude.ai/code)(CLI版Claude)
- Spotify(デスクトップアプリ)
## 実装手順
### 1. Hammerspoon のインストール
`bash
brew install --cask hammerspoon
`
インストール後、以下の権限を付与してください:
- **システム設定 → プライバシーとセキュリティ → アクセシビリティ** → Hammerspoon を許可
- **システム設定 → プライバシーとセキュリティ → 位置情報サービス** → 有効化(Wi-Fi名取得に必要)
- **システム設定 → 通知 → Hammerspoon** → 許可
### 2. Claude Code のセットアップ
Claude Codeがインストールされていることを確認:
`bash
claude --version
`
### 3. Hammerspoon の設定ファイルを作成
~/.hammerspoon/init.lua を作成:
`lua
-- Wi-Fi Auto DJ設定
-- 最後の実行時刻を記録(連続実行防止)
lastRun = 0
-- Wi-Fi接続を監視
wifiWatcher = hs.wifi.watcher.new(function()
local network = hs.wifi.currentNetwork()
local now = hs.timer.secondsSinceEpoch()
-- 60秒以内の再実行を防止
if network and (now - lastRun) > 60 then
lastRun = now
-- 通知
hs.notify.new({
title="Auto DJ",
informativeText="Wi-Fi接続検知!選曲中..."
}):send()
-- ターミナルを開いてClaude Codeを実行
hs.applescript([[
tell application "Terminal"
activate
do script "claude --dangerously-skip-permissions '今の時間帯に合った曲をSpotifyでかけて。今の曲とは別の曲を選んで必ず再生して。
【重要】Spotifyの再生は以下の形式で実行すること:
osascript << EOF
tell application \"Spotify\"
activate
play track \"spotify:track:トラックID\"
end tell
EOF
必ずactivateを含め、ヒアドキュメント形式で実行すること。'"
end tell
]])
end
end)
wifiWatcher:start()
-- 起動確認
hs.notify.new({
title="Hammerspoon",
informativeText="Wi-Fi Auto DJ 監視開始!"
}):send()
`
### 4. Hammerspoon を再起動
メニューバーのHammerspoonアイコン → **Reload Config**
「Wi-Fi Auto DJ 監視開始!」の通知が出ればOK。
## 動作確認
1. Wi-Fiを一度オフにする
2. Wi-Fiをオンにする(または別のネットワークに接続)
3. ターミナルが開き、Claude Codeが起動
4. 時間帯に応じた曲がSpotifyで再生される
## 試行錯誤の記録
### Spotify再生で失敗したパターン
#### ❌ 失敗1: 一行でAppleScript実行
`bash
osascript -e 'tell application "Spotify" to play track "spotify:track:XXX"'
`
**問題:** Spotifyがアクティブでないと失敗する
#### ❌ 失敗2: URIを直接開く
`bash
open "spotify:track:XXX"
`
**問題:** 再生が開始されない場合がある
#### ✅ 成功: ヒアドキュメント + activate
`bash
osascript << 'EOF'
tell application "Spotify"
activate
play track "spotify:track:XXX"
end tell
EOF
`
**ポイント:**
- activate でSpotifyを確実にアクティブ化
- ヒアドキュメントで複数コマンドを順序実行
### API競合問題
Claude.ai(Webチャット)とClaude Code(CLI)を同時に使うと、以下のエラーが発生:
`
API Error: 400 due to tool use concurrency issues.
`
**解決策:** Claude.aiのタブを閉じてからClaude Codeを実行する
### Wi-Fiイベントの多重発火
Wi-Fi接続時に複数回イベントが発火する問題が発生。
**解決策:** タイムスタンプでデバウンス処理
`lua
if network and (now - lastRun) > 60 then
lastRun = now
-- 実行処理
end
`
## 応用アイデア
この仕組みは「Wi-Fi × Spotify」以外にも応用できます:
### トリガーの拡張
| トリガー | 実装方法 |
|----------|----------|
| PC起動時 | launchd / ログイン項目 |
| 特定の時刻 | cron / launchd |
| アプリ起動時 | Hammerspoon hs.application.watcher |
| Bluetooth接続 | Hammerspoon |
### 操作対象の拡張
| アプリ | できること |
|--------|-----------|
| LINE | メッセージ送信(検索→クリック→入力) |
| Slack | チャンネル操作 |
| Adobe系 | メニュー操作、フィルタ適用 |
| DAW (Logic等) | 再生、エフェクト操作 |
**AppleScriptでGUI操作できるアプリ** × **Claude Codeの判断力** = 無限の可能性
## まとめ
AppleScript × Claude Code の組み合わせで、**APIがないアプリにもAIの知性を注入**できることがわかりました。
今回は「時間帯に応じた自動選曲」という比較的シンプルな例でしたが、同じ構成で:
- 「メールの内容を判断して自動振り分け」
- 「会議前に集中BGM、会議後にリラックス曲」
- 「天気に応じたプレイリスト選択」
なども実現できます。
**Claude Codeが「判断」を担い、AppleScriptが「実行」を担う** この分業モデルは、macOSの自動化に新しい可能性を開くと思います。
## 参考リンク
- Hammerspoon 公式(https://www.hammerspoon.org/)
- Claude Code ドキュメント(https://claude.ai/code)
- AppleScript Language Guide(https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/)
---
質問やフィードバックがあれば、コメントでお知らせください!
Lua