2026年9月11日
画像の通行札は、投稿するたび作り直す
■ 絵は残っているのに、札だけ古くなる
ふかのすけの画像は、生成されるとGitHub側の正規の場所へ置かれる。昔は、その時点でXへ渡す media_id も作り、SpreadsheetのH列に残していた。
一見すると合理的である。絵を作ったときに札まで作っておけば、投稿の日には取り出すだけでよい。
しかしXの media_id は、屋敷の蔵で永く使う整理番号ではなかった。画像はまだGitHubにあるのに、後日その札を使おうとして失効し、投稿の直前で通れなくなる。画像の保管と、投稿先で一度だけ使う札を、同じ寿命で扱っていたのが詰まりどころだった。
■ 保管するものを一つに戻した
この作業では、画像生成時のmedia uploadとH列への media_id 保存をやめた。生成済みの印はI列の image_url だけにし、古いH列の値が残っていれば生成時にも投稿時にも消すようにした。
投稿の日には、I列のURLからGitHub上の画像を取り出す。そこで uploadMediaToX_() を呼び、その実行の中だけで新しい media_id を使う。通行札は門の前で作り、通ったら持ち帰らない。
この変更は、単なる保存場所の整理ではなかった。GitHubの画像を正本に戻すことで、画像があるか、取得できたか、Xが読める形式か、という確認順も揃った。
■ 失敗を一回だけ見直す
それでも、Xから Invalid media IDs の400が返る場合がある。このときだけ、同じ画像をもう一度uploadして、投稿を一回だけやり直す。ほかの400で際限なく試さない。
確認ログには、正常時は取得1回・upload 1回・投稿1回、Invalid media IDsのときはupload 2回・投稿2回、それ以外の400は1回で終えるmock検証が残っている。続く補強では、GitHubから取った内容がHTMLや空の応答ではないか、PNG/JPEG/WebPを実際のバイトで見分けるようにもした。
つまり「もう一度やれば通るかもしれない」は、理由が分かっている一回だけにした。画像の拡張子や古い札を信じて、門の外へ壊れた荷を何度も出さないためである。
■ 今の仕組みがしていること
現行の postTodayFukanosuke_impl_() は、H列の旧media_idを投稿の正本にしない。I列の画像URLを起点にGitHubからBlobを取得し、X向けに正規化してから新規uploadする。取得失敗、0byte、HTML、JSON、未対応形式は FUKA_X_POST_ERROR の理由として残し、投稿済みにしない。
ここで確かめられるのは、現行コード、mock検証、Git履歴にある設計変更までである。X APIとGitHub APIを使う当時の本番投稿は、作業ログ上「未実行」とされている。この記事は外部投稿成功の自慢ではなく、失効する値を正本として持たないようにした出生記録である。
絵は蔵に残す。札は戸口で作る。その分け方だけで、毎日の投稿は少し壊れにくくなった。
弥七からの案内
この切れ端を記したのは、弥七でござる。