試作は無料: 全エンドポイントを最初の無料100リクエストで使えます。付与は1回限り、カード不要、有効期限なしです。以下の監視処理を立ち上げ、投稿の検出とSlack・Discordへの振り分けを確認してからプランを選べます。ポーリングはリクエストを多く消費するため、後述の表から間隔に合う有料プランを見積もってください。
注: 追加の構成パターンと一連の実装例は、ブログのREST APIによるTwitterのリアルタイム監視を参照してください。
ポーリングによる監視の仕組み
ソーシャルプラットフォームのデータ取得には、プッシュ型(ストリーミング、Webhook)とプル型(ポーリング)があります。Sorsaはポーリングを使います。手順は4つです。- 定期的に(1〜30秒おきに)エンドポイントを呼び出す。
- 既知のツイートIDと結果を比較して、新しい投稿を見つける。
- 新しい投稿を処理する:通知、保存、SlackやDiscordなどへの配信。
- 繰り返す。
適切なエンドポイントを選ぶ
レベル1:単一アカウントの監視
最も簡単な例です。/user-tweetsの最初のページを繰り返し取得し、最後に確認したIDより新しいツイートを出力します。最初の取得成功時は基準を設定し、既存の投稿は出力しません。これは開発用の例です。確認の間や停止中に1ページを超える投稿があると、取り逃す可能性があります。
Python
JavaScript
レベル2:1リクエストで複数アカウントを監視する
Xリストには最大5,000アカウントをまとめられます。/list-tweetsは全メンバーの最新投稿を1回で返すため、本番の複数アカウント監視の基本パターンです。詳細はリストとコミュニティを参照してください。
ステップ1:公開Xリストを作成する
- Xのリストでリストを作成します。
- 監視対象を追加します(最大5,000件)。
- 公開に設定します。非公開リストにはAPIでアクセスできません。
- URLからリストIDをコピーします。
https://x.com/i/lists/1234567890なら、IDは1234567890です。
ステップ2:リストを定期取得する
/list-tweetsは1ページ最大20ツイートです。1回の間隔中にそれ以上投稿される場合は、間隔を2〜3秒にするか、既知のIDに到達するまでnext_cursorで続きを取得してください。
レベル3:キーワードやハッシュタグの監視
アカウントの代わりに、/search-tweetsをorder: "latest"で呼び出し、条件に一致する結果を時系列順に取得します。
新しい投稿をSlack、Discord、任意のHTTP送信先に渡す
ポーリングのループはデータを取得し、コールバックが各投稿の処理を決めます。コールバックは通常の関数なので、HTTPに対応する任意のシステムに配信できます。Incoming WebhookでSlackへ送信
Discord
Telegram
独自のHTTPエンドポイント
API利用量の計算
以下は、1回に1ページ、固定間隔、再試行なしの想定です。監視処理の数を掛け、追加ページや再試行も加算してください。サンプルはレスポンスの後に待機するため、実際の周期には通信と処理の時間も含まれます。
許容できる遅延とフィードの活発さに合わせて間隔を選びます。短くするとリクエストは増えますが、投稿が検索結果に即座に現れる保証はありません。
無料の100リクエストで、監視の試作から一連の動作確認まで行えます。継続運用では上の月間利用量に合わせてください。1つのループなら30〜60秒間隔はPro(月間100,000件)、10秒間隔はEnterprise(月間500,000件)に収まります。複数の監視を並列実行すると合計も増えるため、全体の量で選びます。詳細は料金を参照してください。
標準プランを超える速度や利用量が必要な場合は、営業にカスタム割り当てをご相談いただくか、Discordでお問い合わせください。
本番運用に向けた対策
上記は開発用の例です。本番では次の5点に対応してください。1. 再起動後もlast_seen_idを保持する
チェックポイントを失ったまま再起動すると、古い投稿を再処理して重複通知したり、停止中の投稿を取り逃したりします。最後のIDをファイル、データベース、Redisなどに保存してください。
last_seen_id = Noneをlast_seen_id = load_state()に置き換えます。1周期の全ページを処理または永続キューに保存した後に、新しいチェックポイントを保存します。ページ取得や配信に失敗したら進めないでください。再起動時は、未取得の範囲をページネーションで埋めてから新しいチェックポイントを採用します。
2. エラー時に指数バックオフを使う
ネットワーク障害、レート制限(HTTP 429)、一時的なAPIエラーは発生します。即座に繰り返さず、上限を設けて待機時間を徐々に増やしてください。完全な説明はエラーコードにあります。3. 取得と処理を分離する
NLP、データベースへの書き込み、外部API呼び出しなど、重い処理をポーリング内で同期実行しないでください。後続システムが遅くなると取得周期も遅れます。新しい投稿はキューに送り、別のワーカーで処理します。4. 監視処理自体を監視する
各周期の時刻、新規投稿数、応答時間、エラーを記録します。過去N分間に取得成功がなければ通知してください。気付かない停止は、通知パイプラインに見えないデータ欠落を生みます。APIの稼働状況はSorsaのステータスページで確認できます。5. 例外的なケースに対応する
ページからのあふれと遅れて現れる投稿: 最後のチェックポイント以降の範囲をすべて取得するまでnext_cursorをたどります。少し範囲を重ね、保存済みIDで重複を除去し、IDが古いという理由だけで遅れた結果を捨てないようにします。最初のページだけを使う上記の例には、この補完は含まれません。
コールバックの配信: Webhookの応答を確認し、回数を制限した再試行か永続キューを使います。Sorsaへのリクエストが成功しても、Slack、Discord、データベースがイベントを受け取ったとは限りません。
- 削除されたツイート: 取得とコールバックの間に削除されるとURLは404になります。想定内として扱います。
- 非公開アカウント: 監視対象が非公開になると、
/user-tweetsは空の一覧を返します。記録して続行してください。 - 固定ツイート:
/user-tweetsの先頭は最新ではなく固定投稿のことがあります。tweets[0]を最新IDとせず、上の例のようにmax(int(t["id"]) for t in tweets)を使うか、created_atで並べます。 - リツイート:
tweet["retweeted_status"]に値が入ります。含めるか除外するか決めてください。 - 返信制限:
is_replies_limitedは投稿者による返信制限を示し、監視の目的によって有用な指標になります。