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

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

[宣传软件网站动态] 自动截图并发送给DEEPSEEK识别示例过程

[复制链接]

793

主题

877

帖子

5620

积分

积分
5620

资讯缩略图:

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

资讯发布简介:自动截图并发送给DEEPSEEK识别示例过程

资讯关键词:自动截图并发送给DEEPSEEK识别示例过程

资讯所属分类:IT资讯 SEO资讯 

联系:

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

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

资讯详细描述
自动截图并发送给DEEPSEEK识别示例过程
自动截图并发送给DEEPSEEK识别示例过程 b2b软件
  1. // AIWROK 自动化流程:截图B站验证码 → 启动DEEPSEEK助手 → 发送截图询问拖动距离 → 采集回答 → 切回B站拖动滑块
  2. // 包名:com.deepseek.chat(DEEPSEEK AI)
  3. //
  4. // 使用说明:
  5. //   1. 在B站验证码页面运行脚本
  6. //   2. 脚本自动截图并发送给DEEPSEEK识别
  7. //   3. 解析DEEPSEEK返回的拖动距离,切回B站拖动滑块

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

  10. // ========== 配置区 ==========
  11. var DEEPK包名 = "com.deepseek.chat";
  12. var B站包名 = "tv.danmaku.bili";
  13. var 截图保存路径 = "/sdcard/验证码截图.png";

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

  17. var 提问话术 = "请帮我分析这张图片,告诉我左边的方块需要向右移动多少像素才能和右边的缺口对齐,只回复座标数字就行了。";

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

  29. // ========== 工具函数 ==========

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

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

  38. function 解码HTML实体(s) {
  39.     var str = "" + s;
  40.     str = str.replace(/
  41. /g, "\n");
  42.     str = str.replace(/
  43. /g, "\r");
  44.     str = str.replace(/        /g, "\t");
  45.     str = str.replace(/'/g, "'");
  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.     return str;
  53. }

  54. function 获取当前最后AI回答(xml) {
  55.     var 回答列表 = 采集AI回答列表(xml);
  56.     if (回答列表.length === 0) return "";
  57.     return 回答列表[回答列表.length - 1];
  58. }

  59. function OCR识别屏幕区域(xml) {
  60.     try {
  61.         var img = screen.screenShotFull();
  62.         
  63.         var ocrres = img.MLKitOcr('zhs');
  64.         var ocrText = "";
  65.         
  66.         if (ocrres && typeof ocrres.getAllString === 'function') {
  67.             ocrText = "" + ocrres.getAllString();
  68.         } else if (ocrres && typeof ocrres.getJsonString === 'function') {
  69.             var jsonStr = "" + ocrres.getJsonString();
  70.             var textPattern = /"text"\s*:\s*"([^"]+)"/g;
  71.             var match;
  72.             var allText = [];
  73.             while ((match = textPattern.exec(jsonStr)) !== null) {
  74.                 if (match[1] && match[1].length > 0) {
  75.                     allText.push(match[1]);
  76.                 }
  77.             }
  78.             ocrText = allText.join("\n");
  79.         } else {
  80.             var str = "" + ocrres;
  81.             var textPattern2 = /"text"\s*:\s*"([^"]+)"/g;
  82.             var match2;
  83.             var allText2 = [];
  84.             while ((match2 = textPattern2.exec(str)) !== null) {
  85.                 if (match2[1] && match2[1].length > 0) {
  86.                     allText2.push(match2[1]);
  87.                 }
  88.             }
  89.             ocrText = allText2.join("\n");
  90.         }
  91.         
  92.         img.recycle();
  93.         
  94.         if (ocrText && ocrText.length > 0) {
  95.             print.log("✓ MLKitOcr识别成功");
  96.             print.log("--- OCR结果开始 ---");
  97.             print.log(ocrText);
  98.             print.log("--- OCR结果结束 ---");
  99.             return "" + ocrText;
  100.         }
  101.         
  102.         print.log("⚠ MLKitOcr未识别到内容");
  103.         return "";
  104.     } catch (e) {
  105.         print.log("⚠ OCR识别异常:" + e.message);
  106.         return "";
  107.     }
  108. }

  109. function 提取数字(文本) {
  110.     var str = "" + 文本;
  111.     var 精确匹配 = str.match(/距离加(\d+)/);
  112.     if (精确匹配) {
  113.         var num = parseInt(精确匹配[1]);
  114.         if (num >= 30) {
  115.             return "" + num;
  116.         }
  117.     }
  118.     var 备选匹配 = str.match(/距离精[\u51c6\u79ef\u786e]加?(\d+)/);
  119.     if (备选匹配) {
  120.         var num2 = parseInt(备选匹配[1]);
  121.         if (num2 >= 30) {
  122.             return "" + num2;
  123.         }
  124.     }
  125.     var allMatches = str.match(/\d+/g);
  126.     if (allMatches) {
  127.         var 候选数字 = [];
  128.         for (var i = 0; i < allMatches.length; i++) {
  129.             var n = parseInt(allMatches[i]);
  130.             if (n >= 30 && n < 1000) {
  131.                 候选数字.push(n);
  132.             }
  133.         }
  134.         if (候选数字.length > 0) {
  135.             候选数字.sort(function(a, b) { return b - a; });
  136.             return "" + 候选数字[0];
  137.         }
  138.         var allNums = [];
  139.         for (var j = 0; j < allMatches.length; j++) {
  140.             allNums.push(parseInt(allMatches[j]));
  141.         }
  142.         allNums.sort(function(a, b) { return b - a; });
  143.         return "" + allNums[0];
  144.     }
  145.     return "";
  146. }

  147. function 采集AI回答列表(xml) {
  148.     var xmlStr = "" + xml;
  149.     var 回答列表 = [];

  150.     var ocr文本 = OCR识别屏幕区域(xml);
  151.     if (ocr文本 && 字符串长度(ocr文本) > 1) {
  152.         回答列表.push(ocr文本);
  153.         print.log("✓ OCR识别到屏幕文本");
  154.         print.log("--- OCR结果开始 ---");
  155.         print.log(ocr文本);
  156.         print.log("--- OCR结果结束 ---");
  157.         
  158.         var ocr数字 = 提取数字(ocr文本);
  159.         if (ocr数字) {
  160.             print.log("✓ 从OCR结果中提取到数字:" + ocr数字);
  161.             回答列表.push(ocr数字);
  162.         }
  163.     }

  164.     var textViewPattern = /<node[^>]*?text="([^"]+)"[^>]*?class="android\.widget\.TextView"[^>]*?\/?>/g;
  165.     var tvMatch;
  166.     var 跳过顶部区域 = true;
  167.     while ((tvMatch = textViewPattern.exec(xmlStr)) !== null) {
  168.         if (tvMatch[1] && 字符串长度(tvMatch[1]) > 1) {
  169.             var 原始文本 = tvMatch[1];
  170.             var 解码文本 = 解码HTML实体(原始文本);
  171.             
  172.             if (解码文本.includes("使用识图模式开始对话") ||
  173.                 解码文本.includes("图片理解功能内测中") ||
  174.                 解码文本.includes("快速模式") ||
  175.                 解码文本.includes("专家模式") ||
  176.                 解码文本.includes("识图模式") ||
  177.                 解码文本.includes("拍照") ||
  178.                 解码文本.includes("相册") ||
  179.                 解码文本.includes("文件") ||
  180.                 解码文本.includes("发消息或按住说话") ||
  181.                 解码文本.includes("深度思考")) {
  182.                 continue;
  183.             }
  184.             
  185.             if (!回答列表.includes(解码文本)) {
  186.                 回答列表.push(解码文本);
  187.                 print.log("✓ 在TextView中找到文本: '" + 解码文本 + "'");
  188.             }
  189.         }
  190.     }

  191.     if (回答列表.length === 0) {
  192.         print.log("⚠ 未找到AI回答节点");
  193.     } else {
  194.         print.log("✓ 采集到" + 回答列表.length + "条AI回答");
  195.     }

  196.     return 回答列表;
  197. }

  198. function 全屏截图(保存路径) {
  199.     try {
  200.         var result = agent.shell("screencap -p " + 保存路径);
  201.         print.log("✓ 截图命令执行:" + result);
  202.         
  203.         var lsResult = agent.shell("ls -la " + 保存路径);
  204.         print.log("✓ 截图文件检查:" + lsResult);
  205.         
  206.         return true;
  207.     } catch (e) {
  208.         print.log("⚠ 截图失败:" + e.message);
  209.         return false;
  210.     }
  211. }

  212. function 判断DEEPK打开形式(xml) {
  213.     var xmlStr = "" + xml;
  214.    
  215.     var hasInput = xmlStr.indexOf('text="发消息或按住说话"') !== -1;
  216.     var hasPhoto = xmlStr.indexOf('text="拍照"') !== -1;
  217.     var hasAlbum = xmlStr.indexOf('text="相册"') !== -1;
  218.     var hasFile = xmlStr.indexOf('text="文件"') !== -1;
  219.    
  220.     if (hasInput && (hasPhoto || hasAlbum || hasFile)) {
  221.         print.log("✓ DEEPSEEK APP打开形式:对话页面");
  222.         return "对话页";
  223.     }
  224.    
  225.     print.log("⚠ DEEPSEEK APP打开形式:未知页面");
  226.     return "未知";
  227. }

  228. function 开启新对话(xml) {
  229.     var xmlStr = "" + xml;
  230.    
  231.     var newChatIdx = xmlStr.indexOf('content-desc="开启新对话"');
  232.     if (newChatIdx !== -1) {
  233.         var 段 = xmlStr.substring(newChatIdx);
  234.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  235.         if (m) {
  236.             var x = (parseInt(m[1]) + parseInt(m[3])) / 2;
  237.             var y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  238.             agent.click(x, y);
  239.             print.log("✓ 已点击开启新对话按钮,坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  240.             sleep.second(秒 = 3);
  241.             return true;
  242.         }
  243.     }
  244.    
  245.     var rightButtonPattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  246.     var rbMatch;
  247.     var 右上角按钮 = [];
  248.     while ((rbMatch = rightButtonPattern.exec(xmlStr)) !== null) {
  249.         var bx1 = parseInt(rbMatch[1]);
  250.         var by1 = parseInt(rbMatch[2]);
  251.         if (bx1 > 屏幕宽 * 0.85 && by1 > 100 && by1 < 400) {
  252.             右上角按钮.push({ x: (bx1 + parseInt(rbMatch[3])) / 2, y: (by1 + parseInt(rbMatch[4])) / 2 });
  253.         }
  254.     }
  255.    
  256.     if (右上角按钮.length > 0) {
  257.         右上角按钮.sort(function(a, b) { return a.x - b.x; });
  258.         var 最右边按钮 = 右上角按钮[右上角按钮.length - 1];
  259.         agent.click(最右边按钮.x, 最右边按钮.y);
  260.         print.log("✓ 已点击右上角按钮开启新对话,坐标(" + Math.round(最右边按钮.x) + "," + Math.round(最右边按钮.y) + ")");
  261.         sleep.second(秒 = 3);
  262.         return true;
  263.     }
  264.    
  265.     print.log("⚠ 未找到开启新对话按钮");
  266.     return false;
  267. }

  268. function 确保识图模式开启(xml) {
  269.     var xmlStr = "" + xml;
  270.    
  271.     var pattern = /text="识图模式"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/;
  272.     var match = pattern.exec(xmlStr);
  273.     if (match) {
  274.         var x1 = parseInt(match[1]);
  275.         var y1 = parseInt(match[2]);
  276.         var x2 = parseInt(match[3]);
  277.         var y2 = parseInt(match[4]);
  278.         var x = (x1 + x2) / 2;
  279.         var y = (y1 + y2) / 2;
  280.         
  281.         var checkedPattern = /text="识图模式"[^>]*?checked="([^"]+)"/;
  282.         var checkedMatch = checkedPattern.exec(xmlStr);
  283.         if (checkedMatch && checkedMatch[1] === "true") {
  284.             print.log("✓ 识图模式已开启");
  285.             return true;
  286.         } else {
  287.             agent.click(x, y);
  288.             print.log("✓ 已点击识图模式按钮开启识图功能,坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  289.             sleep.second(秒 = 2);
  290.             return true;
  291.         }
  292.     }
  293.    
  294.     var visualModePattern = /<node[^>]*?checkable="true"[^>]*?checked="([^"]+)"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  295.     var vmMatch;
  296.     var 模式按钮列表 = [];
  297.     while ((vmMatch = visualModePattern.exec(xmlStr)) !== null) {
  298.         var 已选中 = vmMatch[1];
  299.         var mx1 = parseInt(vmMatch[2]);
  300.         var my1 = parseInt(vmMatch[3]);
  301.         var mx2 = parseInt(vmMatch[4]);
  302.         var my2 = parseInt(vmMatch[5]);
  303.         if (my1 > 屏幕高 * 0.3 && my2 < 屏幕高 * 0.5) {
  304.             模式按钮列表.push({ checked: 已选中 === "true", x: (mx1 + mx2) / 2, y: (my1 + my2) / 2, x1: mx1 });
  305.         }
  306.     }
  307.    
  308.     if (模式按钮列表.length >= 3) {
  309.         模式按钮列表.sort(function(a, b) { return a.x1 - b.x1; });
  310.         var 第三个按钮 = 模式按钮列表[2];
  311.         if (第三个按钮.checked) {
  312.             print.log("✓ 识图模式(第三个按钮)已开启");
  313.             return true;
  314.         } else {
  315.             agent.click(第三个按钮.x, 第三个按钮.y);
  316.             print.log("✓ 已点击第三个模式按钮开启识图功能,坐标(" + Math.round(第三个按钮.x) + "," + Math.round(第三个按钮.y) + ")");
  317.             sleep.second(秒 = 2);
  318.             return true;
  319.         }
  320.     }
  321.    
  322.     print.log("⚠ 未找到识图模式按钮,跳过此步骤");
  323.     return false;
  324. }

  325. function 查找输入框中心(xml) {
  326.     var xmlStr = "" + xml;
  327.    
  328.     var inputIdx = xmlStr.indexOf('text="发消息或按住说话"');
  329.     if (inputIdx !== -1) {
  330.         var 段 = xmlStr.substring(inputIdx);
  331.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  332.         if (m) {
  333.             var x1 = parseInt(m[1]);
  334.             var y1 = parseInt(m[2]);
  335.             var x2 = parseInt(m[3]);
  336.             var y2 = parseInt(m[4]);
  337.             print.log("✓ 输入框定位:text=发消息或按住说话,bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "]");
  338.             return {
  339.                 x: (x1 + x2) / 2,
  340.                 y: (y1 + y2) / 2
  341.             };
  342.         }
  343.     }

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

  360.     var viewFactoryHolderIdx = xmlStr.indexOf('class="androidx.compose.ui.viewinterop.ViewFactoryHolder"');
  361.     if (viewFactoryHolderIdx !== -1) {
  362.         var 段3 = xmlStr.substring(viewFactoryHolderIdx);
  363.         var m3 = 段3.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  364.         if (m3) {
  365.             var x1 = parseInt(m3[1]);
  366.             var y1 = parseInt(m3[2]);
  367.             var x2 = parseInt(m3[3]);
  368.             var y2 = parseInt(m3[4]);
  369.             print.log("✓ 输入框定位(ViewFactoryHolder):bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "]");
  370.             return {
  371.                 x: (x1 + x2) / 2,
  372.                 y: (y1 + y2) / 2
  373.             };
  374.         }
  375.     }

  376.     print.log("⚠ 未找到输入框,使用兜底坐标");
  377.     return {
  378.         x: 屏幕宽 * 0.35,
  379.         y: 屏幕高 * 0.75
  380.     };
  381. }

  382. function 查找加号按钮(xml) {
  383.     var xmlStr = "" + xml;
  384.    
  385.     var plusDescIdx = xmlStr.indexOf('content-desc="切换至语音"');
  386.     if (plusDescIdx !== -1) {
  387.         var 段 = xmlStr.substring(plusDescIdx);
  388.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  389.         if (m) {
  390.             var x1 = parseInt(m[1]);
  391.             var y1 = parseInt(m[2]);
  392.             var x2 = parseInt(m[3]);
  393.             var y2 = parseInt(m[4]);
  394.             var centerX = (x1 + x2) / 2;
  395.             var centerY = (y1 + y2) / 2;
  396.             print.log("✓ 加号按钮定位:content-desc=切换至语音,坐标(" + Math.round(centerX) + "," + Math.round(centerY) + ")");
  397.             return { x: centerX, y: centerY };
  398.         }
  399.     }

  400.     var inputIdx = xmlStr.indexOf('text="发消息或按住说话"');
  401.     if (inputIdx !== -1) {
  402.         var 输入框段 = xmlStr.substring(inputIdx);
  403.         var 输入框边界 = 输入框段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  404.         if (输入框边界) {
  405.             var 输入框X2 = parseInt(输入框边界[3]);
  406.             var 输入框Y = parseInt(输入框边界[2]);
  407.             var 输入框底部Y = parseInt(输入框边界[4]);
  408.             var 输入框中心Y = (输入框Y + 输入框底部Y) / 2;
  409.             
  410.             var clickablePattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  411.             var clickMatch;
  412.             var 候选按钮 = [];
  413.             
  414.             while ((clickMatch = clickablePattern.exec(xmlStr)) !== null) {
  415.                 var bx1 = parseInt(clickMatch[1]);
  416.                 var by1 = parseInt(clickMatch[2]);
  417.                 var bx2 = parseInt(clickMatch[3]);
  418.                 var by2 = parseInt(clickMatch[4]);
  419.                
  420.                 if (by1 >= 输入框中心Y - 100 && by2 <= 输入框中心Y + 200 && bx1 > 输入框X2 - 50) {
  421.                     候选按钮.push({ x: (bx1 + bx2) / 2, y: (by1 + by2) / 2 });
  422.                 }
  423.             }
  424.             
  425.             if (候选按钮.length > 0) {
  426.                 候选按钮.sort(function(a, b) { return a.x - b.x; });
  427.                 print.log("✓ 加号按钮定位:输入框右侧clickable元素,坐标(" + Math.round(候选按钮[0].x) + "," + Math.round(候选按钮[0].y) + ")");
  428.                 return 候选按钮[0];
  429.             }
  430.         }
  431.     }

  432.     print.log("⚠ 加号按钮使用兜底坐标(输入框右侧)");
  433.     var 输入框 = 查找输入框中心(xml);
  434.     return {
  435.         x: 屏幕宽 * 0.9,
  436.         y: 输入框.y
  437.     };
  438. }

  439. function 查找相册按钮(xml) {
  440.     var xmlStr = "" + xml;
  441.    
  442.     var albumIdx = xmlStr.indexOf('text="相册"');
  443.     if (albumIdx !== -1) {
  444.         var 段 = xmlStr.substring(albumIdx);
  445.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  446.         if (m) {
  447.             var x1 = parseInt(m[1]);
  448.             var y1 = parseInt(m[2]);
  449.             var x2 = parseInt(m[3]);
  450.             var y2 = parseInt(m[4]);
  451.             var centerX = (x1 + x2) / 2;
  452.             var centerY = (y1 + y2) / 2;
  453.             print.log("✓ 相册按钮定位:text=相册,bounds=[" + x1 + "," + y1 + "][" + x2 + "," + y2 + "],坐标(" + Math.round(centerX) + "," + Math.round(centerY) + ")");
  454.             return { x: centerX, y: centerY };
  455.         }
  456.     }

  457.     var clickableViewPattern = /<node[^>]*?clickable="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  458.     var clickMatch;
  459.     var 候选按钮 = [];
  460.    
  461.     while ((clickMatch = clickableViewPattern.exec(xmlStr)) !== null) {
  462.         var bx1 = parseInt(clickMatch[1]);
  463.         var by1 = parseInt(clickMatch[2]);
  464.         var bx2 = parseInt(clickMatch[3]);
  465.         var by2 = parseInt(clickMatch[4]);
  466.         
  467.         if (by1 >= 屏幕高 * 0.8 && by2 <= 屏幕高 * 0.95) {
  468.             候选按钮.push({ x: (bx1 + bx2) / 2, y: (by1 + by2) / 2 });
  469.         }
  470.     }
  471.    
  472.     if (候选按钮.length >= 3) {
  473.         候选按钮.sort(function(a, b) { return a.x - b.x; });
  474.         var 中间按钮 = 候选按钮[1];
  475.         print.log("✓ 相册按钮定位:底部中间clickable元素,坐标(" + Math.round(中间按钮.x) + "," + Math.round(中间按钮.y) + ")");
  476.         return 中间按钮;
  477.     }

  478.     print.log("⚠ 相册按钮使用兜底坐标(底部中间)");
  479.     return {
  480.         x: 屏幕宽 * 0.5,
  481.         y: 屏幕高 * 0.88
  482.     };
  483. }

  484. function 查找相册选项(xml) {
  485.     var xmlStr = "" + xml;
  486.    
  487.     var text关键词 = ["相册", "图片", "照片", "所有照片", "从相册选择", "选择图片"];
  488.     for (var i = 0; i < text关键词.length; i++) {
  489.         var kw = text关键词[i];
  490.         var idx = xmlStr.indexOf('text="' + kw + '"');
  491.         if (idx !== -1) {
  492.             var 段 = xmlStr.substring(idx);
  493.             var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  494.             if (m) {
  495.                 print.log("✓ 相册选项定位:text=" + kw);
  496.                 return {
  497.                     x: (parseInt(m[1]) + parseInt(m[3])) / 2,
  498.                     y: (parseInt(m[2]) + parseInt(m[4])) / 2
  499.                 };
  500.             }
  501.         }
  502.     }

  503.     var desc关键词 = ["相册", "图片", "照片"];
  504.     for (var j = 0; j < desc关键词.length; j++) {
  505.         var kw2 = desc关键词[j];
  506.         var idx2 = xmlStr.indexOf('content-desc="' + kw2 + '"');
  507.         if (idx2 !== -1) {
  508.             var 段2 = xmlStr.substring(idx2);
  509.             var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  510.             if (m2) {
  511.                 print.log("✓ 相册选项定位:content-desc=" + kw2);
  512.                 return {
  513.                     x: (parseInt(m2[1]) + parseInt(m2[3])) / 2,
  514.                     y: (parseInt(m2[2]) + parseInt(m2[4])) / 2
  515.                 };
  516.             }
  517.         }
  518.     }
  519.    
  520.     return null;
  521. }

  522. function 粘贴文本(文本) {
  523.     try {
  524.         Clipboard.copy("" + 文本);
  525.     } catch (e) {
  526.         print.log("⚠ Clipboard.copy 失败:" + e.message);
  527.     }
  528.     sleep.millisecond(毫秒 = 300);

  529.     try {
  530.         agent.shell("service call clipboard 3 i32 1 s16 '" + 文本 + "' i32 0");
  531.     } catch (e2) {
  532.         // 忽略错误
  533.     }
  534.     sleep.millisecond(毫秒 = 300);

  535.     agent.shell("input keyevent 279");
  536.     sleep.millisecond(毫秒 = 500);
  537.    
  538.     try {
  539.         agent.shell("input text '" + 文本 + "'");
  540.         print.log("✓ 已通过input text直接输入文本");
  541.     } catch (e3) {
  542.         print.log("⚠ input text失败:" + e3.message);
  543.     }
  544.    
  545.     sleep.second(秒 = 1);
  546.     print.log("✓ 已粘贴文本:" + 文本);
  547. }

  548. function 是否在系统相册页面(xml) {
  549.     var xmlStr = "" + xml;
  550.    
  551.     var packageMatch = xmlStr.match(/package="([^"]+)"/);
  552.     var 当前包名 = packageMatch ? packageMatch[1] : "";
  553.    
  554.     if (当前包名 && 当前包名 !== DEEPK包名) {
  555.         print.log("✓ 检测到系统相册页面,包名:" + 当前包名);
  556.         return true;
  557.     }
  558.    
  559.     return false;
  560. }

  561. function 是否在图片预览页面(xml) {
  562.     var xmlStr = "" + xml;
  563.     if (xmlStr.indexOf('text="完成"') !== -1 || xmlStr.indexOf('text="发送"') !== -1) {
  564.         return true;
  565.     }
  566.     if (xmlStr.indexOf('content-desc="完成"') !== -1 || xmlStr.indexOf('content-desc="发送"') !== -1) {
  567.         return true;
  568.     }
  569.     return false;
  570. }

  571. function 查找图片预览确认按钮(xml) {
  572.     var xmlStr = "" + xml;
  573.    
  574.     var 关键词 = ["完成", "发送", "确认"];
  575.     for (var i = 0; i < 关键词.length; i++) {
  576.         var kw = 关键词[i];
  577.         var textIdx = xmlStr.indexOf('text="' + kw + '"');
  578.         if (textIdx !== -1) {
  579.             var 段 = xmlStr.substring(textIdx);
  580.             var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  581.             if (m) {
  582.                 var x = (parseInt(m[1]) + parseInt(m[3])) / 2;
  583.                 var y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  584.                 print.log("✓ 图片预览确认按钮定位:text=" + kw + ",坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  585.                 return { x: x, y: y };
  586.             }
  587.         }
  588.     }
  589.    
  590.     for (var j = 0; j < 关键词.length; j++) {
  591.         var kw2 = 关键词[j];
  592.         var descIdx = xmlStr.indexOf('content-desc="' + kw2 + '"');
  593.         if (descIdx !== -1) {
  594.             var 段2 = xmlStr.substring(descIdx);
  595.             var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  596.             if (m2) {
  597.                 var x = (parseInt(m2[1]) + parseInt(m2[3])) / 2;
  598.                 var y = (parseInt(m2[2]) + parseInt(m2[4])) / 2;
  599.                 print.log("✓ 图片预览确认按钮定位:content-desc=" + kw2 + ",坐标(" + Math.round(x) + "," + Math.round(y) + ")");
  600.                 return { x: x, y: y };
  601.             }
  602.         }
  603.     }
  604.    
  605.     print.log("⚠ 图片预览确认按钮使用兜底坐标(底部中间)");
  606.     return { x: 屏幕宽 * 0.5, y: 屏幕高 * 0.92 };
  607. }

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

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

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

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

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

  766.     try {
  767.         var detects = opencv.findImagesEx('图色168638.cv');
  768.         if (detects != null && detects.length > 0) {
  769.             print.log("✓ 发送按钮定位:图色匹配");
  770.             var dStr = "" + detects[0];
  771.             print.log("图色匹配结果:" + dStr);
  772.             var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  773.             if (m) {
  774.                 var left = parseFloat(m[1]);
  775.                 var top = parseFloat(m[2]);
  776.                 var right = parseFloat(m[3]);
  777.                 var bottom = parseFloat(m[4]);
  778.                 var centerX = (left + right) / 2;
  779.                 var centerY = (top + bottom) / 2;
  780.                 print.log("图色匹配百分比坐标:left=" + left + ", top=" + top + ", right=" + right + ", bottom=" + bottom);
  781.                 print.log("计算点击百分比:(" + centerX + "," + centerY + ")");
  782.                 agent.clickPercent(centerX, centerY);
  783.                 print.log("✓ 已点击发送按钮(图色)");
  784.                 return null;
  785.             }
  786.             print.log("⚠ 图色匹配结果格式解析失败");
  787.         }
  788.     } catch (e) {
  789.         print.log("⚠ 图色匹配失败:" + e.message);
  790.     }

  791.     var inputIdx = xmlStr.indexOf('text="发消息或按住说话"');
  792.     if (inputIdx !== -1) {
  793.         var 输入框段 = xmlStr.substring(inputIdx);
  794.         var 输入框边界 = 输入框段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  795.         
  796.         if (输入框边界) {
  797.             var 输入框信息 = {
  798.                 x1: parseInt(输入框边界[1]),
  799.                 y1: parseInt(输入框边界[2]),
  800.                 x2: parseInt(输入框边界[3]),
  801.                 y2: parseInt(输入框边界[4]),
  802.                 centerY: (parseInt(输入框边界[2]) + parseInt(输入框边界[4])) / 2
  803.             };

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

  807.             while ((clickMatch = clickablePattern.exec(xmlStr)) !== null) {
  808.                 var cx1 = parseInt(clickMatch[1]);
  809.                 var cy1 = parseInt(clickMatch[2]);
  810.                 var cx2 = parseInt(clickMatch[3]);
  811.                 var cy2 = parseInt(clickMatch[4]);
  812.                 var cw = cx2 - cx1;
  813.                 var ch = cy2 - cy1;

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

  817.                 if (是小按钮 && 在输入框右侧 && 在输入框水平行) {
  818.                     candidates.push({
  819.                         x1: cx1, y1: cy1, x2: cx2, y2: cy2,
  820.                         x: (cx1 + cx2) / 2,
  821.                         y: (cy1 + cy2) / 2
  822.                     });
  823.                 }
  824.             }

  825.             if (candidates.length > 0) {
  826.                 candidates.sort(function(a, b) {
  827.                     return b.x1 - a.x1;
  828.                 });
  829.                 var 选中 = candidates[0];
  830.                 print.log("✓ 发送按钮定位:输入框右侧clickable元素,坐标(" + Math.round(选中.x) + "," + Math.round(选中.y) + ")");
  831.                 return { x: 选中.x, y: 选中.y };
  832.             }

  833.             var 预估X = 输入框信息.x2 + 100;
  834.             var 预估Y = 输入框信息.centerY;
  835.             print.log("⚠ 发送按钮使用输入框右侧兜底坐标(" + Math.round(预估X) + "," + Math.round(预估Y) + ")");
  836.             return { x: 预估X, y: 预估Y };
  837.         }
  838.     }

  839.     var sendTextIdx = xmlStr.indexOf('text="发送"');
  840.     if (sendTextIdx !== -1) {
  841.         var 段 = xmlStr.substring(sendTextIdx);
  842.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  843.         if (m) {
  844.             print.log("✓ 发送按钮定位:文本匹配");
  845.             return {
  846.                 x: (parseInt(m[1]) + parseInt(m[3])) / 2,
  847.                 y: (parseInt(m[2]) + parseInt(m[4])) / 2
  848.             };
  849.         }
  850.     }

  851.     var sendDescIdx = xmlStr.indexOf('content-desc="发送"');
  852.     if (sendDescIdx !== -1) {
  853.         var 段2 = xmlStr.substring(sendDescIdx);
  854.         var m2 = 段2.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  855.         if (m2) {
  856.             print.log("✓ 发送按钮定位:content-desc匹配");
  857.             return {
  858.                 x: (parseInt(m2[1]) + parseInt(m2[3])) / 2,
  859.                 y: (parseInt(m2[2]) + parseInt(m2[4])) / 2
  860.             };
  861.         }
  862.     }

  863.     print.log("⚠ 发送按钮使用屏幕右侧兜底策略");
  864.     agent.clickPercent(0.9, 0.75);
  865.     print.log("✓ 已点击发送按钮(硬编码兜底)");
  866.     return null;
  867. }

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

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

  874.     sleep.second(秒 = 5);
  875.     已耗时 += 5;

  876.     while (已耗时 < 等待回答超时秒) {
  877.         var xml = 获取UI();
  878.         var 回答列表 = 采集AI回答列表(xml);
  879.         
  880.         if (回答列表.length > 0) {
  881.             var 当前最后回答 = 回答列表[回答列表.length - 1];
  882.             var 当前提取数字 = 提取数字(当前最后回答);
  883.             var 当前规范化文本 = 当前最后回答.trim().replace(/\s+/g, " ");
  884.             
  885.             var 有新回答 = false;
  886.             var 回答数量增加 = (回答列表.length > 发送前回答数量);
  887.             
  888.             var 发送前规范化 = 发送前的最后文本.trim().replace(/\s+/g, " ");
  889.             有新回答 = (当前规范化文本 !== 发送前规范化) || (当前提取数字 !== "");
  890.             
  891.             if (有新回答 || 回答数量增加) {
  892.                 print.log("✓ 检测到新回答(" + 已耗时 + "秒):'" + 当前最后回答 + "',提取数字:'" + 当前提取数字 + "'");
  893.                
  894.                 if (当前提取数字 !== "") {
  895.                     print.log("✓ 提取到数字,直接返回:" + 当前提取数字);
  896.                     return 当前提取数字;
  897.                 }
  898.                
  899.                 if (当前规范化文本 === 上次规范化文本) {
  900.                     连续相同次数++;
  901.                     if (连续相同次数 >= 2) {
  902.                         print.log("✓ 文本连续2次相同,回答完成");
  903.                         var 最终数字 = 提取数字(当前最后回答);
  904.                         if (最终数字 !== "") {
  905.                             return 最终数字;
  906.                         }
  907.                         return 当前最后回答;
  908.                     }
  909.                 } else {
  910.                     连续相同次数 = 0;
  911.                     上次规范化文本 = 当前规范化文本;
  912.                 }
  913.             }
  914.         }
  915.         
  916.         sleep.second(秒 = 检查间隔秒);
  917.         已耗时 += 检查间隔秒;
  918.     }

  919.     print.log("⚠ 等待AI回答超时(" + 等待回答超时秒 + "秒),尝试返回当前内容");
  920.     var xml = 获取UI();
  921.     var 兜底列表 = 采集AI回答列表(xml);
  922.     if (兜底列表.length > 0) {
  923.         var 兜底文本 = 兜底列表[兜底列表.length - 1];
  924.         print.log("✓ 超时兜底:返回当前采集到的回答:" + 兜底文本);
  925.         return 兜底文本;
  926.     }
  927.     return null;
  928. }

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

  930. function 主流程() {
  931.     // 步骤1:全屏截图(B站验证码页面)
  932.     print.log("\n========== 步骤1:全屏截图B站验证码 ==========");
  933.     var 截图成功 = 全屏截图(截图保存路径);
  934.     if (!截图成功) {
  935.         print.log("✗ 截图失败,退出流程");
  936.         print.log("===== DEEPSEEK识别验证码拖动B站流程结束 =====");
  937.         return;
  938.     }

  939.     // 步骤2:启动DEEPSEEK APP
  940.     print.log("\n========== 步骤2:启动DEEPSEEK APP ==========");
  941.     try {
  942.         app.openApp(DEEPK包名);
  943.         print.log("✓ 已启动DEEPSEEK");
  944.     } catch (e) {
  945.         print.log("⚠ 启动失败:" + e.message);
  946.     }
  947.     sleep.second(秒 = 5);

  948.     // 步骤3:点击右上角新对话按钮
  949.     print.log("\n========== 步骤3:点击右上角新对话按钮 ==========");
  950.    
  951.     xml = 获取UI();
  952.    
  953.     var 新对话X = 屏幕宽 * 0.96;
  954.     var 新对话Y = 屏幕高 * 0.06;
  955.    
  956.     var newChatIdx = xml.indexOf('content-desc="开启新对话"');
  957.     if (newChatIdx !== -1) {
  958.         var 段 = xml.substring(newChatIdx);
  959.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  960.         if (m) {
  961.             新对话X = (parseInt(m[1]) + parseInt(m[3])) / 2;
  962.             新对话Y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  963.             print.log("✓ 新对话按钮定位:content-desc=开启新对话,坐标(" + Math.round(新对话X) + "," + Math.round(新对话Y) + ")");
  964.         }
  965.     }
  966.    
  967.     agent.click(新对话X, 新对话Y);
  968.     print.log("✓ 已点击新对话按钮,坐标(" + Math.round(新对话X) + "," + Math.round(新对话Y) + ")");
  969.    
  970.     sleep.second(秒 = 3);
  971.     print.log("✓ 新对话操作完成");

  972.     // 步骤5:确保识图模式已开启
  973.     print.log("\n========== 步骤5:确保识图模式已开启 ==========");
  974.    
  975.     var 识图模式X = 屏幕宽 * 0.8;
  976.     var 识图模式Y = 屏幕高 * 0.53;
  977.    
  978.     var visualModeIdx = xml.indexOf('text="识图模式"');
  979.     if (visualModeIdx !== -1) {
  980.         var 段 = xml.substring(visualModeIdx);
  981.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  982.         if (m) {
  983.             识图模式X = (parseInt(m[1]) + parseInt(m[3])) / 2;
  984.             识图模式Y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  985.             print.log("✓ 识图模式按钮定位:text=识图模式,坐标(" + Math.round(识图模式X) + "," + Math.round(识图模式Y) + ")");
  986.         }
  987.     } else {
  988.         print.log("⚠ XML中未找到识图模式按钮,使用兜底坐标");
  989.     }
  990.    
  991.     agent.click(识图模式X, 识图模式Y);
  992.     print.log("✓ 已点击识图模式按钮,坐标(" + Math.round(识图模式X) + "," + Math.round(识图模式Y) + ")");
  993.     sleep.second(秒 = 2);
  994.     xml = 获取UI();

  995.     // 步骤6:记录发送前的最后一条AI回答和数量
  996.     print.log("\n========== 步骤6:记录发送前状态 ==========");
  997.     var 发送前回答数量 = 0;
  998.     print.log("✓ 发送前回答数量:" + 发送前回答数量);

  999.     // 步骤7:点击加号按钮打开附件菜单
  1000.     print.log("\n========== 步骤7:点击加号按钮打开附件菜单 ==========");
  1001.    
  1002.     var 加号X = 屏幕宽 * 0.83;
  1003.     var 加号Y = 屏幕高 * 0.97;
  1004.    
  1005.     var plusDescIdx = xml.indexOf('content-desc="上传文件"');
  1006.     if (plusDescIdx !== -1) {
  1007.         var 段 = xml.substring(plusDescIdx);
  1008.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  1009.         if (m) {
  1010.             加号X = (parseInt(m[1]) + parseInt(m[3])) / 2;
  1011.             加号Y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  1012.             print.log("✓ 加号按钮定位:content-desc=上传文件,坐标(" + Math.round(加号X) + "," + Math.round(加号Y) + ")");
  1013.         }
  1014.     } else {
  1015.         print.log("⚠ XML中未找到加号按钮,使用兜底坐标");
  1016.     }
  1017.    
  1018.     agent.click(加号X, 加号Y);
  1019.     print.log("✓ 已点击加号按钮,坐标(" + Math.round(加号X) + "," + Math.round(加号Y) + ")");
  1020.     sleep.second(秒 = 2);

  1021.     // 步骤8:点击相册按钮选择图片
  1022.     print.log("\n========== 步骤8:点击相册按钮选择图片 ==========");
  1023.    
  1024.     var 相册选择成功 = false;
  1025.     var 尝试次数 = 0;
  1026.    
  1027.     while (!相册选择成功 && 尝试次数 < 5) {
  1028.         尝试次数++;
  1029.         xml = 获取UI();
  1030.         
  1031.         if (是否在系统相册页面(xml)) {
  1032.             print.log("✓ 已进入系统相册页面");
  1033.             相册选择成功 = true;
  1034.             break;
  1035.         }
  1036.         
  1037.         var 相册X = 屏幕宽 * 0.5;
  1038.         var 相册Y = 屏幕高 * 0.88;
  1039.         
  1040.         var albumIdx = xml.indexOf('text="相册"');
  1041.         if (albumIdx !== -1) {
  1042.             var 段 = xml.substring(albumIdx);
  1043.             var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  1044.             if (m) {
  1045.                 相册X = (parseInt(m[1]) + parseInt(m[3])) / 2;
  1046.                 相册Y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  1047.                 print.log("✓ 相册按钮定位:text=相册,坐标(" + Math.round(相册X) + "," + Math.round(相册Y) + ")");
  1048.             }
  1049.         }
  1050.         
  1051.         agent.click(相册X, 相册Y);
  1052.         print.log("✓ 已点击相册按钮,坐标(" + Math.round(相册X) + "," + Math.round(相册Y) + ")");
  1053.         sleep.second(秒 = 2);
  1054.         
  1055.         xml = 获取UI();
  1056.         if (是否在系统相册页面(xml)) {
  1057.             print.log("✓ 已进入系统相册页面");
  1058.             相册选择成功 = true;
  1059.             break;
  1060.         }
  1061.         
  1062.         print.log("⚠ 第" + 尝试次数 + "次尝试:未进入相册页面,重新点击加号");
  1063.         agent.click(屏幕宽 * 0.77, 屏幕高 * 0.94);
  1064.         sleep.second(秒 = 2);
  1065.     }

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

  1102.     // 步骤10:等待图片添加到输入区域(等待回到DEEPSEEK对话页面)
  1103.     print.log("\n========== 步骤10:等待图片添加到输入区域 ==========");
  1104.     sleep.second(秒 = 3);
  1105.     xml = 获取UI();
  1106.    
  1107.     var packageMatch = xml.match(/package="([^"]+)"/);
  1108.     if (packageMatch && packageMatch[1] === DEEPK包名) {
  1109.         print.log("✓ 已回到DEEPSEEK对话页面");
  1110.     }
  1111.    
  1112.     print.log("✓ 图片已添加到输入区域");
  1113.    
  1114.     var isQuickMode = xml.indexOf('快速模式') !== -1;
  1115.     if (isQuickMode) {
  1116.         print.log("✓ 当前是快速模式,切换到识图模式");
  1117.         var 识图模式X = 屏幕宽 * 0.75;
  1118.         var 识图模式Y = 屏幕高 * 0.72;
  1119.         agent.click(识图模式X, 识图模式Y);
  1120.         print.log("✓ 已点击识图模式按钮,坐标(" + Math.round(识图模式X) + "," + Math.round(识图模式Y) + ")");
  1121.         sleep.second(秒 = 2);
  1122.     }

  1123.     // 步骤11:粘贴文字询问拖动距离
  1124.     print.log("\n========== 步骤11:粘贴文字询问拖动距离 ==========");
  1125.     xml = 获取UI();
  1126.    
  1127.     var 输入框X = 屏幕宽 * 0.2;
  1128.     var 输入框Y = 屏幕高 * 0.72;
  1129.    
  1130.     var editTextIdx = xml.indexOf('class="android.widget.EditText"');
  1131.     if (editTextIdx !== -1) {
  1132.         var 段 = xml.substring(editTextIdx);
  1133.         var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  1134.         if (m) {
  1135.             输入框X = (parseInt(m[1]) + parseInt(m[3])) / 2;
  1136.             输入框Y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  1137.             print.log("✓ 输入框定位:class=EditText,坐标(" + Math.round(输入框X) + "," + Math.round(输入框Y) + ")");
  1138.         }
  1139.     } else {
  1140.         var inputKeywords = ["text=\"发消息\"", "text=\"发消息或按住说话\"", "text=\"在这里提问\"", "text=\"接着问\""];
  1141.         for (var k = 0; k < inputKeywords.length; k++) {
  1142.             var idx = xml.indexOf(inputKeywords[k]);
  1143.             if (idx !== -1) {
  1144.                 var 段 = xml.substring(idx);
  1145.                 var m = 段.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  1146.                 if (m) {
  1147.                     输入框X = (parseInt(m[1]) + parseInt(m[3])) / 2;
  1148.                     输入框Y = (parseInt(m[2]) + parseInt(m[4])) / 2;
  1149.                     print.log("✓ 输入框定位:" + inputKeywords[k].replace('text="', '').replace('"', '') + ",坐标(" + Math.round(输入框X) + "," + Math.round(输入框Y) + ")");
  1150.                     break;
  1151.                 }
  1152.             }
  1153.         }
  1154.     }
  1155.    
  1156.     agent.click(输入框X, 输入框Y);
  1157.     print.log("✓ 已点击输入框,坐标(" + Math.round(输入框X) + "," + Math.round(输入框Y) + ")");
  1158.     sleep.second(秒 = 2);
  1159.    
  1160.     try {
  1161.         Clipboard.copy("" + 提问话术);
  1162.         sleep.millisecond(毫秒 = 500);
  1163.         agent.shell("input keyevent 279");
  1164.         sleep.second(秒 = 2);
  1165.         print.log("✓ 已通过剪贴板粘贴文本");
  1166.     } catch (e) {
  1167.         print.log("⚠ 剪贴板粘贴失败:" + e.message);
  1168.         agent.shell("input text '" + 提问话术 + "'");
  1169.         sleep.second(秒 = 2);
  1170.         print.log("✓ 已通过input text直接输入文本");
  1171.     }
  1172.     sleep.second(秒 = 2);

  1173.     // 步骤12:发送图片和文字
  1174.     print.log("\n========== 步骤12:发送图片和文字 ==========");
  1175.    
  1176.     var detects = opencv.findImagesEx('图色769678.cv');
  1177.     if (detects != null) {
  1178.         print.log("✓ 图色匹配找到发送按钮");
  1179.         print.log("图色匹配结果:" + detects[0]);
  1180.         var dStr = "" + detects[0];
  1181.         var m = dStr.match(/矩形区域:([\d.]+),\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
  1182.         if (m) {
  1183.             var left = parseFloat(m[1]);
  1184.             var top = parseFloat(m[2]);
  1185.             var right = parseFloat(m[3]);
  1186.             var bottom = parseFloat(m[4]);
  1187.             var centerX = (left + right) / 2;
  1188.             var centerY = (top + bottom) / 2;
  1189.             agent.clickPercent(centerX, centerY);
  1190.             print.log("✓ 已点击发送按钮(图色匹配),百分比坐标(" + centerX.toFixed(4) + "," + centerY.toFixed(4) + ")");
  1191.         }
  1192.     } else {
  1193.         print.log("⚠ 图色匹配未找到发送按钮");
  1194.     }
  1195.    
  1196.     sleep.second(秒 = 35);

  1197.     // 步骤13:等待DEEPSEEK AI回答
  1198.     print.log("\n========== 步骤13:等待DEEPSEEK AI回答 ==========");
  1199.     xml = 获取UI();
  1200.     var AI回答 = 等待AI回答完成("", 0);
  1201.    
  1202.     if (!AI回答) {
  1203.         print.log("✗ 未获取到AI回答");
  1204.         print.log("===== DEEPSEEK识别验证码拖动B站流程结束 =====");
  1205.         return;
  1206.     }

  1207.     print.log("\n✓ 采集到AI回答");
  1208.     print.log("--- 采集内容开始 ---");
  1209.     print.log(AI回答);
  1210.     print.log("--- 采集内容结束 ---");

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

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

  1328.     xml = 获取UI();
  1329.     var 验证码区域左边界 = 屏幕宽 * 0.15;
  1330.    
  1331.     var 滑块轨道匹配 = xml.match(/<node[^>]*?text="拖动滑块完成拼图"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  1332.     if (滑块轨道匹配) {
  1333.         验证码区域左边界 = parseInt(滑块轨道匹配[1]);
  1334.     }

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

  1336.     var startX = 验证码区域左边界 + 50;
  1337.     var startY = 屏幕高 * 0.42;
  1338.     var endX = startX + 拖动距离;
  1339.     var endY = startY;

  1340.     print.log("✓ 验证码区域左边界: " + 验证码区域左边界 + ", 拖动距离: " + 拖动距离);
  1341.     agent.swip(startX, startY, endX, endY, 2000);
  1342.     print.log("✓ 已拖动滑块,起点(" + Math.round(startX) + "," + Math.round(startY) + "),终点(" + Math.round(endX) + "," + Math.round(endY) + ")");
  1343. }

  1344. 主流程();

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



untoAIWROK软件测试文心识别识别验证码示例nextnocontent
回复

使用道具 举报

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

本版积分规则

相关导读
信息发布软件自动截图并发送给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控件的多种创意用法和实际应用场景
群发软件苹果脚本toast高级应用综合示例
苹果脚本toast高级应用综合示例

QQ|( 京ICP备09078825号 )

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

GMT+8, 2026-7-20 12:50 , Processed in 0.185393 second(s), 52 queries .

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

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