Skip to main content
特定アカウントの新しいツイートやキーワードへの言及を検出し、Xの最新データをアプリケーションに取り込みます。このガイドでは、Sorsa APIを定期的に呼び出すプル型のポーリングで、ほぼリアルタイムの監視パイプラインを構築します。 検出までの時間は、ポーリング間隔、APIの応答時間、対象フィードや検索インデックスに投稿が現れるタイミングで決まります。新しい投稿が必ず次のレスポンスに含まれると考えず、チェックポイント、ページネーション、重複排除を中心に設計してください。
試作は無料: 全エンドポイントを最初の無料100リクエストで使えます。付与は1回限り、カード不要、有効期限なしです。以下の監視処理を立ち上げ、投稿の検出とSlack・Discordへの振り分けを確認してからプランを選べます。ポーリングはリクエストを多く消費するため、後述の表から間隔に合う有料プランを見積もってください。
注: 追加の構成パターンと一連の実装例は、ブログのREST APIによるTwitterのリアルタイム監視を参照してください。

ポーリングによる監視の仕組み

ソーシャルプラットフォームのデータ取得には、プッシュ型(ストリーミング、Webhook)とプル型(ポーリング)があります。Sorsaはポーリングを使います。手順は4つです。
  1. 定期的に(1〜30秒おきに)エンドポイントを呼び出す
  2. 既知のツイートIDと結果を比較して、新しい投稿を見つける。
  3. 新しい投稿を処理する:通知、保存、SlackやDiscordなどへの配信。
  4. 繰り返す
ツイートIDには作成日時が含まれ、Pythonの整数やJavaScriptのBigIntで比較できます。確認済みの最大IDはチェックポイントに使えますが、投稿が遅れて現れたり順不同になったりする場合があります。本番では、取得する時間範囲を重ね、IDで重複を除去してください。障害後の再開には、チェックポイントの保存と読み込みを明示的に実装する必要があります。

適切なエンドポイントを選ぶ


レベル1:単一アカウントの監視

最も簡単な例です。/user-tweetsの最初のページを繰り返し取得し、最後に確認したIDより新しいツイートを出力します。最初の取得成功時は基準を設定し、既存の投稿は出力しません。これは開発用の例です。確認の間や停止中に1ページを超える投稿があると、取り逃す可能性があります。

Python

JavaScript

多数のアカウントには向きません。50アカウントなら50個のループと50倍のリクエストが必要です。そこでXリストを使います。

レベル2:1リクエストで複数アカウントを監視する

Xリストには最大5,000アカウントをまとめられます。/list-tweetsは全メンバーの最新投稿を1回で返すため、本番の複数アカウント監視の基本パターンです。詳細はリストとコミュニティを参照してください。

ステップ1:公開Xリストを作成する

  1. Xのリストでリストを作成します。
  2. 監視対象を追加します(最大5,000件)。
  3. 公開に設定します。非公開リストにはAPIでアクセスできません。
  4. URLからリストIDをコピーします。https://x.com/i/lists/1234567890なら、IDは1234567890です。

ステップ2:リストを定期取得する

効率の向上。 50アカウントを個別に10秒間隔で確認すると、1日50 × 8,640 = 432,000リクエストです。同じ50アカウントを1リストにまとめると、1日8,640リクエストで済み、50分の1になります。他のパターンはAPI利用の最適化を参照してください。
/list-tweetsは1ページ最大20ツイートです。1回の間隔中にそれ以上投稿される場合は、間隔を2〜3秒にするか、既知のIDに到達するまでnext_cursorで続きを取得してください。

レベル3:キーワードやハッシュタグの監視

アカウントの代わりに、/search-tweetsorder: "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 = Nonelast_seen_id = load_state()に置き換えます。1周期の全ページを処理または永続キューに保存した後に、新しいチェックポイントを保存します。ページ取得や配信に失敗したら進めないでください。再起動時は、未取得の範囲をページネーションで埋めてから新しいチェックポイントを採用します。

2. エラー時に指数バックオフを使う

ネットワーク障害、レート制限(HTTP 429)、一時的なAPIエラーは発生します。即座に繰り返さず、上限を設けて待機時間を徐々に増やしてください。完全な説明はエラーコードにあります。

3. 取得と処理を分離する

NLP、データベースへの書き込み、外部API呼び出しなど、重い処理をポーリング内で同期実行しないでください。後続システムが遅くなると取得周期も遅れます。新しい投稿はキューに送り、別のワーカーで処理します。
負荷が高い場合は、メモリ内のdequeをRedis、RabbitMQ、SQS、または既存のメッセージブローカーに置き換えます。

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は投稿者による返信制限を示し、監視の目的によって有用な指標になります。

次のステップ