ここまでの記事で、Antigravityを使ってX自動投稿の基本コードと予約投稿の仕組みを作りました。
しかし、実際に運用するなら、ただ投稿できるだけでは不十分です。
必要なのは、エラーが起きたときに原因を確認できること、同じ投稿を繰り返さないこと、安全なルールで運用することです。
この記事では、X自動投稿を実用レベルにするためのログ管理、エラー対策、安全運用の考え方を解説します。
実用化に必要な機能
X自動投稿を実用化するには、次の機能を追加します。
- 投稿ログを残す
- エラーログを残す
- 二重投稿を防ぐ
- 投稿文字数をチェックする
- 空欄投稿を防ぐ
- APIキーを安全に管理する
- 投稿内容を事前確認する
- Xの自動化ルールに沿って運用する
自動投稿は、一度動けば終わりではありません。
安定して運用できるようにすることが大切です。
ログ管理を追加する
まず、ログを残すようにします。
logsフォルダを作成します。
x-auto-post/
└─ logs/
└─ post.log
Pythonでログを出すには、loggingを使います。
post_to_x.pyの先頭付近に追加します。
import logging
次に、ログ設定を追加します。
logging.basicConfig(
filename="logs/post.log",
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
encoding="utf-8"
)
投稿成功時には、次のように記録します。
logging.info(f"投稿成功 id={post['id']} text={post['text']}")
エラー時には、次のように記録します。
logging.error(f"投稿失敗 id={post['id']} error={e}")
これで、あとからlogs/post.logを見れば、いつ何が起きたか確認できます。
エラーに強いコードにする
自動投稿では、APIエラー、通信エラー、CSVの入力ミスなどが起きる可能性があります。
そのため、try exceptでエラーを受け止めます。
def run_once():
try:
rows = load_posts()
post = get_due_post(rows) if post is None:
print("投稿予定時刻を過ぎた投稿はありません。")
logging.info("投稿対象なし")
return validate_post(post["text"]) print(f"投稿します: {post['text']}")
result = post_to_x(post["text"]) 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("投稿成功:", result)
logging.info(f"投稿成功 id={post['id']}") except Exception as e:
print("エラーが発生しました:", e)
logging.error(f"エラー発生: {e}")
エラーが起きたときにプログラムが完全に止まるより、ログに残して原因を確認できる方が安全です。
投稿前チェックを追加する
投稿文が空欄だったり、長すぎたりするとエラーの原因になります。
投稿前にチェックする関数を追加します。
def validate_post(text):
if not text or text.strip() == "":
raise ValueError("投稿文が空です。") if len(text) > 280:
raise ValueError("投稿文が280文字を超えています。")
Xの文字数カウントは厳密にはURLや文字種によって扱いが変わる場合がありますが、初心者向けの最初の実装では、まず280文字以内に収める運用にしておくと安全です。
二重投稿を防ぐ考え方
自動投稿で怖いのは、同じ投稿が何度も投稿されることです。
二重投稿を防ぐには、次の考え方が重要です。
- 投稿対象はstatusがreadyのものだけにする
- 投稿成功後だけstatusをpostedにする
- posted_atを記録する
- 同じtextをCSVに何度も入れない
- エラー時はstatusをpostedにしない
特に大切なのは、投稿成功前にpostedへ変更しないことです。
投稿に失敗したのにpostedへ変更すると、本当は投稿されていないのに投稿済み扱いになります。
逆に、投稿成功後にCSV保存が失敗すると、次回また同じ投稿を送ってしまう可能性があります。
実用化するなら、投稿IDも保存する設計にするとさらに安全です。
投稿IDを保存する
X APIの投稿成功レスポンスには、投稿IDが返ります。
そこで、CSVにtweet_id列を追加します。
id,text,status,scheduled_at,posted_at,tweet_id
1,朝の投稿です。,ready,2026-04-28 08:00:00,,
投稿成功後に、返ってきたIDを保存します。
tweet_id = result["data"]["id"]
row["tweet_id"] = tweet_id
これにより、どの投稿がX上のどの投稿に対応しているか管理しやすくなります。
安全運用で守るべきルール
X自動投稿では、システムを作れることと、安全に運用できることは別です。
Xの自動化ルールでは、API制限の回避、非APIベースの自動化、スパム、重複投稿、迷惑なDMやメンションなどを避けるよう案内されています。
また、XのDeveloper Guidelinesでは、公式APIの使用、レート制限の尊重、認証情報の保護、データ利用記録の保持などが示されています。
実務では、次のルールで運用するのがおすすめです。
- 投稿文は事前に人間が確認する
- 同じ文章を連続投稿しない
- 自動メンションを安易に使わない
- 自動DMを安易に使わない
- 投稿頻度を上げすぎない
- APIキーを共有しない
- ログを定期的に確認する
- 違和感があれば自動投稿を停止する
Antigravityに改善を依頼するプロンプト
実用化の段階では、Antigravityに次のように依頼します。
現在のX自動投稿ツールを実用運用できるように改善してください。要件は以下です。
・logs/post.logに投稿結果とエラーを記録する
・投稿文が空欄の場合は投稿しない
・投稿文が280文字を超える場合は投稿しない
・投稿成功後にtweet_idをCSVへ保存する
・エラー時にはCSVのstatusをpostedに変更しない
・例外処理を追加する
・README.mdに運用手順と注意点を追記する
・Xの自動化ルールに反しない運用上の注意点も書く
Antigravityは、完成後の改善にも使えます。
特に、ログ、例外処理、READMEの整備は、AIに任せやすい作業です。
最終的なファイル構成
実用化後のファイル構成は次のようになります。
x-auto-post/
├─ .env
├─ .gitignore
├─ requirements.txt
├─ posts.csv
├─ post_to_x.py
├─ scheduler.py
├─ logs/
│ └─ post.log
└─ README.md
この状態になれば、最低限のX自動投稿ツールとして運用できます。
初心者におすすめの運用方法
初心者は、いきなり完全自動で大量投稿するのではなく、次の流れで始めるのがおすすめです。
- 1日目は、手動実行で1件だけ投稿します。
- 2日目は、CSVに3件ほど投稿文を入れて、手動で1件ずつ実行します。
- 3日目は、
scheduler.pyを使って、1日1〜3件だけ予約投稿します。 - 1週間ほどログを確認し、問題がなければ投稿数を少しずつ増やします。
この流れなら、エラーや二重投稿が起きても被害を小さくできます。
この記事のまとめ
この記事では、Antigravityで作ったX自動投稿システムを実用化する方法を解説しました。
重要なポイントは次の通りです。
- ログを残す
- エラーを記録する
- 投稿前に文字数と空欄をチェックする
- 投稿成功後にstatusをpostedにする
- tweet_idを保存する
- Xの自動化ルールに沿って運用する
- 最初は少ない投稿数でテストする
Antigravityを使えば、X自動投稿の仕組みは初心者でも作れます。
ただし、大切なのは「動くものを作ること」だけではありません。
安全に運用し、スパムにならず、読者にとって価値のある投稿を継続できる仕組みにすることです。
最初に作るなら、次の組み合わせが最も再現性が高いです。
- Antigravity
- Python
- X API
- CSV管理
- 予約投稿
- ログ管理
この構成なら、初心者でも理解しやすく、あとからGoogleスプレッドシート連携、WordPress記事連携、AI投稿文生成、サーバー実行などへ発展できます。

