下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:1133
该代码实现了完整的快手评论采集功能,包含UI界面、评论滚动采集、用户信息提取和数据保存等功能。使用时需要确保Auto.js已获取无障碍权限,建议在模拟器或root设备上运行。
// 快手评论采集工具 - Auto.js实现
// 功能:采集视频评论区UID、评论内容和用户主页链接
// 版本:v1.0
// 日期:2025-07-17
"ui";
ui.layout(
<vertical padding="16" bg="#f5f5f5">
<text text="快手评论采集工具" textSize="24" gravity="center" marginBottom="16"/>
<horizontal>
<input id="target_url" hint="输入快手视频链接" layout_weight="1"/>
<button id="start_btn" text="开始采集" marginLeft="8"/>
</horizontal>
<horizontal>
<text text="采集深度:" marginRight="8"/>
<input id="scroll_times" text="10" inputType="number" layout_weight="1"/>
<text text="次滚动" marginLeft="8"/>
</horizontal>
<checkbox id="save_screenshot" text="保存截图" checked="false"/>
<progressbar id="progress" indeterminate="true" visibility="gone"/>
<scroll>
<text id="log" text="准备就绪..." textSize="14"/>
</scroll>
</vertical>
);
// 全局变量
let collectedData = [];
let currentPage = 1;
const config = {
maxRetry: 3,
scrollWaitTime: 2000,
commentSelector: "android.widget.TextView",
userInfoSelector: "android.widget.ImageView",
homePageBtnText: "主页"
};
// 主函数
ui.start_btn.click(() => {
let targetUrl = ui.target_url.text().trim();
if (!targetUrl) {
toast("请输入视频链接");
return;
}
// 初始化
collectedData = [];
currentPage = 1;
ui.progress.visibility = "visible";
log("开始采集...");
// 启动快手APP
launchApp("快手");
waitForPackage("com.kuaishou.nebula");
sleep(3000);
// 处理URL
if (!targetUrl.startsWith("http")) {
targetUrl = "https://" + targetUrl;
}
// 打开目标视频
app.openUrl(targetUrl);
sleep(5000);
// 进入评论区
clickCommentArea();
// 开始采集
collectComments(parseInt(ui.scroll_times.text()));
// 保存结果
saveResults();
ui.progress.visibility = "gone";
log("采集完成!共采集到 " + collectedData.length + " 条评论");
});
// 点击评论区
function clickCommentArea() {
let commentBtn = text("评论").findOne(5000);
if (commentBtn) {
commentBtn.click();
sleep(3000);
} else {
log("未找到评论区入口");
exit();
}
}
// 采集评论核心函数
function collectComments(scrollTimes) {
for (let i = 0; i < scrollTimes; i++) {
log("正在采集第 " + (i + 1) + " 页...");
// 获取当前屏幕可见评论
let comments = className(config.commentSelector)
.depth(10)
.find();
for (let j = 0; j < comments.length; j++) {
let comment = comments[j];
if (comment.text().length > 0 && comment.visibleToUser()) {
processCommentItem(comment);
}
}
// 滚动屏幕
swipe(
device.width / 2,
device.height * 0.8,
device.width / 2,
device.height * 0.2,
500
);
sleep(config.scrollWaitTime);
// 保存截图
if (ui.save_screenshot.checked) {
let img = captureScreen();
let path = "/sdcard/Download/kuaishou_screenshot_" + currentPage + ".png";
images.save(img, path);
log("已保存截图: " + path);
}
currentPage++;
}
}
// 处理单个评论项
function processCommentItem(comment) {
try {
let commentText = comment.text();
let parent = comment.parent();
// 获取用户信息
let userInfo = parent.findOne(className(config.userInfoSelector));
if (!userInfo) return;
// 点击用户头像进入主页
userInfo.click();
sleep(3000);
// 获取UID和主页链接
let uid = getUidFromProfile();
let profileUrl = getCurrentPageUrl();
// 返回评论区
back();
sleep(2000);
// 保存数据
if (uid && commentText) {
collectedData.push({
uid: uid,
comment: commentText,
profile_url: profileUrl,
timestamp: new Date().toLocaleString()
});
log("采集到: " + uid + " - " + commentText.substring(0, 20) + "...");
}
} catch (e) {
log("处理评论出错: " + e);
}
}
// 从个人主页获取UID
function getUidFromProfile() {
let uidText = textMatches(/ID: \d+/).findOne(3000);
if (uidText) {
return uidText.text().replace("ID: ", "");
}
return null;
}
// 获取当前页面URL
function getCurrentPageUrl() {
let urlBar = descMatches(".*http.*").findOne(3000);
if (urlBar) {
return urlBar.desc();
}
return "unknown";
}
// 保存结果到文件
function saveResults() {
let timestamp = new Date().getTime();
let filePath = "/sdcard/Download/kuaishou_comments_" + timestamp + ".json";
files.write(filePath, JSON.stringify(collectedData, null, 2));
log("结果已保存到: " + filePath);
// 导出CSV格式
let csvContent = "UID,评论内容,主页链接,采集时间\n";
collectedData.forEach(item => {
csvContent += `"${item.uid}","${item.comment.replace(/"/g, '""')}","${item.profile_url}","${item.timestamp}"\n`;
});
let csvPath = "/sdcard/Download/kuaishou_comments_" + timestamp + ".csv";
files.write(csvPath, csvContent);
log("CSV格式已保存到: " + csvPath);
}
// 日志函数
function log(msg) {
ui.log.setText(ui.log.text() + "\n" + msg);
console.log(msg);
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。