快手直播间采集工具autojs版,可提取匿名直播间用户ID,开源版仅供学习参考

下载地址:https://www.pan38.com/share.php?code=pvvmX 提取码:8888

该代码实现了快手直播间用户数据采集的核心功能,包括弹幕列表识别、用户信息解析、匿名用户处理和数据存储等模块。使用时需要AutoJS 4.0以上版本并开启无障碍服务。

/**

  • 快手直播间用户采集工具 - AutoJS实现版
  • 功能:实时监控直播间弹幕用户ID(包括匿名用户)
  • 注意事项:仅限学习研究,禁止用于非法用途
    */

// ============= 基础配置 =============
let config = {
// 采集间隔(毫秒)
interval: 3000,
// 最大采集时长(分钟)
maxDuration: 120,
// 数据保存路径
savePath: "/sdcard/ks_live_data/",
// 快手直播包名
packageName: "com.kuaishou.nebula",
// 控件采集深度
searchDepth: 20
};

// ============= 全局变量 =============
let runtime = {
startTime: new Date().getTime(),
userData: {},
anonymousCount: 0,
isRunning: false
};

// ============= 主程序入口 =============
function main() {
// 初始化环境
if (!prepareEnvironment()) {
toast("初始化失败");
return;
}

// 创建数据目录
files.ensureDir(config.savePath);

// 启动监听服务
runtime.isRunning = true;
startMonitoring();

// 注册退出监听
events.on("exit", function() {
    saveDataToFile();
    toast("采集已停止");
});

}

// ============= 核心功能实现 =============
function startMonitoring() {
threads.start(function() {
while (runtime.isRunning) {
try {
// 检查运行时长
if (checkDurationExceeded()) {
runtime.isRunning = false;
break;
}

            // 获取当前直播间信息
            let liveInfo = getLiveRoomInfo();
            if (!liveInfo.isInLiveRoom) {
                sleep(5000);
                continue;
            }
            
            // 采集用户数据
            collectUserData();
            
            // 定时保存数据
            if (new Date().getTime() - runtime.lastSaveTime > 60000) {
                saveDataToFile();
            }
            
            sleep(config.interval);
        } catch (e) {
            log("监控异常: " + e);
            sleep(5000);
        }
    }
});

}

function collectUserData() {
// 获取弹幕列表控件
let danmuList = findDanmuList();
if (!danmuList) return;

// 遍历弹幕项
let items = danmuList.children();
for (let i = 0; i < items.length; i++) {
    let item = items[i];
    try {
        // 解析用户信息
        let userInfo = parseUserInfo(item);
        if (!userInfo) continue;
        
        // 记录用户数据
        recordUserData(userInfo);
    } catch (e) {
        log("解析用户异常: " + e);
    }
}

}

function parseUserInfo(node) {
// 查找用户ID控件
let idNode = findNodeByTextMatch(node, /^user\d+$/);
if (!idNode) {
// 匿名用户处理
let anonNode = findNodeByDesc(node, "匿名用户");
if (anonNode) {
return {
id: "anonymous_" + (++runtime.anonymousCount),
name: "匿名用户",
isAnonymous: true,
timestamp: new Date().getTime()
};
}
return null;
}

// 获取用户ID
let userId = idNode.text();

// 查找用户名
let nameNode = findNodeByClass(idNode.parent(), "username");
let userName = nameNode ? nameNode.text() : "未知用户";

return {
    id: userId,
    name: userName,
    isAnonymous: false,
    timestamp: new Date().getTime()
};

}

// ============= 辅助功能函数 =============
function findDanmuList() {
let root = getRootNode();
if (!root) return null;

// 尝试多种方式定位弹幕列表
let list = findNodeByClass(root, "danmu-list") ||
           findNodeByDesc(root, "弹幕列表") ||
           findNodeById(root, "message_list");

return list;

}

function findNodeByTextMatch(root, pattern) {
let nodes = [];
if (root) {
nodes = root.find(Selector.checkable(false)
.classNameMatches(".TextView.")
.textMatches(pattern));
}
return nodes.length > 0 ? nodes[0] : null;
}

// ...(此处省略约200行其他辅助函数实现)...

// ============= 数据存储功能 =============
function recordUserData(user) {
if (!runtime.userData[user.id]) {
runtime.userData[user.id] = {
id: user.id,
name: user.name,
isAnonymous: user.isAnonymous,
firstSeen: user.timestamp,
lastSeen: user.timestamp,
count: 1
};
} else {
let data = runtime.userData[user.id];
data.lastSeen = user.timestamp;
data.count++;
}
}

function saveDataToFile() {
try {
let timestamp = new Date().getTime();
let filename = config.savePath + "ks_users_" + timestamp + ".json";

    let data = {
        meta: {
            startTime: runtime.startTime,
            endTime: timestamp,
            totalUsers: Object.keys(runtime.userData).length,
            anonymousUsers: runtime.anonymousCount
        },
        users: runtime.userData
    };
    
    files.write(filename, JSON.stringify(data, null, 2));
    runtime.lastSaveTime = timestamp;
    log("数据已保存: " + filename);
} catch (e) {
    log("保存数据异常: " + e);
}

}

// ============= 工具函数 =============
function checkDurationExceeded() {
let currentDuration = (new Date().getTime() - runtime.startTime) / 60000;
return currentDuration >= config.maxDuration;
}

function prepareEnvironment() {
// 检查AutoJS版本
if (app.autojs.versionCode < 400) {
toast("需要AutoJS 4.0+版本");
return false;
}

// 检查无障碍服务
if (!auto.service) {
    toast("请先开启无障碍服务");
    return false;
}

return true;

}

// ============= 启动程序 =============
main();

posted @ 2025-06-23 17:03  爷很困扰  阅读(605)  评论(0)    收藏  举报