使用Twitter Streaming API筛选指定用户发布及被@推文相关问题
Twitter Streaming API 过滤逻辑解决方案
以下逻辑适配Twitter API v1.1版本的返回字段结构。
1. 过滤指定用户自主发布的推文
stream.filter(follow=['user_id'])的默认返回规则:会返回所有和目标用户关联的事件,包括该用户发推、转推、回复他人、他人回复该用户、他人@该用户等内容,因此需要在on_status回调中新增多层过滤。
过滤条件
- 第一层:确认发布者为目标用户:判断
status.user.id_str是否等于你传入的目标用户ID,直接排除所有非该用户发布的内容 - 第二层:排除转推内容:若存在
status.retweeted_status字段,说明本条为转推,直接跳过,这也是你搜索到的示例代码的作用 - 第三层:排除回复内容:若
status.in_reply_to_user_id_str不为空,说明本条为该用户回复其他人的内容,不属于自主发布,直接跳过 - 可选过滤:如果需要排除引用其他推文的原创内容,可新增判断
hasattr(status, 'quoted_status'),存在该字段则跳过
代码示例
TARGET_USER_ID = "你的目标用户ID" def on_status(self, status): # 非目标用户发布直接跳过 if status.user.id_str != TARGET_USER_ID: return # 排除转推 if hasattr(status, 'retweeted_status'): return # 排除回复 if status.in_reply_to_user_id_str is not None: return # 可选:排除引用推文 # if hasattr(status, 'quoted_status'): # return # 剩下的就是目标用户自主发布的原创推文 print(status.text)
2. 过滤@目标账号的提及推文
stream.filter(track=["@screen_name"])的默认返回规则:只要推文全文中出现@screen_name字符串就会返回,包括转推内容里的@、回复其他用户时附带的@、甚至正文文本中巧合出现的相同字符串,因此需要过滤:
过滤条件
- 第一层:排除转推内容:同样判断是否存在
status.retweeted_status,存在则跳过,避免转推内容里的@被计入 - 第二层:校验官方识别的提及列表:Twitter API会在
status.entities['user_mentions']中返回本条推文中真实@的所有账号列表,只有列表中存在目标账号的screen_name或user_id,才是有效提及 - 可选过滤:如果仅需要定向发送给该用户的内容(即推文以@该账号开头,专门发给该用户的内容),可新增判断
status.text.strip().startswith(f"@{TARGET_SCREEN_NAME}")
代码示例
TARGET_SCREEN_NAME = "你的目标账号用户名(不带@)" TARGET_USER_ID = "你的目标用户ID" def on_status(self, status): # 排除转推 if hasattr(status, 'retweeted_status'): return # 检查是否为有效提及 is_mention = False for mention in status.entities['user_mentions']: # 匹配user_id更准确(用户名可修改,ID不变) if mention['id_str'] == TARGET_USER_ID: is_mention = True break if not is_mention: return # 可选:仅保留开头@目标账号的定向发送内容 # if not status.text.strip().startswith(f"@{TARGET_SCREEN_NAME}"): # return # 剩下的就是符合要求的提及推文 print(status.text)
内容的提问来源于stack exchange,提问作者Data_Science_110
相关产品推荐
相关产品推荐

