YYPOST群发软件 发表于 5 天前

本地电脑部署YOLO找图服务器识别

本地电脑部署YOLO找图服务器识别









https://www.yuque.com/aiwork/nba2pr/cqznidyq69qlitmu


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

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

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

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

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

// 带重试的 GET
function YOLO_get(url) {
    for (var t = 0; t < 2; t++) {
      try {
            var s = http.get(url.toString());
            if (s && ("" + s).charAt(0) === "{") return JSON.parse(s);
      } catch (e) {}
      java.lang.Thread.sleep(500);
    }
    return null;
}

// ---------- 序列模式:一步一动作 ----------
function 跑一步() {
    var st = 动作序列[步骤 % 动作序列.length];
    if (st === "swipe") {
      auto.swip(540, 1500, 540, 500, 300, 0);   // 从下往上滑=下一个视频
      print.log("[序列] 第" + (步骤 + 1) + "步: 下滑一个视频");
      步骤++;
      return;
    }
    var shot = screen.screenShotFull();
    if (!shot) { print.log(" 截图失败"); return; }
    var f = YOLO_post(LAN + "/api/find",
      ("b64=" + encodeURIComponent(shot.toBase64()) + "&names=" + st + "&thr=" + FIND_THR).toString());
    if (!f || !f.ok) { print.log("[序列] 网络波动,下轮重试"); return; }
    var m = (f.matches || []);
    if (m && m.found) {
      print.log("[序列] 第" + (步骤 + 1) + "步: 找到 " + m.name + " 置信度" + m.conf + " 中心点(" + m.center + "," + m.center + "),点击");
      auto.clickPoint(m.center, m.center);
      步骤++;
    } else {
      print.log("[序列] 第" + (步骤 + 1) + "步: 没找到 " + st + ",下轮再找");
    }
}

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

function 旧模式一轮(b64) {
    if (LOOK_FOR.length) {
      var f = YOLO_post(LAN + "/api/find",
            ("b64=" + encodeURIComponent(b64) + "&names=" + LOOK_FOR.join(",") + "&thr=" + FIND_THR).toString());
      if (f && f.ok) {
            for (var k = 0; k < (f.matches || []).length; k++) {
                var m = f.matches;
                if (m.found) {
                  print.log(" 找到 " + m.name + " 置信度" + m.conf + ",点击");
                  auto.clickPoint(m.center, m.center);
                }
            }
            return;
      }
    }
    var d = YOLO_post(LAN + "/api/detect", ("b64=" + encodeURIComponent(b64)).toString());
    if (d && d.count !== undefined) { YOLO_处理(d, "局域网"); return; }
    var r = YOLO_post(RELAY + "put_img", ("room=" + ROOM + "&b64=" + encodeURIComponent(b64)).toString());
    if (!r || !r.ok) { print.log(" 网络波动,本轮跳过"); return; }
    for (var i = 0; i < 10; i++) {
      var g = YOLO_get(RELAY + "get_result?room=" + ROOM + "&after=" + lastResult);
      if (g && g.ok && g.id && g.id !== lastResult) {
            lastResult = g.id;
            if (g.id >= r.id) YOLO_处理(g.result || {}, "公网");
            break;
      }
      java.lang.Thread.sleep(300);
    }
}

setInterval(function () {
    try {
      if (动作序列.length) { 跑一步(); return; }
      var shot = screen.screenShotFull();
      if (!shot) { print.log(" 截图失败"); return; }
      旧模式一轮(shot.toBase64());
    } catch (e) { print.log(" " + e); }
}, 间隔毫秒);




页: [1]
查看完整版本: 本地电脑部署YOLO找图服务器识别