X(Twitter)の投稿・引用RTをAIで自動化する方法
Python×API実践ガイド

実践ガイドSNS運用

「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件/日
  1. X検索APIで特定キーワードのポストを取得
  2. Claude APIでポストを評価+コメント生成
  3. 良いポストに引用RTで投稿
  4. cronで1日4回自動実行

3. Step 1: X APIの準備

X APIを使うには、Developer Portalでアプリを作成し、認証情報を取得します。

1

X Developer Portalにアクセス

developer.x.com でアカウント作成・アプリ登録

2

プランを選ぶ

無料プラン: 投稿のみ(月1,500ツイート)
Basicプラン($200/月): 検索API+投稿(月10,000ツイート)

3

認証情報を取得

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引用RT2件
9:30リプライチェック
12:00引用RT2件
14:30リプライチェック
17:00引用RT2件
20:30リプライチェック
21:00引用RT2件

→ 計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 Basicプラン$200/月(約¥30,000)
Claude API(240回のコメント生成)約 ¥200
VPSサーバー(cron実行用)¥1,000〜3,000
合計約 ¥31,200〜33,200/月

💡 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自動化をご提案します。

無料で相談する →

📚 関連記事