信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 3|回复: 0
打印 上一主题 下一主题

[宣传软件网站动态] 解析Kimi返回的拖动距离示例

[复制链接]

794

主题

878

帖子

5626

积分

积分
5626

资讯缩略图:

资讯发布日期:2026-07-21

资讯发布简介:解析Kimi返回的拖动距离示例

资讯关键词:解析Kimi返回的拖动距离示例

资讯所属分类:IT资讯 

联系:

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件网站分类目录 网址:http://www.postbbs.com/

资讯详细描述
解析Kimi返回的拖动距离示例
解析Kimi返回的拖动距离示例 b2b软件
  1. // AIWROK 自动化流程:截图B站验证码 → 启动Kimi助手 → 发送截图询问拖动距离 → 采集回答 → 切回B站拖动滑块
  2. // 包名:com.moonshot.kimichat(Kimi AI)
  3. //
  4. // 使用说明:
  5. //   1. 在B站验证码页面运行脚本
  6. //   2. 脚本自动截图并发送给Kimi识别
  7. //   3. 解析Kimi返回的拖动距离,切回B站拖动滑块
  8. //   4. Kimi使用WebView/Compose渲染,XML可能无可用节点,故采用OCR优先+坐标兜底策略

  9. print.log("===== KIMI识别验证码拖动B站流程启动 =====");
  10. print.time();

  11. // ========== 配置区 ==========
  12. var KIMI包名 = "com.moonshot.kimichat";
  13. var B站包名 = "tv.danmaku.bili";
  14. var 截图保存路径 = "/sdcard/验证码截图.png";

  15. var 等待回答超时秒 = 60;
  16. var 回答输出等待秒 = 60;
  17. var 滑块校准系数 = 1.0;

  18. var 提问话术 = "请帮我分析这张图片,告诉我左边的方块需要向右移动多少像素才能和右边的缺口对齐,只输出:距离加数字。";

  19. // ========== 获取设备信息 ==========
  20. var 屏幕宽 = screen.getScreenWidth();
  21. var 屏幕高 = screen.getScreenHeight();
  22. var 验证码滑块距离 = null;
  23. print.log("屏幕尺寸:" + 屏幕宽 + " x " + 屏幕高);
  24. try {
  25.     var 代理状态 = agent.isOpen();
  26.     print.log("代理状态:" + (代理状态 ? "已开启" : "未开启"));
  27. } catch (e) {
  28.     print.log("代理状态检查失败:" + e.message);
  29. }

  30. // ========== 工具函数 ==========

  31. function 获取UI() {
  32.     var xml = agent.getXml();
  33.     return "" + xml;
  34. }

  35. function 字符串长度(s) {
  36.     var str = "" + s;
  37.     return str.length;
  38. }

  39. function 解码HTML实体(s) {
  40.     var str = "" + s;
  41.     str = str.replace(/
  42. /g, "\n");
  43.     str = str.replace(/
  44. /g, "\r");
  45.     str = str.replace(/        /g, "\t");
  46.     str = str.replace(/'/g, "'");
  47.     str = str.replace(/"/g, '"');
  48.     str = str.replace(/"/g, '"');
  49.     str = str.replace(/'/g, "'");
  50.     str = str.replace(/&/g, "&");
  51.     str = str.replace(/</g, "<");
  52.     str = str.replace(/>/g, ">");
  53.     return str;
  54. }

  55. function 获取当前最后AI回答(xml) {
  56.     var 回答列表 = 采集AI回答列表(xml);
  57.     if (回答列表.length === 0) return "";
  58.    
  59.     print.log("调试:回答列表共" + 回答列表.length + "条:" + 回答列表.join(", "));
  60.    
  61.     var 候选回答 = [];
  62.     for (var i = 0; i < 回答列表.length; i++) {
  63.         var 回答 = 回答列表[i];
  64.         if (回答.indexOf("距离") !== -1 || 回答.indexOf("像素") !== -1) {
  65.             候选回答.push({ text: 回答, len: 回答.length });
  66.         }
  67.     }
  68.    
  69.     if (候选回答.length > 0) {
  70.         候选回答.sort(function(a, b) { return a.len - b.len; });
  71.         print.log("✓ 找到包含距离信息的回答,选择最短的:'" + 候选回答[0].text + "'");
  72.         return 候选回答[0].text;
  73.     }
  74.    
  75.     for (var j = 0; j < 回答列表.length; j++) {
  76.         var 回答2 = 回答列表[j];
  77.         var 数字匹配 = 回答2.match(/\d+/g);
  78.         if (数字匹配 && 数字匹配.length > 0) {
  79.             var 数字 = parseInt(数字匹配[0]);
  80.             if (数字 >= 10 && 数字 <= 500) {
  81.                 print.log("✓ 找到包含合理数字的回答:'" + 回答2 + "'");
  82.                 return 回答2;
  83.             }
  84.         }
  85.     }
  86.    
  87.     return 回答列表[回答列表.length - 1];
  88. }

  89. function OCR识别屏幕区域(xml) {
  90.     try {
  91.         var img = screen.screenShotFull();
  92.         
  93.         var ocrres = img.MLKitOcr('zhs');
  94.         var ocrText = "";
  95.         
  96.         if (ocrres && typeof ocrres.getAllString === 'function') {
  97.             ocrText = "" + ocrres.getAllString();
  98.         } else if (ocrres && typeof ocrres.getJsonString === 'function') {
  99.             var jsonStr = "" + ocrres.getJsonString();
  100.             var textPattern = /"text"\s*:\s*"([^"]+)"/g;
  101.             var match;
  102.             var allText = [];
  103.             while ((match = textPattern.exec(jsonStr)) !== null) {
  104.                 if (match[1] && match[1].length > 0) {
  105.                     allText.push(match[1]);
  106.                 }
  107.             }
  108.             ocrText = allText.join("\n");
  109.         } else {
  110.             var str = "" + ocrres;
  111.             var textPattern2 = /"text"\s*:\s*"([^"]+)"/g;
  112.             var match2;
  113.             var allText2 = [];
  114.             while ((match2 = textPattern2.exec(str)) !== null) {
  115.                 if (match2[1] && match2[1].length > 0) {
  116.                     allText2.push(match2[1]);
  117.                 }
  118.             }
  119.             ocrText = allText2.join("\n");
  120.         }
  121.         
  122.         img.recycle();
  123.         
  124.         if (ocrText && ocrText.length > 0) {
  125.             print.log("✓ MLKitOcr识别成功");
  126.             print.log("--- OCR结果开始 ---");
  127.             print.log(ocrText);
  128.             print.log("--- OCR结果结束 ---");
  129.             return "" + ocrText;
  130.         }
  131.         
  132.         print.log("⚠ MLKitOcr未识别到内容");
  133.         return "";
  134.     } catch (e) {
  135.         print.log("⚠ OCR识别异常:" + e.message);
  136.         return "";
  137.     }
  138. }

  139. function 提取数字(文本) {
  140.     var str = "" + 文本;
  141.     var 精确匹配 = str.match(/距离加(\d+)/);
  142.     if (精确匹配) {
  143.         var num = parseInt(精确匹配[1]);
  144.         if (num >= 30) {
  145.             return "" + num;
  146.         }
  147.     }
  148.     var 备选匹配 = str.match(/距离精[\u51c6\u79ef\u786e]加?(\d+)/);
  149.     if (备选匹配) {
  150.         var num2 = parseInt(备选匹配[1]);
  151.         if (num2 >= 30) {
  152.             return "" + num2;
  153.         }
  154.     }
  155.     var 距离匹配 = str.match(/距离[\uFF0C,\s]*(\d+)/);
  156.     if (距离匹配) {
  157.         var num3 = parseInt(距离匹配[1]);
  158.         if (num3 >= 30) {
  159.             return "" + num3;
  160.         }
  161.     }
  162.     var allMatches = str.match(/\d+/g);
  163.     if (allMatches) {
  164.         var 候选数字 = [];
  165.         for (var i = 0; i < allMatches.length; i++) {
  166.             var n = parseInt(allMatches[i]);
  167.             if (n >= 30 && n < 1000) {
  168.                 候选数字.push(n);
  169.             }
  170.         }
  171.         if (候选数字.length > 0) {
  172.             候选数字.sort(function(a, b) { return b - a; });
  173.             return "" + 候选数字[0];
  174.         }
  175.         var allNums = [];
  176.         for (var j = 0; j < allMatches.length; j++) {
  177.             allNums.push(parseInt(allMatches[j]));
  178.         }
  179.         allNums.sort(function(a, b) { return b - a; });
  180.         return "" + allNums[0];
  181.     }
  182.     return "";
  183. }

  184. function 采集AI回答列表(xml) {
  185.     var xmlStr = "" + xml;
  186.     var 回答列表 = [];

  187.     var textViewPattern = /<node[^>]*?text="([^"]+)"[^>]*?class="android\.widget\.TextView"[^>]*?\/?>/g;
  188.     var tvMatch;
  189.     while ((tvMatch = textViewPattern.exec(xmlStr)) !== null) {
  190.         if (tvMatch[1] && 字符串长度(tvMatch[1]) > 1) {
  191.             var 原始文本 = tvMatch[1];
  192.             var 解码文本 = 解码HTML实体(原始文本);
  193.             
  194.             if (解码文本.includes("给Kimi发消息") ||
  195.                 解码文本.includes("有问题尽管问我") ||
  196.                 解码文本.includes("拍照解题") ||
  197.                 解码文本.includes("深度研究") ||
  198.                 解码文本.includes("OK Computer") ||
  199.                 解码文本.includes("发送") ||
  200.                 解码文本.includes("消息")) {
  201.                 continue;
  202.             }
  203.             
  204.             if (!回答列表.includes(解码文本)) {
  205.                 回答列表.push(解码文本);
  206.                 print.log("✓ 在TextView中找到文本: '" + 解码文本 + "'");
  207.             }
  208.         }
  209.     }

  210.     if (回答列表.length === 0) {
  211.         print.log("⚠ 未找到AI回答节点");
  212.     } else {
  213.         print.log("✓ 采集到" + 回答列表.length + "条AI回答");
  214.     }

  215.     return 回答列表;
  216. }

  217. function 全屏截图(保存路径) {
  218.     try {
  219.         var result = agent.shell("screencap -p " + 保存路径);
  220.         print.log("✓ 截图命令执行:" + result);
  221.         
  222.         var lsResult = agent.shell("ls -la " + 保存路径);
  223.         print.log("✓ 截图文件检查:" + lsResult);
  224.         
  225.         return true;
  226.     } catch (e) {
  227.         print.log("⚠ 截图失败:" + e.message);
  228.         return false;
  229.     }
  230. }

  231. function 判断KIMI打开形式(xml) {
  232.     var xmlStr = "" + xml;
  233.    
  234.     var inputKeywords = ["给Kimi发消息", "有问题尽管问我", "输入消息", "发消息"];
  235.     var hasInput = false;
  236.     for (var i = 0; i < inputKeywords.length; i++) {
  237.         if (xmlStr.indexOf('text="' + inputKeywords[i] + '"') !== -1) {
  238.             hasInput = true;
  239.             break;
  240.         }
  241.     }
  242.    
  243.     var plusKeywords = ["加号", "附件", "图片", "相册"];
  244.     var hasPlus = false;
  245.     for (var j = 0; j < plusKeywords.length; j++) {
  246.         if (xmlStr.indexOf('text="' + plusKeywords[j] + '"') !== -1 ||
  247.             xmlStr.indexOf('content-desc="' + plusKeywords[j] + '"') !== -1) {
  248.             hasPlus = true;
  249.             break;
  250.         }
  251.     }
  252.    
  253.     if (hasInput || hasPlus) {
  254.         print.log("✓ Kimi APP打开形式:对话页面");
  255.         return "对话页";
  256.     }
  257.    
  258.     print.log("⚠ Kimi APP打开形式:未知页面");
  259.     return "未知";
  260. }

  261. function 开启新对话(xml) {
  262.     var xmlStr = "" + xml;
  263.    
  264.     var newChatIdx = xmlStr.indexOf('content-desc="开启新会话"');
  265.     if (newChatIdx !== -1) {
  266.         var 段 = xmlStr.substring(newChatIdx);
  267.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  268.         if (m) {
  269.             var x = (parseInt(m[1]) + parseInt(m[3])) / 2;
  270.             var y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  271.             agent.click(x, y);
  272.             print.log("✓ 已点击开启新对话按钮,content-desc=开启新会话,坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  273.             sleep.second(秒 = 3);
  274.             return true;
  275.         }
  276.     }
  277.    
  278.     var rightButtonPattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  279.     var rbMatch;
  280.     var 右上角按钮 = [];
  281.     while ((rbMatch = rightButtonPattern.exec(xmlStr)) !== null) {
  282.         var bx1 = parseInt(rbMatch[1]);
  283.         var by1 = parseInt(rbMatch[2]);
  284.         if (bx1 > 屏幕宽 * 0.85 && by1 > 100 && by1 < 400) {
  285.             右上角按钮.push({ x: (bx1 + parseInt(rbMatch[3])) / 2, y: (by1 + parseInt(rbMatch[4])) / 2 });
  286.         }
  287.     }
  288.    
  289.     if (右上角按钮.length > 0) {
  290.         右上角按钮.sort(function(a, b) { return a.x - b.x; });
  291.         var 最右边按钮 = 右上角按钮[右上角按钮.length - 1];
  292.         agent.click(最右边按钮.x, 最右边按钮.y);
  293.         print.log("✓ 已点击右上角按钮开启新对话,坐标(" + Math.round(最右边按钮.x) + "," + Math.round(最右边按钮.y) + ")");
  294.         sleep.second(秒 = 3);
  295.         return true;
  296.     }
  297.    
  298.     print.log("⚠ 未找到开启新对话按钮,使用坐标兜底(右上角)");
  299.     var 兜底X = 屏幕宽 * 0.96;
  300.     var 兜底Y = 屏幕高 * 0.06;
  301.     agent.click(兜底X, 兜底Y);
  302.     print.log("✓ 已点击右上角兜底位置开启新对话,坐标(" + Math.round(兜底X) + "," + Math.round(兜底Y) + ")");
  303.     sleep.second(秒 = 3);
  304.     return true;
  305. }

  306. function 查找输入框中心(xml) {
  307.     var xmlStr = "" + xml;
  308.    
  309.     var inputKeywords = ["有问题尽管问我...", "给Kimi发消息", "输入消息", "发消息", "接着问"];
  310.     for (var i = 0; i < inputKeywords.length; i++) {
  311.         var kw = inputKeywords[i];
  312.         var inputIdx = xmlStr.indexOf('text="' + kw + '"');
  313.         if (inputIdx !== -1) {
  314.             var 段 = xmlStr.substring(inputIdx);
  315.             var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  316.             if (m) {
  317.                 var x1 = parseInt(m[1]);
  318.                 var y1 = parseInt(m[2]);
  319.                 var x2 = parseInt(m[3]);
  320.                 var y2 = parseInt(m[4]);
  321.                 print.log("✓ 输入框定位:text=" + kw + ",bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "]");
  322.                 return {
  323.                     x: (x1 + x2) / 2,
  324.                     y: (y1 + y2) / 2
  325.                 };
  326.             }
  327.         }
  328.     }

  329.     var editTextIdx = xmlStr.indexOf('class="android.widget.EditText"');
  330.     if (editTextIdx !== -1) {
  331.         var 段2 = xmlStr.substring(editTextIdx);
  332.         var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  333.         if (m2) {
  334.             var x1 = parseInt(m2[1]);
  335.             var y1 = parseInt(m2[2]);
  336.             var x2 = parseInt(m2[3]);
  337.             var y2 = parseInt(m2[4]);
  338.             print.log("✓ 输入框定位(EditText):bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "]");
  339.             return {
  340.                 x: (x1 + x2) / 2,
  341.                 y: (y1 + y2) / 2
  342.             };
  343.         }
  344.     }

  345.     var viewFactoryHolderIdx = xmlStr.indexOf('class="androidx.compose.ui.viewinterop.ViewFactoryHolder"');
  346.     if (viewFactoryHolderIdx !== -1) {
  347.         var 段3 = xmlStr.substring(viewFactoryHolderIdx);
  348.         var m3 = 段3.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  349.         if (m3) {
  350.             var x1 = parseInt(m3[1]);
  351.             var y1 = parseInt(m3[2]);
  352.             var x2 = parseInt(m3[3]);
  353.             var y2 = parseInt(m3[4]);
  354.             print.log("✓ 输入框定位(ViewFactoryHolder):bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "]");
  355.             return {
  356.                 x: (x1 + x2) / 2,
  357.                 y: (y1 + y2) / 2
  358.             };
  359.         }
  360.     }

  361.     print.log("⚠ 未找到输入框,使用坐标兜底(屏幕下方区域)");
  362.     return {
  363.         x: 屏幕宽 * 0.35,
  364.         y: 屏幕高 * 0.55
  365.     };
  366. }

  367. function 查找加号按钮(xml) {
  368.     var xmlStr = "" + xml;
  369.    
  370.     var plusDescIdx = xmlStr.indexOf('content-desc="更多输入方式"');
  371.     if (plusDescIdx !== -1) {
  372.         var 段 = xmlStr.substring(plusDescIdx);
  373.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  374.         if (m) {
  375.             var x1 = parseInt(m[1]);
  376.             var y1 = parseInt(m[2]);
  377.             var x2 = parseInt(m[3]);
  378.             var y2 = parseInt(m[4]);
  379.             var centerX = (x1 + x2) / 2;
  380.             var centerY = (y1 + y2) / 2;
  381.             print.log("✓ 加号按钮定位:content-desc=更多输入方式,坐标(" + Math.round(centerX) + "," + Math.round(centerY) + ")");
  382.             return { x: centerX, y: centerY };
  383.         }
  384.     }

  385.     var inputIdx = xmlStr.indexOf('text="有问题尽管问我..."');
  386.     if (inputIdx === -1) {
  387.         inputIdx = xmlStr.indexOf('text="给Kimi发消息"');
  388.     }
  389.     if (inputIdx === -1) {
  390.         inputIdx = xmlStr.indexOf('text="有问题尽管问我"');
  391.     }
  392.    
  393.     if (inputIdx !== -1) {
  394.         var 输入框段 = xmlStr.substring(inputIdx);
  395.         var 输入框边界 = 输入框段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  396.         if (输入框边界) {
  397.             var 输入框X2 = parseInt(输入框边界[3]);
  398.             var 输入框Y = parseInt(输入框边界[2]);
  399.             var 输入框底部Y = parseInt(输入框边界[4]);
  400.             var 输入框中心Y = (输入框Y + 输入框底部Y) / 2;
  401.             
  402.             var clickablePattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  403.             var clickMatch;
  404.             var 候选按钮 = [];
  405.             
  406.             while ((clickMatch = clickablePattern.exec(xmlStr)) !== null) {
  407.                 var bx1 = parseInt(clickMatch[1]);
  408.                 var by1 = parseInt(clickMatch[2]);
  409.                 var bx2 = parseInt(clickMatch[3]);
  410.                 var by2 = parseInt(clickMatch[4]);
  411.                
  412.                 if (by1 >= 输入框中心Y - 100 && by2 <= 输入框中心Y + 200 && bx1 > 输入框X2 - 50) {
  413.                     候选按钮.push({ x: (bx1 + bx2) / 2, y: (by1 + by2) / 2 });
  414.                 }
  415.             }
  416.             
  417.             if (候选按钮.length > 0) {
  418.                 候选按钮.sort(function(a, b) { return a.x - b.x; });
  419.                 print.log("✓ 加号按钮定位:输入框右侧clickable元素,坐标(" + Math.round(候选按钮[0].x) + "," + Math.round(候选按钮[0].y) + ")");
  420.                 return 候选按钮[0];
  421.             }
  422.         }
  423.     }

  424.     print.log("⚠ 加号按钮使用坐标兜底(输入框右侧)");
  425.     var 输入框 = 查找输入框中心(xml);
  426.     return {
  427.         x: 屏幕宽 * 0.92,
  428.         y: 输入框.y
  429.     };
  430. }

  431. function 查找相册按钮(xml) {
  432.     var xmlStr = "" + xml;
  433.    
  434.     var clickablePattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  435.     var clickMatch;
  436.     var 候选按钮 = [];
  437.    
  438.     while ((clickMatch = clickablePattern.exec(xmlStr)) !== null) {
  439.         var bx1 = parseInt(clickMatch[1]);
  440.         var by1 = parseInt(clickMatch[2]);
  441.         var bx2 = parseInt(clickMatch[3]);
  442.         var by2 = parseInt(clickMatch[4]);
  443.         
  444.         var 节点段 = xmlStr.substring(xmlStr.indexOf(clickMatch[0]));
  445.         var 节点结束 = 节点段.indexOf('</node>');
  446.         if (节点结束 !== -1) {
  447.             var 子节点内容 = 节点段.substring(0, 节点结束);
  448.             if (子节点内容.indexOf('text="相册"') !== -1 ||
  449.                 子节点内容.indexOf('content-desc="相册"') !== -1) {
  450.                 var centerX = (bx1 + bx2) / 2;
  451.                 var centerY = (by1 + by2) / 2;
  452.                 print.log("✓ 相册按钮定位:clickable父节点包含相册,bounds=[" + bx1 + "," + by1 + "][" + bx2 + "," + by2 + "],坐标(" + Math.round(centerX) + "," + Math.round(centerY) + ")");
  453.                 return { x: centerX, y: centerY };
  454.             }
  455.         }
  456.     }
  457.    
  458.     var albumDescIdx = xmlStr.indexOf('content-desc="相册"');
  459.     if (albumDescIdx !== -1) {
  460.         var 段 = xmlStr.substring(albumDescIdx);
  461.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  462.         if (m) {
  463.             var x1 = parseInt(m[1]);
  464.             var y1 = parseInt(m[2]);
  465.             var x2 = parseInt(m[3]);
  466.             var y2 = parseInt(m[4]);
  467.             var centerX = (x1 + x2) / 2;
  468.             var centerY = (y1 + y2) / 2;
  469.             print.log("✓ 相册按钮定位:content-desc=相册,bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "],坐标(" + Math.round(centerX) + "," + Math.round(centerY) + ")");
  470.             return { x: centerX, y: centerY };
  471.         }
  472.     }
  473.    
  474.     var albumKeywords = ["相册", "图片", "照片"];
  475.     for (var i = 0; i < albumKeywords.length; i++) {
  476.         var kw = albumKeywords[i];
  477.         var albumIdx = xmlStr.indexOf('text="' + kw + '"');
  478.         if (albumIdx !== -1) {
  479.             var 段 = xmlStr.substring(albumIdx);
  480.             var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  481.             if (m) {
  482.                 var x1 = parseInt(m[1]);
  483.                 var y1 = parseInt(m[2]);
  484.                 var x2 = parseInt(m[3]);
  485.                 var y2 = parseInt(m[4]);
  486.                 var centerX = (x1 + x2) / 2;
  487.                 var centerY = (y1 + y2) / 2;
  488.                 print.log("✓ 相册按钮定位:text=" + kw + ",bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "],坐标(" + Math.round(centerX) + "," + Math.round(centerY) + ")");
  489.                 return { x: centerX, y: centerY };
  490.             }
  491.         }
  492.     }

  493.     print.log("⚠ 相册按钮使用坐标兜底(底部中间)");
  494.     return {
  495.         x: 屏幕宽 * 0.5,
  496.         y: 屏幕高 * 0.88
  497.     };
  498. }

  499. function 查找相册选项(xml) {
  500.     var xmlStr = "" + xml;
  501.    
  502.     var text关键词 = ["相册", "图片", "照片", "所有照片", "从相册选择", "选择图片"];
  503.     for (var i = 0; i < text关键词.length; i++) {
  504.         var kw = text关键词[i];
  505.         var idx = xmlStr.indexOf('text="' + kw + '"');
  506.         if (idx !== -1) {
  507.             var 段 = xmlStr.substring(idx);
  508.             var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  509.             if (m) {
  510.                 print.log("✓ 相册选项定位:text=" + kw);
  511.                 return {
  512.                     x: (parseInt(m[1]) + parseInt(m[3])) / 2,
  513.                     y: (parseInt(m[2]) + parseInt(m[4])) / 2
  514.                 };
  515.             }
  516.         }
  517.     }

  518.     var desc关键词 = ["相册", "图片", "照片"];
  519.     for (var j = 0; j < desc关键词.length; j++) {
  520.         var kw2 = desc关键词[j];
  521.         var idx2 = xmlStr.indexOf('content-desc="' + kw2 + '"');
  522.         if (idx2 !== -1) {
  523.             var 段2 = xmlStr.substring(idx2);
  524.             var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  525.             if (m2) {
  526.                 print.log("✓ 相册选项定位:content-desc=" + kw2);
  527.                 return {
  528.                     x: (parseInt(m2[1]) + parseInt(m2[3])) / 2,
  529.                     y: (parseInt(m2[2]) + parseInt(m2[4])) / 2
  530.                 };
  531.             }
  532.         }
  533.     }
  534.    
  535.     return null;
  536. }

  537. function 粘贴文本(文本) {
  538.     try {
  539.         Clipboard.copy("" + 文本);
  540.     } catch (e) {
  541.         print.log("⚠ Clipboard.copy 失败:" + e.message);
  542.     }
  543.     sleep.millisecond(毫秒 = 300);

  544.     try {
  545.         agent.shell("service call clipboard 3 i32 1 s16 '" + 文本 + "' i32 0");
  546.     } catch (e2) {
  547.         // 忽略错误
  548.     }
  549.     sleep.millisecond(毫秒 = 300);

  550.     agent.shell("input keyevent 279");
  551.     sleep.millisecond(毫秒 = 500);
  552.    
  553.     try {
  554.         agent.shell("input text '" + 文本 + "'");
  555.         print.log("✓ 已通过input text直接输入文本");
  556.     } catch (e3) {
  557.         print.log("⚠ input text失败:" + e3.message);
  558.     }
  559.    
  560.     sleep.second(秒 = 1);
  561.     print.log("✓ 已粘贴文本:" + 文本);
  562. }

  563. function 是否在系统相册页面(xml) {
  564.     var xmlStr = "" + xml;
  565.    
  566.     var packageMatch = xmlStr.match(/package="([^"]+)"/);
  567.     var 当前包名 = packageMatch ? packageMatch[1] : "";
  568.    
  569.     if (当前包名 && 当前包名 !== KIMI包名) {
  570.         print.log("✓ 检测到系统相册页面,包名:" + 当前包名);
  571.         return true;
  572.     }
  573.    
  574.     return false;
  575. }

  576. function 是否在图片预览页面(xml) {
  577.     var xmlStr = "" + xml;
  578.     if (xmlStr.indexOf('text="完成"') !== -1 || xmlStr.indexOf('text="发送"') !== -1) {
  579.         return true;
  580.     }
  581.     if (xmlStr.indexOf('content-desc="完成"') !== -1 || xmlStr.indexOf('content-desc="发送"') !== -1) {
  582.         return true;
  583.     }
  584.     return false;
  585. }

  586. function 查找图片预览确认按钮(xml) {
  587.     var xmlStr = "" + xml;
  588.    
  589.     var 关键词 = ["完成", "发送", "确认"];
  590.     for (var i = 0; i < 关键词.length; i++) {
  591.         var kw = 关键词[i];
  592.         var textIdx = xmlStr.indexOf('text="' + kw + '"');
  593.         if (textIdx !== -1) {
  594.             var 段 = xmlStr.substring(textIdx);
  595.             var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  596.             if (m) {
  597.                 var x = (parseInt(m[1]) + parseInt(m[3])) / 2;
  598.                 var y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  599.                 print.log("✓ 图片预览确认按钮定位:text=" + kw + ",坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  600.                 return { x: x, y: y };
  601.             }
  602.         }
  603.     }
  604.    
  605.     for (var j = 0; j < 关键词.length; j++) {
  606.         var kw2 = 关键词[j];
  607.         var descIdx = xmlStr.indexOf('content-desc="' + kw2 + '"');
  608.         if (descIdx !== -1) {
  609.             var 段2 = xmlStr.substring(descIdx);
  610.             var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  611.             if (m2) {
  612.                 var x = (parseInt(m2[1]) + parseInt(m2[3])) / 2;
  613.                 var y = (parseInt(m2[2]) + parseInt(m2[4])) / 2;
  614.                 print.log("✓ 图片预览确认按钮定位:content-desc=" + kw2 + ",坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  615.                 return { x: x, y: y };
  616.             }
  617.         }
  618.     }
  619.    
  620.     print.log("⚠ 图片预览确认按钮使用坐标兜底(底部中间)");
  621.     return { x: 屏幕宽 * 0.5, y: 屏幕高 * 0.92 };
  622. }

  623. function 查找相册选择按钮(xml) {
  624.     var xmlStr = "" + xml;
  625.    
  626.     var 关键词列表 = ["选择", "完成", "确认", "发送", "确定"];
  627.     for (var i = 0; i < 关键词列表.length; i++) {
  628.         var kw = 关键词列表[i];
  629.         
  630.         var textPattern = new RegExp('text="' + kw + '[^"]*"[^>]*?bounds="\\[(\\d+),(\\d+)\\]\\[(\\d+),(\\d+)\\]"', 'gi');
  631.         var textMatch = textPattern.exec(xmlStr);
  632.         if (textMatch) {
  633.             var x = (parseInt(textMatch[1]) + parseInt(textMatch[3])) / 2;
  634.             var y = (parseInt(textMatch[2]) + parseInt(textMatch[4])) / 2;
  635.             print.log("✓ 相册选择按钮定位:text=" + kw + ",坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  636.             return { x: x, y: y };
  637.         }
  638.         
  639.         var descIdx = xmlStr.indexOf('content-desc="' + kw + '"');
  640.         if (descIdx !== -1) {
  641.             var 段2 = xmlStr.substring(descIdx);
  642.             var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  643.             if (m2) {
  644.                 var x = (parseInt(m2[1]) + parseInt(m2[3])) / 2;
  645.                 var y = (parseInt(m2[2]) + parseInt(m2[4])) / 2;
  646.                 print.log("✓ 相册选择按钮定位:content-desc=" + kw + ",坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  647.                 return { x: x, y: y };
  648.             }
  649.         }
  650.     }
  651.    
  652.     var bottomButtonPattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  653.     var bottomMatch;
  654.     var 底部按钮列表 = [];
  655.     while ((bottomMatch = bottomButtonPattern.exec(xmlStr)) !== null) {
  656.         var bx1 = parseInt(bottomMatch[1]);
  657.         var by1 = parseInt(bottomMatch[2]);
  658.         var bx2 = parseInt(bottomMatch[3]);
  659.         var by2 = parseInt(bottomMatch[4]);
  660.         if (by1 >= 屏幕高 * 0.85) {
  661.             底部按钮列表.push({ x: (bx1 + bx2) / 2, y: (by1 + by2) / 2 });
  662.         }
  663.     }
  664.    
  665.     if (底部按钮列表.length > 0) {
  666.         底部按钮列表.sort(function(a, b) { return b.x - a.x; });
  667.         var 最右边按钮 = 底部按钮列表[0];
  668.         print.log("✓ 相册选择按钮定位:底部最右边按钮,坐标(" + Math.round(最右边按钮.x) + "," + Math.round(最右边按钮.y) + ")");
  669.         return { x: 最右边按钮.x, y: 最右边按钮.y };
  670.     }
  671.    
  672.     print.log("⚠ 相册选择按钮使用坐标兜底(底部)");
  673.     return { x: 屏幕宽 * 0.78, y: 屏幕高 * 0.92 };
  674. }

  675. function 查找第一张图片(xml) {
  676.     var xmlStr = "" + xml;
  677.    
  678.     if (是否在系统相册页面(xmlStr)) {
  679.         agent.shell("echo '" + xmlStr.substring(0, 5000) + "' > /sdcard/相册UI_dump.xml");
  680.         print.log("✓ 已保存相册UI XML到/sdcard/相册UI_dump.xml");
  681.         
  682.         var nafPattern = /<node[^>]*?NAF="true"[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  683.         var nafMatch;
  684.         var NAF小圆点列表 = [];
  685.         
  686.         while ((nafMatch = nafPattern.exec(xmlStr)) !== null) {
  687.             var nx1 = parseInt(nafMatch[1]);
  688.             var ny1 = parseInt(nafMatch[2]);
  689.             var nx2 = parseInt(nafMatch[3]);
  690.             var ny2 = parseInt(nafMatch[4]);
  691.             var nw = nx2 - nx1;
  692.             var nh = ny2 - ny1;
  693.             
  694.             if (nw >= 50 && nw <= 300 && nh >= 50 && nh <= 300) {
  695.                 if (ny1 >= 400 && ny2 <= 屏幕高 - 400) {
  696.                     NAF小圆点列表.push({ x1: nx1, y1: ny1, x2: nx2, y2: ny2, x: (nx1 + nx2) / 2, y: (ny1 + ny2) / 2 });
  697.                 }
  698.             }
  699.         }
  700.         
  701.         if (NAF小圆点列表.length > 0) {
  702.             NAF小圆点列表.sort(function(a, b) {
  703.                 if (a.y1 !== b.y1) return a.y1 - b.y1;
  704.                 return a.x1 - b.x1;
  705.             });
  706.             var 选中小圆点 = NAF小圆点列表[0];
  707.             print.log("✓ ComposeView找到NAF小圆点选择框:坐标(" + Math.round(选中小圆点.x) + "," + Math.round(选中小圆点.y) + "),bounds=[" + 选中小圆点.x1 + "," + 选中小圆点.y1 + "][" + 选中小圆点.x2 + "," + 选中小圆点.y2 + "]");
  708.             return { x: 选中小圆点.x, y: 选中小圆点.y };
  709.         }
  710.         
  711.         var imageDescPattern = /<node[^>]*?content-desc="([^"]+\.(png|jpg|jpeg|gif))"[^>]*?class="android\.view\.View"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/gi;
  712.         var imgMatch;
  713.         var 图片节点列表 = [];
  714.         
  715.         while ((imgMatch = imageDescPattern.exec(xmlStr)) !== null) {
  716.             var 文件名 = imgMatch[1];
  717.             var ix1 = parseInt(imgMatch[3]);
  718.             var iy1 = parseInt(imgMatch[4]);
  719.             var ix2 = parseInt(imgMatch[5]);
  720.             var iy2 = parseInt(imgMatch[6]);
  721.             var iw = ix2 - ix1;
  722.             var ih = iy2 - iy1;
  723.             
  724.             if (iw >= 100 && ih >= 100) {
  725.                 图片节点列表.push({ 文件名: 文件名, x1: ix1, y1: iy1, x2: ix2, y2: iy2, w: iw, h: ih });
  726.             }
  727.         }
  728.         
  729.         if (图片节点列表.length > 0) {
  730.             图片节点列表.sort(function(a, b) {
  731.                 if (a.y1 !== b.y1) return a.y1 - b.y1;
  732.                 return a.x1 - b.x1;
  733.             });
  734.             var 第一张图片 = 图片节点列表[0];
  735.             print.log("✓ 找到图片:" + 第一张图片.文件名 + ",bounds=[" + 第一张图片.x1 + "," + 第一张图片.y1 + "][" + 第一张图片.x2 + "," + 第一张图片.y2 + "]");
  736.             
  737.             var 选择框X = 第一张图片.x1 + 第一张图片.w * 0.77;
  738.             var 选择框Y = 第一张图片.y1 + 第一张图片.h * 0.24;
  739.             print.log("✓ 计算小圆点选择框坐标:(" + Math.round(选择框X) + "," + Math.round(选择框Y) + ")");
  740.             return { x: 选择框X, y: 选择框Y };
  741.         }
  742.         
  743.         var clickableViewPattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  744.         var clickMatch;
  745.         var 可点击区域 = [];
  746.         while ((clickMatch = clickableViewPattern.exec(xmlStr)) !== null) {
  747.             var cx1 = parseInt(clickMatch[1]);
  748.             var cy1 = parseInt(clickMatch[2]);
  749.             var cx2 = parseInt(clickMatch[3]);
  750.             var cy2 = parseInt(clickMatch[4]);
  751.             var cw = cx2 - cx1;
  752.             var ch = cy2 - cy1;
  753.             可点击区域.push({ x1: cx1, y1: cy1, x2: cx2, y2: cy2, w: cw, h: ch, x: (cx1 + cx2) / 2, y: (cy1 + cy2) / 2 });
  754.         }
  755.         
  756.         var 图片区域内可点击 = [];
  757.         for (var k = 0; k < 可点击区域.length; k++) {
  758.             var item = 可点击区域[k];
  759.             if (item.y >= 400 && item.y <= 屏幕高 - 400) {
  760.                 图片区域内可点击.push(item);
  761.             }
  762.         }
  763.         
  764.         if (图片区域内可点击.length > 0) {
  765.             图片区域内可点击.sort(function(a, b) {
  766.                 if (a.y !== b.y) return a.y - b.y;
  767.                 return a.x - b.x;
  768.             });
  769.             var 第一个可点击 = 图片区域内可点击[0];
  770.             print.log("✓ ComposeView图片区域内第一个可点击元素:坐标(" + Math.round(第一个可点击.x) + "," + Math.round(第一个可点击.y) + ")");
  771.             return { x: 第一个可点击.x, y: 第一个可点击.y };
  772.         }

  773.         print.log("⚠ 系统相册未找到图片,使用坐标兜底");
  774.         return { x: 屏幕宽 * 0.25, y: 屏幕高 * 0.3 };
  775.     }

  776.     print.log("⚠ 未找到图片,使用坐标兜底(底部第一行第一列)");
  777.     return { x: 屏幕宽 * 0.15, y: 屏幕高 * 0.85 };
  778. }

  779. function 查找发送按钮中心(xml) {
  780.     var xmlStr = "" + xml;

  781.     try {
  782.         var detects = opencv.findImagesEx('图色168638.cv');
  783.         if (detects != null && detects.length > 0) {
  784.             print.log("✓ 发送按钮定位:图色匹配");
  785.             var dStr = "" + detects[0];
  786.             print.log("图色匹配结果:" + dStr);
  787.             var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  788.             if (m) {
  789.                 var left = parseFloat(m[1]);
  790.                 var top = parseFloat(m[2]);
  791.                 var right = parseFloat(m[3]);
  792.                 var bottom = parseFloat(m[4]);
  793.                 var centerX = (left + right) / 2;
  794.                 var centerY = (top + bottom) / 2;
  795.                 print.log("图色匹配百分比坐标:left=" + left + ", top=" + top + ", right=" + right + ", bottom=" + bottom);
  796.                 print.log("计算点击百分比:(" + centerX + "," + centerY + ")");
  797.                 agent.clickPercent(centerX, centerY);
  798.                 print.log("✓ 已点击发送按钮(图色)");
  799.                 return null;
  800.             }
  801.             print.log("⚠ 图色匹配结果格式解析失败");
  802.         }
  803.     } catch (e) {
  804.         print.log("⚠ 图色匹配失败:" + e.message);
  805.     }

  806.     var inputKeywords = ["给Kimi发消息", "有问题尽管问我"];
  807.     var inputIdx = -1;
  808.     for (var k = 0; k < inputKeywords.length; k++) {
  809.         inputIdx = xmlStr.indexOf('text="' + inputKeywords[k] + '"');
  810.         if (inputIdx !== -1) break;
  811.     }
  812.    
  813.     if (inputIdx !== -1) {
  814.         var 输入框段 = xmlStr.substring(inputIdx);
  815.         var 输入框边界 = 输入框段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  816.         
  817.         if (输入框边界) {
  818.             var 输入框信息 = {
  819.                 x1: parseInt(输入框边界[1]),
  820.                 y1: parseInt(输入框边界[2]),
  821.                 x2: parseInt(输入框边界[3]),
  822.                 y2: parseInt(输入框边界[4]),
  823.                 centerY: (parseInt(输入框边界[2]) + parseInt(输入框边界[4])) / 2
  824.             };

  825.             var clickablePattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"[^>]*?\/?>/g;
  826.             var clickMatch;
  827.             var candidates = [];

  828.             while ((clickMatch = clickablePattern.exec(xmlStr)) !== null) {
  829.                 var cx1 = parseInt(clickMatch[1]);
  830.                 var cy1 = parseInt(clickMatch[2]);
  831.                 var cx2 = parseInt(clickMatch[3]);
  832.                 var cy2 = parseInt(clickMatch[4]);
  833.                 var cw = cx2 - cx1;
  834.                 var ch = cy2 - cy1;

  835.                 var 是小按钮 = (cw < 300 && ch < 300);
  836.                 var 在输入框右侧 = (cx1 > 输入框信息.x2 - 100);
  837.                 var 在输入框水平行 = (cy1 >= 输入框信息.y1 - 100 && cy1 <= 输入框信息.y2 + 100);

  838.                 if (是小按钮 && 在输入框右侧 && 在输入框水平行) {
  839.                     candidates.push({
  840.                         x1: cx1, y1: cy1, x2: cx2, y2: cy2,
  841.                         x: (cx1 + cx2) / 2,
  842.                         y: (cy1 + cy2) / 2
  843.                     });
  844.                 }
  845.             }

  846.             if (candidates.length > 0) {
  847.                 candidates.sort(function(a, b) {
  848.                     return b.x1 - a.x1;
  849.                 });
  850.                 var 选中 = candidates[0];
  851.                 print.log("✓ 发送按钮定位:输入框右侧clickable元素,坐标(" + Math.round(选中.x) + "," + Math.round(选中.y) + ")");
  852.                 return { x: 选中.x, y: 选中.y };
  853.             }

  854.             var 预估X = 输入框信息.x2 + 100;
  855.             var 预估Y = 输入框信息.centerY;
  856.             print.log("⚠ 发送按钮使用输入框右侧坐标兜底(" + Math.round(预估X) + "," + Math.round(预估Y) + ")");
  857.             return { x: 预估X, y: 预估Y };
  858.         }
  859.     }

  860.     var sendTextIdx = xmlStr.indexOf('text="发送"');
  861.     if (sendTextIdx !== -1) {
  862.         var 段 = xmlStr.substring(sendTextIdx);
  863.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  864.         if (m) {
  865.             print.log("✓ 发送按钮定位:文本匹配");
  866.             return {
  867.                 x: (parseInt(m[1]) + parseInt(m[3])) / 2,
  868.                 y: (parseInt(m[2]) + parseInt(m[4])) / 2
  869.             };
  870.         }
  871.     }

  872.     var sendDescIdx = xmlStr.indexOf('content-desc="发送"');
  873.     if (sendDescIdx !== -1) {
  874.         var 段2 = xmlStr.substring(sendDescIdx);
  875.         var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  876.         if (m2) {
  877.             print.log("✓ 发送按钮定位:content-desc匹配");
  878.             return {
  879.                 x: (parseInt(m2[1]) + parseInt(m2[3])) / 2,
  880.                 y: (parseInt(m2[2]) + parseInt(m2[4])) / 2
  881.             };
  882.         }
  883.     }

  884.     print.log("⚠ 发送按钮使用屏幕右侧坐标兜底");
  885.     agent.clickPercent(0.9, 0.92);
  886.     print.log("✓ 已点击发送按钮(硬编码兜底)");
  887.     return null;
  888. }

  889. function 等待AI回答完成(发送前的最后文本, 发送前回答数量) {
  890.     var 已耗时 = 0;
  891.     var 检查间隔秒 = 3;
  892.     var 连续相同次数 = 0;
  893.     var 上次规范化文本 = "";

  894.     print.log("发送前最后AI回答:'" + 发送前的最后文本 + "',发送前回答数量:" + 发送前回答数量);

  895.     sleep.second(秒 = 5);
  896.     已耗时 += 5;

  897.     while (已耗时 < 等待回答超时秒) {
  898.         var xml = 获取UI();
  899.         var 回答列表 = 采集AI回答列表(xml);
  900.         
  901.         if (回答列表.length > 0) {
  902.             var 当前最后回答 = 回答列表[回答列表.length - 1];
  903.             var 当前提取数字 = 提取数字(当前最后回答);
  904.             var 当前规范化文本 = 当前最后回答.trim().replace(/\s+/g, " ");
  905.             
  906.             var 有新回答 = false;
  907.             var 回答数量增加 = (回答列表.length > 发送前回答数量);
  908.             
  909.             var 发送前规范化 = 发送前的最后文本.trim().replace(/\s+/g, " ");
  910.             有新回答 = (当前规范化文本 !== 发送前规范化) || (当前提取数字 !== "");
  911.             
  912.             if (有新回答 || 回答数量增加) {
  913.                 print.log("✓ 检测到新回答(" + 已耗时 + "秒):'" + 当前最后回答 + "',提取数字:'" + 当前提取数字 + "'");
  914.                
  915.                 if (当前规范化文本 === 上次规范化文本) {
  916.                     连续相同次数++;
  917.                     if (连续相同次数 >= 2) {
  918.                         print.log("✓ 文本连续2次相同,回答完成");
  919.                         return 当前最后回答;
  920.                     }
  921.                 } else {
  922.                     连续相同次数 = 0;
  923.                     上次规范化文本 = 当前规范化文本;
  924.                 }
  925.             }
  926.         }
  927.         
  928.         sleep.second(秒 = 检查间隔秒);
  929.         已耗时 += 检查间隔秒;
  930.     }

  931.     print.log("⚠ 等待AI回答超时(" + 等待回答超时秒 + "秒),尝试返回当前内容");
  932.     var xml = 获取UI();
  933.     var 兜底列表 = 采集AI回答列表(xml);
  934.     if (兜底列表.length > 0) {
  935.         var 兜底文本 = 兜底列表[兜底列表.length - 1];
  936.         print.log("✓ 超时兜底:返回当前采集到的回答:" + 兜底文本);
  937.         return 兜底文本;
  938.     }
  939.     return null;
  940. }

  941. // ========== 主流程开始 ==========

  942. function 主流程() {
  943.     // 步骤1:全屏截图(B站验证码页面)
  944.     print.log("\n========== 步骤1:全屏截图B站验证码 ==========");
  945.     var 截图成功 = 全屏截图(截图保存路径);
  946.     if (!截图成功) {
  947.         print.log("✗ 截图失败,退出流程");
  948.         print.log("===== KIMI识别验证码拖动B站流程结束 =====");
  949.         return;
  950.     }

  951.     // 步骤2:启动Kimi APP
  952.     print.log("\n========== 步骤2:启动Kimi APP ==========");
  953.     try {
  954.         app.openApp(KIMI包名);
  955.         print.log("✓ 已启动Kimi");
  956.     } catch (e) {
  957.         print.log("⚠ 启动失败:" + e.message);
  958.     }
  959.     sleep.second(秒 = 5);

  960.     // 步骤3:点击右上角新对话按钮
  961.     print.log("\n========== 步骤3:点击右上角新对话按钮 ==========");
  962.    
  963.     xml = 获取UI();
  964.    
  965.     var 新对话X = 屏幕宽 * 0.96;
  966.     var 新对话Y = 屏幕高 * 0.06;
  967.    
  968.     var newChatIdx = xml.indexOf('content-desc="开启新会话"');
  969.     if (newChatIdx !== -1) {
  970.         var 段 = xml.substring(newChatIdx);
  971.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  972.         if (m) {
  973.             新对话X = (parseInt(m[1]) + parseInt(m[3])) / 2;
  974.             新对话Y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  975.             print.log("✓ 新对话按钮定位:content-desc=开启新会话,坐标(" + Math.round(新对话X) + "," + Math.round(新对话Y) + ")");
  976.         }
  977.     }
  978.    
  979.     agent.click(新对话X, 新对话Y);
  980.     print.log("✓ 已点击新对话按钮,坐标(" + Math.round(新对话X) + "," + Math.round(新对话Y) + ")");
  981.    
  982.     sleep.second(秒 = 5);
  983.     print.log("✓ 新对话操作完成,等待5秒确保界面加载");

  984.     // 步骤4:记录发送前的最后一条AI回答和数量
  985.     print.log("\n========== 步骤4:记录发送前状态 ==========");
  986.     var 发送前回答数量 = 0;
  987.     print.log("✓ 发送前回答数量:" + 发送前回答数量);

  988.     // 步骤5:点击加号按钮打开附件菜单(使用图色匹配,因为点击前XML可能不完整)
  989.     print.log("\n========== 步骤5:点击加号按钮打开附件菜单 ==========");
  990.    
  991.     var 加号点击成功 = false;
  992.     var detects = opencv.findImagesEx('图色414387.cv');
  993.     if (detects != null && detects.length > 0) {
  994.         print.log("✓ 图色匹配找到加号按钮");
  995.         print.log("图色匹配结果:" + detects[0]);
  996.         var dStr = "" + detects[0];
  997.         var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  998.         if (m) {
  999.             var left = parseFloat(m[1]);
  1000.             var top = parseFloat(m[2]);
  1001.             var right = parseFloat(m[3]);
  1002.             var bottom = parseFloat(m[4]);
  1003.             var centerX = (left + right) / 2;
  1004.             var centerY = (top + bottom) / 2;
  1005.             agent.clickPercent(centerX, centerY);
  1006.             print.log("✓ 已点击加号按钮(图色匹配),百分比坐标(" + centerX.toFixed(4) + "," + centerY.toFixed(4) + ")");
  1007.             加号点击成功 = true;
  1008.         }
  1009.     }
  1010.    
  1011.     if (!加号点击成功) {
  1012.         print.log("⚠ 图色匹配未找到加号按钮,使用坐标兜底");
  1013.         var 兜底X = 屏幕宽 * 0.92;
  1014.         var 兜底Y = 屏幕高 * 0.55;
  1015.         agent.click(兜底X, 兜底Y);
  1016.         print.log("✓ 已点击加号按钮(坐标兜底),坐标(" + Math.round(兜底X) + "," + Math.round(兜底Y) + ")");
  1017.         加号点击成功 = true;
  1018.     }
  1019.    
  1020.     sleep.second(秒 = 3);
  1021.     print.log("✓ 等待3秒让附件菜单完全弹出");

  1022.     // 步骤6:点击相册按钮选择图片(点击加号后XML已完整,使用XML定位)
  1023.     print.log("\n========== 步骤6:点击相册按钮选择图片 ==========");
  1024.    
  1025.     var 相册选择成功 = false;
  1026.     var 尝试次数 = 0;
  1027.    
  1028.     while (!相册选择成功 && 尝试次数 < 5) {
  1029.         尝试次数++;
  1030.         xml = 获取UI();
  1031.         
  1032.         if (是否在系统相册页面(xml)) {
  1033.             print.log("✓ 已进入系统相册页面");
  1034.             相册选择成功 = true;
  1035.             break;
  1036.         }
  1037.         
  1038.         var 相册位置 = 查找相册按钮(xml);
  1039.         agent.click(相册位置.x, 相册位置.y);
  1040.         print.log("✓ 已点击相册按钮,坐标(" + Math.round(相册位置.x) + "," + Math.round(相册位置.y) + ")");
  1041.         sleep.second(秒 = 2);
  1042.         
  1043.         xml = 获取UI();
  1044.         if (是否在系统相册页面(xml)) {
  1045.             print.log("✓ 已进入系统相册页面");
  1046.             相册选择成功 = true;
  1047.             break;
  1048.         }
  1049.         
  1050.         print.log("⚠ 第" + 尝试次数 + "次尝试:未进入相册页面,重新点击加号");
  1051.         
  1052.         var 加号Detects = opencv.findImagesEx('图色414387.cv');
  1053.         if (加号Detects != null && 加号Detects.length > 0) {
  1054.             var dStr2 = "" + 加号Detects[0];
  1055.             var m2 = dStr2.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  1056.             if (m2) {
  1057.                 var centerX2 = (parseFloat(m2[1]) + parseFloat(m2[3])) / 2;
  1058.                 var centerY2 = (parseFloat(m2[2]) + parseFloat(m2[4])) / 2;
  1059.                 agent.clickPercent(centerX2, centerY2);
  1060.                 print.log("✓ 重新点击加号按钮(图色匹配),百分比坐标(" + centerX2.toFixed(4) + "," + centerY2.toFixed(4) + ")");
  1061.             }
  1062.         } else {
  1063.             var 兜底X = 屏幕宽 * 0.92;
  1064.             var 兜底Y = 屏幕高 * 0.55;
  1065.             agent.click(兜底X, 兜底Y);
  1066.             print.log("✓ 重新点击加号按钮(坐标兜底),坐标(" + Math.round(兜底X) + "," + Math.round(兜底Y) + ")");
  1067.         }
  1068.         sleep.second(秒 = 3);
  1069.     }

  1070.     // 步骤7:选择第一张图片(系统相册用Canvas渲染,XML无节点,直接坐标点击)
  1071.     print.log("\n========== 步骤7:选择第一张图片 ==========");
  1072.    
  1073.     var 图片尝试次数 = 0;
  1074.     while (图片尝试次数 < 3) {
  1075.         图片尝试次数++;
  1076.         xml = 获取UI();
  1077.         
  1078.         if (是否在系统相册页面(xml)) {
  1079.             print.log("✓ 系统相册页面,点击图片位置");
  1080.             
  1081.             var 标题栏底部 = 432;
  1082.             var actionBarMatch = xml.match(/resource-id="android:id\/action_bar"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  1083.             if (actionBarMatch) {
  1084.                 标题栏底部 = parseInt(actionBarMatch[4]);
  1085.             }
  1086.             
  1087.             var 图片区域顶部 = 标题栏底部;
  1088.             var 图片区域底部 = 屏幕高;
  1089.             var 图片区域高度 = 图片区域底部 - 图片区域顶部;
  1090.             
  1091.             var 图片X = 屏幕宽 * 0.5;
  1092.             var 图片Y = 图片区域顶部 + 图片区域高度 * 0.4;
  1093.             agent.click(图片X, 图片Y);
  1094.             print.log("✓ 已点击图片位置,坐标(" + Math.round(图片X) + "," + Math.round(图片Y) + ")");
  1095.             sleep.second(秒 = 3);
  1096.             
  1097.             xml = 获取UI();
  1098.             if (!是否在系统相册页面(xml)) {
  1099.                 print.log("✓ 已离开相册页面,图片可能已添加");
  1100.                 break;
  1101.             }
  1102.         } else {
  1103.             break;
  1104.         }
  1105.     }

  1106.     // 步骤8:等待图片添加到输入区域(等待回到Kimi对话页面)
  1107.     print.log("\n========== 步骤8:等待图片添加到输入区域 ==========");
  1108.     sleep.second(秒 = 3);
  1109.     xml = 获取UI();
  1110.    
  1111.     var packageMatch = xml.match(/package="([^"]+)"/);
  1112.     if (packageMatch && packageMatch[1] === KIMI包名) {
  1113.         print.log("✓ 已回到Kimi对话页面");
  1114.     }
  1115.    
  1116.     print.log("✓ 图片已添加到输入区域");

  1117.     // 步骤9:粘贴文字询问拖动距离
  1118.     print.log("\n========== 步骤9:粘贴文字询问拖动距离 ==========");
  1119.     xml = 获取UI();
  1120.    
  1121.     var 输入框位置 = 查找输入框中心(xml);
  1122.     agent.click(输入框位置.x, 输入框位置.y);
  1123.     print.log("✓ 已点击输入框,坐标(" + Math.round(输入框位置.x) + "," + Math.round(输入框位置.y) + ")");
  1124.     sleep.second(秒 = 2);
  1125.    
  1126.     try {
  1127.         Clipboard.copy("" + 提问话术);
  1128.         sleep.millisecond(毫秒 = 500);
  1129.         agent.shell("input keyevent 279");
  1130.         sleep.second(秒 = 2);
  1131.         print.log("✓ 已通过剪贴板粘贴文本");
  1132.     } catch (e) {
  1133.         print.log("⚠ 剪贴板粘贴失败:" + e.message);
  1134.         agent.shell("input text '" + 提问话术 + "'");
  1135.         sleep.second(秒 = 2);
  1136.         print.log("✓ 已通过input text直接输入文本");
  1137.     }
  1138.     sleep.second(秒 = 2);

  1139.     // 步骤10:发送图片和文字
  1140.     print.log("\n========== 步骤10:发送图片和文字 ==========");
  1141.    
  1142.     var detects = opencv.findImagesEx('图色769678.cv');
  1143.     if (detects != null) {
  1144.         print.log("✓ 图色匹配找到发送按钮");
  1145.         print.log("图色匹配结果:" + detects[0]);
  1146.         var dStr = "" + detects[0];
  1147.         var sendMatch = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  1148.         if (sendMatch) {
  1149.             var left = parseFloat(sendMatch[1]);
  1150.             var top = parseFloat(sendMatch[2]);
  1151.             var right = parseFloat(sendMatch[3]);
  1152.             var bottom = parseFloat(sendMatch[4]);
  1153.             var centerX = (left + right) / 2;
  1154.             var centerY = (top + bottom) / 2;
  1155.             agent.clickPercent(centerX, centerY);
  1156.             print.log("✓ 已点击发送按钮(图色匹配),百分比坐标(" + centerX.toFixed(4) + "," + centerY.toFixed(4) + ")");
  1157.         }
  1158.     } else {
  1159.         print.log("⚠ 图色匹配未找到发送按钮,尝试坐标兜底");
  1160.         var 发送按钮位置 = 查找发送按钮中心(xml);
  1161.         if (发送按钮位置) {
  1162.             agent.click(发送按钮位置.x, 发送按钮位置.y);
  1163.             print.log("✓ 已点击发送按钮(坐标兜底)");
  1164.         }
  1165.     }
  1166.    
  1167.     sleep.second(秒 = 10);

  1168.     // 步骤11:等待Kimi AI回答
  1169.     print.log("\n========== 步骤11:等待Kimi AI回答 ==========");
  1170.     xml = 获取UI();
  1171.     var AI回答 = 等待AI回答完成("", 0);
  1172.    
  1173.     if (!AI回答) {
  1174.         print.log("✗ 未获取到AI回答");
  1175.         print.log("===== KIMI识别验证码拖动B站流程结束 =====");
  1176.         return;
  1177.     }

  1178.     print.log("\n✓ 采集到AI回答");
  1179.    
  1180.     print.log("\n========== 步骤11.5:点击加号获取完整源码 ==========");
  1181.     var detects = opencv.findImagesEx('图色414387.cv');
  1182.     if (detects != null && detects.length > 0) {
  1183.         var dStr = "" + detects[0];
  1184.         var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  1185.         if (m) {
  1186.             var centerX = (parseFloat(m[1]) + parseFloat(m[3])) / 2;
  1187.             var centerY = (parseFloat(m[2]) + parseFloat(m[4])) / 2;
  1188.             agent.clickPercent(centerX, centerY);
  1189.             print.log("✓ 已点击加号按钮(图色匹配),百分比坐标(" + centerX.toFixed(4) + "," + centerY.toFixed(4) + ")");
  1190.         }
  1191.     } else {
  1192.         agent.click(屏幕宽 * 0.92, 屏幕高 * 0.55);
  1193.         print.log("✓ 已点击加号按钮(坐标兜底)");
  1194.     }
  1195.     sleep.second(秒 = 2);
  1196.     xml = 获取UI();
  1197.     print.log("✓ 点击加号后重新获取UI");
  1198.    
  1199.     AI回答 = 获取当前最后AI回答(xml);
  1200.     print.log("✓ 重新采集AI回答:'" + AI回答 + "'");
  1201.    
  1202.     print.log("--- 采集内容开始 ---");
  1203.     print.log(AI回答);
  1204.     print.log("--- 采集内容结束 ---");

  1205.     // 步骤12:解析拖动距离坐标
  1206.     print.log("\n========== 步骤12:解析拖动距离坐标 ==========");
  1207.     print.log("✓ AI原始回答:'" + AI回答 + "'");
  1208.    
  1209.     var 所有数字 = AI回答.match(/\d+/g);
  1210.     var 拖动距离像素 = null;
  1211.     var AI图像宽度 = null;
  1212.    
  1213.     if (AI回答.indexOf("距离") !== -1 || AI回答.indexOf("像素") !== -1) {
  1214.         var 距离匹配 = AI回答.match(/(\d+)\s*[像相]?素?/);
  1215.         if (距离匹配) {
  1216.             拖动距离像素 = parseInt(距离匹配[1]);
  1217.             print.log("✓ 识别到距离格式回答,提取数字:" + 拖动距离像素);
  1218.             AI图像宽度 = 屏幕宽;
  1219.             print.log("✓ 距离格式回答,使用屏幕宽度作为图像宽度,不额外缩放");
  1220.         } else {
  1221.             var 数字匹配 = AI回答.match(/(\d+)/);
  1222.             if (数字匹配) {
  1223.                 拖动距离像素 = parseInt(数字匹配[1]);
  1224.                 print.log("✓ 从距离回答中提取数字:" + 拖动距离像素);
  1225.                 AI图像宽度 = 屏幕宽;
  1226.             }
  1227.         }
  1228.     } else if (所有数字 && 所有数字.length >= 2) {
  1229.         var 数字列表 = [];
  1230.         for (var n = 0; n < 所有数字.length; n++) {
  1231.             数字列表.push(parseInt(所有数字[n]));
  1232.         }
  1233.         print.log("✓ 提取到所有数字:" + 数字列表.join(", "));
  1234.         
  1235.         if (数字列表.length >= 5) {
  1236.             var x1 = 数字列表[0];
  1237.             var y1 = 数字列表[1];
  1238.             var x2 = 数字列表[2];
  1239.             var y2 = 数字列表[3];
  1240.             AI图像宽度 = 数字列表[4];
  1241.             拖动距离像素 = Math.abs(x2 - x1);
  1242.             print.log("✓ 识别到两组坐标+图像宽度:(" + x1 + "," + y1 + ") 和 (" + x2 + "," + y2 + "),图像宽度=" + AI图像宽度);
  1243.             print.log("✓ 计算拖动距离:|x2 - x1| = |" + x2 + " - " + x1 + "| = " + 拖动距离像素);
  1244.         } else if (数字列表.length >= 4) {
  1245.             var x1 = 数字列表[0];
  1246.             var y1 = 数字列表[1];
  1247.             var x2 = 数字列表[2];
  1248.             var y2 = 数字列表[3];
  1249.             拖动距离像素 = Math.abs(x2 - x1);
  1250.             AI图像宽度 = Math.max(x1, x2) + 100;
  1251.             print.log("✓ 识别到两组坐标格式:(" + x1 + "," + y1 + ") 和 (" + x2 + "," + y2 + ")");
  1252.             print.log("✓ 计算拖动距离:|x2 - x1| = |" + x2 + " - " + x1 + "| = " + 拖动距离像素);
  1253.             print.log("✓ 估算图像宽度:max(x1,x2)+100 = " + AI图像宽度);
  1254.         } else if (数字列表.length >= 2) {
  1255.             var 坐标匹配 = AI回答.match(/(\d+)\s*[,,]\s*(\d+)/);
  1256.             if (坐标匹配) {
  1257.                 var cx1 = parseInt(坐标匹配[1]);
  1258.                 var cx2 = parseInt(坐标匹配[2]);
  1259.                 拖动距离像素 = Math.abs(cx2 - cx1);
  1260.                 AI图像宽度 = Math.max(cx1, cx2) + 100;
  1261.                 print.log("✓ 识别到坐标格式:(" + cx1 + "," + cx2 + "),计算距离:" + 拖动距离像素);
  1262.             } else {
  1263.                 拖动距离像素 = 数字列表[0];
  1264.                 print.log("✓ 提取到单个数字(拖动距离):" + 拖动距离像素);
  1265.             }
  1266.         } else {
  1267.             拖动距离像素 = 数字列表[0];
  1268.             print.log("✓ 提取到单个数字(拖动距离):" + 拖动距离像素);
  1269.         }
  1270.     } else if (所有数字 && 所有数字.length === 1) {
  1271.         拖动距离像素 = parseInt(所有数字[0]);
  1272.         print.log("✓ 提取到单个数字(拖动距离):" + 拖动距离像素);
  1273.     } else {
  1274.         print.log("✗ 未找到有效的拖动距离");
  1275.         print.log("===== KIMI识别验证码拖动B站流程结束 =====");
  1276.         return;
  1277.     }
  1278.    
  1279.     var 图像缩放系数 = 1.0;
  1280.     if (拖动距离像素 < 30) {
  1281.         print.log("⚠ 提取到的拖动距离过小(" + 拖动距离像素 + "),可能是OCR识别错误,跳过缩放补偿");
  1282.     } else if (AI图像宽度 && AI图像宽度 > 0 && AI图像宽度 < 屏幕宽) {
  1283.         图像缩放系数 = 屏幕宽 / AI图像宽度;
  1284.         if (图像缩放系数 > 5) {
  1285.             图像缩放系数 = 1.0;
  1286.         } else {
  1287.             拖动距离像素 = Math.round(拖动距离像素 * 图像缩放系数);
  1288.             print.log("✓ 图像缩放补偿:AI图像宽度=" + AI图像宽度 + ",屏幕宽=" + 屏幕宽);
  1289.             print.log("✓ 缩放系数=" + 图像缩放系数.toFixed(2) + ",补偿后拖动距离=" + 拖动距离像素);
  1290.         }
  1291.     } else {
  1292.         图像缩放系数 = 屏幕宽 / 750;
  1293.         拖动距离像素 = Math.round(拖动距离像素 * 图像缩放系数);
  1294.         print.log("✓ 单数字模式补偿:假设AI图像宽度≈750,缩放系数=" + 图像缩放系数.toFixed(2));
  1295.         print.log("✓ 补偿后拖动距离=" + 拖动距离像素);
  1296.     }
  1297.    
  1298.     验证码滑块距离 = {
  1299.         x: 拖动距离像素,
  1300.         y: 0
  1301.     };

  1302.     // 步骤13:切换回B站并拖动滑块
  1303.     print.log("\n========== 步骤13:切换回B站并拖动滑块 ==========");
  1304.    
  1305.     agent.shell("input keyevent 187");
  1306.     print.log("✓ 已按后台键打开任务列表");
  1307.     sleep.second(秒 = 2);
  1308.    
  1309.     xml = 获取UI();
  1310.     var biliIdx = xml.indexOf('哔哩哔哩');
  1311.     if (biliIdx === -1) {
  1312.         biliIdx = xml.indexOf('bilibili');
  1313.     }
  1314.     if (biliIdx === -1) {
  1315.         biliIdx = xml.indexOf('B站');
  1316.     }
  1317.    
  1318.     if (biliIdx !== -1) {
  1319.         var 段 = xml.substring(biliIdx);
  1320.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  1321.         if (m) {
  1322.             var clickX = (parseInt(m[1]) + parseInt(m[3])) / 2;
  1323.             var clickY = (parseInt(m[2]) + parseInt(m[4])) / 2;
  1324.             agent.click(clickX, clickY);
  1325.             print.log("✓ 已点击B站任务卡片,坐标(" + Math.round(clickX) + "," + Math.round(clickY) + ")");
  1326.         }
  1327.     } else {
  1328.         print.log("⚠ 未找到B站任务卡片,尝试直接打开");
  1329.         try {
  1330.             app.openApp(B站包名);
  1331.             print.log("✓ 已打开B站");
  1332.         } catch (e) {
  1333.             print.log("⚠ 打开B站失败:" + e.message);
  1334.         }
  1335.     }
  1336.     sleep.second(秒 = 3);

  1337.     xml = 获取UI();
  1338.    
  1339.     var startX = 屏幕宽 * 0.15 + 50;
  1340.     var startY = 屏幕高 * 0.42;
  1341.    
  1342.     var detects = opencv.findImagesEx('图色975253.cv');
  1343.     if (detects != null && detects.length > 0) {
  1344.         print.log("✓ 图色匹配找到滑块初始位置");
  1345.         print.log("图色匹配结果:" + detects[0]);
  1346.         var dStr = "" + detects[0];
  1347.         var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  1348.         if (m) {
  1349.             var left = parseFloat(m[1]);
  1350.             var top = parseFloat(m[2]);
  1351.             var right = parseFloat(m[3]);
  1352.             var bottom = parseFloat(m[4]);
  1353.             startX = (left + right) / 2 * 屏幕宽;
  1354.             startY = (top + bottom) / 2 * 屏幕高;
  1355.             print.log("✓ 滑块初始位置:(" + Math.round(startX) + "," + Math.round(startY) + ")");
  1356.         }
  1357.     } else {
  1358.         print.log("⚠ 图色匹配未找到滑块,使用坐标兜底");
  1359.     }

  1360.     var 拖动距离 = 验证码滑块距离.x * 滑块校准系数;

  1361.     var endX = startX + 拖动距离;
  1362.     var endY = startY;

  1363.     print.log("✓ 滑块起点: (" + Math.round(startX) + "," + Math.round(startY) + "), 拖动距离: " + 拖动距离);
  1364.     agent.swip(startX, startY, endX, endY, 2000);
  1365.     print.log("✓ 已拖动滑块,起点(" + Math.round(startX) + "," + Math.round(startY) + "),终点(" + Math.round(endX) + "," + Math.round(endY) + ")");
  1366. }

  1367. 主流程();

  1368. print.log("\n===== KIMI识别验证码拖动B站流程结束 =====");
复制代码



unto自动截图并发送给DEEPSEEK识别示例过程nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
信息发布软件解析Kimi返回的拖动距离示例
解析Kimi返回的拖动距离示例
信息发布软件自动截图并发送给DEEPSEEK识别示例过程
自动截图并发送给DEEPSEEK识别示例过程
信息发布软件AIWROK软件测试文心识别识别验证码示例
AIWROK软件测试文心识别识别验证码示例
信息发布软件元宝截图B站验证码示例测试
元宝截图B站验证码示例测试
信息发布软件示例千问自动采集文章保存记事本
示例千问自动采集文章保存记事本
信息发布软件豆包识别验证码加拖动验证码示例
豆包识别验证码加拖动验证码示例
信息发布软件豆包对话采集示例
豆包对话采集示例
信息发布软件启动自动百度贴吧发图片
启动自动百度贴吧发图片
信息发布软件自动百度贴吧示例
自动百度贴吧示例
信息发布软件代理模式简书自动流程
代理模式简书自动流程
信息发布软件启动极速版任务页看小说赚钱自动阅读
启动极速版任务页看小说赚钱自动阅读
信息发布软件agent代理模式功能小结
agent代理模式功能小结
信息发布软件完整苹果IOS小脚本文本输入与粘贴流程
完整苹果IOS小脚本文本输入与粘贴流程
信息发布软件AIWROK使用activity列表开关与进度条的协同交互
AIWROK使用activity列表开关与进度条的协同交互
群发软件苹果脚本找图后Detect对象各种方法演示
苹果脚本找图后Detect对象各种方法演示
群发软件苹果脚本网络API监控与数据管理工具
苹果脚本网络API监控与数据管理工具
群发软件IOS苹果脚本TXT文件读写H5日志打印完整示例
IOS苹果脚本TXT文件读写H5日志打印完整示例
群发软件AIWROK软件演示多线程创建暂停恢复
AIWROK软件演示多线程创建暂停恢复
群发软件AIWROK软件定时检查页面状态防止卡死技巧
AIWROK软件定时检查页面状态防止卡死技巧
群发软件安卓脚本runTime相关功能示例
安卓脚本runTime相关功能示例
群发软件floatUI实例秒显示秒关闭吐司功能
floatUI实例秒显示秒关闭吐司功能
群发软件苹果脚本HID多行实例粘帖板示例
苹果脚本HID多行实例粘帖板示例
群发软件安卓脚本HID节点查找完整方法示例
HID节点查找完整方法示例
群发软件AIWROK软件框架的抖音自动化营销系统
AIWROK软件框架的抖音自动化营销系统
群发软件赛博朋克任务控制中心H5示例
赛博朋克任务控制中心H5示例
群发软件苹果脚本现代深色UI设计风格
现代深色UI设计风格
群发软件AIWROK软件智能任务监控悬浮窗
AIWROK软件智能任务监控悬浮窗
群发软件AIWROK软件事件监听示例
AIWROK软件事件监听示例
群发软件QZ掘金原生UI界面
QZ掘金原生UI界面
群发软件安卓脚本auto方法完整示例
安卓脚本auto方法完整示例
群发软件安卓脚本暂停弹出确认对话框
安卓脚本暂停弹出确认对话框
群发软件苹果iOS脚本天气信息查询工具
苹果iOS脚本天气信息查询工具
群发软件安卓脚本简化版H5日志输出窗口
安卓脚本简化版H5日志输出窗口
群发软件安卓脚本简化版H5日志输出窗口
安卓脚本简化版H5日志输出窗口
群发软件安卓脚本应用重置、代理模式监控及补丁升级
安卓脚本应用重置、代理模式监控及补丁升级
群发软件安卓脚本里的打开关闭安装以及卡密授权信息
安卓脚本里的打开关闭安装以及卡密授权信息
群发软件AIWROK软件脚本GET下载文件并检测0KB工具
AIWROK软件脚本GET下载文件并检测0KB工具
群发软件安卓脚本HID按键方法完整示例
安卓脚本HID按键方法完整示例
群发软件AIWROK软件键鼠HID滑动所有方法功能演示
AIWROK软件键鼠HID滑动所有方法功能演示
群发软件苹果脚本里HID的5种滑动方法的使用
苹果脚本里HID的5种滑动方法的使用
群发软件苹果脚本示例7种不同的OCR识别和点击方法
苹果脚本示例7种不同的OCR识别和点击方法
群发软件AIWROK软件安卓脚本FTP上传下载例子
AIWROK软件安卓脚本FTP上传下载例子
群发软件AIWROK软件脚本JSON转换示例
AIWROK软件脚本JSON转换示例
群发软件AIWROK软件运算符高级应用实例
AIWROK软件运算符高级应用实例
群发软件JavaScript语法小示例
JavaScript语法小示例
群发软件展示JavaScript各种语句标识符的实际应用
展示JavaScript各种语句标识符的实际应用
群发软件AIWROK条件语句实用示例智能活动推荐系统
AIWROK条件语句实用示例智能活动推荐系统
群发软件AIWROK软件示例数组方法实战应用
AIWROK软件示例数组方法实战应用
群发软件示例JavaScript的 try-catch-finally-throw用法
示例JavaScript的 try-catch-finally-throw用法
群发软件JavaScript 高级错误处理实战示例
JavaScript 高级错误处理实战示例
群发软件安卓脚本AIWROK软件示例JS函数高级用法
安卓脚本AIWROK软件示例JS函数高级用法
群发软件AIWROK环境JavaScript编码规范完整示例
AIWROK环境JavaScript编码规范完整示例
群发软件安卓脚本示例实时截图判断页面变化
安卓脚本示例实时截图判断页面变化
群发软件苹果脚本7种不同的OCR识别
苹果脚本7种不同的OCR识别
群发软件安卓脚本多变的function用法
安卓脚本多变的function用法
群发软件苹果脚本示例Config配置H5集成
苹果脚本示例Config配置H5集成
群发软件安卓脚本类型判断与Boolean对象综合示例
安卓脚本类型判断与Boolean对象综合示例
群发软件线程全局变量H5可视化控制台
线程全局变量H5可视化控制台
群发软件秒吐司快速显示和关闭的UI提示窗口
秒吐司快速显示和关闭的UI提示窗口
群发软件苹果脚本里H5 里的 window.at.callFun 示例
苹果脚本里H5 里的 window.at.callFun 示例
群发软件H5日志打印运行过程例子
H5日志打印运行过程例子
群发软件AIWROK软件字符串方法实用案例
AIWROK软件字符串方法实用案例
群发软件HID贝塞尔曲线运动控制器
HID贝塞尔曲线运动控制器
群发软件AIWROK苹果脚本sleep方法综合实战示例
AIWROK苹果脚本sleep方法综合实战示例
群发软件苹果脚本Line控件的多种创意用法和实际应用场景
苹果脚本Line控件的多种创意用法和实际应用场景

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2026-7-21 14:05 , Processed in 0.336593 second(s), 52 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表