Windowsで作業していた環境をMacに引っ越してきて、さあ何から始めようか、というタイミング。最初に作り始めたのがSNSApp。X(旧Twitter)の投稿を管理して、AIが下書きを作ってくれるアプリ。名前はそのまんま。
メモリ管理やタスク管理みたいな「重要だけど地味」なものより、すぐ動いて効果が見えるものを最初に作りたかった。新しい環境で勢いをつけたい、という気分もあったと思う。
構成はそんなに迷わなかった。React+Pythonの組み合わせは前から頭の中にあった通り。フロントは React + Vite で3画面。投稿一覧、チャット、設定。バックエンドは Python(Quart)の app.py、データベースは SQLite(db.py)。X API との通信は Tweepy を使った x_client.py、下書きの生成は Claude Agent SDK を使った ai_generator.py。
コーディングしてくれている Claude Code(以降 Code)と一緒に進めて、短期間で動くものができた。特にどこかで詰まった感覚はない。
目指している流れは一本。チャット画面で「この話題で書いて」と言うと下書きが出てくる。気になるところを直して、投稿ボタンを押すと X に飛ぶ。
下書きの生成まではもう動いてる。残りは X への実投稿だけ。
投稿ボタンを押した。
402 Payment Required
Your enrolled account [2008511363140980736] does not have any credits to fulfill this request.
402・・・。HTTP のステータスコードとしての 402(Payment Required)は「支払いが必要」という意味だけど、実際にはほとんど使われてないコード。それが X API から返ってきた。
最初は自分たちの実装を疑った。でも認証は通ってる。get_me() でユーザー名も取れてる。API キーも合ってる。なのに投稿だけが通らない。
Code に調べてもらうと、PPU モード(Pay-Per-Use)の問題らしい。X API のアカウントの課金状態によっては、API キーが有効でも投稿できない構成になっているとのこと。
コードのバグじゃなくて、X 側の課金の仕様。こっちで書いたものは全部動いてるのに、最後の一歩だけが向こうの都合で通らない。バグなら Code と直せばいいけど、これはアプリの外側の話。ちょっと拍子抜けだった。
PPU 問題が解決したあと、改めて全機能を確認した。
- AI 投稿文生成(Claude Agent SDK)
- チャット(ストリーミング対応)
- 下書きの作成・削除
- X API 認証(
get_me()でユーザー名取得まで確認) - X への実投稿
全部動いてる。起動スクリプト(SNSApp.command)もダブルクリックで立ち上がるようにした。Phase 1 の MVP、完成。
投稿ボタンを押すと、本当に X に投稿が出る。チャットで頼んだ文章が、自分のアプリを通ってそのまま世に出る。素直にうれしかった。
ただ、このアプリを「X 投稿管理ツール」で終わらせるつもりはなくて、いずれは Slack やメールの返信まで窓口一つで代行させたい、という構想が頭にある。
そのために次にやるのは MCP 連携。MONET(Claude が動いているメインの会話相手となるオーケストレーター)から SNSApp を呼び出せるようにする。僕は MONET と話すだけで、裏で SNSApp が動いて投稿までやってくれる形。
まずは一本つなぐところから。