B2B网络软件

标题: 本地电脑部署YOLO找图服务器识别 [打印本页]

作者: YYPOST群发软件    时间: 1 小时前
标题: 本地电脑部署YOLO找图服务器识别
本地电脑部署YOLO找图服务器识别
本地电脑部署YOLO找图服务器识别 B2B网络软件

本地电脑部署YOLO找图服务器识别 B2B网络软件

本地电脑部署YOLO找图服务器识别 B2B网络软件

本地电脑部署YOLO找图服务器识别 B2B网络软件


  1. https://www.yuque.com/aiwork/nba2pr/cqznidyq69qlitmu
复制代码


  1. // YOLO 找图演示:点心心 → 下滑一个视频 → 点星星 → 下滑 → 循环
  2. // 电脑端要开着:YOLO 服务(托盘图标)
  3. // 模板图在电脑 templates/ 文件夹:hongxin.png(心心) shoucang.png(星星) dianzan.png hongbao.png

  4. var LAN = "http://192.168.10.103:8000";        // ★电脑局域网IP
  5. var RELAY = "https://7yebr64h.qwenwork.host/"; // 公网兜底(找图模式只用局域网)
  6. var ROOM = "yolo";

  7. // ★动作序列:按顺序执行、循环往复。["find","名字"]=找到模板就点;["swipe"]=下滑一个视频
  8. var 动作序列 = [
  9.     ["find", "hongxin"],     // 第1步:找到心心(点赞)就点
  10.     ["swipe"],               // 第2步:下滑一个视频
  11.     ["find", "shoucang"],    // 第3步:找到星星(收藏)就点
  12.     ["swipe"]                // 第4步:下滑一个视频
  13. ];

  14. // 旧模式备用:动作序列留空 [] 时,LOOK_FOR 里的名字"找到全点";也空则走 YOLO 识别
  15. var LOOK_FOR = [];
  16. var FIND_THR = 0.8;   // 匹配阈值,找不到可降到0.7
  17. var 间隔毫秒 = 4000;  // 每步间隔(让视频播一会儿)
  18. var lastResult = 0;
  19. var 步骤 = 0;
  20. var http = new okHttp();
  21. print.log("[YOLO] == 找图演示脚本已启动 ==");

  22. // 带重试的 POST 表单
  23. function YOLO_post(url, body) {
  24.     for (var t = 0; t < 2; t++) {
  25.         try {
  26.             var s = http.postForm(url.toString(), body.toString());
  27.             if (s && ("" + s).charAt(0) === "{") return JSON.parse(s);
  28.         } catch (e) {}
  29.         java.lang.Thread.sleep(500);
  30.     }
  31.     return null;
  32. }

  33. // 带重试的 GET
  34. function YOLO_get(url) {
  35.     for (var t = 0; t < 2; t++) {
  36.         try {
  37.             var s = http.get(url.toString());
  38.             if (s && ("" + s).charAt(0) === "{") return JSON.parse(s);
  39.         } catch (e) {}
  40.         java.lang.Thread.sleep(500);
  41.     }
  42.     return null;
  43. }

  44. // ---------- 序列模式:一步一动作 ----------
  45. function 跑一步() {
  46.     var st = 动作序列[步骤 % 动作序列.length];
  47.     if (st[0] === "swipe") {
  48.         auto.swip(540, 1500, 540, 500, 300, 0);   // 从下往上滑=下一个视频
  49.         print.log("[序列] 第" + (步骤 + 1) + "步: 下滑一个视频");
  50.         步骤++;
  51.         return;
  52.     }
  53.     var shot = screen.screenShotFull();
  54.     if (!shot) { print.log("[YOLO 跳过] 截图失败"); return; }
  55.     var f = YOLO_post(LAN + "/api/find",
  56.         ("b64=" + encodeURIComponent(shot.toBase64()) + "&names=" + st[1] + "&thr=" + FIND_THR).toString());
  57.     if (!f || !f.ok) { print.log("[序列] 网络波动,下轮重试"); return; }
  58.     var m = (f.matches || [])[0];
  59.     if (m && m.found) {
  60.         print.log("[序列] 第" + (步骤 + 1) + "步: 找到 " + m.name + " 置信度" + m.conf + " 中心点(" + m.center[0] + "," + m.center[1] + "),点击");
  61.         auto.clickPoint(m.center[0], m.center[1]);
  62.         步骤++;
  63.     } else {
  64.         print.log("[序列] 第" + (步骤 + 1) + "步: 没找到 " + st[1] + ",下轮再找");
  65.     }
  66. }

  67. // ---------- 旧模式:找到全点 / YOLO ----------
  68. function YOLO_处理(res, 通道) {
  69.     if (!res) return;
  70.     print.log("[YOLO-" + 通道 + "] 取回坐标: " + (res.count || 0) + " 个目标");
  71.     if ((res.count || 0) > 0) {
  72.         var d = res.detections[0];
  73.         print.log("[YOLO-" + 通道 + "] 点击 " + d.label + " 中心点(" + d.center[0] + "," + d.center[1] + ")");
  74.         auto.clickPoint(Math.round(d.center[0] * screen.getScreenWidth() / res.width),
  75.                         Math.round(d.center[1] * screen.getScreenHeight() / res.height));
  76.     }
  77. }

  78. function 旧模式一轮(b64) {
  79.     if (LOOK_FOR.length) {
  80.         var f = YOLO_post(LAN + "/api/find",
  81.             ("b64=" + encodeURIComponent(b64) + "&names=" + LOOK_FOR.join(",") + "&thr=" + FIND_THR).toString());
  82.         if (f && f.ok) {
  83.             for (var k = 0; k < (f.matches || []).length; k++) {
  84.                 var m = f.matches[k];
  85.                 if (m.found) {
  86.                     print.log("[YOLO 找图] 找到 " + m.name + " 置信度" + m.conf + ",点击");
  87.                     auto.clickPoint(m.center[0], m.center[1]);
  88.                 }
  89.             }
  90.             return;
  91.         }
  92.     }
  93.     var d = YOLO_post(LAN + "/api/detect", ("b64=" + encodeURIComponent(b64)).toString());
  94.     if (d && d.count !== undefined) { YOLO_处理(d, "局域网"); return; }
  95.     var r = YOLO_post(RELAY + "put_img", ("room=" + ROOM + "&b64=" + encodeURIComponent(b64)).toString());
  96.     if (!r || !r.ok) { print.log("[YOLO] 网络波动,本轮跳过"); return; }
  97.     for (var i = 0; i < 10; i++) {
  98.         var g = YOLO_get(RELAY + "get_result?room=" + ROOM + "&after=" + lastResult);
  99.         if (g && g.ok && g.id && g.id !== lastResult) {
  100.             lastResult = g.id;
  101.             if (g.id >= r.id) YOLO_处理(g.result || {}, "公网");
  102.             break;
  103.         }
  104.         java.lang.Thread.sleep(300);
  105.     }
  106. }

  107. setInterval(function () {
  108.     try {
  109.         if (动作序列.length) { 跑一步(); return; }
  110.         var shot = screen.screenShotFull();
  111.         if (!shot) { print.log("[YOLO 跳过] 截图失败"); return; }
  112.         旧模式一轮(shot.toBase64());
  113.     } catch (e) { print.log("[YOLO 异常] " + e); }
  114. }, 间隔毫秒);
复制代码









欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) Powered by Discuz! X3.2