前の記事では、CSVから投稿文を読み込み、X APIを使って1件投稿するコードを作りました。
ただし、そのままでは毎回手動で実行する必要があります。
X運用を効率化するには、決まった時間に自動で投稿される仕組みが必要です。
この記事では、Antigravityを使ってX自動投稿を予約投稿に発展させる方法を解説します。
予約投稿に必要な考え方
予約投稿を作るには、投稿文ごとに「いつ投稿するか」を管理する必要があります。
そのため、posts.csvに投稿予定時刻の列を追加します。
id,text,status,scheduled_at,posted_at
1,朝の投稿です。,ready,2026-04-28 08:00:00,
2,昼の投稿です。,ready,2026-04-28 12:00:00,
3,夜の投稿です。,ready,2026-04-28 20:00:00,
このように、scheduled_atを追加します。
プログラム側では、現在時刻とscheduled_atを比較し、投稿予定時刻を過ぎているものだけを投稿します。
予約投稿の処理の流れ
予約投稿の流れは次の通りです。
1. posts.csvを読み込む
2. statusがreadyの投稿を探す
3. scheduled_atが現在時刻以前か確認する
4. 条件に合う投稿を1件投稿する
5. 成功したらstatusをpostedに変更する
6. posted_atに投稿日時を入れる
この仕組みにすれば、投稿予定時刻になっていない投稿はスキップできます。
requirements.txtを更新する
定期実行にはscheduleというライブラリを使います。
requirements.txtを次のようにします。
requests
requests-oauthlib
python-dotenv
schedule
追加後、次のコマンドを実行します。
pip install -r requirements.txt
post_to_x.pyを予約投稿対応にする
post_to_x.pyを次のように変更します。
import csv
import os
from datetime import datetime
from dotenv import load_dotenv
from requests_oauthlib import OAuth1SessionPOSTS_CSV = "posts.csv"def load_env():
load_dotenv() api_key = os.getenv("X_API_KEY")
api_secret = os.getenv("X_API_SECRET")
access_token = os.getenv("X_ACCESS_TOKEN")
access_token_secret = os.getenv("X_ACCESS_TOKEN_SECRET") if not all([api_key, api_secret, access_token, access_token_secret]):
raise ValueError(".envに必要なX APIキーが設定されていません。") return api_key, api_secret, access_token, access_token_secretdef load_posts():
with open(POSTS_CSV, mode="r", encoding="utf-8-sig", newline="") as file:
reader = csv.DictReader(file)
return list(reader)def save_posts(rows):
fieldnames = ["id", "text", "status", "scheduled_at", "posted_at"] with open(POSTS_CSV, mode="w", encoding="utf-8-sig", newline="") as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(rows)def get_due_post(rows):
now = datetime.now() for row in rows:
if row["status"] != "ready":
continue scheduled_at = datetime.strptime(row["scheduled_at"], "%Y-%m-%d %H:%M:%S") if scheduled_at <= now:
return row return Nonedef post_to_x(text):
api_key, api_secret, access_token, access_token_secret = load_env() oauth = OAuth1Session(
api_key,
client_secret=api_secret,
resource_owner_key=access_token,
resource_owner_secret=access_token_secret,
) response = oauth.post(
"https://api.x.com/2/tweets",
json={"text": text}
) if response.status_code not in [200, 201]:
raise Exception(f"投稿に失敗しました: {response.status_code} {response.text}") return response.json()def run_once():
rows = load_posts()
post = get_due_post(rows) if post is None:
print("投稿予定時刻を過ぎた投稿はありません。")
return print(f"投稿します: {post['text']}") result = post_to_x(post["text"])
print("投稿成功:", result) for row in rows:
if row["id"] == post["id"]:
row["status"] = "posted"
row["posted_at"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
break save_posts(rows)
print("CSVを更新しました。")if __name__ == "__main__":
run_once()
このコードでは、現在時刻を取得して、scheduled_atと比較しています。
if scheduled_at <= now:
return row
これにより、投稿予定時刻を過ぎた投稿だけが対象になります。
scheduler.pyを作る
次に、定期的にrun_once()を実行する scheduler.pyを作ります。
import time
import schedule
from post_to_x import run_oncedef job():
print("投稿チェックを実行します。")
run_once()schedule.every(1).minutes.do(job)print("X自動投稿スケジューラーを開始しました。")while True:
schedule.run_pending()
time.sleep(1)
このコードは、1分ごとに投稿予定のチェックを行います。
投稿予定時刻を過ぎた投稿があれば、Xへ投稿します。
実行方法
ターミナルで次のコマンドを実行します。
python scheduler.py
Macなどの場合は、次のように実行します。
python3 scheduler.py
起動すると、次のように表示されます。
X自動投稿スケジューラーを開始しました。
投稿チェックを実行します。
投稿予定時刻を過ぎた投稿はありません。
予定時刻を過ぎた投稿がある場合は、自動で投稿されます。
Antigravityに依頼するプロンプト
Antigravityに予約投稿化を依頼する場合は、次のように書きます。
現在のX自動投稿ツールを予約投稿対応にしてください。要件は以下です。
・posts.csvにscheduled_at列を追加する
・statusがreadyの投稿だけを対象にする
・scheduled_atが現在時刻以前の投稿だけを投稿する
・投稿成功後はstatusをpostedにする
・posted_atに投稿日時を入れる
・scheduler.pyを作成し、1分ごとに投稿予定をチェックする
・初心者にもわかるコメントを追加する
Antigravityに依頼するときは、実装したい条件を細かく書くことが重要です。
Windowsで定期実行する方法
scheduler.pyを常に起動しておけば、自動投稿は動きます。
ただし、パソコンを再起動したときに止まるため、Windowsではタスクスケジューラを使う方法もあります。
流れは次の通りです。
1. タスクスケジューラを開く
2. 基本タスクの作成を選ぶ
3. 毎日またはログオン時を選ぶ
4. プログラムの開始を選ぶ
5. python.exeを指定する
6. 引数にscheduler.pyのパスを指定する
初心者の場合は、まず手動でscheduler.pyを起動して動作確認するのがおすすめです。
動作が安定してから、タスクスケジューラに登録します。
Macで定期実行する方法
Macでは、ターミナルでscheduler.pyを起動できます。
python3 scheduler.py
常時起動する場合は、launchdを使う方法もあります。
ただし、最初からlaunchdまで設定すると難しくなるため、初心者はまず手動起動で十分です。
運用に慣れてから、サーバーやクラウド環境へ移行するとよいです。
予約投稿で注意すること
予約投稿では、投稿間隔に注意してください。
短時間に大量投稿すると、スパムのように見える可能性があります。
Xの自動化ルールでは、スパム投稿、重複投稿、トレンド操作、誤解を招くリンクなどに注意するよう案内されています。
実務では、次のような運用が安全です。
- 1日3〜5投稿程度から始める
- 同じ文章を繰り返し投稿しない
- リンク先を明確にする
- 投稿文を人間が事前確認する
- 自動返信や自動メンションは安易に使わない
X自動投稿は、投稿頻度を増やすためではなく、継続投稿を安定させるために使うのが基本です。
この記事のまとめ
この記事では、X自動投稿を予約投稿にする方法を解説しました。
重要なポイントは次の通りです。
- posts.csvにscheduled_at列を追加する
- 現在時刻とscheduled_atを比較する
- 予定時刻を過ぎたready投稿だけを投稿する
- scheduler.pyで1分ごとにチェックする
- 投稿後はpostedに変更して二重投稿を防ぐ
これで、X自動投稿の基本形から、予約投稿の仕組みへ進化しました。
次の記事では、ログ管理、エラー対策、安全運用、改善方法を加えて、実用レベルのX自動投稿システムに仕上げます。

