注册 登录
发贴工具
查看: 8|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] 启动自动百度贴吧发图片

[复制链接]

2580

主题

2628

帖子

1万

积分

积分
15656
跳转到指定楼层
楼主
启动自动百度贴吧发图片
启动自动百度贴吧发图片 群发软件发帖工具

  1. // AIWROK 完整自动化流程:启动百度贴吧 → 点击发帖 → 添加图片 → 选择相册图片 → 输入标题和内容 → 发布
  2. // 全程使用 agent 方式操作,不依赖无障碍权限
  3. // 包名:com.baidu.tieba(百度贴吧)

  4. print.log("===== 百度贴吧发图片流程启动 =====");
  5. print.time();

  6. // ========== 配置区 ==========
  7. var APP包名 = "com.baidu.tieba";

  8. var 循环次数 = 1;
  9. var 当前循环 = 0;

  10. var 发布标题列表 = [
  11.     "分享一张图片",
  12.     "看看这张图怎么样",
  13.     "图片分享"
  14. ];

  15. var 发布内容列表 = [
  16.     "分享一张有趣的图片~",
  17.     "这张图拍得不错吧!",
  18.     "随手拍的,大家看看~"
  19. ];

  20. var 选择图片数量 = 3;

  21. var 内容索引 = 0;

  22. // ========== 获取设备信息 ==========
  23. var 屏幕宽 = screen.getScreenWidth();
  24. var 屏幕高 = screen.getScreenHeight();
  25. print.log("屏幕尺寸:" + 屏幕宽 + " x " + 屏幕高);
  26. print.log("代理状态:" + (agent.isOpen() ? "已开启" : "未开启"));

  27. // ========== 工具函数 ==========
  28. function 获取XML() {
  29.     var raw = agent.shell("uiautomator dump --compressed /proc/self/fd/1 2>/dev/null");
  30.     var rawStr = "" + raw;
  31.     var startIdx = rawStr.indexOf("<?xml");
  32.     var endIdx = rawStr.indexOf("</hierarchy>");
  33.     if (startIdx !== -1 && endIdx !== -1) {
  34.         return rawStr.substring(startIdx, endIdx + 13);
  35.     }
  36.     return rawStr;
  37. }

  38. function 查找节点中心(xml, text) {
  39.     var idx = ("" + xml).indexOf('text="' + text + '"');
  40.     if (idx === -1) {
  41.         idx = ("" + xml).indexOf("text='" + text + "'");
  42.     }
  43.     if (idx === -1) {
  44.         return null;
  45.     }
  46.     var 后面 = ("" + xml).substring(idx);
  47.     var m = 后面.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  48.     if (!m) {
  49.         m = 后面.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
  50.     }
  51.     if (!m) {
  52.         return null;
  53.     }
  54.     var x1 = parseInt(m[1]);
  55.     var y1 = parseInt(m[2]);
  56.     var x2 = parseInt(m[3]);
  57.     var y2 = parseInt(m[4]);
  58.     return {
  59.         x: (x1 + x2) / 2,
  60.         y: (y1 + y2) / 2
  61.     };
  62. }

  63. function 查找输入框中心(xml, hintText) {
  64.     var xmlStr = "" + xml;

  65.     var editTextPattern = /<node[^>]*?class="android\.widget\.EditText"[^>]*?\/>/g;
  66.     var match;
  67.     while ((match = editTextPattern.exec(xmlStr)) !== null) {
  68.         var nodeStr = match[0];
  69.         var textMatch = nodeStr.match(/text="([^"]*)"/);
  70.         if (!textMatch) {
  71.             textMatch = nodeStr.match(/text='([^']*)'/);
  72.         }
  73.         if (textMatch && textMatch[1].indexOf(hintText) !== -1) {
  74.             var boundsMatch = nodeStr.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  75.             if (!boundsMatch) {
  76.                 boundsMatch = nodeStr.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
  77.             }
  78.             if (boundsMatch) {
  79.                 var x1 = parseInt(boundsMatch[1]);
  80.                 var y1 = parseInt(boundsMatch[2]);
  81.                 var x2 = parseInt(boundsMatch[3]);
  82.                 var y2 = parseInt(boundsMatch[4]);
  83.                 return {
  84.                     x: (x1 + x2) / 2,
  85.                     y: (y1 + y2) / 2
  86.                 };
  87.             }
  88.         }
  89.     }

  90.     var textPattern = new RegExp('text="([^"]*?' + hintText + '[^"]*)"', 'g');
  91.     while ((match = textPattern.exec(xmlStr)) !== null) {
  92.         var afterText = xmlStr.substring(match.index);
  93.         var boundsMatch = afterText.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  94.         if (!boundsMatch) {
  95.             boundsMatch = afterText.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
  96.         }
  97.         if (boundsMatch) {
  98.             var x1 = parseInt(boundsMatch[1]);
  99.             var y1 = parseInt(boundsMatch[2]);
  100.             var x2 = parseInt(boundsMatch[3]);
  101.             var y2 = parseInt(boundsMatch[4]);
  102.             return {
  103.                 x: (x1 + x2) / 2,
  104.                 y: (y1 + y2) / 2
  105.             };
  106.         }
  107.     }

  108.     return null;
  109. }

  110. function 查找底部导航中间按钮(xml) {
  111.     var pattern = /<node\s[^>]*?index="3"[^>]*?class="android\.widget\.FrameLayout"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  112.     var match;
  113.     while ((match = pattern.exec(xml)) !== null) {
  114.         var x1 = parseInt(match[1]);
  115.         var y1 = parseInt(match[2]);
  116.         var x2 = parseInt(match[3]);
  117.         var y2 = parseInt(match[4]);
  118.         var centerY = (y1 + y2) / 2;
  119.         if (centerY > 屏幕高 * 0.8) {
  120.             return {
  121.                 x: (x1 + x2) / 2,
  122.                 y: centerY
  123.             };
  124.         }
  125.     }

  126.     var pattern2 = /NAF="true"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  127.     while ((match = pattern2.exec(xml)) !== null) {
  128.         var x1 = parseInt(match[1]);
  129.         var y1 = parseInt(match[2]);
  130.         var x2 = parseInt(match[3]);
  131.         var y2 = parseInt(match[4]);
  132.         var centerX = (x1 + x2) / 2;
  133.         var centerY = (y1 + y2) / 2;
  134.         if (centerY > 屏幕高 * 0.85 && centerX > 屏幕宽 * 0.3 && centerX < 屏幕宽 * 0.7) {
  135.             return {
  136.                 x: centerX,
  137.                 y: centerY
  138.             };
  139.         }
  140.     }

  141.     return null;
  142. }

  143. function 设置ADB输入法() {
  144.     try {
  145.         var 当前输入法 = ("" + agent.shell("settings get secure default_input_method")).trim();
  146.         print.log("当前默认输入法:" + 当前输入法);

  147.         var adbKeyboard = "com.android.adbkeyboard/.AdbIME";
  148.         if (当前输入法.indexOf("adbkeyboard") === -1) {
  149.             print.log("当前不是ADB输入法,尝试切换");
  150.             agent.shell("ime enable " + adbKeyboard);
  151.             sleep.millisecond(毫秒 = 300);
  152.             agent.shell("ime set " + adbKeyboard);
  153.             sleep.millisecond(毫秒 = 500);
  154.             print.log("✓ 已切换到ADB输入法");
  155.         } else {
  156.             print.log("✓ 当前已是ADB输入法");
  157.         }
  158.     } catch (e) {
  159.         print.log("⚠ 设置ADB输入法失败:" + e.message);
  160.         print.log("提示:请手动安装ADB Keyboard并设置为默认输入法");
  161.     }
  162. }

  163. function 输入文本(content, x, y) {
  164.     var 粘贴成功 = false;

  165.     agent.click(Math.floor(x), Math.floor(y));
  166.     sleep.second(秒 = 1);

  167.     agent.shell("service call clipboard 4 i32 1 s16 '" + content + "' i32 0");
  168.     sleep.millisecond(毫秒 = 300);
  169.     agent.shell("service call clipboard 3 i32 1 s16 '" + content + "' i32 0");
  170.     sleep.millisecond(毫秒 = 300);
  171.     Clipboard.copy(content);
  172.     sleep.millisecond(毫秒 = 300);

  173.     print.log("✓ 剪贴板已设置内容");

  174.     agent.shell("input keyevent 279");
  175.     sleep.second(秒 = 1);
  176.     var xmlA = 获取XML();
  177.     if (xmlA.indexOf(content.substring(0, 2)) !== -1) {
  178.         粘贴成功 = true;
  179.         print.log("✓ KEYCODE_PASTE 粘贴成功");
  180.     }

  181.     if (!粘贴成功) {
  182.         agent.shell("input keyevent 50 --meta 0x1000");
  183.         sleep.second(秒 = 1);
  184.         var xmlB = 获取XML();
  185.         if (xmlB.indexOf(content.substring(0, 2)) !== -1) {
  186.             粘贴成功 = true;
  187.             print.log("✓ Ctrl+V 粘贴成功");
  188.         }
  189.     }

  190.     if (!粘贴成功) {
  191.         var 长按命令 = "input swipe " + Math.floor(x) + " " + Math.floor(y) + " " + (Math.floor(x) + 1) + " " + (Math.floor(y) + 1) + " 2000";
  192.         agent.shell(长按命令);
  193.         sleep.second(秒 = 2);

  194.         var xmlC = 获取XML();
  195.         var 关键词 = ["粘贴", "Paste", "paste"];
  196.         for (var i = 0; i < 关键词.length; i++) {
  197.             if (xmlC.indexOf(关键词[i]) !== -1) {
  198.                 var 后面 = xmlC.substring(xmlC.indexOf(关键词[i]));
  199.                 var m = 后面.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  200.                 if (!m) {
  201.                     m = 后面.match(/bounds='\[(\d+),(\d+)\]\[(\d+),(\d+)\]'/);
  202.                 }
  203.                 if (m) {
  204.                     var cx = (parseInt(m[1]) + parseInt(m[3])) / 2;
  205.                     var cy = (parseInt(m[2]) + parseInt(m[4])) / 2;
  206.                     agent.click(cx, cy);
  207.                     粘贴成功 = true;
  208.                     print.log("✓ 长按粘贴成功");
  209.                     break;
  210.                 }
  211.             }
  212.         }
  213.     }

  214.     if (!粘贴成功) {
  215.         print.log("✗ 所有粘贴方式均未成功");
  216.     }

  217.     return 粘贴成功;
  218. }

  219. function 查找完成按钮(xml) {
  220.     var xmlStr = "" + xml;

  221.     var pattern = /class="android\.view\.View"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  222.     var match;
  223.     var 候选列表 = [];
  224.    
  225.     while ((match = pattern.exec(xmlStr)) !== null) {
  226.         var x1 = parseInt(match[1]);
  227.         var y1 = parseInt(match[2]);
  228.         var x2 = parseInt(match[3]);
  229.         var y2 = parseInt(match[4]);

  230.         if (y1 > 屏幕高 * 0.9) {
  231.             var 节点片段 = xmlStr.substring(match.index, match.index + 200);
  232.             var 可用 = 节点片段.indexOf("enabled=\"true\"") !== -1 || 节点片段.indexOf("enabled='true'") !== -1;
  233.             候选列表.push({
  234.                 x1: x1, y1: y1, x2: x2, y2: y2,
  235.                 enabled: 可用,
  236.                 x: (x1 + x2) / 2,
  237.                 y: (y1 + y2) / 2
  238.             });
  239.         }
  240.     }

  241.     候选列表.sort(function(a, b) {
  242.         return b.x1 - a.x1;
  243.     });

  244.     for (var i = 0; i < 候选列表.length; i++) {
  245.         if (候选列表[i].enabled) {
  246.             return {
  247.                 x: 候选列表[i].x,
  248.                 y: 候选列表[i].y
  249.             };
  250.         }
  251.     }

  252.     if (候选列表.length > 0) {
  253.         return {
  254.             x: 候选列表[0].x,
  255.             y: 候选列表[0].y
  256.         };
  257.     }

  258.     return null;
  259. }

  260. function 查找选择吧区域(xml) {
  261.     var xmlStr = "" + xml;

  262.     var pattern = /class="android\.widget\.RelativeLayout"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  263.     var match;
  264.     while ((match = pattern.exec(xmlStr)) !== null) {
  265.         var x1 = parseInt(match[1]);
  266.         var y1 = parseInt(match[2]);
  267.         var x2 = parseInt(match[3]);
  268.         var y2 = parseInt(match[4]);

  269.         if (y1 > 300 && y2 < 600 && x2 - x1 > 500) {
  270.             var 节点片段 = xmlStr.substring(match.index, match.index + 500);
  271.             if (节点片段.indexOf("选择吧") !== -1) {
  272.                 return {
  273.                     x: (x1 + x2) / 2,
  274.                     y: (y1 + y2) / 2
  275.                 };
  276.             }
  277.         }
  278.     }

  279.     return null;
  280. }

  281. function 查找第一个吧(xml) {
  282.     var xmlStr = "" + xml;

  283.     var pattern = /class="android\.widget\.LinearLayout"[^>]*?bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/g;
  284.     var match;
  285.     var 候选列表 = [];

  286.     while ((match = pattern.exec(xmlStr)) !== null) {
  287.         var x1 = parseInt(match[1]);
  288.         var y1 = parseInt(match[2]);
  289.         var x2 = parseInt(match[3]);
  290.         var y2 = parseInt(match[4]);

  291.         if (y1 > 800 && y2 - y1 > 200) {
  292.             var 节点片段 = xmlStr.substring(match.index, match.index + 300);
  293.             if (节点片段.indexOf('clickable="true"') !== -1 || 节点片段.indexOf("clickable='true'") !== -1) {
  294.                 候选列表.push({
  295.                     x: (x1 + x2) / 2,
  296.                     y: (y1 + y2) / 2,
  297.                     top: y1
  298.                 });
  299.             }
  300.         }
  301.     }

  302.     候选列表.sort(function(a, b) {
  303.         return a.top - b.top;
  304.     });

  305.     if (候选列表.length > 0) {
  306.         return 候选列表[0];
  307.     }

  308.     return null;
  309. }

  310. function 选择相册图片(数量) {
  311.     print.log("准备从相册选择 " + 数量 + " 张图片");
  312.     var 已选 = 0;
  313.     var 开始时间 = Date.now();

  314.     while (已选 < 数量 && Date.now() - 开始时间 < 30000) {
  315.         try {
  316.             var xml = 获取XML();

  317.             if (xml.indexOf("相机胶卷") === -1) {
  318.                 print.log("⚠ 未检测到相册页面,等待...");
  319.                 sleep.second(秒 = 2);
  320.                 continue;
  321.             }

  322.             var 复选框列表 = [];
  323.             var descIndex = xml.indexOf('content-desc="复选框未选中"');
  324.             while (descIndex !== -1) {
  325.                 var 后面 = xml.substring(descIndex);
  326.                 var boundsM = 后面.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  327.                 if (boundsM) {
  328.                     var left = parseInt(boundsM[1]);
  329.                     var top = parseInt(boundsM[2]);
  330.                     var right = parseInt(boundsM[3]);
  331.                     var bottom = parseInt(boundsM[4]);
  332.                     var width = right - left;
  333.                     var height = bottom - top;

  334.                     if (width > 50 && height > 50) {
  335.                         复选框列表.push({
  336.                             centerX: (left + right) / 2,
  337.                             centerY: (top + bottom) / 2,
  338.                             left: left,
  339.                             top: top
  340.                         });
  341.                     }
  342.                 }
  343.                 descIndex = xml.indexOf('content-desc="复选框未选中"', descIndex + 20);
  344.             }

  345.             复选框列表.sort(function(a, b) {
  346.                 if (Math.abs(a.top - b.top) < 50) {
  347.                     return a.left - b.left;
  348.                 }
  349.                 return a.top - b.top;
  350.             });

  351.             print.log("找到 " + 复选框列表.length + " 个复选框");

  352.             if (复选框列表.length > 已选) {
  353.                 var 目标节点 = 复选框列表[已选];
  354.                 agent.click(Math.floor(目标节点.centerX), Math.floor(目标节点.centerY));
  355.                 print.log("✓ 已选中第 " + (已选 + 1) + " 张图片 (" + Math.floor(目标节点.centerX) + ", " + Math.floor(目标节点.centerY) + ")");
  356.                 已选++;
  357.                 sleep.second(秒 = 1);
  358.             } else {
  359.                 print.log("⚠ 复选框不足,尝试点击图片区域...");

  360.                 var 图片列表 = [];
  361.                 var classIndex = xml.indexOf('class="android.widget.RelativeLayout"');
  362.                 while (classIndex !== -1) {
  363.                     var 后面 = xml.substring(classIndex);
  364.                     var boundsM = 后面.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  365.                     if (boundsM) {
  366.                         var left = parseInt(boundsM[1]);
  367.                         var top = parseInt(boundsM[2]);
  368.                         var right = parseInt(boundsM[3]);
  369.                         var bottom = parseInt(boundsM[4]);
  370.                         var width = right - left;
  371.                         var height = bottom - top;

  372.                         if (width > 100 && height > 100 && top > 500) {
  373.                             图片列表.push({
  374.                                 centerX: (left + right) / 2,
  375.                                 centerY: (top + bottom) / 2,
  376.                                 left: left,
  377.                                 top: top
  378.                             });
  379.                         }
  380.                     }
  381.                     classIndex = xml.indexOf('class="android.widget.RelativeLayout"', classIndex + 35);
  382.                 }

  383.                 图片列表.sort(function(a, b) {
  384.                     if (Math.abs(a.top - b.top) < 50) {
  385.                         return a.left - b.left;
  386.                     }
  387.                     return a.top - b.top;
  388.                 });

  389.                 if (图片列表.length > 已选) {
  390.                     var 目标图片 = 图片列表[已选];
  391.                     agent.click(Math.floor(目标图片.centerX), Math.floor(目标图片.centerY));
  392.                     print.log("✓ 已点击第 " + (已选 + 1) + " 张图片区域 (" + Math.floor(目标图片.centerX) + ", " + Math.floor(目标图片.centerY) + ")");
  393.                     已选++;
  394.                     sleep.second(秒 = 1);
  395.                 } else {
  396.                     print.log("⚠ 图片不足,等待加载...");
  397.                     sleep.second(秒 = 2);
  398.                 }
  399.             }
  400.         } catch (e) {
  401.             print.log("⚠ 选择第 " + (已选 + 1) + " 张图片失败:" + e.message);
  402.             sleep.second(秒 = 1);
  403.         }
  404.     }

  405.     print.log("共选中 " + 已选 + " 张图片");
  406.     return 已选;
  407. }

  408. // ========================================
  409. // 主循环开始
  410. // ========================================
  411. for (当前循环 = 1; 循环次数 == 0 || 当前循环 <= 循环次数; 当前循环++) {
  412.     if (循环次数 > 0) {
  413.         print.log("\n======================================");
  414.         print.log("===== 第 " + 当前循环 + " / " + 循环次数 + " 次循环 =====");
  415.         print.log("======================================");
  416.     } else {
  417.         print.log("\n======================================");
  418.         print.log("===== 第 " + 当前循环 + " 次循环(无限模式)=====");
  419.         print.log("======================================");
  420.     }

  421.     var 发布标题 = 发布标题列表[内容索引 % 发布标题列表.length];
  422.     var 发布内容 = 发布内容列表[内容索引 % 发布内容列表.length];
  423.     内容索引++;

  424.     print.log("本次发布标题:" + 发布标题);
  425.     print.log("本次发布内容:" + 发布内容);

  426.     // ========================================
  427.     // 步骤1:启动百度贴吧
  428.     // ========================================
  429.     print.log("\n========== 步骤1:启动百度贴吧 ==========");
  430.     try {
  431.         app.openApp(APP包名);
  432.         print.log("✓ 已启动百度贴吧");
  433.     } catch (e) {
  434.         print.log("✗ 启动失败:" + e.message);
  435.     }
  436.     sleep.second(秒 = 5);

  437.     // ========================================
  438.     // 步骤2:设置ADB输入法(支持中文输入)
  439.     // ========================================
  440.     print.log("\n========== 步骤2:设置ADB输入法 ==========");
  441.     设置ADB输入法();

  442.     // ========================================
  443.     // 步骤3:点击底部导航中间的加号按钮
  444.     // ========================================
  445.     print.log("\n========== 步骤3:点击底部导航中间的加号按钮 ==========");
  446.     var 加号按钮点击成功 = false;

  447.     for (var i = 0; i < 5; i++) {
  448.         var xml2 = 获取XML();
  449.         print.log("  正在扫描界面...");

  450.         var 加号按钮位置 = 查找底部导航中间按钮(xml2);
  451.         if (加号按钮位置) {
  452.             print.log("  ✓ 找到底部导航中间按钮:(" + Math.floor(加号按钮位置.x) + ", " + Math.floor(加号按钮位置.y) + ")");
  453.             agent.click(Math.floor(加号按钮位置.x), Math.floor(加号按钮位置.y));
  454.             加号按钮点击成功 = true;
  455.             sleep.second(秒 = 3);

  456.             var xml2b = 获取XML();
  457.             var 添加图片选项位置 = 查找节点中心(xml2b, "添加图片");
  458.             if (添加图片选项位置) {
  459.                 print.log("  ✓ 找到添加图片选项");
  460.                 agent.click(Math.floor(添加图片选项位置.x), Math.floor(添加图片选项位置.y));
  461.                 print.log("✓ 已进入添加图片页面");
  462.             }
  463.             break;
  464.         }

  465.         sleep.second(秒 = 2);
  466.     }

  467.     if (!加号按钮点击成功) {
  468.         print.log("⚠ 未找到加号按钮,使用百分比坐标");
  469.         agent.clickPercent(0.5, 0.96);
  470.         sleep.second(秒 = 3);

  471.         var xml2c = 获取XML();
  472.         var 添加图片选项位置 = 查找节点中心(xml2c, "添加图片");
  473.         if (添加图片选项位置) {
  474.             print.log("  ✓ 找到添加图片选项");
  475.             agent.click(Math.floor(添加图片选项位置.x), Math.floor(添加图片选项位置.y));
  476.             print.log("✓ 已进入添加图片页面");
  477.         }
  478.     }

  479.     // ========================================
  480.     // 步骤4:等待进入相册页面
  481.     // ========================================
  482.     print.log("\n========== 步骤4:等待进入相册页面 ==========");
  483.     var 相册进入成功 = false;

  484.     for (var j = 0; j < 5; j++) {
  485.         var xml3 = 获取XML();

  486.         if (xml3.indexOf("相机胶卷") !== -1) {
  487.             print.log("✓ 已进入相册页面(相机胶卷)");
  488.             相册进入成功 = true;
  489.             break;
  490.         }

  491.         var 从相册选择位置 = 查找节点中心(xml3, "从相册选择");
  492.         if (从相册选择位置) {
  493.             print.log("  ✓ 找到从相册选择:(" + Math.floor(从相册选择位置.x) + ", " + Math.floor(从相册选择位置.y) + ")");
  494.             agent.click(Math.floor(从相册选择位置.x), Math.floor(从相册选择位置.y));
  495.             相册进入成功 = true;
  496.             sleep.second(秒 = 3);
  497.             break;
  498.         }

  499.         var 相册位置 = 查找节点中心(xml3, "相册");
  500.         if (相册位置) {
  501.             print.log("  ✓ 找到相册:(" + Math.floor(相册位置.x) + ", " + Math.floor(相册位置.y) + ")");
  502.             agent.click(Math.floor(相册位置.x), Math.floor(相册位置.y));
  503.             相册进入成功 = true;
  504.             sleep.second(秒 = 3);
  505.             break;
  506.         }

  507.         sleep.second(秒 = 2);
  508.     }

  509.     if (!相册进入成功) {
  510.         print.log("⚠ 未进入相册页面");
  511.     }

  512.     // ========================================
  513.     // 步骤5:从相册选择图片
  514.     // ========================================
  515.     print.log("\n========== 步骤5:从相册选择图片 ==========");
  516.     try {
  517.         选择相册图片(选择图片数量);
  518.     } catch (e) {
  519.         print.log("⚠ 选择图片失败:" + e.message);
  520.     }
  521.     sleep.second(秒 = 2);

  522.     // ========================================
  523.     // 步骤6:点击"完成"按钮(等待按钮变为可用)
  524.     // ========================================
  525.     print.log("\n========== 步骤6:点击完成按钮 ==========");
  526.     var 完成成功 = false;
  527.     var 开始时间 = Date.now();

  528.     while (!完成成功 && Date.now() - 开始时间 < 15000) {
  529.         var xml4 = 获取XML();

  530.         var 完成按钮位置 = 查找完成按钮(xml4);
  531.         if (完成按钮位置) {
  532.             print.log("  ✓ 找到完成按钮:(" + Math.floor(完成按钮位置.x) + ", " + Math.floor(完成按钮位置.y) + ")");
  533.             agent.click(Math.floor(完成按钮位置.x), Math.floor(完成按钮位置.y));
  534.             完成成功 = true;
  535.             sleep.second(秒 = 3);
  536.             break;
  537.         }

  538.         sleep.second(秒 = 1);
  539.     }

  540.     if (!完成成功) {
  541.         print.log("⚠ 未找到完成按钮,尝试点击底部右侧区域");
  542.         agent.clickPercent(0.85, 0.96);
  543.         sleep.second(秒 = 3);
  544.     }

  545.     // ========================================
  546.     // 步骤7:选择吧
  547.     // ========================================
  548.     print.log("\n========== 步骤7:选择吧 ==========");
  549.     var 选择吧完成 = false;
  550.     var 已经点击选择吧 = false;

  551.     for (var l = 0; l < 5; l++) {
  552.         var xml5 = 获取XML();

  553.         if (xml5.indexOf("最近逛的吧") !== -1 || xml5.indexOf("关注的吧") !== -1) {
  554.             var 第一个吧位置 = 查找第一个吧(xml5);
  555.             if (第一个吧位置) {
  556.                 print.log("  ✓ 选择列表中第一个吧:(" + Math.floor(第一个吧位置.x) + ", " + Math.floor(第一个吧位置.y) + ")");
  557.                 agent.click(Math.floor(第一个吧位置.x), Math.floor(第一个吧位置.y));
  558.                 sleep.second(秒 = 3);
  559.                 选择吧完成 = true;
  560.                 break;
  561.             }
  562.         } else if (xml5.indexOf("发布贴子") !== -1) {
  563.             var 选择吧区域 = 查找选择吧区域(xml5);
  564.             var 选择吧位置 = 查找节点中心(xml5, "选择吧");
  565.             if (选择吧区域) {
  566.                 print.log("  ✓ 找到选择吧区域:(" + Math.floor(选择吧区域.x) + ", " + Math.floor(选择吧区域.y) + ")");
  567.                 agent.click(Math.floor(选择吧区域.x), Math.floor(选择吧区域.y));
  568.                 sleep.second(秒 = 3);
  569.             } else if (选择吧位置) {
  570.                 print.log("  ✓ 找到选择吧:(" + Math.floor(选择吧位置.x) + ", " + Math.floor(选择吧位置.y) + ")");
  571.                 agent.click(Math.floor(选择吧位置.x), Math.floor(选择吧位置.y));
  572.                 sleep.second(秒 = 3);
  573.             } else {
  574.                 print.log("✓ 已选吧或无需选择吧");
  575.                 选择吧完成 = true;
  576.                 break;
  577.             }
  578.         } else {
  579.             print.log("✓ 已在发布页面(可能已选吧)");
  580.             选择吧完成 = true;
  581.             break;
  582.         }

  583.         sleep.second(秒 = 2);
  584.     }

  585.     if (!选择吧完成) {
  586.         print.log("⚠ 跳过选择吧步骤");
  587.     }

  588.     // ========================================
  589.     // 步骤8:输入标题
  590.     // ========================================
  591.     print.log("\n========== 步骤8:输入标题 ==========");
  592.     var 标题输入成功 = false;

  593.     for (var m = 0; m < 5; m++) {
  594.         var xml6 = 获取XML();

  595.         var 标题输入框位置 = 查找输入框中心(xml6, "请输入完整贴子标题");
  596.         if (!标题输入框位置) {
  597.             标题输入框位置 = 查找输入框中心(xml6, "完整贴子标题");
  598.         }
  599.         if (!标题输入框位置) {
  600.             标题输入框位置 = 查找输入框中心(xml6, "标题");
  601.         }

  602.         if (标题输入框位置) {
  603.             print.log("  ✓ 找到标题输入框:(" + Math.floor(标题输入框位置.x) + ", " + Math.floor(标题输入框位置.y) + ")");

  604.             var 粘贴结果 = 输入文本(发布标题, 标题输入框位置.x, 标题输入框位置.y);
  605.             if (粘贴结果) {
  606.                 print.log("✓ 标题输入成功");
  607.                 标题输入成功 = true;
  608.             } else {
  609.                 print.log("✗ 标题输入失败");
  610.             }
  611.             break;
  612.         }

  613.         sleep.second(秒 = 2);
  614.     }

  615.     if (!标题输入成功) {
  616.         print.log("✗ 标题输入失败");
  617.     }

  618.     // ========================================
  619.     // 步骤9:输入内容
  620.     // ========================================
  621.     print.log("\n========== 步骤9:输入内容 ==========");
  622.     var 内容输入成功 = false;

  623.     for (var n = 0; n < 5; n++) {
  624.         var xml7 = 获取XML();

  625.         var 内容输入框位置 = 查找输入框中心(xml7, "来吧,尽情发挥吧");
  626.         if (!内容输入框位置) {
  627.             内容输入框位置 = 查找输入框中心(xml7, "尽情发挥");
  628.         }
  629.         if (!内容输入框位置) {
  630.             内容输入框位置 = 查找输入框中心(xml7, "请输入内容");
  631.         }

  632.         if (内容输入框位置) {
  633.             print.log("  ✓ 找到内容输入框:(" + Math.floor(内容输入框位置.x) + ", " + Math.floor(内容输入框位置.y) + ")");

  634.             var 粘贴结果 = 输入文本(发布内容, 内容输入框位置.x, 内容输入框位置.y);
  635.             if (粘贴结果) {
  636.                 print.log("✓ 内容输入成功");
  637.                 内容输入成功 = true;
  638.             } else {
  639.                 print.log("✗ 内容输入失败");
  640.             }
  641.             break;
  642.         }

  643.         sleep.second(秒 = 2);
  644.     }

  645.     if (!内容输入成功) {
  646.         print.log("✗ 内容输入失败");
  647.     }

  648.     // ========================================
  649.     // 步骤10:点击发布
  650.     // ========================================
  651.     print.log("\n========== 步骤10:点击发布 ==========");
  652.     var 发布成功 = false;

  653.     for (var p = 0; p < 5; p++) {
  654.         var xml8 = 获取XML();

  655.         var 发布按钮位置 = 查找节点中心(xml8, "发布");
  656.         if (发布按钮位置) {
  657.             print.log("  ✓ 找到发布按钮:(" + Math.floor(发布按钮位置.x) + ", " + Math.floor(发布按钮位置.y) + ")");
  658.             agent.click(Math.floor(发布按钮位置.x), Math.floor(发布按钮位置.y));
  659.             sleep.second(秒 = 3);

  660.             var xml8b = 获取XML();
  661.             if (xml8b.indexOf("发布成功") !== -1 || xml8b.indexOf("帖子已发布") !== -1) {
  662.                 print.log("✓ 帖子发布成功");
  663.                 发布成功 = true;
  664.             } else if (xml8b.indexOf("发布贴子") === -1) {
  665.                 print.log("✓ 已离开发布页面,发布流程完成");
  666.                 发布成功 = true;
  667.             } else {
  668.                 print.log("⚠ 发布按钮点击后页面未变化");
  669.             }
  670.             break;
  671.         }

  672.         sleep.second(秒 = 2);
  673.     }

  674.     if (!发布成功) {
  675.         print.log("✗ 发布失败");
  676.     }

  677.     // ========================================
  678.     // 步骤11:关闭APP
  679.     // ========================================
  680.     print.log("\n========== 步骤11:关闭APP ==========");
  681.     try {
  682.         agent.shell("am force-stop " + APP包名);
  683.         print.log("✓ 已关闭百度贴吧");
  684.     } catch (e) {
  685.         print.log("⚠ 关闭APP失败:" + e.message);
  686.     }
  687.     sleep.second(秒 = 3);

  688.     // ========================================
  689.     // 循环间隔
  690.     // ========================================
  691.     if (循环次数 == 0 || 当前循环 < 循环次数) {
  692.         print.log("\n========== 等待下一次循环 ==========");
  693.         sleep.second(秒 = 5);
  694.     }
  695. }

  696. // ========================================
  697. // 结果汇总
  698. // ========================================
  699. print.timeEnd();
  700. print.log("\n======================================");
  701. print.log("===== 所有循环执行完成 =====");
  702. if (循环次数 > 0) {
  703.     print.log("总计执行:" + 循环次数 + " 次");
  704. } else {
  705.     print.log("无限循环模式,已执行:" + (当前循环 - 1) + " 次");
  706. }
  707. print.log("======================================");
复制代码



unto自动百度贴吧示例nextnocontent
回复

使用道具 举报

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

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