金曜9時、自動投稿がスキップされていた
今週の金曜朝、いつものように投稿が上がっているはずが、パイプラインのログを見ると以下の一行で処理が止まっていた。
notes/log.mdが前回投稿時から更新されていないため、投稿をスキップします
バグではない。notes/log.md の SHA256 ハッシュを前回投稿時と比較し、変化がなければ重複防止でスキップする、という自分で仕込んだ安全弁だった。ログを更新し忘れていた僕のミスだ。
問題はそのとき手元にPCがなく、スマホしかなかったこと。VSCodeも開けない。さてどうするか。
「生成」と「公開」を切り離す設計に変更した
その場で考えた解決策は、記事の 生成フェーズ と 公開フェーズ を完全に分離することだった。これまでは「Claudeに記事を作らせてそのままWordPressに投稿」という一本道だったが、途中にJSONファイルを挟むバッファを設ける構成に変える。
具体的にやったことは以下の4つ。
やったこと① ClaudeにJSONで下書きを生成させる
スマホのブラウザでClaude(Cowork)を開き、「記事本文をWordPressに投稿できるJSON形式で出力して」と指示。タイトル・本文HTML・カテゴリ・タグなどをまとめたJSONをそのままコピーし、GitHubのファイル編集画面から notes/draft_ai-proofreading-tools.json として保存した。
ポイントは、この時点では 投稿しない こと。下書きをリポジトリに置くだけにとどめる。
やったこと② main.pyに --from-file オプションを追加
次に、生成済みのJSONを読み込んで投稿できるよう main.py を改修した。
# 変更前: 毎回Claudeを呼び出して記事生成→投稿
python main.py
# 変更後: 生成済みJSONを指定して投稿のみ実行
python main.py --from-file notes/draft_ai-proofreading-tools.json --status draft
実装自体はシンプルで、引数に --from-file が渡されたらAPI呼び出しをスキップしてJSONをそのまま読み込む分岐を追加するだけだ。スマホのGitHub Web UIでも十分編集できる量の変更だった。
やったこと③ workflow_dispatchにinputを追加してGitHub UIから投稿トリガー
GitHub Actionsの workflow_dispatch に from_file 入力を追加し、GitHubのサイト上から「Run workflow」ボタンを押すだけで任意のJSONを指定して投稿できるようにした。
on:
workflow_dispatch:
inputs:
from_file:
description: '投稿する下書きJSONのパス(例: notes/draft_xxx.json)'
required: false
default: ''
これで「スマホ→Claudeで下書き生成→GitHubにコミット→ActionsのRun workflowで投稿」という経路がすべてブラウザだけで完結した。
やったこと④ 投稿済みJSONを notes/posted/ に自動退避
同じファイルを誤って二重投稿しないよう、投稿完了後に該当JSONを notes/posted/ ディレクトリへ自動で移動する処理も追加した。単純なファイル移動だが、これがないと「前回投稿したのがどのJSONだったか」の管理が煩雑になる。
ハマったポイント:認証情報の持ち運び問題
スマホ運用で一番不安だったのが認証情報の扱いだ。Anthropic APIキー・WordPressのアプリケーションパスワード・LINE通知トークンなどを手元の端末に持たずに済むか?
結論、すべてGitHub Secretsに寄せてあるので問題なかった。ローカルの .env を参照しているのはローカル実行時だけで、Actions経由なら端末に鍵を持ち歩く必要が一切ない。この設計にしておいて本当によかった。
今回の構成まとめ
変更後のフローを整理すると、以下のようになる。
[通常ルート]
GitHub Actions(定期実行)→ Claude API で記事生成 → WordPress投稿
[緊急・手動ルート]
Claude(ブラウザ)で JSON 下書き生成
→ GitHub Web UI でコミット
→ Actions の workflow_dispatch で from_file 指定して投稿トリガー
→ 投稿完了後、JSONを notes/posted/ へ退避
次にやりたいこと:スキップ時の自動PR作成
今回は「スキップされたことに自分で気づいた」から手動で動けたが、理想は スキップが発生した時点でClaudeが自動で下書きJSONを生成してPRを立てる ところまで自動化することだ。
イメージとしては:
- 定期実行でスキップ判定が出る
- Actions内でClaude APIを呼び出し、下書きJSONを生成
- GitHub CLIでブランチを切り、JSONをコミットしてPRを作成
- 自分はPRをマージするだけ → 次のActionsが投稿実行
「完全放置」ではなく「承認だけ人間がする」形にすることで、誤投稿リスクを残しつつ手間を最小化できる。来週はここに着手したい。
まとめ
今週の収穫は、スマホだけで記事下書き〜投稿トリガーまで完結できる経路を作れたこと。PCがない状況でのトラブル対応が、結果的にシステム全体の柔軟性を高めることになった。
認証情報をGitHub Secretsに集約し、生成と公開を分離しておくだけで、端末を選ばない運用が可能になる。同じ構成でWordPress自動投稿を組んでいる人には参考になるはずなので、詰まっている箇所があればコメントで教えてほしい。
👉 関連商品をAmazonで探す(GitHub Actions)