目次
- この記事でできるようになること
- 全体の仕組み — 3つのスクリプトの役割
- 事前準備 — X API の開発者登録とキー取得
- H3-3a. 開発者アカウントの登録
- H3-3b. APIキー・トークンの取得(OAuth 1.0a)
- H3-3c. つまずきポイント:App permissions の変更を忘れると 403 エラー
- 5パターンの投稿文をAIで自動生成する(generate_x_posts.py)
- H3-4a. 5パターンの設計意図 — なぜ1記事5投稿なのか
- H3-4b. generate_x_posts.py のコードと動作
- H3-4c. 実際の出力例(Before: 手動告知 → After: 5パターン)
- X API で投稿する(post_x_posts.py)
- H3-5a. tweepy のインストールと認証コード
- H3-5b. 投稿と履歴管理の実装
- H3-5c. 無料プランの制限(月1,500投稿・1日あたりの上限)
- 毎日の投稿を自動化する(daily_x_runner.py)
- H3-6a. daily_x_runner.py の2つのモード
- H3-6b. Windows タスクスケジューラの設定
- H3-6c. 季節別キーワード優先の仕組み
- WordPress 記事の自動取得と連動
- --from-wp オプションで自動取得
- つまずいたことと解決策
- 1. OAuth 権限エラー(403 Forbidden)
- 2. Rate limit(429 Too Many Requests)
- 3. 投稿文の文字数制限
- 4. dry-run を忘れて本番投稿してしまう
- 5. タスクスケジューラのパス問題
- まとめ — 非エンジニアでもここまでできる
- よくある質問
- Q. X APIの無料プランで月に何件まで投稿できますか?
- Q. コードを書けない非エンジニアでもこの仕組みは作れますか?
この記事でできるようになること
ブログ記事を書いたら、コマンドを1回実行するだけ。翌日から1日5回、Xに自動で投稿される仕組みの作り方を紹介します。
完成した状態のイメージはこうです。
- ブログ記事を書いて公開する(またはWordPressに下書きを入れる)
python scripts/generate_x_posts.py --from-wpを実行する- AIが5パターンの投稿文を自動生成する
- Windows タスクスケジューラが毎日 06:50 に今日の投稿キューを組み立てる
- 07:00、12:00、17:00、21:00、23:00 の5時刻にXへ自動投稿される
手動でXに「記事を書きました!→URL」と告知していた頃から比べると、ずいぶん楽になりました。毎日投稿することが義務になっていたし、何を書けばいいかも正直わからなかった。告知するだけじゃ読まれないのもわかっていたけど、毎回5種類の投稿文を考える時間はない。
この仕組みはその矛盾を解決するために作りました。
なお、この記事はブログ自動化の全体像を扱っているピラー記事「AIでブログ運営を自動化する5ステップの全体像」のStep 5、X投稿自動化の深掘り版です。全体像を先に確認したい方はそちらをどうぞ。
全体の仕組み — 3つのスクリプトの役割
この自動化は3つのPythonスクリプトで構成されています。
[ブログ記事]
↓
generate_x_posts.py … 記事本文→AI→5パターンの投稿文を生成・保存
↓
x-drafts/{slug}/B1.md〜B5.md
↓
daily_x_runner.py … 毎日06:50: キューを組み立て today.json に保存
… 07:00〜23:00: 各時刻にスロットを投稿
↓
post_tweet() … tweepy 経由で X API v2 に投稿(post_x_posts.py も同関数を使用)
↓
x-管理.csv … 投稿履歴をCSVに記録(重複防止・90日フィルタ)
generate_x_posts.py は記事の本文と抜粋をAIに渡し、5パターンの投稿文を生成するスクリプトです。ローカルのMarkdownファイルを対象にする方法と、WordPress REST APIから直接記事を取得する方法(--from-wp オプション)の両方に対応しています。
daily_x_runner.py は毎日の自動スケジューラです。2つのモードがあります。--setup-today モードでは、WordPressから全記事を取得し、90日以内に使用していないパターンを持つ記事から5件を選んで today.json に保存します。--post --time HH:MM モードでは、指定した時刻のスロットをXに投稿します。
post_x_posts.py は承認ベースの投稿スクリプトで、x-approved/ フォルダに置いた投稿文を手動承認してから投稿するフローに使います。daily_x_runner.py の全自動フローとは別に、「今すぐこの記事を投稿したい」というときに使います。
事前準備 — X API の開発者登録とキー取得
H3-3a. 開発者アカウントの登録
X APIを使うには、X Developer Portal での開発者アカウント登録が必要です。
- developer.twitter.com にアクセスし、Xアカウントでログイン
- 「Apply for a Developer Account」からフォームに入力(用途説明が必要。「personal use / automation」と正直に書けばOK)
- 承認後、「Create Project」→「Create App」でアプリを作成する
- 作成したアプリの「Keys and Tokens」タブでAPIキーを取得する
Freeプランでも開発者登録は可能です。2026年5月時点では、APIキー取得まで数分〜数時間で通過できることが多いです。
H3-3b. APIキー・トークンの取得(OAuth 1.0a)
X API v2 でツイートを投稿するには OAuth 1.0a User Context が必要です。読み取りだけなら Bearer Token(OAuth 2.0)で足りますが、投稿(POST)には User Context が必須です。
「Keys and Tokens」タブで以下の4つを取得します。
API Key(Consumer Key)
API Key Secret(Consumer Secret)
Access Token
Access Token Secret
これらを .env ファイルに保存します。
X_API_KEY=xxxxxxxxxxxxxxxxxxxxxxx
X_API_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X_ACCESS_TOKEN=xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X_ACCESS_TOKEN_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
スクリプトは python-dotenv でこの .env を読み込みます。.env はGitの管理対象外(.gitignore に追加)にしてください。
H3-3c. つまずきポイント:App permissions の変更を忘れると 403 エラー
ここが一番詰まるポイントです。
Access Token と Access Token Secret を取得するとき、その時点のアプリの権限設定がトークンに焼き込まれます。デフォルトの権限は「Read only」なので、このまま投稿しようとすると 403 Forbidden エラーが出ます。
正しい手順は次のとおりです。
- アプリの「Settings」タブ → 「App permissions」を 「Read and Write」 に変更して保存
- その後、「Keys and Tokens」タブで Access Token と Access Token Secret を 再生成
- 再生成したトークンを
.envに上書きする
既に取得したトークンを使い回しても権限は変わりません。必ず再生成が必要です。これを知らずに1時間溶かしました。
5パターンの投稿文をAIで自動生成する(generate_x_posts.py)
この仕組みの核心です。
H3-4a. 5パターンの設計意図 — なぜ1記事5投稿なのか
「記事を書いたのでぜひ読んでください → URL」という告知投稿。かつてはこれだけやっていました。読まれなかった。
なぜ読まれないかというと、Xのアルゴリズムは今、投稿への滞在時間・エンゲージメントを重視する評価方式に変わっています。「リンクを踏んでくれるかどうか」より「この投稿そのものが価値があるか」を見ている。告知文は「これから外に出てください」という誘導で、X内での滞在時間がゼロです。評価されない。
そこで、同じ記事から5種類の投稿文を作ることにしました。それぞれが異なる角度で記事の価値を切り取り、X上でも読まれる投稿になるように設計しています。
| パターン | ラベル | 役割 |
|---|---|---|
| B1 | 体験入口型 | 書き手の体験・失敗談から入る。「自分も同じ」と感じさせる |
| B2 | 学び直球型 | 記事の主な学びを1〜2行でシャープに伝える |
| B3 | 問いかけ型 | 読者に問いかけて考えさせる。RTされやすい |
| B4 | 余韻型 | 感情に残る一言。思わず保存・いいねされやすい |
| B5 | 記事告知型 | 唯一の告知投稿。5パターンの中の1本だけ |
B5(記事告知型)を5パターンのうち1本だけにしている理由があります。告知は必要だけど、告知だけが並んでいるアカウントはフォローされない。4本はX上で完結する投稿にして、その流れで1本が告知になる。この比率が今のXに合っていると感じています。
また、1記事5パターンを使い切ったら90日間はその記事を投稿対象から外します(XPostHistory クラスで管理)。同じ記事の繰り返しを避けるためです。
H3-4b. generate_x_posts.py のコードと動作
スクリプトの中心部分を見ると、パターンと投稿時刻の対応はこうなっています。
VARIANTS = ["B1", "B2", "B3", "B4", "B5"]
VARIANT_LABELS = {
"B1": "体験入口型",
"B2": "学び直球型",
"B3": "問いかけ型",
"B4": "余韻型",
"B5": "記事告知型",
}
DEFAULT_TIMES = {
"B1": "07:00",
"B2": "12:00",
"B3": "17:00",
"B4": "21:00",
"B5": "23:00",
}
各パターンに対応するプロンプトは prompts/x-post/B1.txt〜B5.txt に保存してあります。テンプレートには {{title}}、{{excerpt}}、{{body}} のプレースホルダーがあり、記事データで置換されます。
実行すると x-drafts/{slug}/ フォルダに B1.md〜B5.md が生成されます。各ファイルは YAML frontmatter + 投稿文の形式です。
---
slug: nurse-psychiatric-ward-real
pattern: B1
label: 体験入口型
status: draft
approved: false
scheduled_time: 07:00
char_count: 138
---
精神科で働き始めたとき、一番戸惑ったのは「身体拘束」の判断だった。
...(投稿文)
H3-4c. 実際の出力例(Before: 手動告知 → After: 5パターン)
AIへの指示(プロンプト)は prompts/x-post/B1.txt などのテキストファイルで管理しています。Claude Code に頼んで作ってもらいましたが、指示の方向性は自分で考えました。
Claude Code への指示例(B1プロンプトを作成したときの実際の依頼文):
prompts/x-post/B1.txt を作成してください。
このプロンプトは、ブログ記事の本文・タイトル・抜粋を受け取り、
「体験入口型」のX投稿文を1件生成します。
制約:
- 全角換算140文字以内(全角1文字・半角0.5文字で計算)
- 「〜してください」「〜しましょう」などの押しつけ語尾を使わない
- URLやハッシュタグは含めない(スクリプト側で管理)
- 記事の内容を正確に反映する(事実にないことを足さない)
体験入口型の定義:
- 書き手の体験・失敗談から入る
- 「自分も同じ」と感じさせる書き出し
- X上で完結する内容にする(外部リンク不要)
プレースホルダー:{{title}}、{{excerpt}}、{{body}} を使う
プロンプトに共通して入れているのは以下の制約です。
- 全角換算140文字以内に収める
- 「〜してください」「〜しましょう」などの押しつけ語尾を使わない
- URLやハッシュタグは含めない(スクリプト側で管理する設計)
- 記事の内容を正確に反映する(事実にないことを足さない)
文字数については、生成後に _count_fullwidth() 関数で全角換算文字数を計算し、超過した場合は最大2回まで自動リトライします。それでも超過する場合は _truncate_to_limit() で末尾カットします。
def _count_fullwidth(text: str) -> float:
count = 0.0
for ch in text:
if unicodedata.east_asian_width(ch) in ("W", "F"):
count += 1.0 # 全角文字
else:
count += 0.5 # 半角文字
return count
Xの文字数カウントは全角1・半角0.5換算なので、この計算でほぼ正確に制限内に収まります。
Before → After:手動告知と自動生成の比較
以前やっていた手動告知はこういう形でした。
【Before:手動告知(B5相当)】
新記事を書きました。
「精神科病棟のリアル|2年間働いて感じたこと」
→ https://ryman-nurse.com/nurse-psychiatric-ward-real/
generate_x_posts.py で同じ記事から5パターンを自動生成すると、こうなります。
【After:B1 体験入口型(自動生成)】
精神科で働き始めたとき、一番戸惑ったのは「身体拘束」の判断だった。
「必要だとわかっていても、なんか違う」という感覚がずっとあった。
2年間働いて、その感覚との折り合いのつけ方が少し変わってきた。
【After:B3 問いかけ型(自動生成)】
精神科の看護師に「向いている人」ってどんな人だと思いますか?
私が2年間いて感じたのは、「感情を持ちながらも巻き込まれない人」だった。
どうやったら巻き込まれずにいられるか、今も試行錯誤中です。
B1は書き手の体験から入り、X上で完結しています。B3は問いかけで始まり、読者が考えるきっかけになる形です。どちらも「記事URLを踏んでください」という誘導はしていない。それでも記事を思い出したときにアクセスしてもらえる投稿になっています。
実行するときのコマンドはシンプルです。
# WordPress の全公開記事を対象に投稿文を生成
python scripts/generate_x_posts.py --from-wp
# WordPress から最新20件だけ処理
python scripts/generate_x_posts.py --from-wp --limit 20
# 特定の記事ファイルを指定して生成
python scripts/generate_x_posts.py done/nurse-first-year-mental.md
# dry-run(AIを呼ばずダミーテキストで動作確認)
python scripts/generate_x_posts.py --from-wp --dry-run
--dry-run フラグは新しい仕組みを試すときに必ず使います。実際にAPIを叩かずに動作確認できます。
5パターンの投稿文設計の詳細と generate_x_posts.py の全コード、各パターンのプロンプトテンプレートは [note で公開しています](リンク追加予定)。
X API で投稿する(post_x_posts.py)
H3-5a. tweepy のインストールと認証コード
まず tweepy をインストールします。
pip install tweepy python-dotenv
x_client.py の認証部分はシンプルです。.env から4つのキーを読み込み、tweepy.Client を初期化します。
import tweepy
import os
from dotenv import load_dotenv
load_dotenv()
client = tweepy.Client(
consumer_key=os.getenv("X_API_KEY"),
consumer_secret=os.getenv("X_API_SECRET"),
access_token=os.getenv("X_ACCESS_TOKEN"),
access_token_secret=os.getenv("X_ACCESS_TOKEN_SECRET"),
)
投稿は1行です。
response = client.create_tweet(text="投稿するテキスト")
tweet_id = str(response.data["id"])
H3-5b. 投稿と履歴管理の実装
post_x_posts.py は手動承認フローで使うスクリプトです。x-approved/ フォルダに置いた投稿文を、スケジュール時刻を確認したうえで投稿し、投稿済みファイルを x-posted/ に移動します。
# 承認済みの未投稿分を全て投稿
python scripts/post_x_posts.py
# dry-run(実際には投稿しない)
python scripts/post_x_posts.py --dry-run
# 特定のslugだけ投稿
python scripts/post_x_posts.py --slug nurse-psychiatric-ward-real
# 投稿済み一覧を表示
python scripts/post_x_posts.py --status
投稿後は x-posted/{slug}/meta.json に投稿履歴が記録されます。
{
"slug": "nurse-psychiatric-ward-real",
"title": "精神科病棟のリアル",
"posted_variants": {
"B1": {
"label": "体験入口型",
"x_post_id": "1234567890123456789",
"posted_at": "2026-05-07T07:00:15.123456+09:00",
"status": "posted",
"dry_run": false
}
}
}
この記録が、90日フィルタリングの根拠になります。
H3-5c. 無料プランの制限(月1,500投稿・1日あたりの上限)
2026年5月時点の X API Free プランの制限です。
| 項目 | Freeプラン | Basicプラン($200/月) |
|---|---|---|
| 月間投稿数 | 1,500件 | 10,000件 |
| アプリあたりの月間投稿 | 1,500件 | — |
| 読み取り(GET) | 制限あり | より多め |
個人ブログ1サイトで1日5投稿 × 30日 = 月150投稿。無料枠(1,500件)の10分の1で収まります。Freeプランで十分です。
複数サイトを同じアプリで運用したり、generate_x_posts.py で大量に下書き生成するとAPIコールが増えますが、POST(投稿)だけが月1,500件の制限対象です。GET(取得)も制限はありますが、1日1回の load_wp_articles() 呼び出し程度であれば引っかかったことはありません。
毎日の投稿を自動化する(daily_x_runner.py)
この仕組みの一番のポイントは「放置して回る」ことです。
H3-6a. daily_x_runner.py の2つのモード
--setup-today モード(毎日06:50に実行)
- WordPress REST API から全公開記事を取得
XPostHistoryクラスで投稿履歴を確認し、90日以内に使用したパターンを除外- 季節性スコア(春→新人・就職系、秋→転職・異動系)と記事の新しさでソート
- 上位から5件を選び、B1〜B5パターンに割り当て
x-schedule/today.jsonに保存
{
"date": "2026-05-07",
"generated_at": "2026-05-07T06:50:01.234+09:00",
"dry_run": false,
"schedule": {
"07:00": {
"slug": "nurse-first-year-mental",
"title": "新人看護師のメンタルを守る...",
"pattern": "B1",
"label": "体験入口型",
"text_preview": "新人の頃、夜勤明けに泣きながら帰った...",
"posted": false
},
"12:00": { ... },
"17:00": { ... },
"21:00": { ... },
"23:00": { ... }
}
}
--post --time HH:MM モード(各投稿時刻に実行)
x-schedule/today.jsonの対応スロットを読む- 対応する
x-drafts/{slug}/{pattern}.mdから投稿文を取得 post_tweet()でX APIに投稿x-管理.csvに投稿履歴を記録
H3-6b. Windows タスクスケジューラの設定
タスクスケジューラで6つのタスクを登録します。コマンドプロンプトで taskschd.msc を実行するか、スタートメニューから「タスクスケジューラ」を開いてください。
各タスクの設定は以下のとおりです。
| タスク名 | 実行時刻 | コマンド |
|---|---|---|
| x_setup_today | 06:50 | python C:\path\to\blog-automation\scripts\daily_x_runner.py --setup-today |
| x_post_0700 | 07:00 | python ... daily_x_runner.py --post --time 07:00 |
| x_post_1200 | 12:00 | python ... daily_x_runner.py --post --time 12:00 |
| x_post_1700 | 17:00 | python ... daily_x_runner.py --post --time 17:00 |
| x_post_2100 | 21:00 | python ... daily_x_runner.py --post --time 21:00 |
| x_post_2300 | 23:00 | python ... daily_x_runner.py --post --time 23:00 |
タスクの新規作成手順(GUIで操作する場合):
- 「基本タスクの作成」をクリック
- 名前に
x_setup_todayなど入力 → 次へ - トリガー:「毎日」→ 時刻を設定(06:50など)→ 次へ
- 操作:「プログラムの開始」→ 次へ
- プログラム/スクリプト:
python(またはPythonの絶対パス) - 引数:
C:\Users\<username>\blog-automation\scripts\daily_x_runner.py --setup-today - 開始場所:
C:\Users\<username>\blog-automation(スクリプトの作業ディレクトリ)
タスクスケジューラで詰まった点: 「引数にパスを直接書く」のではなく、「開始場所(作業ディレクトリ)を設定する」必要があります。作業ディレクトリを設定しないと、スクリプトが .env ファイルを見つけられず ValueError で落ちます。
設定後、「今すぐ実行」でテストしてください。エラーが出た場合は、タスクを右クリック → 「履歴」でエラーメッセージを確認できます。
H3-6c. 季節別キーワード優先の仕組み
daily_x_runner.py は記事の優先度を月ごとに変えます。
SEASONAL_KEYWORDS = {
(3, 4): ["新人", "就職", "1年目", "入職", "新卒", "始め"],
(10, 11): ["転職", "異動", "キャリア", "辞め", "転", "移"],
(1, 2): ["国家試験", "試験", "燃え尽き", "疲れ", "やめた"],
}
3月・4月は新人・就職系の記事が優先的に選ばれ、10月・11月は転職・異動系が優先されます。これはスコアに +10 点加算されるだけなので、候補記事が少ない場合は通常の記事が選ばれます。
WordPress 記事の自動取得と連動
--from-wp オプションで自動取得
generate_x_posts.py --from-wp を実行すると、WordPress REST API から全公開記事を自動取得します。
内部では utils/wp_loader.py の load_wp_articles() 関数を呼び出しており、WordPress のサイトURL と認証情報を .env で設定しておく必要があります。
WP_SITE_URL=https://ryman-nurse.com
WP_USERNAME=your_username
WP_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
WordPress のアプリケーションパスワードは「ユーザー」→「プロフィール」→「アプリケーションパスワード」から生成できます。
publish_post.py(記事公開スクリプト)と組み合わせると、記事を公開した直後に --from-wp を呼び出して X投稿文を生成するフローも作れます。
# 記事公開
python scripts/publish_post.py drafts/articles/nurse-first-year-mental/
# 公開直後にX投稿文を生成
python scripts/generate_x_posts.py --from-wp --limit 1
WordPress 自動投稿の詳しい実装については、「Claude Code で WordPress 自動投稿を実装する方法」で解説しています。
つまずいたことと解決策
実際に詰まったポイントを5つ書きます。
1. OAuth 権限エラー(403 Forbidden)
前述のとおり、App permissions を「Read and Write」に変更した後で Access Token を再生成する必要があります。変更前に生成したトークンは「Read only」のままです。
エラーメッセージ:
tweepy.errors.Forbidden: 403 Forbidden
453 - You currently have Essential access which includes access to Twitter API v2 endpoints only.
または
tweepy.errors.Forbidden: 403 Forbidden
187 - Status is a duplicate.
権限が不足していると、このようなエラーが出ます。Developer Portal の App Settings を確認して、権限変更→トークン再生成をやり直してください。
2. Rate limit(429 Too Many Requests)
無料プランには1日あたりの投稿数制限もあります。短時間に大量テストをすると引っかかります。
--dry-run フラグを使えば実際のAPI呼び出しをせずに動作確認できます。本番テストの前に必ず dry-run で動作確認する習慣をつけると、制限に引っかかるリスクが減ります。
python scripts/daily_x_runner.py --setup-today --dry-run
python scripts/daily_x_runner.py --post --time 07:00 --dry-run
3. 投稿文の文字数制限
Xの文字数制限は「全角1文字=2文字、半角1文字=1文字」で数えるサービス側の仕様と、「全角1・半角0.5」で換算して140が上限というAI生成側の数え方が混在してわかりにくいです。
スクリプトでは全角換算140文字を上限として _count_fullwidth() で計算しています。日本語メインの投稿なら実際の140文字制限にほぼ対応できています。URLを含む場合はt.coで短縮されるため23文字として扱われますが、このスクリプトはURLをAI生成に含めない設計のため問題になりません。
4. dry-run を忘れて本番投稿してしまう
動作確認のつもりでオプションをつけ忘れ、実際に投稿されてしまったことがあります。テスト中は必ず --dry-run をつける、という習慣を守るしかないです。
--status オプションで投稿済み履歴を確認できるので、事後確認にも使えます。
python scripts/post_x_posts.py --status
5. タスクスケジューラのパス問題
タスクスケジューラはデフォルトで C:\Windows\System32 を作業ディレクトリとして実行します。スクリプトが .env や x-schedule/ を相対パスで参照している場合、このディレクトリから探しに行ってしまい、ファイルが見つからないエラーになります。
解決策は2つです。
方法1: タスクスケジューラの「開始(オプション)」欄にスクリプトの作業ディレクトリを設定する(推奨)
方法2: Path(__file__).resolve().parent.parent のように、スクリプトファイルの位置を基準に絶対パスを解決する(スクリプト内で処理)
このプロジェクトのスクリプトは方法2で書かれていますが、念のため方法1も設定しておくと安心です。
まとめ — 非エンジニアでもここまでできる
正直に書きます。このスクリプトのコードは、ほぼ全てClaude Codeが書いてくれました。自分でPythonを書いたわけではありません。やったのはコマンドを実行することと、「こういう仕組みにしたい」という要件を伝えることです。
それでも仕組みは回っています。毎朝起きるとXに投稿が出ている。自分が寝ている間に、ブログ記事の内容をXで届けてくれている。
この仕組みを作るまで、X投稿は「やるべきだけど続かない作業」でした。毎日告知文を考えるのが嫌だったし、告知だけ続けてもエンゲージメントが上がらないのも感じていた。5パターン設計はその問題を解決するためのものです。
現在の投稿実績として、1ブログで月150本前後(1日5本 × 30日)のX投稿が完全自動で出ています。全て無料枠の範囲内です。
generate_x_posts.py の5パターン投稿設計の全コードと、各パターンのプロンプトテンプレートは [note で公開しています](リンク追加予定)。コードを手元で動かしたい方は、そちらを参照してください。
自動化の全体像については「AIでブログ運営を自動化する5ステップ」で紹介しています。X投稿の自動化はその Step 5 ですが、他の4ステップと組み合わせると「記事公開 → X告知 → WordPress管理」が全部自動になります。
また、「ブログ作業を自動化した10のこと」では、X投稿以外に何を自動化したかをまとめています。
よくある質問
Q. X APIの無料プランで月に何件まで投稿できますか?
2026年5月時点では、Freeプランで月1,500件(投稿)が上限です。Basicプラン(月$200)に上げると月10,000件になります。
個人ブログ1サイトで1日5投稿を毎日続けると、月150件(5 × 30日)。無料枠(1,500件)の10分の1で十分収まります。個人ブロガーが1サイトを運用するなら、Freeプランで問題ありません。複数のブログを1アカウントで運用したり、generate_x_posts.py で大量に一括生成するような使い方をするなら Basicを検討してください。
Q. コードを書けない非エンジニアでもこの仕組みは作れますか?
Pythonの実行環境(Python 3.10以上)とX APIキーの取得さえできれば、コードは全てClaude Code等のAIに書いてもらえます。
私自身が看護師でエンジニアではなく、このスクリプトの全コードをClaude Codeに依頼して作ってもらいました。自分がやったのはコマンドを実行することと、動かない部分のエラーメッセージをClaude Codeに見せて直してもらうことです。「Pythonを書ける」ではなく「Pythonを実行できる」が最低ラインです。Python の実行環境のセットアップで詰まる場合は、Claude Code に「Windows に Python をインストールする手順を教えて」と聞くのが早いです。
同じように「X投稿が続かない」「告知だけの投稿になってしまう」と感じている方がいたら、この仕組みが参考になれば嬉しいです。まずは --dry-run で動かしてみてください。
関連 note 記事
「コードが読めない看護師が、ブログの自動投稿を作るまでにやったこと」を note で書いています。X 自動投稿に至る前の物語。
