示例代理模式agent小红书自动发文

380

主题

193

回帖

2397

积分

管理员

积分
2397
示例代理模式agent小红书自动发文

1.png

2.png


3.png


4.png


  1. // AIWROK 完整自动化流程:启动小红书 → 点击加号 → 选择文字 → 自动发文
  2. // 代理模式agent小红书自动发文神器
  3. // 包名:com.xingin.xhs(小红书)

  4. print.log("===== 小红书自动发文流程启动 =====");
  5. print.time();

  6. // ========== 配置区 ==========
  7. var APP包名 = "com.xingin.xhs";

  8. // 循环配置
  9. var 循环次数 = 3; // 设置循环次数,0表示无限循环
  10. var 当前循环 = 0;

  11. // 发布内容数组(可以设置多条不同内容)
  12. var 发布内容列表 = [
  13.     "无聊,就发一发想法看看有什么好玩的。",
  14.     "今天天气不错,分享一个日常~",
  15.     "记录生活中的小美好 ✨"
  16. ];
  17. var 内容索引 = 0;

  18. // 底部加号按钮
  19. var 加号按钮X = 0.5;
  20. var 加号按钮Y = 0.965;

  21. // "写文字"选项按钮
  22. var 文字选项X = 0.5;
  23. var 文字选项Y = 0.8578;

  24. // "下一步"按钮(第一个下一步,进入预览页)
  25. var 下一步按钮X = 0.5;
  26. var 下一步按钮Y = 0.95;

  27. // "下一步"按钮(第二个下一步,从预览页进入编辑页)
  28. var 预览下一步X = 0.85;
  29. var 预览下一步Y = 0.95;

  30. // "发布笔记"按钮(最终发布)
  31. // 红色大按钮,在屏幕底部
  32. var 发布按钮X = 0.5;
  33. var 发布按钮Y = 0.91;

  34. // 文本输入框 (根据XML bounds="[406,1107][1755,2820]")
  35. var 输入框X = 0.5;
  36. var 输入框Y = 0.5113;

  37. // ========== 获取设备信息 ==========
  38. var 屏幕宽 = screen.getScreenWidth();
  39. var 屏幕高 = screen.getScreenHeight();
  40. print.log("屏幕尺寸:" + 屏幕宽 + " x " + 屏幕高);
  41. print.log("代理状态:" + (agent.isOpen() ? "已开启" : "未开启"));

  42. // ========================================
  43. // 主循环开始
  44. // ========================================
  45. for (当前循环 = 1; 循环次数 == 0 || 当前循环 <= 循环次数; 当前循环++) {
  46.     if (循环次数 > 0) {
  47.         print.log("\n======================================");
  48.         print.log("===== 第 " + 当前循环 + " / " + 循环次数 + " 次循环 =====");
  49.         print.log("======================================");
  50.     } else {
  51.         print.log("\n======================================");
  52.         print.log("===== 第 " + 当前循环 + " 次循环(无限模式)=====");
  53.         print.log("======================================");
  54.     }
  55.    
  56.     // 获取当前要发布的内容
  57.     var 发布内容 = 发布内容列表[内容索引 % 发布内容列表.length];
  58.     内容索引++;
  59.    
  60.     print.log("本次发布内容:" + 发布内容);
  61.    
  62.     // ========================================
  63.     // 步骤1:启动小红书
  64.     // ========================================
  65. print.log("\n========== 步骤1:启动小红书 ==========");
  66. try {
  67.     app.openApp(APP包名);
  68.     print.log("✓ 已启动小红书");
  69. } catch (e) {
  70.     print.log(" 启动失败:" + e.message);
  71. }
  72. sleep.second(秒 = 5);

  73. // ========================================
  74. // 步骤2:点击底部加号按钮
  75. // ========================================
  76. print.log("\n========== 步骤2:点击加号按钮 ==========");
  77. try {
  78.     agent.clickPercent(加号按钮X, 加号按钮Y);
  79.     print.log("✓ 已点击加号按钮");
  80. } catch (e) {
  81.     print.log("⚠ 点击加号失败:" + e.message);
  82. }
  83. sleep.second(秒 = 2);

  84. // ========================================
  85. // 步骤3:选择"文字"选项
  86. // ========================================
  87. print.log("\n========== 步骤3:选择文字选项 ==========");
  88. try {
  89.     agent.clickPercent(文字选项X, 文字选项Y);
  90.     print.log("✓ 已选择文字选项");
  91. } catch (e) {
  92.     print.log("⚠ 选择文字选项失败:" + e.message);
  93. }
  94. sleep.second(秒 = 2);

  95. // ========================================
  96. // 步骤4:输入内容
  97. // ========================================
  98. print.log("\n========== 步骤4:输入内容 ==========");

  99. var 发布内容 = "无聊,就发一发想法看看有什么好玩的。";
  100. print.log("准备输入内容:" + 发布内容);

  101. // 计算输入框像素坐标
  102. var 输入框像素X = Math.floor(输入框X * 屏幕宽);
  103. var 输入框像素Y = Math.floor(输入框Y * 屏幕高);

  104. // ---- 第1步:点击输入框获取焦点 ----
  105. agent.click(输入框像素X, 输入框像素Y);
  106. sleep.second(秒 = 1);

  107. // ---- 第2步:设置剪贴板(双保险) ----
  108. agent.shell("service call clipboard 4 i32 1 s16 '" + 发布内容 + "' i32 0");
  109. sleep.millisecond(毫秒 = 300);
  110. agent.shell("service call clipboard 3 i32 1 s16 '" + 发布内容 + "' i32 0");
  111. sleep.millisecond(毫秒 = 300);
  112. Clipboard.copy(发布内容);
  113. sleep.millisecond(毫秒 = 300);

  114. // ---- 第3步:粘贴内容(尝试多种方式) ----
  115. var 粘贴成功 = false;

  116. // 方式A:KEYCODE_PASTE (279)
  117. agent.shell("input keyevent 279");
  118. sleep.second(秒 = 1);
  119. var xmlA = agent.shell("uiautomator dump --compressed /proc/self/fd/1 2>/dev/null");
  120. if (xmlA.indexOf("无聊") !== -1 || xmlA.indexOf("想法") !== -1) {
  121.     粘贴成功 = true;
  122.     print.log("✓ KEYCODE_PASTE 粘贴成功");
  123. }

  124. // 方式B:Ctrl+V
  125. if (!粘贴成功) {
  126.     agent.shell("input keyevent 50 --meta 0x1000");
  127.     sleep.second(秒 = 1);
  128.     var xmlB = agent.shell("uiautomator dump --compressed /proc/self/fd/1 2>/dev/null");
  129.     if (xmlB.indexOf("无聊") !== -1 || xmlB.indexOf("想法") !== -1) {
  130.         粘贴成功 = true;
  131.         print.log("✓ Ctrl+V 粘贴成功");
  132.     }
  133. }

  134. // 方式C:长按 + 查找粘贴按钮
  135. if (!粘贴成功) {
  136.     var 长按命令 = "input swipe " + 输入框像素X + " " + 输入框像素Y + " " + (输入框像素X + 1) + " " + (输入框像素Y + 1) + " 2000";
  137.     agent.shell(长按命令);
  138.     sleep.second(秒 = 2);
  139.    
  140.     var xmlC = agent.shell("uiautomator dump --compressed /proc/self/fd/1 2>/dev/null");
  141.     var 关键词 = ["粘贴", "Paste", "paste"];
  142.     for (var i = 0; i < 关键词.length; i++) {
  143.         if (xmlC.indexOf(关键词[i]) !== -1) {
  144.             var 后面 = xmlC.substring(xmlC.indexOf(关键词[i]));
  145.             var m = 后面.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
  146.             if (m) {
  147.                 var cx = (parseInt(m[1]) + parseInt(m[3])) / 2;
  148.                 var cy = (parseInt(m[2]) + parseInt(m[4])) / 2;
  149.                 agent.click(cx, cy);
  150.                 粘贴成功 = true;
  151.                 print.log("✓ 长按粘贴成功");
  152.                 break;
  153.             }
  154.         }
  155.     }
  156. }

  157. if (!粘贴成功) {
  158.     print.log("✗ 所有粘贴方式均未成功");
  159. }

  160. // ========================================
  161. // 步骤5:点击"下一步"(进入预览页)
  162. // ========================================
  163. print.log("\n========== 步骤5:点击下一步 ==========");
  164. try {
  165.     agent.clickPercent(下一步按钮X, 下一步按钮Y);
  166.     print.log("✓ 已点击下一步按钮");
  167. } catch (e) {
  168.     print.log("⚠ 点击下一步失败:" + e.message);
  169. }
  170. sleep.second(秒 = 5);

  171. // ========================================
  172. // 步骤6:点击预览页的"下一步"(进入编辑页)
  173. // ========================================
  174. print.log("\n========== 步骤6:点击预览页下一步 ==========");
  175. try {
  176.     agent.clickPercent(预览下一步X, 预览下一步Y);
  177.     print.log("✓ 已点击预览页下一步按钮");
  178. } catch (e) {
  179.     print.log("⚠ 点击预览页下一步失败:" + e.message);
  180. }
  181. sleep.second(秒 = 2);

  182. // ========================================
  183. // 步骤7:点击"发布笔记"(最终发布)
  184. // ========================================
  185. print.log("\n========== 步骤7:点击发布笔记 ==========");
  186. try {
  187.     agent.clickPercent(发布按钮X, 发布按钮Y);
  188.     print.log("✓ 已点击发布笔记按钮");
  189. } catch (e) {
  190.     print.log(" 点击发布笔记失败:" + e.message);
  191. }
  192. sleep.second(秒 = 3);
  193.    
  194.     // ========================================
  195.     // 循环间隔(最后一次不等待)
  196.     // ========================================
  197.     if (循环次数 == 0 || 当前循环 < 循环次数) {
  198.         print.log("\n========== 等待下一次循环 ==========");
  199.         sleep.second(秒 = 5);
  200.     }
  201. }

  202. // ========================================
  203. // 结果汇总
  204. // ========================================
  205. print.timeEnd();
  206. print.log("\n======================================");
  207. print.log("===== 所有循环执行完成 =====");
  208. if (循环次数 > 0) {
  209.     print.log("总计执行:" + 循环次数 + " 次");
  210. } else {
  211.     print.log("无限循环模式,已执行:" + (当前循环 - 1) + " 次");
  212. }
  213. print.log("======================================");
复制代码


举报 回复