調整さんの出欠回答を Playwright で自動入力し、Claude Code 経由の Google Calendar MCP で判定する構成
調整さん(chouseisan.com)の出欠回答を Playwright で自動入力し、◯/△/× の判定は Google カレンダーと照合して Claude Code(claude.ai Google Calendar MCP 経由)に任せる構成を作成した記録です。fetch / fill / submit の3段階に分け、判定ルールは CLAUDE.md に記述する形にしました。
playwrightclaude-codemcpgoogle-calendarchouseisanautomationpython
台本(フルテキスト)
動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。
オープニング
- 調整さんの出欠回答を Playwright で自動入力
- Claude Code + Google Calendar MCP で日程判定
- はう
- 今日は調整さんの出欠入力を自動化するツールについて教えてください。
- めたん
- 調整さんの出欠回答を Playwright で自動入力して、◯・△・× の判定は Google カレンダーと照合して Claude Code に任せる構成を作ったの。
- はう
- なぜ Playwright を使うんですか?
- めたん
- 調整さんは公開 API を持っていないので、公開ページの DOM を直接操作しているの。Playwright がブラウザ操作の自動化に適しているわ。
- はう
- 判定の AI 部分はどうやっているんですか?
- めたん
- Claude.ai の Google Calendar MCP を使うことで、OAuth 設定なしでカレンダーと連携できるの。Claude Code セッションに対話で頼む形にしているわ。
3段階のワークフロー
- fetch → Claude で判定 → submit の3段階
- 各段階を独立に再実行できる設計
- はう
- ワークフローの全体像を教えてください。
- めたん
- fetch で候補日を events/{slug}.json に抽出、Claude にカレンダー照合と答え埋めを依頼、submit で Playwright 経由で送信、という3段階よ。
- はう
- 3段階に分けるメリットは何ですか?
- めたん
- 候補が変わったら fetch だけ再実行、判定ロジックを試したいなら Claude に再依頼するだけ、確認後に submit、という形で各段階を切り離せるのよ。
- はう
- fetch の出力はどういう形式ですか?
- めたん
- slug、ラベル、URL、名前、コメント、choices 配列を含む JSON よ。choices には候補日時と初期値の × が入っていて、Claude がここを埋めていくの。
調整さんの DOM 操作
- hidden input kouho{N} に 1=◯/2=△/3=× が入る
- #kouho{N} ~ input.oax-{col} で一意にボタンを取得
- はう
- Playwright で DOM をどう操作するんですか?
- めたん
- 候補ごとの hidden input に 1=◯、2=△、3=× の値が入るの。クリック対象は同じ td 内の画像ボタン oax-0 から oax-2 よ。
- はう
- ID が重複していたんですか?
- めたん
- そうなの。全行の最初の画像ボタンが oax_0_0 という ID になっていたから、ID では取れなかったわ。#kouho{N} を起点に CSS の後続兄弟セレクタで取る形にしたの。
判定ルールを CLAUDE.md に記述
- CLAUDE.md に判定ルールを書いて Claude Code が自動読込
- 「参考:」プレフィックスのスキップや終日イベントの扱いを定義
- はう
- 判定ルールはどこに書くんですか?
- めたん
- プロジェクトルートの CLAUDE.md に書くの。Claude Code は作業ディレクトリの CLAUDE.md を自動的に読むから、毎回ルールを伝えなおさなくて済むわ。
- はう
- どんなルールを書いているんですか?
- めたん
- 「参考:」プレフィックスのイベントはスキップ、transparency が transparent のイベントは空きとみなす、終日のブロッキング予定は × にする、といった個人のカレンダー運用ルールね。
- はう
- 既存エントリの更新はどう処理しますか?
- めたん
- ページ表示直後に同名の参加者リンクがあるか確認して、あれば編集モード、なければ新規モードに自動切替するの。毎回新規エントリが増えないようにしているわ。
ハマりどころとまとめ
- networkidle は調整さんでは永遠に来ない → load を使う
- 判定ルール外在化でロジックのデバッグが容易に
- はう
- ハマったところはほかにありましたか?
- めたん
- wait_for_load_state の networkidle が調整さんのページで30秒経っても来なかったの。Google Ads などの第三者タグが多いのが原因で、load に変えたら解決したわ。
- はう
- 今日のまとめをお願いします。
- めたん
- 調整さんの DOM を Playwright で操作して fetch・submit、判定部分は Claude Code + Google Calendar MCP に任せる設計よ。ルールを CLAUDE.md に書いておくと管理しやすいの。
- はう
- ソースコードはどこで見られますか?
- めたん
- GitHub の nakamura196/choseisan で公開しているわ。DOM の構造は予告なく変わる可能性があるから、利用する際は確認してね。