解剖 01 ── 毎朝1本、X へ自動投稿する仕組みの構造
(2026-09-24・図1・表3)
結論
X への投稿を毎朝1回、自動で出す仕組みは、スクリプト9本・データ12ファイル・外部3つでできていて、月の費用は9月(24日まで)で概算12ドル、動かし始めてから止まった箇所は16件でした。
この仕組みのコードは公開していません。公開しているのは投稿ボードの部分だけです。この記録は、部品の名前よりも「どの順で・どこで・どう壊れたか」と「月いくらか」を持ち帰ってもらうためのものです。
部品の関係図

(図1: 左が人と外部、真ん中が毎朝の工程、右がリポジトリの中のデータ。矢印は読む・書くの向き)
一言でいうと、GitHub Actions が毎朝1回ワークフローを起動し、X から自分の投稿と返信を読んで台帳に写し、棚(投稿の予定表)にある承認済みの1本を X に出して、結果を受領票に書き、変わったファイルをコミットする。ぼくが手で行うのは、棚に登録して承認することと、手動の投稿だけです。
止まった箇所
| 日付 | 何が止まったか | どう直したか |
|---|---|---|
| 8/10〜27 | 投稿ボードが HTML 1枚で、記録が端末1台の中だけ。URL を知れば読めた | 8/27 に棚(リポジトリのファイル)と Cloudflare Access の鍵に作り直した |
| 8/27 | 定時実行が発火しなかった | 時刻を端数の分にずらした |
| 8/28 | 6時間半遅れで発火し、出力が git add の一覧に無くて失敗、消えた | 一覧に追加。「出力を足す改修は git add の一覧とセット」を決まりに |
| 9/7 | git add の glob が当たらない日に exit 128 | 固定パスと「あれば add」に分けた |
| 9/9〜10 | 記事の短報が手動と自動で二重に出た | 手動の投稿も棚に通し、台帳で照合する形に |
| 9/11 | 台帳が .gitignore に当たって保存されず消えた | 例外を1行。「check-ignore で確かめる」を決まりに |
| 9/11 | 棚を操作したコミットでボードが前の状態に戻った | 9/13 に決まりを追加 |
| 9/10〜12 | 「キューの前に投稿」「取り込み失敗でも投稿」の順序事故が起きうる作り | 9/13 に1本のワークフローに統合し、順序を固定。受領票を追加 |
| 9/14〜15 | 投稿済みの記事2本が「未告知」と出た(台帳だけで判定していた) | 棚の投稿済みも根拠に。投稿の直後にボードを作り直す |
| 9/17〜 | 定時の遅延がおよそ2時間(最長 2時間30分) | 予定は変えず、週次で中央値を見ている |
| 9/20 | 停止中に queue_out が drafts.json を要求して失敗 | 無ければ空として読む |
| 9/20 | 下書きの流れの失敗で投稿まで止まる作り | 投稿と接点の取得を、取り込みの成否だけに繋いだ |
| 9/21〜22 | 自動起案の登録行がコミットされず、同じカードが作り直された | 登録記録をコミット対象に。二重の判定を「登録記録か棚」に |
| 9/22〜23 | 画像の t.co が「URL あり」に数えられた | 本文の URL だけで判定 |
| 9/23 | 長文の投稿が途中までの本文で記帳されていた | 全文を取り直す形に(9/24 朝に2行が置き換わった) |
| 9/23 | 手元でボードを作り直すと weekly.json の履歴が消えた | weekly.json を正本にした |
16件(8月10日〜9月23日)のうち、X API 側の仕様に当たったのは2件(長文・t.co)。残りは全部、自分の作りの順序と保存の問題でした。
月の費用
| 部品 | 9月の費用 | 出どころ |
|---|---|---|
| X API | 12.2ドル(概算) | 読み取り1件 0.005ドル・投稿1本 0.015ドルで数えた値。請求の実額は記録なし。8月は 3.9ドル |
| 画像の送信 | 0(単価が公式表に無い) | 開発者ポータルの課金の行に画像の項目が出ないかを確認中 |
| GitHub Actions | 0 | 9月は47回・合計およそ11分。非公開リポジトリの無料枠の中 |
| Cloudflare Pages・Access | 0 | 無料枠 |
概算は実費ではありません。実費は開発者ポータルの残高の差で測り、計器盤の「月ごとの費用」の行に出します。
部品ごとの役割
| 部品 | 役割 | 置き場 |
|---|---|---|
| ワークフロー x-ops-daily | 毎朝 06:47 の予定で全工程を順に呼ぶ | .github/workflows/ |
| own_posts.py | 自分の投稿を取り込み、手動投稿を棚と照合する | scripts/x_ops/ |
| article_cards.py | 記事を公開したとき、棚に承認待ちのカードを作る | scripts/x_ops/ |
| run.py | 下書きの流れ(いまは停止中で、キューの出力だけ) | scripts/x_ops/ |
| queue_out.py | 下書きをリントに通してキューを作る | scripts/x_ops/ |
| post.py | 棚の承認済みを X に出す(画像1枚まで) | scripts/x_ops/ |
| contacts.py | 自分宛の返信・メンションを取る | scripts/x_ops/ |
| shelf.py | 棚への登録・承認・見送り(人が使う唯一のもの) | scripts/x_ops/ |
| common.py | 支出の概算・リントの橋渡し・URL の判定・画像の検査 | scripts/x_ops/ |
| board.py | 投稿ボード(HTML)を作る | scripts/ |
| 台帳 own_posts_x.json | 自分の投稿の写し。照合の根拠 | data/ |
| 棚 shelf.json | 投稿の予定と結果 | board/ |
| 登録記録 shelf_registered.jsonl | 自動で作ったカードの控え(二重登録を防ぐ) | scripts/x_ops/ |
| 週次 weekly.json | 週ごとの数字の正本 | board/ |
| 受領票 run_receipt.jsonl | 毎朝の成否。失敗しても書く | data/ |
| 支出の概算 x_ops_spend.json | 読み取りと投稿の件数から出す概算 | data/ |
| X API | 読む5つ・書く2つのエンドポイント | 外部 |
| 開発者ポータル | 鍵と残高。実費はここでしか分からない | 外部 |
| Cloudflare Access | 投稿ボードの鍵 | 外部 |
関係する記録
- 連載第2弾(この仕組みを作った時間の順の記録)
- 投稿ボードのツールページ(x-autopost-board)
2026-10-02 更新: 「止まった箇所」の件数を、表の行数に合わせて15件から16件に直しました。
この工場の続きはXで実況しています → @hitoriaifactory