BLOG.HIRO UENO.ART
← index
2026.01.06

402 Payment Required

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 問題が解決したあと、改めて全機能を確認した。

全部動いてる。起動スクリプト(SNSApp.command)もダブルクリックで立ち上がるようにした。Phase 1 の MVP、完成。

投稿ボタンを押すと、本当に X に投稿が出る。チャットで頼んだ文章が、自分のアプリを通ってそのまま世に出る。素直にうれしかった。

ただ、このアプリを「X 投稿管理ツール」で終わらせるつもりはなくて、いずれは Slack やメールの返信まで窓口一つで代行させたい、という構想が頭にある。

そのために次にやるのは MCP 連携。MONET(Claude が動いているメインの会話相手となるオーケストレーター)から SNSApp を呼び出せるようにする。僕は MONET と話すだけで、裏で SNSApp が動いて投稿までやってくれる形。

まずは一本つなぐところから。