TwexAPI で X アカウントのフォロワーを取得する方法
フォロワーデータは、収集方法が説明できるときに使いやすくなります。最近のフォロワーをすばやく見るなら latest followers、再利用できるデータセットを作るなら cursor 付きのページングを使います。
この記事では elonmusk を screen name の例として使います。実際には、分析する合理的な理由がある対象アカウントに置き換えてください。
適切なエンドポイントを選ぶ
| タスク | エンドポイント | 使う場面 |
|---|---|---|
| 最近のフォロワーを取得 | GET /twitter/latest-followers/{screen_name} | すばやい確認や、最近のフォロワー変化を見るとき。 |
| フォロワーをページング取得 | POST /twitter/followers/page | 保存、重複排除、確認が必要な cursor ベースのエクスポート。 |
| 固定件数を取得 | GET /twitter/followers/{screen_name}/{count} | 必要件数が決まっている小さな一回限りの取得。 |
比較、補完、レポートに使うデータなら、ページングされたエクスポートを選びます。単一の大きなレスポンスより、確認記録を残しやすくなります。
最近のフォロワーを取得する
curl --request GET \
--url https://api.twexapi.io/twitter/latest-followers/elonmusk \
--header 'Authorization: Bearer <token>'このエンドポイントは最近のフォロワーをすばやく見る用途に向いています。「最近」は時間とともに変わるため、レスポンスと一緒に実行時刻を保存します。
フォロワーをページングする
POST /twitter/followers/page は screen_name と任意の next_cursor を受け取ります。1 ページ目では next_cursor を省略します。レスポンスに次の cursor が含まれる場合、それを次のリクエストに渡します。
curl --request POST \
--url https://api.twexapi.io/twitter/followers/page \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"screen_name": "elonmusk"
}'{
"code": 200,
"msg": "success",
"data": [],
"has_next_page": true,
"next_cursor": "1234567890"
}Python コレクター
次のコレクターは、指定したページ数だけ取得し、確認表で使いやすいフォロワー情報に整えます。
1import os
2from typing import Any
3
4import requests
5
6TOKEN = os.environ["TWEXAPI_BEARER_TOKEN"]
7BASE_URL = "https://api.twexapi.io"
8
9def headers() -> dict[str, str]:
10 return {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
11
12def get_latest_followers(screen_name: str) -> list[dict[str, Any]]:
13 response = requests.get(
14 f"{BASE_URL}/twitter/latest-followers/{screen_name}",
15 headers=headers(),
16 timeout=30,
17 )
18 response.raise_for_status()
19 return response.json().get("data", [])
20
21def get_followers_page(
22 screen_name: str,
23 *,
24 next_cursor: str | None = None,
25) -> dict[str, Any]:
26 payload: dict[str, Any] = {"screen_name": screen_name}
27 if next_cursor:
28 payload["next_cursor"] = next_cursor
29
30 response = requests.post(
31 f"{BASE_URL}/twitter/followers/page",
32 headers=headers(),
33 json=payload,
34 timeout=30,
35 )
36 response.raise_for_status()
37 return response.json()
38
39def normalize_follower(user: dict[str, Any]) -> dict[str, Any]:
40 return {
41 "user_id": user.get("user_id") or user.get("userId") or user.get("id"),
42 "screen_name": user.get("screen_name") or user.get("username"),
43 "name": user.get("name"),
44 "description": user.get("description") or "",
45 "followers_count": user.get("followers_count") or user.get("followersCount") or 0,
46 "verified": bool(user.get("verified")),
47 "protected": bool(user.get("protected")),
48 "created_at": user.get("created_at_datetime") or user.get("createdAtDatetime") or user.get("createdAt"),
49 }
50
51def collect_followers(screen_name: str, max_pages: int = 3) -> list[dict[str, Any]]:
52 rows: list[dict[str, Any]] = []
53 seen_ids: set[str] = set()
54 cursor = None
55
56 for _ in range(max_pages):
57 page = get_followers_page(screen_name, next_cursor=cursor)
58 for user in page.get("data", []):
59 row = normalize_follower(user)
60 user_id = str(row.get("user_id") or "")
61 if user_id and user_id in seen_ids:
62 continue
63 if user_id:
64 seen_ids.add(user_id)
65 rows.append(row)
66
67 cursor = page.get("next_cursor")
68 if not page.get("has_next_page") or not cursor:
69 break
70
71 return rows
72
73if __name__ == "__main__":
74 followers = collect_followers("elonmusk", max_pages=2)
75 print(len(followers))データ管理の注意点
- 各ページの
screen_name、実行時刻、エンドポイント、cursor を記録します。 - 安定したユーザー ID がある場合は、それを重複排除の主キーにします。
- protected フラグや空のプロフィール文は、エラーではなくデータとして残します。
- フォロワー数だけでアカウントの品質や意図を判断しないようにします。
- フォロワーのエクスポートを営業やマーケティングに使う場合は、同意、プライバシー、コンプライアンスを先に確認します。
まとめ
すばやい確認には GET /twitter/latest-followers/{screen_name}、再利用できるエクスポートには POST /twitter/followers/page を使います。
安定した流れは、ページングで取得し、cursor を保存し、プロフィール項目を整え、ユーザー ID で重複排除し、なぜそのフォロワー一覧を収集したのかを記録することです。