问答
怎么拿到一个推特账号发过的所有推文?
简短回答
用 X 账号帖子列表从新到旧翻页(每页约 20 条,$0.006),更早的时间段用 X 帖子搜索加 from:用户名 和 since:/until: 日期补齐(每页 $0.006)。一个每天发 10 条的账号,一年约 183 页,大约 $1.098。
比如你想把竞品今年在 X 上发的东西全部拉下来,看看他们宣布了什么、哪些帖子反响好。两个接口就够了。X 账号帖子列表按从新到旧一页页返回这个账号的帖子,翻过起始日期就停。更早的时间段,或者想确认没有漏掉,用 X 帖子搜索加 from:用户名 和时间范围,一段一段往前补。
先估个量
先用 X 账号信息($0.001)看一眼。返回的 posts 字段是 X 自己统计的发帖总数,里面包含回复和转发,所以你最后采到的条数一般对不上,但能看出要处理的是 400 条还是 4 万条。
| 账号情况 | 帖子数 | 页数 | 费用 |
|---|---|---|---|
| 每天 2 条,一年 | 约 730 | 37 | $0.222 |
| 每天 10 条,一年 | 约 3,650 | 183 | $1.098 |
| 同上,改用按月分段搜索 | 约 3,650 | 183 | $1.098 |
代码:翻时间线直到截止日期
import os, requests
API = "https://api.okdata.online/v1"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
START = "2026-01-01"
def get(path, **params):
body = requests.get(f"{API}/{path}", headers=H, params=params, timeout=60).json()
if body["code"] != "ok":
raise RuntimeError(f"{body['code']}: {body['message']}")
return body
posts, cursor = [], None
while True:
body = get("x/users/posts/list", username="openai", **({"cursor": cursor} if cursor else {}))
batch = body["data"]["items"]
posts += [p for p in batch if p["published_at"] >= START]
if not body["page"]["has_more"] or (batch and batch[-1]["published_at"] < START):
break
cursor = body["page"]["next_cursor"]
print(len(posts), "条,起始日期", START)
走搜索这条路时,按月循环,query=f"from:openai since:{a} until:{b}",配合 sort=latest。只想要账号自己发的帖子、不要它回复别人的,再加上 -filter:replies。
限制
- 时间线能往回翻多深由 X 决定。翻不到起始日期就停了的话,改用按月分段搜索。
- 受保护账号和已删除的帖子采不到。
- 每页算一次调用,失败的那页不扣钱。
官方渠道
X 官方 API 的用户时间线最多只返回最近 3,200 条。官方全量历史搜索配合 from: 可以回溯到 2006 年,按量付费账号可用,每条 0.005 美元。只采一个几千条帖子的账号,这个价格不算贵;如果你需要 X 官方对完整性的保证,就选它。要是每周都要跟十几个竞品账号,按页计费会便宜不少。每周跑一次的完整做法见竞品监测方案。
更新于