本地电脑部署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]