spacevision

ガジェット好きのアマチュアサイクルフォトグラファー

X API Free廃止後に、個人のAI投稿botを立ち上げた夜

X Premiumの収益化に向けて、@spacevision の運用を少し見直すことにした。

90日で500万インプレッション、Verified followers 500人。数字だけ見ると、なかなか大きい。気合いで毎日投稿するだけでは、たぶん続かない。では、RSSを読み、投稿候補を作り、自分が最後に承認して投稿するところまでを、AIで軽くできないだろうか。

そんなことを考えて、今日はX用の自動投稿botを一気に組んでいた。

結果からいうと、動いた。RSSから投稿候補を作り、Discordで番号を選び、X API v2で投稿するところまで行けた。

ただし、その途中で「X API Free Planはもうない」という現実に正面からぶつかった。

これは、個人でX botを作ろうとしている人ほど、早めに知っておいたほうがいい話だと思う。

無料で始めるつもりが、最初の壁だった

最初は、以前作ったDeveloper Appを使えば、そのまま投稿できると思っていた。

ところが、POST /2/tweets を叩くとエラーになる。

403 App not attached to a Project

Developer Consoleを見ると、古いAppが「Free [DEPRECATED]」のような扱いになっていた。画面上ではAppがある。キーもある。トークンもある。なのに、APIから見るとProjectに紐づいていない。

最初は設定ミスだと思った。

でも調べていくと、X APIは2026年2月以降、Free PlanからPay-per-useへ移行していた。X公式ドキュメントでも、現在のX APIはpay-per-usage pricingとして説明されている。

「無料の範囲でなんとかする」つもりだったので、ここで一度止まった。

正直、今日はここまでかなと思った。

ただ、そこで終わるには少し惜しかった。今日の熱量があるうちに、実際に動くところまで持っていきたい。そう思って、「無料死守」から「個人で納得できる範囲なら払う」へ切り替えた。

この切り替えが、今日の山場だった。

Pay-per-useは安いが、油断はできない

X APIのPay-per-useは、月額固定ではなく、API利用ごとにクレジットが減る仕組みだ。公式Pricingでは、2026年5月18日時点で、書き込み系は次のように案内されている。

操作 公式Pricing上の単価
Content: Create $0.015 / request
Content: Create (with URL) $0.200 / request
Interaction: Delete $0.010 / request

作業中に見ていた情報では「投稿1件あたり$0.010」という理解で進めていたが、少なくともこの記事を書いている時点の公式表では、通常投稿は$0.015、URL付き投稿は$0.200になっている。

ここは大事だ。

たとえば、1日5投稿、月150投稿なら、本文だけの投稿は単純計算で約$2.25になる。

150 posts x $0.015 = $2.25 / month

一方で、元記事URLを本文に入れる投稿を150件作ると、URL付き投稿扱いで約$30になる可能性がある。

150 posts x $0.200 = $30.00 / month

個人の実験としては、前者ならかなり軽い。後者になると、ちゃんと運用設計を考えたくなる金額だ。

その意味で、今回の設計では「本文投稿」と「元記事URL」を分けた。

post_with_source という形にした

作った投稿関数は、post_with_source という形にした。

動きは単純だ。

メイン投稿
  ↓ 5秒待つ
自己リプライで元記事URLを添付

メイン投稿には、読み手に届けたい文だけを書く。外部リンクは入れない。元記事URLは、必要な人が辿れるように自己リプライで付ける。

理由はふたつある。

ひとつは、X上で外部リンク入り投稿が伸びにくくなる可能性を考えたこと。これはアルゴリズムの中身が公開されているわけではないので断定はしないが、運用者の体感としてはよく語られる話だ。

もうひとつは、AIが生成した投稿の透明性を残すためだ。今回のbotでは、元記事URLとは別に、必要に応じて次のような自己リプライも付ける。

↑AI下書き / 本人承認

最初は「以上はしもとAIの自動投稿でした」のような文言も考えた。けれど、これは少しロボット感が強い。読んだ人にとっては、投稿本文よりも「AIが出てきた」印象が前に出てしまう。

そこで、事実だけを軽く出す表現にした。

AIが下書きし、本人が承認する。

この距離感が、今の自分には合っている。

Discordで「1」と打つと投稿される

今回の運用は、完全自動ではない。

流れはこうだ。

