如何用 TwexAPI 获取 X List 里的帖子
X Lists 的价值在于:已经有人替你做了一部分编辑筛选。一个 List 往往围绕某个市场、报道领域、社区或竞品集合组织账号,所以它的信息流通常比宽泛关键词搜索更干净。
这篇文章介绍如何用 TwexAPI 获取公开 X List 中的帖子。只想快速拿一批数据时,用固定数量端点;要做信息流、归档或定时监控时,用基于 cursor 的分页端点。
选择合适的端点
TwexAPI 提供两种常用的 List Tweets 获取方式:
| 目标 | 端点 | 适合场景 |
|---|---|---|
| 一次性快照 | GET /twitter/list/{list_id}/tweets/{target_count} | 需要从某个 List 获取固定数量的近期帖子。 |
| 可复用信息流或归档 | POST /twitter/list/tweets/page | 需要用 next_cursor 分页,并保存采集进度。 |
两个端点都需要 Bearer Token。list_id 是你要读取的 X List 数字 ID。
获取固定数量快照
快速检查时,可以用 path 参数传入 list_id 和 target_count。
curl --request GET \
--url https://api.twexapi.io/twitter/list/<list_id>/tweets/50 \
--header 'Authorization: Bearer <token>'成功响应会包含 code、msg 和 data,其中 data 是 tweet 对象数组。
1{
2 "code": 200,
3 "msg": "success",
4 "data": [
5 {
6 "tweet_id": "1234567890123456789",
7 "created_at": "Mon Jul 01 12:34:56 +0000 2025",
8 "text": "<API 返回的帖子正文>",
9 "favorite_count": 120,
10 "retweet_count": 18
11 }
12 ]
13}这个端点足够简单,但不会返回 cursor。如果你需要从上次位置继续,请使用分页端点。
按页读取 List 信息流
做持续监控时,调用 POST /twitter/list/tweets/page。第一页不传 next_cursor,后续请求传入上一页返回的 cursor。
curl --request POST \
--url https://api.twexapi.io/twitter/list/tweets/page \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"list_id": "<list_id>"
}'当响应中 has_next_page 为 true 时,继续请求下一页:
curl --request POST \
--url https://api.twexapi.io/twitter/list/tweets/page \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"list_id": "<list_id>",
"next_cursor": "cursor_from_previous_response"
}'分页过程中不要更换 list_id。cursor 只对生成它的 List 和采集状态有意义。
Python 导出脚本
下面的脚本会把 List 帖子导出为 JSONL,并写入包含 cursor 链的元信息文件,方便后续恢复和审计。
1import json
2import time
3from datetime import datetime, timezone
4from pathlib import Path
5
6import requests
7
8TOKEN = "<your_bearer_token>"
9LIST_ID = "<list_id>"
10URL = "https://api.twexapi.io/twitter/list/tweets/page"
11OUT = Path(f"x-list-{LIST_ID}-tweets.jsonl")
12META = Path(f"x-list-{LIST_ID}-tweets-meta.json")
13
14headers = {
15 "Authorization": f"Bearer {TOKEN}",
16 "Content-Type": "application/json",
17}
18
19seen_ids = set()
20cursor = None
21page_log = []
22page_number = 0
23
24with OUT.open("w", encoding="utf-8") as f:
25 while True:
26 payload = {"list_id": LIST_ID}
27 if cursor:
28 payload["next_cursor"] = cursor
29
30 response = requests.post(URL, headers=headers, json=payload, timeout=30)
31 response.raise_for_status()
32 body = response.json()
33
34 page_number += 1
35 tweets = body.get("data") or []
36
37 for tweet in tweets:
38 tweet_id = tweet.get("tweet_id")
39 if not tweet_id or tweet_id in seen_ids:
40 continue
41 seen_ids.add(tweet_id)
42 f.write(json.dumps(tweet, ensure_ascii=False) + "\n")
43
44 page_log.append({
45 "page": page_number,
46 "items": len(tweets),
47 "has_next_page": body.get("has_next_page"),
48 "next_cursor": body.get("next_cursor"),
49 })
50
51 if not body.get("has_next_page") or not body.get("next_cursor"):
52 break
53
54 cursor = body["next_cursor"]
55 time.sleep(1)
56
57META.write_text(json.dumps({
58 "list_id": LIST_ID,
59 "exported_at": datetime.now(timezone.utc).isoformat(),
60 "unique_tweets": len(seen_ids),
61 "pages": page_log,
62}, ensure_ascii=False, indent=2), encoding="utf-8")
63
64print(f"Saved {len(seen_ids)} tweets to {OUT}")生产任务中,建议每成功读取一页就持久化最后一个 cursor。如果任务中断,就能从最近一次成功位置继续,而不是从头开始。
把 List 帖子变成可用信息流
导出之后,按产品需求规范化字段:
tweet_id、created_at、正文、作者字段,以及响应中存在的互动计数。- 标准帖子 URL,例如
https://x.com/i/web/status/<tweet_id>;如果有作者信息,也可以生成作者状态链接。 - 产生这条记录的
list_id、导出时间和 page cursor。 - 稳定的去重键,通常是
tweet_id。
List 是人维护的,人会调整 List。如果成员发生变化,后续导出的内容会反映不同的编辑视角。分析对一致性有要求时,请单独保存 List 元信息。
实际使用场景
- 从记者和领域专家 List 构建新闻编辑台信息流。
- 通过创始人、分析师和产品账号 List 追踪竞品领域。
- 用代表某个社区或市场的公开 List 构建研究数据集。
- 给内容编辑团队提供待筛选、待分享的候选帖子。
- 不写宽泛关键词,也能监控一个狭窄主题。
List 方法的前提是成员本身有意义。如果 List 很久没维护、范围太宽,或维护者不清楚,建议先检查成员,再信任它的信息流。
常见坑
- 路径写错。当前 List Tweets 端点使用单数
list路径段,不要沿用旧的复数写法。 - 把 List 当成完整讨论。List 只是一个精选切片,不是整个话题归档。
- 在对比历史导出时修改 List。成员变化会改变信息流内容。
- 不保存 cursor 元信息。没有 cursor,就很难解释导出推进到了哪里。
- 覆盖互动数却不保存时间戳。互动数会变化,快照必须带采集日期。
小结
快速拉取时,用 GET /twitter/list/{list_id}/tweets/{target_count}。要做信息流或归档时,用 POST /twitter/list/tweets/page,保存每一页结果,并把 cursor 链和数据集放在一起。
这个流程比抓一个宽泛时间线或依赖噪音很大的关键词查询更干净,也更容易向团队解释。