 | |  |  | 本地电脑部署YOLO找图服务器识别
YOLO-Server.exe 下载服务器中转
- // 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("[YOLO] == 找图演示脚本已启动 ==");
- // 带重试的 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[0] === "swipe") {
- auto.swip(540, 1500, 540, 500, 300, 0); // 从下往上滑=下一个视频
- print.log("[序列] 第" + (步骤 + 1) + "步: 下滑一个视频");
- 步骤++;
- return;
- }
- var shot = screen.screenShotFull();
- if (!shot) { print.log("[YOLO 跳过] 截图失败"); return; }
- var f = YOLO_post(LAN + "/api/find",
- ("b64=" + encodeURIComponent(shot.toBase64()) + "&names=" + st[1] + "&thr=" + FIND_THR).toString());
- if (!f || !f.ok) { print.log("[序列] 网络波动,下轮重试"); return; }
- var m = (f.matches || [])[0];
- if (m && m.found) {
- print.log("[序列] 第" + (步骤 + 1) + "步: 找到 " + m.name + " 置信度" + m.conf + " 中心点(" + m.center[0] + "," + m.center[1] + "),点击");
- auto.clickPoint(m.center[0], m.center[1]);
- 步骤++;
- } else {
- print.log("[序列] 第" + (步骤 + 1) + "步: 没找到 " + st[1] + ",下轮再找");
- }
- }
- // ---------- 旧模式:找到全点 / YOLO ----------
- function YOLO_处理(res, 通道) {
- if (!res) return;
- print.log("[YOLO-" + 通道 + "] 取回坐标: " + (res.count || 0) + " 个目标");
- if ((res.count || 0) > 0) {
- var d = res.detections[0];
- print.log("[YOLO-" + 通道 + "] 点击 " + d.label + " 中心点(" + d.center[0] + "," + d.center[1] + ")");
- auto.clickPoint(Math.round(d.center[0] * screen.getScreenWidth() / res.width),
- Math.round(d.center[1] * 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[k];
- if (m.found) {
- print.log("[YOLO 找图] 找到 " + m.name + " 置信度" + m.conf + ",点击");
- auto.clickPoint(m.center[0], m.center[1]);
- }
- }
- 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("[YOLO] 网络波动,本轮跳过"); 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("[YOLO 跳过] 截图失败"); return; }
- 旧模式一轮(shot.toBase64());
- } catch (e) { print.log("[YOLO 异常] " + e); }
- }, 间隔毫秒);
复制代码
| |  | |  |
|