X(Twitter)のBOTを作った。トレンドワードを自動で拾い、それに絡めたツイートを生成して投稿する仕組みだ。投稿はtweepy、文章生成はGemini APIを使っている。
全体の流れ
処理の流れはシンプルで、3ステップで完結する。
トレンドワードを取得
↓
Gemini APIでツイート文を生成
↓
tweepyで投稿
これをcronで毎時1回実行している。
トレンドの取得
X(Twitter)のAPIでトレンドを取得する方法もあるが、Free tierではトレンドAPIが使えない。代わりにtrends24.inを使った。このサイトはXのトレンドをリアルタイムで集計していて、Puppeteerでページを取得すればトレンドワードのリストが手に入る。
const page = await browser.newPage();
await page.goto('https://trends24.in/japan/');
const trends = await page.$$eval('.trend-card__list li a', els =>
els.map(el => el.textContent.trim())
);
Puppeteerが使えない場合のフォールバックとして、lynx(テキストブラウザ)での取得も用意してある。精度は落ちるが、Chromiumのメモリが厳しい時に役立つ。
Gemini APIでツイートを生成する
取得したトレンドワードをGemini APIに渡して、ツイート文を生成する。プロンプトにはペルソナ設定を含めていて、毎回同じようなテンプレ文にならないようにしている。
import google.generativeai as genai
import os
genai.configure(api_key=os.environ['GOOGLE_API_KEY'])
model = genai.GenerativeModel('gemini-2.5-flash')
prompt = f"""
以下のトレンドワードから1つ選んで、自然なツイートを生成してください。
トレンド: {', '.join(trends[:10])}
条件:
- 140文字以内
- ハッシュタグは使わない
- 宣伝っぽくしない
- 日常的なつぶやきのトーンで
"""
response = model.generate_content(prompt)
tweet_text = response.text.strip()
現在の時刻や曜日もプロンプトに含めることで、「月曜の朝」「金曜の夜」といった時間帯に合った内容が生成されるようにした。
tweepyで投稿する
生成したテキストをtweepyで投稿する。X API v2を使用。
import tweepy
client = tweepy.Client(
consumer_key=os.environ['X_API_KEY'],
consumer_secret=os.environ['X_API_SECRET'],
access_token=os.environ['X_ACCESS_TOKEN'],
access_token_secret=os.environ['X_ACCESS_SECRET']
)
client.create_tweet(text=tweet_text)
重複回避の仕組み
同じトレンドワードが数時間続くことはよくある。同じネタで何度も投稿するとスパムっぽくなるので、投稿履歴をテキストファイルに保存し、直近の投稿と被らないようにしている。
from datetime import datetime
# 履歴ファイルに追記
with open('bot_history.txt', 'a') as f:
f.write(f"{datetime.now().isoformat()}|{trend_word}|{tweet_text}\n")
# 投稿前にチェック
with open('bot_history.txt', 'r') as f:
recent = f.readlines()[-50:]
used_trends = [line.split('|')[1] for line in recent]
if trend_word in used_trends:
pass # 別のトレンドを選び直す
画像生成を組み合わせる
テキストだけの投稿よりも画像付きの方がエンゲージメントが高い。1日1回だけ、Geminiの画像生成モデルでイラストを生成して添付するようにした。
画像生成モデルの名前がドキュメントと実際に動くものとで違っていて、ここで少しハマった。モデル名は更新されることがあるらしく、エラーが出たらAPIドキュメントで最新のモデル名を確認する必要がある。
X Free APIの制約
X(Twitter)のFree tierには1日あたりの投稿数制限がある。この制約の中で最大限の露出を得るために、毎時1回の投稿スケジュールにした。朝8時から夜23時まで、1時間に1回。深夜帯は投稿しない。
いいね機能はFree tierでは使えないため、リプライやリツイートでのエンゲージメント獲得に頼ることになる。トレンドに乗った投稿はインプレッションが取れやすいので、この設計は今のところうまく機能している。
関連記事
参考リンク
- tweepy — Python用Twitter APIラッパー
- Google AI Studio (Gemini API)
- X(Twitter) API ドキュメント
- Puppeteer
- trends24.in — リアルタイムトレンド