X(Twitter)の投稿・引用RTをAIで自動化する方法
Python×API実践ガイド
「Xの投稿を毎日続けるのがしんどい…」「良い投稿を見つけて引用RTしたいけど時間がない…」
この記事では、X(Twitter) APIとAIを組み合わせて、投稿・引用RT・リプライ返信を自動化する仕組みを 実際に僕たちが運用しているコードをベースに解説します。
⏱ 読了時間:約15分 | 実装時間:約1時間 | 前提:Python基本知識、X APIアカウント
📖 目次
1. キュレーション型X運用とは?
X運用の方法は大きく分けて2つあります。
❌ オリジナル投稿型
- 毎日ネタを考えて投稿
- ネタ切れとの戦い
- 作成に時間がかかる
- 当たり外れが大きい
✅ キュレーション型
- 良い投稿を見つけて引用RT
- ネタは他の人が提供してくれる
- コメント追加で付加価値
- 安定してコンテンツを出せる
キュレーション型のメリットは、「この人をフォローしておけば最新情報がわかる」 というポジションが取れること。自分で一から書くより、良いコンテンツを選ぶ目利き力が価値になります。
💡 僕たちの運用: AI自動化・業務効率化のテーマで、 1日8本の引用RTを自動投稿。海外の英語ポストは日本語に翻訳して引用。 これを全自動で回しています。
2. 仕組みの全体像
┌──────────────┐ 検索API ┌──────────────┐ Claude API ┌──────────────┐
│ X (Twitter)│ ────────> │ Python │ ──────────> │ コメント生成 │
│ 良い投稿 │ │ スクリプト │ <────────── │ (AI) │
└──────────────┘ │ │ └──────────────┘
│ │
引用RT ◄──────────── │ │ 投稿API
└──────────────┘
↑
cron (定期実行)
1日4回 × 2件 = 8件/日- X検索APIで特定キーワードのポストを取得
- Claude APIでポストを評価+コメント生成
- 良いポストに引用RTで投稿
- cronで1日4回自動実行
3. Step 1: X APIの準備
X APIを使うには、Developer Portalでアプリを作成し、認証情報を取得します。
X Developer Portalにアクセス
developer.x.com でアカウント作成・アプリ登録
プランを選ぶ
無料プラン: 投稿のみ(月1,500ツイート)
Basicプラン($200/月): 検索API+投稿(月10,000ツイート)
認証情報を取得
API Key、API Secret、Access Token、Access Token Secret の4つ
# credentials.json
{
"api_key": "YOUR_API_KEY",
"api_secret": "YOUR_API_SECRET",
"access_token": "YOUR_ACCESS_TOKEN",
"access_token_secret": "YOUR_ACCESS_TOKEN_SECRET",
"bearer_token": "YOUR_BEARER_TOKEN"
}# 必要なPythonライブラリ
pip install requests requests-oauthlib anthropic
💰 プラン選びのコツ: 引用RTの自動化には検索APIが必要なので、Basicプラン($200/月)が必要です。ただし、検索APIなしでも 特定アカウントのリストから取得する方法もあります(後述)。
4. Step 2: 良いポストを自動検索する
X検索APIで、特定のキーワードに合うポストを取得します。
# search_posts.py
import requests
import json
import random
# 認証情報を読み込み
with open('credentials.json') as f:
creds = json.load(f)
BEARER_TOKEN = creds['bearer_token']
# 検索テーマ(ランダムに選択)
SEARCH_THEMES = [
{
'name': 'AI自動化',
'query': '(AI 自動化 OR AI 業務効率化) lang:ja'
' -is:retweet min_faves:10',
},
{
'name': 'AIツール',
'query': '(Claude OR ChatGPT OR Cursor) (便利 OR すごい'
' OR 使ってみた) lang:ja -is:retweet min_faves:5',
},
{
'name': '海外AI活用',
'query': '(AI agent OR AI automation OR no-code AI)'
' -is:retweet min_faves:20',
},
{
'name': 'GAS/ノーコード',
'query': '(GAS OR Zapier OR Make) (自動化 OR 効率化)'
' lang:ja -is:retweet min_faves:5',
},
]
def search_posts(theme=None):
"""テーマに基づいてポストを検索"""
if theme is None:
theme = random.choice(SEARCH_THEMES)
url = 'https://api.twitter.com/2/tweets/search/recent'
headers = {
'Authorization': f'Bearer {BEARER_TOKEN}',
}
params = {
'query': theme['query'],
'max_results': 20,
'tweet.fields': 'public_metrics,author_id,lang,created_at',
'expansions': 'author_id',
'user.fields': 'username,name,public_metrics',
}
res = requests.get(url, headers=headers, params=params)
if res.status_code != 200:
raise Exception(f'Search API error: {res.status_code}')
data = res.json()
tweets = data.get('data', [])
# エンゲージメント順にソート
tweets.sort(
key=lambda t: (
t['public_metrics']['like_count']
+ t['public_metrics']['retweet_count'] * 3
),
reverse=True,
)
return tweets[:10], theme['name'] # 上位10件📌 検索クエリのコツ:
-is:retweet: RTを除外(オリジナル投稿のみ)min_faves:10: いいね10以上(質のフィルター)lang:ja: 日本語ポストに限定- テーマをランダム選択で、偏りなくキュレーション
5. Step 3: AIでコメントを生成する
見つけたポストに対して、Claude APIで引用コメントを生成します。
# generate_comment.py
import anthropic
client = anthropic.Anthropic() # ANTHROPIC_API_KEY環境変数から自動取得
SYSTEM_PROMPT = """あなたはAI活用・業務自動化の専門家です。
Xの引用RTに付けるコメントを生成してください。
ルール:
- 120文字以内(短く、インパクトのある一言)
- 元ポストの良い点を具体的に触れる
- 自分の知見や経験を1つ添える
- 絵文字は1-2個まで
- ハッシュタグは付けない
- 「素晴らしい!」「いいですね!」だけの薄いコメントは禁止
- 英語ポストの場合は日本語に翻訳してコメントする
トーンの例:
- 「これ実際に導入したけど、○○の部分が特に効いた」
- 「○○が面白い。うちでは△△に応用してる」
- 「🇺🇸→🇯🇵 要約すると○○。日本でも十分使える」
"""
def generate_comment(tweet_text: str, is_english: bool = False):
"""ポストに対する引用コメントを生成"""
user_msg = f"""以下のポストに対する引用RTコメントを生成してください。
【ポスト内容】
{tweet_text}
{'※ 英語ポストです。日本語で翻訳要約+コメントしてください。' if is_english else ''}
120文字以内のコメントのみを出力してください。"""
response = client.messages.create(
model='claude-sonnet-4-20250514',
max_tokens=200,
system=SYSTEM_PROMPT,
messages=[{'role': 'user', 'content': user_msg}],
)
return response.content[0].text.strip()生成例
元ポスト(日本語):
「ChatGPTで議事録の要約を自動化したら、会議後の作業が30分→5分になった。もう戻れない。」
AIが生成した引用コメント:
「議事録要約、うちではGAS+Geminiで完全自動化してる。会議のGoogleMeet録画から自動で文字起こし→要約→Slack通知まで。人の手ゼロ 🔥」
元ポスト(英語):
"Just shipped an AI agent that handles customer support tickets. 80% resolution rate without human intervention."
AIが生成した引用コメント:
「🇺🇸→🇯🇵 AIエージェントでカスタマーサポートを自動化、人間なしで80%解決。日本でも問い合わせ対応のAI化は効果大。一次返信だけでも自動化すると対応速度が劇的に変わる」
6. Step 4: 引用RTを自動投稿する
OAuth 1.0aで認証し、引用RT(コメント付きリツイート)を投稿します。
# post_quote.py
from requests_oauthlib import OAuth1Session
import json
import time
import random
with open('credentials.json') as f:
creds = json.load(f)
oauth = OAuth1Session(
creds['api_key'],
client_secret=creds['api_secret'],
resource_owner_key=creds['access_token'],
resource_owner_secret=creds['access_token_secret'],
)
def post_quote_tweet(tweet_id: str, comment: str):
"""引用RTを投稿"""
url = 'https://api.twitter.com/2/tweets'
# 引用RT = コメント + 元ツイートのURL
quote_url = f'https://twitter.com/i/status/{tweet_id}'
payload = {
'text': comment,
'quote_tweet_id': tweet_id,
}
res = oauth.post(url, json=payload)
if res.status_code == 201:
data = res.json()
print(f'✅ 引用RT成功: {data["data"]["id"]}')
return data['data']['id']
else:
print(f'❌ エラー: {res.status_code} {res.text}')
return None
def run_curation(num_quotes=2):
"""メインフロー: 検索→AI分析→引用RT"""
tweets, theme_name = search_posts()
posted = 0
done_ids = load_done_ids() # 重複防止
for tweet in tweets:
if posted >= num_quotes:
break
if tweet['id'] in done_ids:
continue
# 英語判定
is_english = tweet.get('lang', 'ja') != 'ja'
# AIコメント生成
comment = generate_comment(
tweet['text'], is_english
)
# 投稿
result = post_quote_tweet(tweet['id'], comment)
if result:
save_done_id(tweet['id'])
posted += 1
# スパム対策: 投稿間に15-30秒のランダム間隔
if posted < num_quotes:
wait = random.randint(15, 30)
print(f'⏳ {wait}秒待機...')
time.sleep(wait)
print(f'🎉 {theme_name}テーマで{posted}件の引用RT完了')
def load_done_ids():
"""投稿済みIDを読み込み(重複防止)"""
try:
with open('done_ids.txt') as f:
return set(f.read().strip().split('\n'))
except FileNotFoundError:
return set()
def save_done_id(tweet_id):
"""投稿済みIDを記録"""
with open('done_ids.txt', 'a') as f:
f.write(tweet_id + '\n')✅ 重複防止: done_ids.txtに投稿済みのツイートIDを記録。 同じポストを2回引用しないように制御しています。
7. Step 5: リプライ自動返信
自分の投稿にリプライが来たら、AIで自動返信する仕組みも作れます。 ただし、これには注意が必要です。
⚠️ 重要: 自動返信のルール
- 初回の一次返信のみ自動化OK(お礼+簡単なコメント)
- 2回目以降のやりとりは手動(会話の自動化はBANリスク大)
- 「ありがとうございます!」だけの返信を連発しない
- 相手の投稿内容に触れたパーソナルな返信にする
# auto_reply.py(一次返信のみ)
def check_and_reply_mentions():
"""自分へのメンション・リプライをチェックして一次返信"""
url = 'https://api.twitter.com/2/users/me/mentions'
headers = {
'Authorization': f'Bearer {BEARER_TOKEN}',
}
params = {
'max_results': 10,
'tweet.fields': 'public_metrics,in_reply_to_user_id',
}
res = requests.get(url, headers=headers, params=params)
mentions = res.json().get('data', [])
replied_ids = load_replied_ids()
for mention in mentions:
if mention['id'] in replied_ids:
continue
# AIで返信を生成
reply_text = generate_reply(mention['text'])
# リプライ投稿
payload = {
'text': reply_text,
'reply': {
'in_reply_to_tweet_id': mention['id']
},
}
res = oauth.post(
'https://api.twitter.com/2/tweets',
json=payload
)
if res.status_code == 201:
save_replied_id(mention['id'])
print(f'✅ リプライ送信: {mention["id"]}')
# スパム対策: 間隔を空ける
time.sleep(random.randint(20, 45))8. cronで定期実行する
スクリプトをcronで定期実行すれば、完全自動運用の完成です。
# crontab -e
# 引用RT: 1日4回 × 2件 = 8件/日 0 8 * * * cd /path/to/scripts && python3 curator.py 0 12 * * * cd /path/to/scripts && python3 curator.py 0 17 * * * cd /path/to/scripts && python3 curator.py 0 21 * * * cd /path/to/scripts && python3 curator.py # リプライチェック: 1日3回 30 9 * * * cd /path/to/scripts && python3 auto_reply.py 30 14 * * * cd /path/to/scripts && python3 auto_reply.py 30 20 * * * cd /path/to/scripts && python3 auto_reply.py
📊 運用スケジュール例
| 時刻 | 内容 | 件数 |
|---|---|---|
| 8:00 | 引用RT | 2件 |
| 9:30 | リプライチェック | — |
| 12:00 | 引用RT | 2件 |
| 14:30 | リプライチェック | — |
| 17:00 | 引用RT | 2件 |
| 20:30 | リプライチェック | — |
| 21:00 | 引用RT | 2件 |
→ 計8件/日の引用RT + リプライ自動返信
9. 反応を分析してテーマを改善する
自動化して終わりではありません。データを見てテーマを改善し続けるのが重要です。
# analyze_performance.py
def analyze_daily_performance():
"""前日の投稿パフォーマンスを分析"""
# 自分の直近ツイートを取得
url = 'https://api.twitter.com/2/users/me/tweets'
params = {
'max_results': 20,
'tweet.fields': 'public_metrics,created_at',
}
res = requests.get(url, headers=headers, params=params)
tweets = res.json().get('data', [])
# テーマ別にスコア集計
theme_scores = {}
for tweet in tweets:
metrics = tweet['public_metrics']
score = (
metrics['like_count'] * 1
+ metrics['retweet_count'] * 3
+ metrics['reply_count'] * 2
+ metrics['impression_count'] * 0.01
)
theme = detect_theme(tweet['text']) # テーマ推定
if theme not in theme_scores:
theme_scores[theme] = []
theme_scores[theme].append(score)
# 平均スコアでランキング
ranking = sorted(
theme_scores.items(),
key=lambda x: sum(x[1]) / len(x[1]),
reverse=True,
)
print('📊 テーマ別パフォーマンス:')
for theme, scores in ranking:
avg = sum(scores) / len(scores)
print(f' {theme}: 平均スコア {avg:.1f} ({len(scores)}件)')🔄 改善サイクル: 毎日スコアを記録 → 週1でテーマを見直し → 反応が悪いテーマを差し替え → 新テーマを試す。 このPDCAを自動化することで、投稿の質が勝手に上がっていく仕組みになります。
10. スパム対策とアカウント凍結の回避
X APIの自動化で最も重要なのがスパム対策です。 以下のルールを守らないと、アカウント凍結のリスクがあります。
🚫 やってはいけないこと
- 1日10件以上の引用RT → スパム判定リスク大
- 投稿間隔が短すぎる(5秒間隔で連投など)
- 同じコメントの使い回し → 明らかなbot判定
- リプライの連続自動化 → 会話のbot化はNG
- フォロー/アンフォローの自動化 → 最も凍結リスクが高い
✅ 安全な運用ルール
- 引用RTは1日8件まで(余裕を持って)
- 投稿間隔は15-30秒以上ランダムに空ける
- 毎回AIで新規コメント生成(テンプレ禁止)
- リプ返し(会話の2往復目以降)は手動
- 定期的に手動投稿も混ぜる(100%自動は不自然)
⚠️ 鉄則: 自動化は「出会い」(発見・最初の接触)まで。 「会話」(やりとり)は人間がやる。このラインを守れば安全に運用できます。
11. 運用コスト
月間コスト(1日8件 × 30日 = 240件/月):
💡 X API無料プランで始める場合
検索APIが使えない無料プランでも、リスト機能を使えば代替可能です:
- フォローしているアカウントの直近ポストを取得(List Tweets API)
- エンゲージメントの高いポストをフィルタリング
- AIでコメント生成 → 引用RT
この方法なら月額¥1,200〜3,200で運用可能です。
まとめ
- ✅キュレーション型で「情報通ポジション」を確立
- ✅X検索API + Claude APIで自動キュレーション
- ✅cronで1日8件の引用RTを完全自動化
- ✅パフォーマンス分析でテーマを自動改善
- ✅スパム対策を徹底して安全運用
「自社のSNS運用をAIで自動化したい」
X/Twitter以外にも、Instagram・LINE・メルマガなど、 あらゆるSNS・マーケティングチャネルのAI自動化をご提案します。
無料で相談する →