You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助编写符合约束的bot_spammers函数识别垃圾账号

实现垃圾账号识别函数:bot_spammers

嘿,我来帮你搞定这个垃圾账号识别的函数!咱们先把需求再理一遍,确保没漏掉关键条件:要找出没有原创推文、至少有一条转发,而且所有转发都在原推文发布后1000毫秒内完成的账号。接下来我会用Python实现这个函数,搭配详细的解释,你可以直接套用或者根据你的日志格式调整。

思路拆解

要实现这个功能,核心是分三步处理:

  • 第一步:解析日志文件,按用户分类整理推文数据
  • 第二步:对每个用户验证是否满足所有垃圾账号的条件
  • 第三步:收集并返回符合条件的账号名称

代码实现(以JSON格式日志为例)

假设你的活动日志是每行一条JSON记录,每条记录包含以下字段:

  • user_name:账号名称
  • tweet_type:推文类型,"original"表示原创,"retweet"表示转发
  • post_time:推文发布的时间戳(毫秒级,比如1620000000000)
  • original_post_time:仅转发推文有此字段,对应原推文的发布时间戳(毫秒级)

如果你的日志是CSV或其他格式,只需要调整读取和解析部分即可。

import json
from typing import List

def bot_spammers(log_file_path: str) -> List[str]:
    # 初始化用户数据字典:键是用户名,值是包含两个字段的字典
    # has_original: 是否发布过原创推文;retweet_time_diffs: 所有转发的时间差(毫秒)列表
    user_data = {}

    # 读取并解析日志文件
    with open(log_file_path, 'r', encoding='utf-8') as f:
        for line in f:
            # 跳过空行
            if not line.strip():
                continue
            try:
                tweet = json.loads(line)
            except json.JSONDecodeError:
                # 如果某行格式错误,跳过并打印提示(可选)
                print(f"跳过格式错误的日志行:{line}")
                continue
            
            user = tweet.get('user_name')
            if not user:
                continue  # 忽略没有用户名的记录
            
            # 初始化用户数据(如果还没记录过)
            if user not in user_data:
                user_data[user] = {
                    'has_original': False,
                    'retweet_time_diffs': []
                }
            
            tweet_type = tweet.get('tweet_type')
            if tweet_type == 'original':
                # 标记该用户有原创推文
                user_data[user]['has_original'] = True
            elif tweet_type == 'retweet':
                # 计算转发时间与原推文时间的差值(毫秒)
                retweet_time = tweet.get('post_time')
                original_time = tweet.get('original_post_time')
                if retweet_time is not None and original_time is not None:
                    time_diff = retweet_time - original_time
                    user_data[user]['retweet_time_diffs'].append(time_diff)
    
    # 筛选符合条件的垃圾账号
    spammer_accounts = []
    for user, data in user_data.items():
        # 条件1:无原创推文
        if data['has_original']:
            continue
        # 条件2:至少有一条转发推文
        if len(data['retweet_time_diffs']) == 0:
            continue
        # 条件3:所有转发的时间差都<=1000毫秒
        all_fast_retweets = all(diff <= 1000 for diff in data['retweet_time_diffs'])
        if all_fast_retweets:
            spammer_accounts.append(user)
    
    return spammer_accounts

关键细节解释

  1. 日志解析容错:加入了JSON格式错误和空行的处理,避免因为部分日志异常导致整个函数崩溃。
  2. 用户数据结构:用字典存储每个用户的核心信息,便于快速更新和查询。
  3. 条件验证顺序:先排除有原创推文的用户,再排除没有转发的用户,最后验证转发时间差,这样可以提前过滤掉不符合条件的用户,提升效率。
  4. 时间差计算:假设时间戳是毫秒级的,如果你的日志用的是秒级时间戳,记得乘以1000转换后再计算差值。

适配不同日志格式

如果你的日志是CSV格式,可以把读取部分改成用csv.DictReader:

import csv

# 替换日志读取部分
with open(log_file_path, 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for tweet in reader:
        # 后续处理逻辑和之前一致,注意字段名要和CSV表头对应
        user = tweet.get('user_name')
        # ... 其余代码不变

这样调整后,函数就能适配你的日志格式啦!

内容的提问来源于stack exchange,提问作者Sayran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:44:53