B2B网络软件
标题:
自动百度贴吧示例
[打印本页]
作者:
YYPOST群发软件
时间:
1 小时前
标题:
自动百度贴吧示例
自动百度贴吧示例
2.png
(599.06 KB, 下载次数: 0)
下载附件
1 小时前
上传
// AIWROK 完整自动化流程:启动百度贴吧 → 点击发帖 → 选择吧 → 输入标题和内容 → 发布
// 全程使用 agent 方式操作,不依赖无障碍权限
print.log("===== 百度贴吧发帖流程启动 =====");
print.time();
// ========== 配置区 ==========
var APP包名 = "com.baidu.tieba";
var 循环次数 = 1;
var 当前循环 = 0;
var 发布标题列表 = [
"这是一个测试标题",
"分享一下今天的心情",
"来讨论一下热门话题"
];
var 发布内容列表 = [
"无聊,就发一发帖子看看有什么好玩的。",
"今天天气不错,分享一个日常~",
"记录生活中的小美好,欢迎大家一起讨论!"
];
var 内容索引 = 0;
// ========== 获取设备信息 ==========
var 屏幕宽 = screen.getScreenWidth();
var 屏幕高 = screen.getScreenHeight();
print.log("屏幕尺寸:" + 屏幕宽 + " x " + 屏幕高);
print.log("代理状态:" + (agent.isOpen() ? "已开启" : "未开启"));
// ========== 工具函数 ==========
function 获取XML() {
var raw = agent.shell("uiautomator dump --compressed /proc/self/fd/1 2>/dev/null");
var rawStr = "" + raw;
var startIdx = rawStr.indexOf("<?xml");
var endIdx = rawStr.indexOf("</hierarchy>");
if (startIdx !== -1 && endIdx !== -1) {
return rawStr.substring(startIdx, endIdx + 13);
}
return rawStr;
}
function 查找节点中心(xml, text) {
var idx = ("" + xml).indexOf('text="' + text + '"');
if (idx === -1) {
idx = ("" + xml).indexOf("text='" + text + "'");
}
if (idx === -1) {
return null;
}
var 后面 = ("" + xml).substring(idx);
var m = 后面.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
if (!m) {
m = 后面.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
}
if (!m) {
return null;
}
var x1 = parseInt(m[1]);
var y1 = parseInt(m[2]);
var x2 = parseInt(m[3]);
var y2 = parseInt(m[4]);
return {
x: (x1 + x2) / 2,
y: (y1 + y2) / 2
};
}
function 查找输入框中心(xml, hintText) {
var xmlStr = "" + xml;
var editTextPattern = /<node[^>]*?class="android\.widget\.EditText"[^>]*?\/>/g;
var match;
while ((match = editTextPattern.exec(xmlStr)) !== null) {
var nodeStr = match[0];
var textMatch = nodeStr.match(/text="([^"]*)"/);
if (!textMatch) {
textMatch = nodeStr.match(/text='([^']*)'/);
}
if (textMatch && textMatch[1].indexOf(hintText) !== -1) {
var boundsMatch = nodeStr.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
if (!boundsMatch) {
boundsMatch = nodeStr.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
}
if (boundsMatch) {
var x1 = parseInt(boundsMatch[1]);
var y1 = parseInt(boundsMatch[2]);
var x2 = parseInt(boundsMatch[3]);
var y2 = parseInt(boundsMatch[4]);
return {
x: (x1 + x2) / 2,
y: (y1 + y2) / 2
};
}
}
}
var textPattern = new RegExp('text="([^"]*?' + hintText + '[^"]*)"', 'g');
while ((match = textPattern.exec(xmlStr)) !== null) {
var afterText = xmlStr.substring(match.index);
var boundsMatch = afterText.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
if (!boundsMatch) {
boundsMatch = afterText.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
}
if (boundsMatch) {
var x1 = parseInt(boundsMatch[1]);
var y1 = parseInt(boundsMatch[2]);
var x2 = parseInt(boundsMatch[3]);
var y2 = parseInt(boundsMatch[4]);
return {
x: (x1 + x2) / 2,
y: (y1 + y2) / 2
};
}
}
return null;
}
function 查找RecyclerView第一个条目(xml) {
var xmlStr = "" + xml;
var pattern = /class="androidx\.recyclerview\.widget\.RecyclerView"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/;
var match = xmlStr.match(pattern);
if (!match) {
pattern = /class='androidx\.recyclerview\.widget\.RecyclerView'[^>]*?bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/;
match = xmlStr.match(pattern);
}
if (match) {
var rvX1 = parseInt(match[1]);
var rvY1 = parseInt(match[2]);
var rvX2 = parseInt(match[3]);
var rvY2 = parseInt(match[4]);
var rvCenterX = (rvX1 + rvX2) / 2;
var rvTopY = rvY1 + 200;
return {
x: rvCenterX,
y: rvTopY
};
}
return null;
}
function 查找底部导航中间按钮(xml) {
var pattern = /<node\s[^>]*?index="3"[^>]*?class="android\.widget\.FrameLayout"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
var match;
while ((match = pattern.exec(xml)) !== null) {
var x1 = parseInt(match[1]);
var y1 = parseInt(match[2]);
var x2 = parseInt(match[3]);
var y2 = parseInt(match[4]);
var centerY = (y1 + y2) / 2;
if (centerY > 屏幕高 * 0.8) {
return {
x: (x1 + x2) / 2,
y: centerY
};
}
}
var pattern2 = /NAF="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
while ((match = pattern2.exec(xml)) !== null) {
var x1 = parseInt(match[1]);
var y1 = parseInt(match[2]);
var x2 = parseInt(match[3]);
var y2 = parseInt(match[4]);
var centerX = (x1 + x2) / 2;
var centerY = (y1 + y2) / 2;
if (centerY > 屏幕高 * 0.85 && centerX > 屏幕宽 * 0.3 && centerX < 屏幕宽 * 0.7) {
return {
x: centerX,
y: centerY
};
}
}
return null;
}
function 设置ADB输入法() {
try {
var 当前输入法 = ("" + agent.shell("settings get secure default_input_method")).trim();
print.log("当前默认输入法:" + 当前输入法);
var adbKeyboard = "com.android.adbkeyboard/.AdbIME";
if (当前输入法.indexOf("adbkeyboard") === -1) {
print.log("当前不是ADB输入法,尝试切换");
agent.shell("ime enable " + adbKeyboard);
sleep.millisecond(毫秒 = 300);
agent.shell("ime set " + adbKeyboard);
sleep.millisecond(毫秒 = 500);
print.log("✓ 已切换到ADB输入法");
} else {
print.log("✓ 当前已是ADB输入法");
}
} catch (e) {
print.log("⚠ 设置ADB输入法失败:" + e.message);
print.log("提示:请手动安装ADB Keyboard并设置为默认输入法");
}
}
function 输入文本(content, x, y) {
var 粘贴成功 = false;
agent.click(Math.floor(x), Math.floor(y));
sleep.second(秒 = 1);
agent.shell("service call clipboard 4 i32 1 s16 '" + content + "' i32 0");
sleep.millisecond(毫秒 = 300);
agent.shell("service call clipboard 3 i32 1 s16 '" + content + "' i32 0");
sleep.millisecond(毫秒 = 300);
Clipboard.copy(content);
sleep.millisecond(毫秒 = 300);
print.log("✓ 剪贴板已设置内容");
agent.shell("input keyevent 279");
sleep.second(秒 = 1);
var xmlA = 获取XML();
if (xmlA.indexOf(content.substring(0, 2)) !== -1) {
粘贴成功 = true;
print.log("✓ KEYCODE_PASTE 粘贴成功");
}
if (!粘贴成功) {
agent.shell("input keyevent 50 --meta 0x1000");
sleep.second(秒 = 1);
var xmlB = 获取XML();
if (xmlB.indexOf(content.substring(0, 2)) !== -1) {
粘贴成功 = true;
print.log("✓ Ctrl+V 粘贴成功");
}
}
if (!粘贴成功) {
var 长按命令 = "input swipe " + Math.floor(x) + " " + Math.floor(y) + " " + (Math.floor(x) + 1) + " " + (Math.floor(y) + 1) + " 2000";
agent.shell(长按命令);
sleep.second(秒 = 2);
var xmlC = 获取XML();
var 关键词 = ["粘贴", "Paste", "paste"];
for (var i = 0; i < 关键词.length; i++) {
if (xmlC.indexOf(关键词[i]) !== -1) {
var 后面 = xmlC.substring(xmlC.indexOf(关键词[i]));
var m = 后面.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
if (!m) {
m = 后面.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
}
if (m) {
var cx = (parseInt(m[1]) + parseInt(m[3])) / 2;
var cy = (parseInt(m[2]) + parseInt(m[4])) / 2;
agent.click(cx, cy);
粘贴成功 = true;
print.log("✓ 长按粘贴成功");
break;
}
}
}
}
if (!粘贴成功) {
print.log("✗ 所有粘贴方式均未成功");
}
return 粘贴成功;
}
// ========================================
// 主循环开始
// ========================================
for (当前循环 = 1; 循环次数 == 0 || 当前循环 <= 循环次数; 当前循环++) {
if (循环次数 > 0) {
print.log("\n======================================");
print.log("===== 第 " + 当前循环 + " / " + 循环次数 + " 次循环 =====");
print.log("======================================");
} else {
print.log("\n======================================");
print.log("===== 第 " + 当前循环 + " 次循环(无限模式)=====");
print.log("======================================");
}
var 发布标题 = 发布标题列表[内容索引 % 发布标题列表.length];
var 发布内容 = 发布内容列表[内容索引 % 发布内容列表.length];
内容索引++;
print.log("本次发布标题:" + 发布标题);
print.log("本次发布内容:" + 发布内容);
// ========================================
// 步骤1:启动百度贴吧
// ========================================
print.log("\n========== 步骤1:启动百度贴吧 ==========");
try {
app.openApp(APP包名);
print.log("✓ 已启动百度贴吧");
} catch (e) {
print.log("✗ 启动失败:" + e.message);
}
sleep.second(秒 = 5);
// ========================================
// 步骤2:设置ADB输入法(支持中文输入)
// ========================================
print.log("\n========== 步骤2:设置ADB输入法 ==========");
设置ADB输入法();
// ========================================
// 步骤3:点击底部导航中间的加号按钮
// ========================================
print.log("\n========== 步骤3:点击底部导航中间的加号按钮 ==========");
var 加号按钮点击成功 = false;
for (var i = 0; i < 5; i++) {
var xml2 = 获取XML();
print.log(" 正在扫描界面...");
var 加号按钮位置 = 查找底部导航中间按钮(xml2);
if (加号按钮位置) {
print.log(" ✓ 找到底部导航中间按钮:(" + Math.floor(加号按钮位置.x) + ", " + Math.floor(加号按钮位置.y) + ")");
agent.click(Math.floor(加号按钮位置.x), Math.floor(加号按钮位置.y));
加号按钮点击成功 = true;
sleep.second(秒 = 3);
var xml2b = 获取XML();
var 发布贴子选项位置 = 查找节点中心(xml2b, "发布贴子");
if (发布贴子选项位置) {
print.log(" ✓ 找到发布贴子选项");
agent.click(Math.floor(发布贴子选项位置.x), Math.floor(发布贴子选项位置.y));
print.log("✓ 已进入发布贴子页面");
}
break;
}
sleep.second(秒 = 2);
}
if (!加号按钮点击成功) {
print.log("⚠ 未找到加号按钮,使用百分比坐标");
agent.clickPercent(0.5, 0.96);
sleep.second(秒 = 3);
var xml2c = 获取XML();
var 发布贴子选项位置 = 查找节点中心(xml2c, "发布贴子");
if (发布贴子选项位置) {
print.log(" ✓ 找到发布贴子选项");
agent.click(Math.floor(发布贴子选项位置.x), Math.floor(发布贴子选项位置.y));
print.log("✓ 已进入发布贴子页面");
}
}
// ========================================
// 步骤4:选择吧
// ========================================
print.log("\n========== 步骤4:选择吧 ==========");
var 选择吧完成 = false;
var 已经点击选择吧 = false;
for (var j = 0; j < 5; j++) {
var xml3 = 获取XML();
if (xml3.indexOf("最近逛的吧") !== -1 || xml3.indexOf("关注的吧") !== -1) {
var 第一个吧位置 = 查找RecyclerView第一个条目(xml3);
if (第一个吧位置) {
print.log(" ✓ 选择列表中第一个吧:(" + Math.floor(第一个吧位置.x) + ", " + Math.floor(第一个吧位置.y) + ")");
agent.click(Math.floor(第一个吧位置.x), Math.floor(第一个吧位置.y));
sleep.second(秒 = 3);
选择吧完成 = true;
break;
}
}
var 选择吧位置 = 查找节点中心(xml3, "选择吧");
if (选择吧位置 && !已经点击选择吧) {
print.log(" ✓ 找到选择吧:(" + Math.floor(选择吧位置.x) + ", " + Math.floor(选择吧位置.y) + ")");
agent.click(Math.floor(选择吧位置.x), Math.floor(选择吧位置.y));
已经点击选择吧 = true;
sleep.second(秒 = 3);
} else if (xml3.indexOf("发布贴子") !== -1) {
print.log("✓ 已在发布页面(可能已选吧)");
选择吧完成 = true;
break;
}
sleep.second(秒 = 2);
}
if (!选择吧完成) {
print.log("⚠ 跳过选择吧步骤");
}
// ========================================
// 步骤5:输入标题
// ========================================
print.log("\n========== 步骤5:输入标题 ==========");
var 标题输入成功 = false;
for (var k = 0; k < 5; k++) {
var xml4 = 获取XML();
var 标题输入框位置 = 查找输入框中心(xml4, "请输入完整贴子标题");
if (!标题输入框位置) {
标题输入框位置 = 查找输入框中心(xml4, "完整贴子标题");
}
if (!标题输入框位置) {
标题输入框位置 = 查找输入框中心(xml4, "标题");
}
if (标题输入框位置) {
print.log(" ✓ 找到标题输入框:(" + Math.floor(标题输入框位置.x) + ", " + Math.floor(标题输入框位置.y) + ")");
var 粘贴结果 = 输入文本(发布标题, 标题输入框位置.x, 标题输入框位置.y);
if (粘贴结果) {
print.log("✓ 标题输入成功");
标题输入成功 = true;
} else {
print.log("✗ 标题输入失败");
}
break;
}
sleep.second(秒 = 2);
}
if (!标题输入成功) {
print.log("✗ 标题输入失败");
}
// ========================================
// 步骤6:输入内容
// ========================================
print.log("\n========== 步骤6:输入内容 ==========");
var 内容输入成功 = false;
for (var l = 0; l < 5; l++) {
var xml5 = 获取XML();
var 内容输入框位置 = 查找输入框中心(xml5, "来吧,尽情发挥吧");
if (!内容输入框位置) {
内容输入框位置 = 查找输入框中心(xml5, "尽情发挥");
}
if (!内容输入框位置) {
内容输入框位置 = 查找输入框中心(xml5, "请输入内容");
}
if (内容输入框位置) {
print.log(" ✓ 找到内容输入框:(" + Math.floor(内容输入框位置.x) + ", " + Math.floor(内容输入框位置.y) + ")");
var 粘贴结果 = 输入文本(发布内容, 内容输入框位置.x, 内容输入框位置.y);
if (粘贴结果) {
print.log("✓ 内容输入成功");
内容输入成功 = true;
} else {
print.log("✗ 内容输入失败");
}
break;
}
sleep.second(秒 = 2);
}
if (!内容输入成功) {
print.log("✗ 内容输入失败");
}
// ========================================
// 步骤7:点击发布
// ========================================
print.log("\n========== 步骤7:点击发布 ==========");
var 发布成功 = false;
for (var m = 0; m < 5; m++) {
var xml6 = 获取XML();
var 发布按钮位置 = 查找节点中心(xml6, "发布");
if (发布按钮位置) {
print.log(" ✓ 找到发布按钮:(" + Math.floor(发布按钮位置.x) + ", " + Math.floor(发布按钮位置.y) + ")");
agent.click(Math.floor(发布按钮位置.x), Math.floor(发布按钮位置.y));
sleep.second(秒 = 3);
var xml6b = 获取XML();
if (xml6b.indexOf("发布成功") !== -1 || xml6b.indexOf("帖子已发布") !== -1) {
print.log("✓ 帖子发布成功");
发布成功 = true;
} else if (xml6b.indexOf("发布贴子") === -1) {
print.log("✓ 已离开发布页面,发布流程完成");
发布成功 = true;
} else {
print.log("⚠ 发布按钮点击后页面未变化");
}
break;
}
sleep.second(秒 = 2);
}
if (!发布成功) {
print.log("✗ 发布失败");
}
// ========================================
// 步骤8:关闭APP
// ========================================
print.log("\n========== 步骤8:关闭APP ==========");
try {
agent.shell("am force-stop " + APP包名);
print.log("✓ 已关闭百度贴吧");
} catch (e) {
print.log("⚠ 关闭APP失败:" + e.message);
}
sleep.second(秒 = 3);
// ========================================
// 循环间隔
// ========================================
if (循环次数 == 0 || 当前循环 < 循环次数) {
print.log("\n========== 等待下一次循环 ==========");
sleep.second(秒 = 5);
}
}
// ========================================
// 结果汇总
// ========================================
print.timeEnd();
print.log("\n======================================");
print.log("===== 所有循环执行完成 =====");
if (循环次数 > 0) {
print.log("总计执行:" + 循环次数 + " 次");
} else {
print.log("无限循环模式,已执行:" + (当前循环 - 1) + " 次");
}
print.log("======================================");
复制代码
欢迎光临 B2B网络软件 (http://bbs.niubt.cn/)
Powered by Discuz! X3.2