RSS 27ソース
  → Ollama + Gemma 4で日本語投稿候補を生成
  → Discord Botに候補を表示
  → 私が番号で承認
  → X API v2で投稿
  → 元記事URLを自己リプライ

国内RSSだけでなく、海外メディアも追加した。Cyclingnews、inrng、PezCyclingNews、CyclingWeekly、VeloNews、Bicycling.comあたりだ。

海外記事を日本語にするだけなら、ただの翻訳botになってしまう。そこでプロンプトには、機械翻訳調を避けるためのルールを入れた。

【言語処理】
- 英語記事は、まず内容を理解する
- 日本語読者に伝わる順番へ組み替える
- 直訳ではなく、spacevision本人の関心に寄せる
- 不明点や断定できない数字は断定しない

たとえば、海外で「ツール・ド・フランスが英国で無料放送」というニュースを見たとき、最初に思ったのは「日本も無料なのかな」だった。

この素朴な疑問は、機械翻訳だけでは出てこない。

海外メディアを読む価値は、情報が早いことだけではない。日本の読者が引っかかるポイントに、自分の言葉で橋をかけられることだと思う。

AIに任せすぎないための一手間

今回いちばん迷ったのは、技術よりも文言だったかもしれない。

AIが作った投稿を、どこまで自分の発信として扱うのか。

全部AI任せにすると、自分のアカウントなのに温度が消える。逆に、全部自分で書くなら、そもそもbotを作る意味が薄い。

そこで、役割を分けた。

AIは、RSSを読み、候補を作る。私は、最後に見る。良ければ番号を選ぶ。違和感があれば捨てる。

この「捨てられる」ことがかなり大事だ。

自動化というと、どうしても最後まで勝手に動く仕組みを作りたくなる。でも、個人の発信では、最後の承認を残したほうが安心できる。Xの自動化ルールでも、アカウントで行われる自動動作に対してユーザー自身が責任を持つことが明記されている。

だから、今回のbotは「自動投稿bot」と言いつつ、実際には「AI下書き + 本人承認bot」に近い。

このくらいが、長く使うにはちょうどいい気がしている。

小さな失敗もあった

勢いで作っていると、当然ミスも出る。

今日は、secretsファイルとexampleファイルを取り違えた。幸い、gitリポジトリに公開したわけではなく、外に漏れたものもなかったので実害はない。

ただ、かなり良くないミスだ。

APIキー、Bot Token、Webhook URL、Access Token。こういうものは、慣れてきた頃がいちばん危ない。今回の件で、改めて「credentialは環境変数か安全な場所に置く」「exampleには絶対に本物を書かない」を徹底しようと思った。

X公式のGetting Accessでも、credentialはソースコードに直書きせず、gitにコミットしないことが推奨されている。

当たり前の話だけれど、当たり前ほど作業中に抜ける。

今日、実際に投稿できたもの

最終的に、Discordから番号を選んでX投稿まで走るところを確認できた。

公開済みの投稿例はこれ。

まだ始めたばかりなので、これで正解とは言えない。Discordでの承認UXが本当に日常運用に合うかも、数日使ってみないと分からない。

ただ、「RSSを読む」「候補を作る」「自分が選ぶ」「投稿する」という一連の流れがつながったのは大きい。

これで、X運用が少しだけ作業ではなくなる。

次は、運用で確かめる

今日作ったものは、まだ初期型だ。

次に見るべきことは、はっきりしている。

  • 1日あたりの投稿数とコスト感
  • URL付き投稿をどう扱うか
  • 「AI下書き / 本人承認」の表示が読者にどう見えるか
  • 海外メディア由来の投稿が、日本の読者に届くか
  • Premium Analyticsで見たとき、どの投稿が実際に伸びるか

90日後、つまり2026年8月14日ごろには、Premium収益化に向けた最初の判定ができるはずだ。

そこまでに、ただ投稿数を増やすのではなく、自分の言葉として続けられる形にしていきたい。

AIで発信を置き換えるのではなく、発信の入口を軽くする。

ブログのAI編集部も、XのAI投稿botも、たぶん同じ考え方でつながっている。

最後に押すボタンは、自分で押す。そのために、そこまでの道をAIに手伝ってもらう。

しばらく、この形で走らせてみる。

Xでも実験の途中経過を出していくので、よければ @spacevision もフォローしてください。

主要リンク