怎么看 X 上的评论和提及(以及那些数字为什么永远对不上)
怎么看 X 上的评论和提及(以及那些数字为什么永远对不上)
X 上并没有"评论"这个东西。 人们说的评论就是回复 —— 而一旦你开始用代码去找,★你会发现一条帖子周围的对话被拆在三份互相独立的列表里★,而其中只有一份出现在帖子下面。
漏掉另外两份,正是大多数回复分析不完整却没人察觉的原因。
是三份列表,不是一份
| 是什么 | 住在哪 | 会通知作者吗 |
|---|---|---|
| 回复 | ★帖子下面★ | 会 |
| 引用 | ★单独一个标签页★ | 会 |
| 提及 | 在提及者自己的时间线上 | 会 |
★回复在对话串里。引用是它自己的一条帖子。提及是一条写了你名字、但并没有回复你的帖子。★
实际后果: 如果你只读回复,★你看到的是那部分「选择留在你的串里」的对话★ —— 而关于你的评论,经常是有意发生在串外的。
三者都是公开可读的 —— 三个调用,三种形态。
三份都读到
import requests
BASE = "https://api.socialapi.tech"
KEY = "your_api_key"
HDRS = {"X-API-Key": KEY}
def conversation(tweet_id):
"""一条帖子的回复与引用 —— 被讨论的那两半。"""
out = {}
for name, path in (("回复", "/v1/tweet/replies"),
("引用", "/v1/tweet/quotes")):
r = requests.get(f"{BASE}{path}",
params={"id": tweet_id, "limit": 100},
headers=HDRS, timeout=60)
r.raise_for_status()
out[name] = r.json()["data"]
return out
def mentions(username, limit=50):
"""点名了这个账号的帖子 —— 包括那些不是回复的。"""
r = requests.get(f"{BASE}/v1/user/mentions",
params={"username": username, "limit": limit},
headers=HDRS, timeout=60)
r.raise_for_status()
return r.json()["data"]
c = conversation("1234567890123456789")
print(f"{len(c['回复'])} 条回复 · {len(c['引用'])} 条引用")
★注意提及是以账号为键的,不是以帖子为键。★ 一条提及并不附着在你的任何一条帖子上 —— 它是别人在自己的帖子里写了你的用户名,所以它需要一个完全不同的查询。
★回复数为什么永远对不上★
这是各家都在产生工单的那一段。
帖子上显示 500 条回复。你去取,拿到 380 条。 ★没有任何东西坏掉了。★
帖子上那个数字不等于你能取到的数字,有四个原因:
1. 已删除的回复仍被计入。 ★回复被删时,计数器不一定会减。★
2. 来自被封或已注销账号的回复。 它们计入,但已经解析不出来了。
3. 来自受保护账号的回复。 ★计入,但不可公开读取★ —— 而这是对的。
4. 嵌套回复。 回复的回复属于另一个对话节点。它算不算,取决于你从哪里看。
★把显示的计数当作上界,而不是目标。★ 写成"一直重试直到数字对上"的代码会永远循环下去 —— 而这正是它造成的真实故障。
我们的回复与引用调用会干净地翻到「公开可取回的全部」—— 和计数器之间的差是平台的,不是取数方的。
原创 vs 其它一切
另一个问题:一个账号的时间线里混着原创、回复和转发,而大多数内容分析只想要第一种。
★在本地过滤是最直觉的做法,而它浪费掉了你取回来的大部分东西★ —— 在一个回复很多的账号上,你可能要丢掉每页的 80%。
def originals(username, limit=100):
"""只要原创 —— 不含回复,不含转发。"""
r = requests.get(f"{BASE}/v1/user/last_tweets",
params={"username": username, "limit": limit,
"exclude": "replies,retweets"},
headers=HDRS, timeout=60)
r.raise_for_status()
return r.json()["data"]
★过滤发生在截断之前★ —— 你要 100 条就拿到 100 条原创,而不是"100 条混合内容筛完剩多少算多少"。而且按实际返回的条数计费,这正好接上上一段:你不会为"取回来又扔掉"的部分付钱。
⚠️ ★这两个问题确实是不同的问题★,而用混合时间线去回答第一个,会虚增内容量,并让你据此算出的每条平均值全部失真。
大家会问的问题
怎么看推特上的评论? 评论就是回复。 ★取那条帖子的回复★ —— 它们是公开的。
怎么看一条推文的评论? 同一个调用。 ★引用不会在里面★ —— 那是单独一份列表。
怎么查看推特评论? 打开那条帖子,或者用代码取它的回复。 两者看到的是同一个串。
为什么我看不到全部评论? 已删除、被封和受保护的回复者仍然计入显示的那个数字。★那个计数是上界。★
回复数为什么和我取到的对不上? ★四个原因:删除、封禁、受保护账号、嵌套回复。★ 对不上是正常的,不是 bug。
怎么看谁回复了一条推文? 回复列表返回完整资料,所以你能按受众规模给回复者排序。
回复和评论有什么区别? 没有区别 —— ★"评论"是人们的叫法,"回复"是平台的叫法★。
回复和引用有什么区别? ★回复住在串里;引用是一条嵌入了你帖子的新帖子。★ 完整机制。
怎么查看引用转发? 单独一个调用取引用列表。 ★这是大多数作者从不去看的那一半。★
怎么看我的提及? 一个以账号为键的提及查询,不是以某条帖子为键。
什么算一次提及? ★任何包含你用户名的帖子★ —— 包括那些并没有回复你的。
提及和回复是一回事吗? 不是。 ★回复一定是提及;提及经常不是回复。★
怎么搜索我的提及? 取回来在本地过滤,或者用带你用户名的搜索语法。
能看别人账号的提及吗? ★能 —— 提及就是公开帖子。★ 它们没有任何私密属性。
怎么在一个长串里找到我自己的回复?
★搜 from:你的用户名 加一个有辨识度的词★ —— 比下拉快得多。
怎么看发给某个人的回复?
搜 to:用户名 —— 提及查询底层做的就是这件事。
回复会显示在作者的时间线上吗? 会,在回复标签页里 —— 这正是只看原创是另一个问题的原因。
怎么只拿原创帖子?
在时间线请求上加 exclude=replies,retweets —— 过滤在服务端、在截断之前完成,不需要你在本地再筛一遍。
为什么一个账号的发帖数看起来虚高? 因为时间线混着原创、回复和转发。 ★把它当成"他的内容"来分析会高估产出量。★
怎么区分转发和原创? 转发会带着原作者的数据。 ★检查这条帖子有没有引用另一个作者★,不要靠位置去猜。
怎么看一条帖子的转发者? 转发者列表会返回谁转播了它 —— 而引用又是分开的。
能看到谁点赞了一条帖子吗? 只能看到一部分 —— ★X 在 2023 年收紧了点赞数据,没有接口返回它★。转发和引用才是可靠信号。
做抽奖有评论抽取器吗? 取回复然后在本地抽。 ★列表是公开的;抽取只是普通代码。★
能取多少条回复? 分页 —— 跟着游标翻。★不要遇到短页就停。★
能取回复的回复吗? 它们属于另一个对话节点。 ★用那条回复自己的 ID 去取★,就能再往下一层。
已删除的回复会从串里消失吗? 会,并留下一个缺口 —— 删除移除了什么。
能实时监控提及吗? 轮询或用流 —— 监控怎么做。
为什么会收到不认识的账号的提及? 任何人都能公开点名你。 ★这正是提及属于公开数据的原因。★
能看到受保护账号的提及吗? 不能 —— ★他们的帖子不公开,所以他们的提及也不公开★。
提及会通知对方吗? 会,不过通知设置各异。★不管他有没有看到,数据都是公开的。★
怎么统计一条帖子的总互动? 回复 + 转发 + 引用 + 点赞 —— ★四个独立计数,相加不会重复计算★。
做情绪分析该看回复还是引用? ★引用往往承载更强的观点★,因为写一条引用比回一句要花更多力气。
简短版
★一条帖子周围的对话被拆在三份列表里 —— 回复、引用、提及 —— 而只有回复出现在它下面。★ 只读那一份,就会漏掉那些有意发生在别处的评论。
★而回复数永远不会和你取到的对上。★ 已删除、被封、受保护的回复者仍然计入显示的数字。★把它当作上界 —— 写成"重试到数字对上"的代码会永远循环下去。★
我们的 API 把回复、引用、提及做成三个调用,另外提供 exclude 过滤参数,在服务端剔除回复与转发,供那些不该把"参与"算进去的内容分析使用。只读、固定按次价格。
没有任何接口返回什么: 点赞者名单(X 在 2023 年收紧了那份数据),以及受保护账号的任何东西。★那些是边界,不是覆盖缺口。★
延伸阅读:为什么引用是单独一份列表 · 互动指标是什么意思 · 持续监控提及 · 删除究竟移除了什么。