如何通过Python的Twython库高效获取某条Twitter推文的所有回复?
更精准获取指定推文所有回复的方案
嘿,我刚好研究过这个问题!你现在用to:screen_name搜索的方法确实容易混入大量无关内容——毕竟发给该用户的推文不一定都是针对这条特定推文的回复。好在现在X(原Twitter)API已经提供了精准锁定对话链的方式,比2014年的方案靠谱太多。
核心思路:利用conversation_id精准定位对话链
每条推文都有一个conversation_id,而原推文的id就是整个对话的根ID——所有针对这条推文的回复(包括回复的回复),它们的conversation_id都会和原推文的id完全一致。通过这个参数搜索,就能100%只拿到属于这条推文的所有互动内容。
具体实现步骤(Twython版)
1. 先获取原推文的conversation_id
其实原推文的id就是它的conversation_id,不过保险起见,我们可以通过API直接获取:
from twython import Twython # 替换成你的API密钥 API_KEY = "你的API_KEY" API_SECRET = "你的API_SECRET" ACCESS_TOKEN = "你的ACCESS_TOKEN" ACCESS_TOKEN_SECRET = "你的ACCESS_TOKEN_SECRET" twitter = Twython(API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) # 替换成目标推文的ID target_tweet_id = "1234567890123456789" original_tweet = twitter.show_status(id=target_tweet_id) conversation_id = original_tweet["id_str"] # 用id_str避免大整数溢出问题
2. 搜索该对话链下的所有回复
用search_recent_tweets接口(如果有学术权限,也可以用search_all_tweets获取历史回复),直接指定conversation_id作为查询条件:
# 初始化结果列表 all_replies = [] next_token = None while True: # 构造查询参数 search_params = { "query": f"conversation_id:{conversation_id}", "max_results": 100, # 每次请求最多返回100条 "tweet.fields": "author_id,created_at,in_reply_to_user_id" # 按需添加需要的字段 } if next_token: search_params["next_token"] = next_token # 调用API response = twitter.search_recent_tweets(**search_params) # 过滤掉原推文本身,只保留回复 replies = [tweet for tweet in response.get("data", []) if tweet["id_str"] != conversation_id] all_replies.extend(replies) # 检查是否有下一页 next_token = response.get("meta", {}).get("next_token") if not next_token: break # 输出结果 for idx, reply in enumerate(all_replies, 1): print(f"回复{idx}: {reply['text']}") print(f"作者ID: {reply['author_id']} | 发布时间: {reply['created_at']}\n")
对比旧方案的优势
- 精准度拉满:不会混入任何发给该用户但不属于这条推文的内容
- 覆盖完整对话链:能获取所有层级的回复(包括回复的回复)
- 符合X API最新规范:这是官方推荐的对话查询方式,比旧的搜索语法更稳定
注意事项
- 权限要求:
search_recent_tweets需要Standard级别的API访问权限;search_all_tweets需要学术研究权限 - 分页处理:如果回复数量超过100条,必须通过
next_token分页获取全部结果 - 字段自定义:可以通过
tweet.fields参数添加你需要的额外字段(比如用户信息、媒体附件等)
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

