 | |  |  | 豆包识别验证码加拖动验证码示例
- // AIWROK 自动化流程:全屏截图 → 启动豆包 → 发送截图 → 等待AI回答 → 采集回答内容 → 保存到文件
- // 全程使用 agent.getXml() 获取界面源码
- // 包名:com.larus.nova(豆包)
- //
- // 使用说明:
- // 1. 在需要截图的页面运行脚本
- // 2. 脚本会自动截图并发送给豆包分析
- // 3. 采集结果保存到 /sdcard/豆包截图分析.json
- print.log("===== 豆包截图发送流程启动 =====");
- print.time();
- // ========== 配置区 ==========
- var 豆包包名 = "com.larus.nova";
- var 截图保存路径 = "/sdcard/screenshot.png";
- // 发送后等待AI回答的最大秒数(整体超时)
- var 等待回答超时秒 = 8;
- // 检测到新回答出现后,再等待多少秒让回答输出完整
- var 回答输出等待秒 = 10;
- // 验证码滑块拖动校准系数(根据实际效果调整,默认1.0)
- // 如果拖动距离偏大,调小此值(如0.95);如果偏小,调大此值(如1.05)
- var 滑块校准系数 = 1.0;
- // ========== 获取设备信息 ==========
- var 屏幕宽 = screen.getScreenWidth();
- var 屏幕高 = screen.getScreenHeight();
- var 验证码滑块距离 = null;
- print.log("屏幕尺寸:" + 屏幕宽 + " x " + 屏幕高);
- print.log("代理状态:" + (agent.isOpen() ? "已开启" : "未开启"));
- // ========== 工具函数 ==========
- function 获取UI() {
- var xml = agent.getXml();
- return "" + xml;
- }
- function 字符串长度(s) {
- var str = "" + s;
- return str.length;
- }
- function 解码HTML实体(s) {
- var str = "" + s;
- str = str.replace(/
- /g, "\n");
- str = str.replace(/
- /g, "\r");
- str = str.replace(/ /g, "\t");
- str = str.replace(/'/g, "'");
- str = str.replace(/"/g, '"');
- str = str.replace(/"/g, '"');
- str = str.replace(/'/g, "'");
- str = str.replace(/&/g, "&");
- str = str.replace(/</g, "<");
- str = str.replace(/>/g, ">");
- return str;
- }
- function 采集AI回答列表(xml, 严格过滤) {
- if (严格过滤 === undefined) 严格过滤 = true;
- var xmlStr = "" + xml;
- var 回答列表 = [];
- var listIdx = xmlStr.indexOf('id/message_list"');
- if (listIdx === -1) {
- print.log("⚠ 未找到消息列表节点");
- return 回答列表;
- }
- var 后面 = xmlStr.substring(listIdx);
- var 位置 = 0;
- while (true) {
- var cvIdx = 后面.indexOf('id/content_view"', 位置);
- if (cvIdx === -1) break;
- var 段 = 后面.substring(cvIdx);
-
- var cvBounds = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- var isAI = false;
- if (cvBounds) {
- var cvX1 = parseInt(cvBounds[1]);
- if (cvX1 < 屏幕宽 / 2) {
- isAI = true;
- }
- }
- var 标签结束 = 段.indexOf(">");
- if (标签结束 === -1) break;
- var 子段 = 段.substring(标签结束 + 1);
- var 文本匹配 = 子段.match(/<node[^>]*?text="([^"]+)"[^>]*?class="android\.widget\.TextView"[^>]*?\/?>/);
- if (!文本匹配) {
- 文本匹配 = 子段.match(/<node[^>]*?class="android\.widget\.TextView"[^>]*?text="([^"]+)"[^>]*?\/?>/);
- }
- if (文本匹配 && 文本匹配[1]) {
- var 原始文本 = 文本匹配[1];
- var 解码文本 = 解码HTML实体(原始文本);
- if (严格过滤) {
- if (isAI && 字符串长度(解码文本) > 0) {
- 回答列表.push(解码文本);
- }
- } else {
- if (字符串长度(解码文本) > 0) {
- 回答列表.push(解码文本);
- }
- }
- }
- 位置 = cvIdx + 30;
- }
- return 回答列表;
- }
- function 获取当前最后AI回答(xml) {
- var 回答列表 = 采集AI回答列表(xml);
- if (回答列表.length === 0) return "";
- return 回答列表[回答列表.length - 1];
- }
- // 全屏截图(使用shell命令)
- function 全屏截图(保存路径) {
- try {
- var result = agent.shell("screencap -p " + 保存路径);
- print.log("✓ 截图命令执行:" + result);
-
- var lsResult = agent.shell("ls -la " + 保存路径);
- print.log("✓ 截图文件检查:" + lsResult);
-
- return true;
- } catch (e) {
- print.log("⚠ 截图失败:" + e.message);
- return false;
- }
- }
- // 查找豆包的加号按钮(优先右下角 action_menu_entrance)
- function 查找加号按钮(xml) {
- var xmlStr = "" + xml;
-
- var menuEntranceIdx = xmlStr.indexOf('id/action_menu_entrance"');
- if (menuEntranceIdx !== -1) {
- var 段 = xmlStr.substring(menuEntranceIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- return {
- x: (parseInt(m[1]) + parseInt(m[3])) / 2,
- y: (parseInt(m[2]) + parseInt(m[4])) / 2
- };
- }
- }
- var entranceIdx = xmlStr.indexOf('id/action_entrance"');
- if (entranceIdx !== -1) {
- var 段2 = xmlStr.substring(entranceIdx);
- var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m2) {
- return {
- x: (parseInt(m2[1]) + parseInt(m2[3])) / 2,
- y: (parseInt(m2[2]) + parseInt(m2[4])) / 2
- };
- }
- }
- var plusIdx = xmlStr.indexOf('text="+"');
- if (plusIdx !== -1) {
- var 段3 = xmlStr.substring(plusIdx);
- var m3 = 段3.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m3) {
- return {
- x: (parseInt(m3[1]) + parseInt(m3[3])) / 2,
- y: (parseInt(m3[2]) + parseInt(m3[4])) / 2
- };
- }
- }
- var attachIdx = xmlStr.indexOf('content-desc="附件"');
- if (attachIdx === -1) {
- attachIdx = xmlStr.indexOf('content-desc="添加"');
- }
- if (attachIdx !== -1) {
- var 段4 = xmlStr.substring(attachIdx);
- var m4 = 段4.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m4) {
- return {
- x: (parseInt(m4[1]) + parseInt(m4[3])) / 2,
- y: (parseInt(m4[2]) + parseInt(m4[4])) / 2
- };
- }
- }
- return null;
- }
- function 查找输入框中心(xml) {
- var xmlStr = "" + xml;
- var idx = xmlStr.indexOf('id/input_text"');
- if (idx === -1) return null;
- var 段 = xmlStr.substring(idx);
- var 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 粘贴文本(文本) {
- try {
- Clipboard.copy("" + 文本);
- } catch (e) {
- print.log("⚠ Clipboard.copy 失败:" + e.message);
- }
- sleep.millisecond(毫秒 = 300);
- try {
- agent.shell("service call clipboard 3 i32 1 s16 '" + 文本 + "' i32 0");
- } catch (e2) {
- // 忽略错误
- }
- sleep.millisecond(毫秒 = 300);
- agent.shell("input keyevent 279");
- sleep.second(秒 = 1);
- print.log("✓ 已粘贴文本:" + 文本);
- }
- function 是否已进入相机页面(xml) {
- var xmlStr = "" + xml;
- return xmlStr.indexOf('id/focus_container"') !== -1 && xmlStr.indexOf('id/suggest_action_bar"') === -1;
- }
- function 是否已进入图片预览页面(xml) {
- var xmlStr = "" + xml;
- return xmlStr.indexOf('id/focus_container"') !== -1 && xmlStr.indexOf('id/suggest_action_bar"') !== -1;
- }
- function 是否已进入图片选择列表页面(xml) {
- var xmlStr = "" + xml;
- return xmlStr.indexOf('id/media_viewpager"') !== -1 || xmlStr.indexOf('id/media_list"') !== -1;
- }
- function 查找相册选项(xml) {
- var xmlStr = "" + xml;
-
- if (是否已进入图片预览页面(xml)) {
- return { x: -1, y: -1, 已进入预览页: true };
- }
-
- if (是否已进入图片选择列表页面(xml)) {
- return { x: -1, y: -1, 已进入选择页: true };
- }
-
- var albumIdx = xmlStr.indexOf('text="相册"');
- if (albumIdx === -1) {
- albumIdx = xmlStr.indexOf('text="图片"');
- }
- if (albumIdx === -1) {
- albumIdx = xmlStr.indexOf('text="照片"');
- }
- if (albumIdx === -1) {
- albumIdx = xmlStr.indexOf('text="所有照片"');
- }
- if (albumIdx === -1) {
- albumIdx = xmlStr.indexOf('text="从相册选择"');
- }
- if (albumIdx === -1) {
- albumIdx = xmlStr.indexOf('text="选择图片"');
- }
- if (albumIdx !== -1) {
- var 段 = xmlStr.substring(albumIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- return {
- x: (parseInt(m[1]) + parseInt(m[3])) / 2,
- y: (parseInt(m[2]) + parseInt(m[4])) / 2
- };
- }
- }
- var albumIconIdx = xmlStr.indexOf('content-desc="相册"');
- if (albumIconIdx === -1) {
- albumIconIdx = xmlStr.indexOf('content-desc="图片"');
- }
- if (albumIconIdx !== -1) {
- var 段2 = xmlStr.substring(albumIconIdx);
- var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m2) {
- return {
- x: (parseInt(m2[1]) + parseInt(m2[3])) / 2,
- y: (parseInt(m2[2]) + parseInt(m2[4])) / 2
- };
- }
- }
- return null;
- }
- // 查找图片选择器中的第一张图片(刚截的图)
- function 查找第一张图片(xml) {
- var xmlStr = "" + xml;
-
- var thumbnailIdx = xmlStr.indexOf('id/iv_thumbnail"');
- if (thumbnailIdx !== -1) {
- var 段 = xmlStr.substring(thumbnailIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- return {
- x: (parseInt(m[1]) + parseInt(m[3])) / 2,
- y: (parseInt(m[2]) + parseInt(m[4])) / 2
- };
- }
- }
- var imageIdx = xmlStr.indexOf('class="android.widget.ImageView"');
- if (imageIdx !== -1) {
- var 段2 = xmlStr.substring(imageIdx);
- var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m2) {
- var x = (parseInt(m2[1]) + parseInt(m2[3])) / 2;
- var y = (parseInt(m2[2]) + parseInt(m2[4])) / 2;
- if (y > 400) {
- return { x: x, y: y };
- }
- }
- }
- return null;
- }
- // 查找发送按钮
- function 查找发送按钮中心(xml) {
- var xmlStr = "" + xml;
- var sendTextIdx = xmlStr.indexOf('text="发送"');
- if (sendTextIdx !== -1) {
- var 段 = xmlStr.substring(sendTextIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- return {
- x: (parseInt(m[1]) + parseInt(m[3])) / 2,
- y: (parseInt(m[2]) + parseInt(m[4])) / 2
- };
- }
- }
- var sendIdIdx = xmlStr.indexOf('id/action_send"');
- if (sendIdIdx !== -1) {
- var 段2 = xmlStr.substring(sendIdIdx);
- var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m2) {
- return {
- x: (parseInt(m2[1]) + parseInt(m2[3])) / 2,
- y: (parseInt(m2[2]) + parseInt(m2[4])) / 2
- };
- }
- }
- var rightIconIdx = xmlStr.indexOf('id/right_icon"');
- if (rightIconIdx !== -1) {
- var 段3 = xmlStr.substring(rightIconIdx);
- var m3 = 段3.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m3) {
- var y = (parseInt(m3[2]) + parseInt(m3[4])) / 2;
- if (y > 3000) {
- return {
- x: (parseInt(m3[1]) + parseInt(m3[3])) / 2,
- y: y
- };
- }
- }
- }
- return null;
- }
- function 查找并点击展开按钮(xml) {
- var xmlStr = "" + xml;
-
- var expandIdx = xmlStr.indexOf('content-desc="展开"');
- if (expandIdx === -1) {
- expandIdx = xmlStr.indexOf('content-desc="更多"');
- }
- if (expandIdx === -1) {
- expandIdx = xmlStr.indexOf('content-desc="收起"');
- }
-
- if (expandIdx !== -1) {
- var 段 = xmlStr.substring(expandIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- var x = (parseInt(m[1]) + parseInt(m[3])) / 2;
- var y = (parseInt(m[2]) + parseInt(m[4])) / 2;
- agent.click(x, y);
- print.log("✓ 已点击展开按钮(content-desc),坐标(" + Math.round(x) + "," + Math.round(y) + ")");
- sleep.second(秒 = 1);
- return true;
- }
- }
- var textExpandIdx = xmlStr.indexOf('text="展开"');
- if (textExpandIdx === -1) {
- textExpandIdx = xmlStr.indexOf('text="更多"');
- }
- if (textExpandIdx !== -1) {
- var 段2 = xmlStr.substring(textExpandIdx);
- var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m2) {
- var x2 = (parseInt(m2[1]) + parseInt(m2[3])) / 2;
- var y2 = (parseInt(m2[2]) + parseInt(m2[4])) / 2;
- agent.click(x2, y2);
- print.log("✓ 已点击展开按钮(文本匹配),坐标(" + Math.round(x2) + "," + Math.round(y2) + ")");
- sleep.second(秒 = 1);
- return true;
- }
- }
- return false;
- }
- function 等待AI回答完成(发送前的最后文本) {
- var 已耗时 = 0;
- var 检查间隔秒 = 1;
- var 发送前回答数量 = 0;
- var xml = 获取UI();
- var 初始列表 = 采集AI回答列表(xml, false);
- 发送前回答数量 = 初始列表.length;
- print.log("发送前AI回答数量:" + 发送前回答数量);
- while (已耗时 < 等待回答超时秒) {
- sleep.second(秒 = 检查间隔秒);
- 已耗时 += 检查间隔秒;
- xml = 获取UI();
- var 回答列表 = 采集AI回答列表(xml, false);
-
- if (回答列表.length > 发送前回答数量) {
- print.log("✓ 检测到新回答(" + 已耗时 + "秒),数量从" + 发送前回答数量 + "增加到" + 回答列表.length);
- sleep.second(秒 = 3);
-
- xml = 获取UI();
- var 最终列表 = 采集AI回答列表(xml, false);
- if (最终列表.length > 0) {
- var 最终文本 = 最终列表[最终列表.length - 1];
- print.log("✓ 采集成功,返回结果:" + 最终文本);
- return 最终文本;
- }
- }
- }
- print.log("⚠ 等待AI回答超时(" + 等待回答超时秒 + "秒),尝试返回当前内容");
- xml = 获取UI();
- var 兜底列表 = 采集AI回答列表(xml, false);
- if (兜底列表.length > 0) {
- var 兜底文本 = 兜底列表[兜底列表.length - 1];
- print.log("✓ 超时兜底:返回当前采集到的回答:" + 兜底文本);
- return 兜底文本;
- }
- return null;
- }
- function 格式化对话(对话列表) {
- var 数据 = {
- "采集时间": new Date().toString(),
- "对话轮数": 对话列表.length,
- "对话记录": []
- };
-
- for (var i = 0; i < 对话列表.length; i++) {
- 数据.对话记录.push({
- "序号": i + 1,
- "角色": 对话列表[i].角色,
- "内容": 对话列表[i].内容
- });
- }
-
- return JSON.stringify(数据, null, 2);
- }
- function 写入文件(文件路径, 内容) {
- try {
- var str = "" + 内容;
- var fos = new java.io.FileOutputStream(文件路径);
- fos.write(str.getBytes("UTF-8"));
- fos.close();
- print.log("✓ 已写入文件(JSON格式):" + 文件路径);
-
- var catResult = agent.shell("cat " + 文件路径 + " | head -2");
- print.log("✓ cat验证结果:" + catResult);
-
- return true;
- } catch (e) {
- print.log("⚠ JSON写入异常:" + e.message);
- }
- print.log("✗ 写入文件失败:" + 文件路径);
- return false;
- }
- function 主流程() {
- // 步骤1:全屏截图
- print.log("\n========== 步骤1:全屏截图 ==========");
- var 截图成功 = 全屏截图(截图保存路径);
- if (!截图成功) {
- print.log("✗ 截图失败,退出流程");
- print.log("===== 豆包截图发送流程结束 =====");
- return;
- }
- // 步骤2:启动豆包APP
- print.log("\n========== 步骤2:启动豆包APP ==========");
- try {
- app.openApp(豆包包名);
- print.log("✓ 已启动豆包");
- } catch (e) {
- print.log("⚠ 启动失败:" + e.message);
- }
- sleep.second(秒 = 5);
- // 步骤3:确认进入对话页面
- print.log("\n========== 步骤3:确认进入对话页面 ==========");
- var xml = 获取UI();
- if (xml.indexOf("message_list") === -1) {
- print.log("⚠ 当前页面可能不是豆包对话页,再次等待");
- sleep.second(秒 = 3);
- xml = 获取UI();
- }
- if (xml.indexOf("message_list") !== -1) {
- print.log("✓ 已进入豆包对话页面");
- } else {
- print.log("⚠ 未检测到消息列表");
- }
- // 步骤4:记录发送前的最后一条AI回答(作为检测基线)
- var 发送前最后文本 = 获取当前最后AI回答(xml);
- // 步骤5:点击加号按钮打开附件菜单
- print.log("\n========== 步骤5:打开附件菜单 ==========");
- var 加号按钮 = 查找加号按钮(xml);
- if (加号按钮) {
- agent.click(加号按钮.x, 加号按钮.y);
- print.log("✓ 已点击action_entrance按钮,坐标(" + Math.round(加号按钮.x) + "," + Math.round(加号按钮.y) + ")");
- } else {
- print.log("⚠ 未找到加号按钮,尝试点击输入框左侧区域");
- var inputIdx = xml.indexOf('id/speak_area"');
- if (inputIdx !== -1) {
- var 段 = xml.substring(inputIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- var speakLeft = parseInt(m[1]);
- var speakY = (parseInt(m[2]) + parseInt(m[4])) / 2;
- agent.click(speakLeft - 50, speakY);
- print.log("✓ 已点击输入框左侧区域");
- }
- }
- }
- sleep.second(秒 = 2);
- // 步骤6:等待页面跳转并处理图片选择
- print.log("\n========== 步骤6:处理图片选择页面 ==========");
- var 当前页面状态 = "未知";
- var 尝试次数 = 0;
- while (当前页面状态 === "未知" && 尝试次数 < 5) {
- sleep.second(秒 = 2);
- xml = 获取UI();
-
- if (是否已进入图片预览页面(xml)) {
- 当前页面状态 = "预览页";
- print.log("✓ 已进入图片预览页面");
- } else if (是否已进入图片选择列表页面(xml)) {
- 当前页面状态 = "选择列表";
- print.log("✓ 已进入图片选择列表页面");
- } else if (是否已进入相机页面(xml)) {
- print.log("✓ 已进入相机页面,点击左下角图片缩略图进入相册");
- agent.click(屏幕宽 * 0.15, 屏幕高 * 0.95);
- print.log("✓ 已点击左下角图片缩略图");
- continue;
- } else {
- var 相册选项 = 查找相册选项(xml);
- if (相册选项 && !相册选项.已进入预览页 && !相册选项.已进入选择页) {
- print.log("✓ 找到相册选项,准备点击");
- agent.click(相册选项.x, 相册选项.y);
- print.log("✓ 已点击相册选项,坐标(" + Math.round(相册选项.x) + "," + Math.round(相册选项.y) + ")");
- continue;
- }
- }
- 尝试次数++;
- }
-
- if (当前页面状态 === "选择列表") {
- var 第一张图片 = 查找第一张图片(xml);
- if (第一张图片) {
- agent.click(第一张图片.x, 第一张图片.y);
- print.log("✓ 已选择第一张图片,坐标(" + Math.round(第一张图片.x) + "," + Math.round(第一张图片.y) + ")");
- sleep.second(秒 = 2);
-
- xml = 获取UI();
- if (是否已进入图片预览页面(xml)) {
- 当前页面状态 = "预览页";
- print.log("✓ 已进入图片预览页面");
- }
- }
- }
- // 步骤7:粘贴文字到输入框(选择图片后马上粘贴)
- print.log("\n========== 步骤7:粘贴文字询问拖动距离坐标 ==========");
- xml = 获取UI();
- var 输入框 = 查找输入框中心(xml);
- if (输入框) {
- agent.click(输入框.x, 输入框.y);
- sleep.second(秒 = 1);
- 粘贴文本("请告诉我验证码滑块需要拖动的距离坐标,只输出坐标数字,不要其他文字");
- } else {
- print.log("⚠ 未找到输入框");
- }
- sleep.second(秒 = 2);
- // 步骤8:发送图片和文字
- print.log("\n========== 步骤8:发送图片和文字 ==========");
- if (当前页面状态 === "预览页") {
- var confirmX = 屏幕宽 * 0.5;
- var confirmY = 屏幕高 * 0.92;
- agent.click(confirmX, confirmY);
- print.log("✓ 已点击预览页底部中间白色对勾确认按钮,坐标(" + Math.round(confirmX) + "," + Math.round(confirmY) + ")");
- sleep.second(秒 = 3);
- xml = 获取UI();
- }
-
- var sendBtn = 查找发送按钮中心(xml);
- if (sendBtn) {
- agent.click(sendBtn.x, sendBtn.y);
- print.log("✓ 已点击对话页面发送按钮,坐标(" + Math.round(sendBtn.x) + "," + Math.round(sendBtn.y) + ")");
- } else {
- var actionSendIdx = xml.indexOf('id/action_send"');
- if (actionSendIdx !== -1) {
- var 段 = xml.substring(actionSendIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- var sendX = (parseInt(m[1]) + parseInt(m[3])) / 2;
- var sendY = (parseInt(m[2]) + parseInt(m[4])) / 2;
- agent.click(sendX, sendY);
- print.log("✓ 已点击action_send按钮,坐标(" + Math.round(sendX) + "," + Math.round(sendY) + ")");
- }
- }
- }
- sleep.second(秒 = 5);
- // 步骤9:记录发送后的基线文本
- print.log("\n========== 步骤9:记录基线文本 ==========");
- xml = 获取UI();
- 发送前最后文本 = 获取当前最后AI回答(xml);
- print.log("发送前最后文本长度:" + 字符串长度(发送前最后文本));
- // 步骤10:等待AI回答
- print.log("\n========== 步骤10:等待AI回答 ==========");
- var 新回答文本 = 等待AI回答完成(发送前最后文本);
- // 步骤11:解析坐标并保存为全局变量
- print.log("\n========== 步骤11:解析坐标 ==========");
-
- if (新回答文本 && 字符串长度(新回答文本) > 0) {
- print.log("✓ 采集到AI回答");
- print.log("--- 采集内容开始 ---");
- print.log(新回答文本);
- print.log("--- 采集内容结束 ---");
-
- var 坐标匹配 = 新回答文本.match(/(\d+)\s*[,,]\s*(\d+)/);
- if (坐标匹配) {
- 验证码滑块距离 = {
- x: parseInt(坐标匹配[1]),
- y: parseInt(坐标匹配[2])
- };
- print.log("✓ 提取到坐标:(" + 验证码滑块距离.x + ", " + 验证码滑块距离.y + ")");
- } else {
- var 单个数字匹配 = 新回答文本.match(/(\d+)/);
- if (单个数字匹配) {
- 验证码滑块距离 = {
- x: parseInt(单个数字匹配[1]),
- y: 0
- };
- print.log("✓ 提取到单个数字:" + 验证码滑块距离.x);
- } else {
- 验证码滑块距离 = null;
- print.log("⚠ 未提取到坐标");
- }
- }
- } else {
- 验证码滑块距离 = null;
- print.log("⚠ 未能采集到新回答");
- }
- // 步骤12:切换回B站并拖动验证码滑块
- if (验证码滑块距离 && 验证码滑块距离.x > 0) {
- print.log("\n========== 步骤12:切换回B站并拖动滑块 ==========");
-
- agent.shell("input keyevent 187");
- print.log("✓ 已按后台键打开任务列表");
- sleep.second(秒 = 2);
- xml = 获取UI();
- var biliIdx = xml.indexOf('哔哩哔哩');
- if (biliIdx === -1) {
- biliIdx = xml.indexOf('bilibili');
- }
-
- if (biliIdx !== -1) {
- var 段 = xml.substring(biliIdx);
- var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (m) {
- var clickX = (parseInt(m[1]) + parseInt(m[3])) / 2;
- var clickY = (parseInt(m[2]) + parseInt(m[4])) / 2;
- agent.click(clickX, clickY);
- print.log("✓ 已点击B站任务卡片,坐标(" + Math.round(clickX) + "," + Math.round(clickY) + ")");
- }
- } else {
- print.log("⚠ 未找到B站任务卡片,尝试直接打开");
- try {
- app.openApp("tv.danmaku.bili");
- print.log("✓ 已打开B站");
- } catch (e) {
- print.log("⚠ 打开B站失败:" + e.message);
- }
- }
- sleep.second(秒 = 3);
- var xml = 获取UI();
- var 验证码区域左边界 = 屏幕宽 * 0.15;
-
- var 滑块轨道匹配 = xml.match(/<node[^>]*?text="拖动滑块完成拼图"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
- if (滑块轨道匹配) {
- 验证码区域左边界 = parseInt(滑块轨道匹配[1]);
- }
- var 拖动距离 = 验证码滑块距离.x * 滑块校准系数;
- var startX = 验证码区域左边界 + 50;
- var startY = 屏幕高 * 0.42;
- var endX = startX + 拖动距离;
- var endY = startY;
- print.log("✓ 验证码区域左边界: " + 验证码区域左边界 + ", 拖动距离: " + 拖动距离);
- agent.swip(startX, startY, endX, endY, 2000);
- print.log("✓ 已拖动滑块,起点(" + Math.round(startX) + "," + Math.round(startY) + "),终点(" + Math.round(endX) + "," + Math.round(endY) + ")");
- }
- print.log("\n===== 豆包截图发送流程结束 =====");
- }
- 主流程();
复制代码
| |  | |  |
|