最近、Claudeのトークン消費がかなり大きくなってきたので、もう少し効率的な回し方ができないかを考えていた。試しにClaudeに相談してみると、「セッションを新しくすれば消費は軽くなる」と言われた。実際にやってみると確かに違った。会話が長くなっていくほど重くなる感覚は前からあったので、これは素直に納得できた。
その流れで、「執筆以外はもっとCodexに任せられるのではないか」と考えるようになった。Claudeはやはり記事本文の仕上がりが素晴らしい。一方で、素材整理、レビュー、WordPress投稿、カテゴリー設定、X投稿といった周辺作業はCodexのほうが向いている場面も多い。実際、WordPressへの投稿もカテゴリー分けまでほぼ自動で回せるようになってきて、かなり便利になった。
今日は、これまでClaudeに任せていたXへの投稿を、Codexにもお願いできるようにしようと思って作業を進めた。
WordPressへの下書き投稿、SEO設定、アイキャッチ画像の設定まではCodexでかなり安定して動くようになってきたので、次はX投稿も同じ流れで自動化したいと考えた。記事を書き、最終稿を作り、WordPressに入れ、最後にXへ流すところまで一気通貫で回せればかなり便利になる。
ところが、実際にやってみると最初の壁は文字化けだった。Codex経由でXに投稿すると、日本語が ? だらけになってしまった。最初はX APIの問題かと思ったが、原因を調べると、PowerShell 5.1 から外部コマンドに日本語を渡すときのエンコーディングが us-ascii になっており、Pythonに渡る前に文字が壊れていた。ここは、投稿文をいったんUTF-8の一時ファイルに保存し、それをPythonで encoding='utf-8' で読んで送る方式に変えることで解決した。

日本語が正常に投稿できるようになって、次に気になったのがサムネイル画像だった。ポスト自体は成功し、リンクも正しく開けるのに、X上で記事カードの画像だけが出ない。最初は「Codexで投稿したときだけ画像が出ず、Claudeで投稿すると出る」ように見えたので、Codex側の投稿文や投稿方法に問題があるのではないかと疑った。

そこで、まず疑ったのは投稿文の違いだった。URLの前後に余分な空白や改行がないか、ハッシュタグの位置に問題がないか、APIへの送り方が json= になっているかなどを確認した。ところが、リンクは正しく認識されていて、投稿文自体にも大きな問題は見つからなかった。
次に記事ページ側を確認したところ、少し重要なことが分かった。twitter:image には記事のアイキャッチ画像が入っているのに、og:image にはサイトロゴが入っていたのである。つまり、X向けの画像タグとOpen Graph向けの画像タグが一致していなかった。これでは、Xがカードを作るタイミングや読み方によって、画像を拾えたり拾えなかったりしてもおかしくない。
そこで、AIOSEOのソーシャル設定を見直した。X側はすでにアイキャッチ画像を使う設定になっていたので、Facebook/Open Graph側も「デフォルトの投稿画像ソース」をアイキャッチ画像に変更した。さらに、該当記事を開き直して保存し直し、公開記事ページのHTMLを再確認した。

保存し直した後は、twitter:imageand og:image の両方が同じアイキャッチ画像URLを指すようになっていた。画像URL自体も 200 OK で返ってきていたので、少なくとも記事ページ側の設定は正常化したと判断できた。
その状態で再度Xに投稿してみたところ、投稿直後は相変わらずサムネイル画像が表示されなかった。しかし、ここで終わらせずに、記事ページのメタ情報を再確認し、別の記事でも同じ状態かを見て、Xの反映時間差まで含めて検証した。すると、しばらく時間を置いたあとにサムネイル画像はきちんと表示された。しかも、同じような現象はBloombergなど大手メディアのポストでも見かけることがある。ここまで来ると、今回の主因は「Codexだから画像が出ない」という話ではなく、X側のカード生成やキャッシュのタイミングによる揺れが大きいと考えるのが自然だった。
つまり、この問題は完全な不具合というより、「ページ側のOGP設定を揃えたうえで、最後はX側の反映待ちになる」という性格のものだった。原因が見えないままだと不安になるが、切り分けていくと、こちらで直せる部分と直せない部分がはっきり分かれていたのは大きかった。
今回の件で、自分なりに整理できたポイントは3つある。
1. まず文字化けとカード画像は別問題
最初の文字化けは、完全にこちらの送信経路の問題だった。PowerShellのエンコーディングで壊れていたので、UTF-8ファイル経由に変えれば直った。一方、サムネイル画像が出ない問題は、投稿文の文字コードとは別の話だった。
2. 記事ページ側では `twitter:image` と `og:image` を揃えたほうがよい
X向けの設定だけ合っていても、Open Graph側がロゴのままだと挙動が不安定になりやすい。実際、今回もOpen Graph側をアイキャッチ画像に揃え、記事を保存し直したことで、少なくともページ側の原因はかなりつぶせた。
3. それでも最後はX側のタイミングに左右される
記事ページ側が正しくても、投稿直後に画像が出ないことはある。少なくとも今回の経験では、投稿してすぐに結論を出すより、数分からしばらく時間を置いてから見るほうがよさそうだ。
今後、CodexにX投稿を任せるときは、次の順番で確認するとよいと思っている。
- 記事ページで `twitter:image` と `og:image` が同じアイキャッチ画像になっているか見る
- 画像URL自体が正常に返るか確認する
- 投稿文のURLが正しく入っているか確認する
- 投稿直後に画像がなくても、少し時間を置いて再確認する
ClaudeとCodexの違いというより、記事ページのOGP設定とX側のタイミングの掛け算で起きる問題だと分かっただけでも、今回の検証には意味があった。自動化は便利だが、SNSカードのように相手側のキャッシュに依存する部分は、最後まで自分の支配下に置けない。そのことを、実際に手を動かして確認できた一日だった。
同時に、運用全体の見直しとしてはかなり収穫があった。Claudeには執筆を中心に任せ、Codexには素材整理、レビュー、投稿、運用まわりを多く任せる。その役割分担はかなりうまくいきそうだ。ただし、当然ながらCodexを使えばCodex側の消費も増える。Claudeの消費を減らせばすべて解決するわけではなく、今度はCodexも含めて全体をどう回すかを考えなければならない。便利になったからこそ、どこに何を任せるかを意識して運営する必要がある。今日は、そのことまで含めて整理できた一日だった。

