B2B网络软件

标题: AIWROK软件本地搭建OCR找字服务器 [打印本页]

作者: YYPOST群发软件    时间: 1 小时前
标题: AIWROK软件本地搭建OCR找字服务器
AIWROK软件本地搭建OCR找字服务器
AIWROK软件本地搭建OCR找字服务器 B2B网络软件

  1. /**
  2. * 轻量OCR识别 - AIWROK端封装
  3. * 通过frp隧道连接本地电脑的RapidOCR服务
  4. * 服务器: http://154.201.80.51:9999 → frp → 本地电脑:9999
  5. *
  6. * 方法:
  7. *   ocrRecognize(region)         全量识别,返回words数组
  8. *   ocrFindText(text, region, mode)  查找文字,返回坐标
  9. *   ocrFindAndClick(text)         查找文字并点击
  10. *   ocrGetAllText(region)         返回全部文字拼接
  11. *   ocrTextExists(text)           检查文字是否存在
  12. *   ocrWaitAndClick(text, timeout) 等待文字出现并点击
  13. *   testOcrServer()               测试连接
  14. *
  15. * Rhino ES5 注意事项:
  16. *   1. 字符串拼接产生ConsString,传给Java方法前必须用""+强转
  17. *   2. 每次请求new okHttp(),不要共享实例(setHeader会累积)
  18. *   3. sleep用sleep.millisecond()不能用sleep(number)
  19. *   4. 时间用new Date().getTime()不用Date.now()
  20. *   5. 截图对象用img.toBase64()不用bitmap.compress()
  21. *   6. 区域截图用cutImagePercent(0~1百分比)不用screen.screenShot像素
  22. */

  23. var OCR_CONFIG = {
  24.     // 局域网直连(手机和电脑同一WiFi时用这个,不走frp隧道,快3-5倍)
  25.     SERVER_LOCAL: "http://192.128.10.103:9999",
  26.     // frp隧道(手机不在同一WiFi时用这个,经服务器中转)
  27.     SERVER_REMOTE: "http://165.201.20.51:9999",
  28.     // 当前使用的服务器,自动检测优先用局域网
  29.     SERVER: "http://192.168.10.103:9999",
  30.     timeout: 30000
  31. };

  32. /**
  33. * 截图转base64
  34. * @param {Array} region 可选 [x1,y1,x2,y2] 百分比0~100
  35. * @return {String} base64字符串
  36. */
  37. function ocrScreenshot(region) {
  38.     var img;
  39.     if (region && region.length >= 4) {
  40.         // region是百分比0~100,cutImagePercent用0~1
  41.         var x1 = region[0] / 100;
  42.         var y1 = region[1] / 100;
  43.         var x2 = region[2] / 100;
  44.         var y2 = region[3] / 100;
  45.         img = screen.screenShotFull().cutImagePercent(x1, y1, x2, y2);
  46.     } else {
  47.         img = screen.screenShotFull();
  48.     }
  49.     if (!img) {
  50.         throw new Error("截图失败");
  51.     }
  52.     // AIWROK Image对象自带toBase64(),返回Java字符串需用""+强转JS字符串
  53.     var b64 = "" + img.toBase64();
  54.     // 释放截图对象
  55.     try { img.recycle(); } catch(e) {}
  56.     return b64;
  57. }

  58. /**
  59. * 发送OCR请求
  60. * 用http.json()替代http.post(),直接传对象不手动JSON.stringify
  61. * 这样不会产生ConsString类型问题(已验证http.json()能跑通)
  62. * @param {String} apiPath 接口路径
  63. * @param {Object} params 请求参数
  64. * @return {Object|null} 解析后的JSON
  65. */
  66. function ocrRequest(apiPath, params) {
  67.     var http = new okHttp();
  68.     http.setHeader("Content-Type", "application/json");
  69.     try {
  70.         // http.json(url, object) 直接传对象,okHttp内部序列化
  71.         // 参考已验证能跑通的OCR测试_AIWROK端.js第260行
  72.         var resp = "" + http.json(OCR_CONFIG.SERVER + apiPath, params || {});
  73.         if (!resp || resp.length === 0) {
  74.             printl("[OCR] 返回空响应");
  75.             return null;
  76.         }
  77.         return JSON.parse(resp);
  78.     } catch (e) {
  79.         printl("[OCR] 请求失败: " + e);
  80.         return null;
  81.     }
  82. }

  83. /**
  84. * 全量OCR识别
  85. * @param {Array} region 可选 [x1,y1,x2,y2] 百分比
  86. * @return {Array} words数组 [{text,score,box}]
  87. */
  88. function ocrRecognize(region) {
  89.     var b64 = ocrScreenshot(region);
  90.     var params = { image: b64 };
  91.     if (region) params.region = region;

  92.     var resp = ocrRequest("/ocr", params);
  93.     if (!resp || resp.code != 0) {
  94.         printl("[OCR] 识别失败: " + (resp ? resp.error : "无响应"));
  95.         return [];
  96.     }
  97.     return resp.words || [];
  98. }

  99. /**
  100. * 查找文字
  101. * @param {String} text 要查找的文字
  102. * @param {Array} region 可选区域
  103. * @param {String} mode exact=精确匹配, include=包含匹配
  104. * @return {Array} 匹配结果 [{text,x,y,score,box}]
  105. */
  106. function ocrFindText(text, region, mode) {
  107.     var b64 = ocrScreenshot(region);
  108.     var params = {
  109.         image: b64,
  110.         text: text,
  111.         mode: mode || "include"
  112.     };
  113.     if (region) params.region = region;

  114.     var resp = ocrRequest("/ocr_find", params);
  115.     if (!resp || resp.code != 0) {
  116.         printl("[OCR] 查找失败: " + (resp ? resp.error : "无响应"));
  117.         return [];
  118.     }
  119.     return resp.found || [];
  120. }

  121. /**
  122. * 查找文字并点击
  123. * @param {String} text 要查找的文字
  124. * @param {Array} region 可选区域
  125. * @return {Boolean} 是否点击成功
  126. */
  127. function ocrFindAndClick(text, region) {
  128.     var found = ocrFindText(text, region, "include");
  129.     if (found.length > 0) {
  130.         var item = found[0];
  131.         var sw = screen.getScreenWidth();
  132.         var sh = screen.getScreenHeight();
  133.         var absX, absY;

  134.         if (region && region.length >= 4) {
  135.             var rx1 = Math.round(region[0] * sw / 100);
  136.             var ry1 = Math.round(region[1] * sh / 100);
  137.             absX = rx1 + item.x;
  138.             absY = ry1 + item.y;
  139.         } else {
  140.             absX = item.x;
  141.             absY = item.y;
  142.         }

  143.         // 随机偏移±5px拟人化
  144.         absX += Math.floor(Math.random() * 10) - 5;
  145.         absY += Math.floor(Math.random() * 10) - 5;

  146.         printl("[OCR] 找到'" + text + "' 坐标(" + absX + "," + absY + ") 点击");
  147.         auto.clickPoint(absX, absY);
  148.         return true;
  149.     }
  150.     return false;
  151. }

  152. /**
  153. * 获取全部文字
  154. * @param {Array} region 可选区域
  155. * @return {String} 全部文字拼接
  156. */
  157. function ocrGetAllText(region) {
  158.     var b64 = ocrScreenshot(region);
  159.     var params = { image: b64 };
  160.     if (region) params.region = region;

  161.     var resp = ocrRequest("/ocr_all", params);
  162.     if (!resp || resp.code != 0) {
  163.         return "";
  164.     }
  165.     return resp.all_text || "";
  166. }

  167. /**
  168. * 检查文字是否存在
  169. * @param {String} text 要检查的文字
  170. * @param {Array} region 可选区域
  171. * @return {Boolean}
  172. */
  173. function ocrTextExists(text, region) {
  174.     var found = ocrFindText(text, region, "include");
  175.     return found.length > 0;
  176. }

  177. /**
  178. * 等待文字出现并点击
  179. * @param {String} text 等待的文字
  180. * @param {Number} timeout 超时秒数
  181. * @param {Array} region 可选区域
  182. * @return {Boolean}
  183. */
  184. function ocrWaitAndClick(text, timeout, region) {
  185.     var maxTime = (timeout || 10) * 1000;
  186.     var startTime = new Date().getTime();

  187.     while (new Date().getTime() - startTime < maxTime) {
  188.         if (ocrFindAndClick(text, region)) {
  189.             return true;
  190.         }
  191.         sleep.millisecond(1000);
  192.     }
  193.     printl("[OCR] 等待'" + text + "'超时");
  194.     return false;
  195. }

  196. /**
  197. * 测试OCR服务连接
  198. * @return {Boolean}
  199. */
  200. function testOcrServer() {
  201.     try {
  202.         var http = new okHttp();
  203.         var resp = "" + http.get(OCR_CONFIG.SERVER + "/health");
  204.         var data = JSON.parse(resp);
  205.         if (data.code == 0) {
  206.             printl("[OCR] 服务连接正常!");
  207.             printl("[OCR] 引擎: " + data.engine);
  208.             printl("[OCR] 已加载: " + data.loaded);
  209.             return true;
  210.         }
  211.     } catch (e) {
  212.         printl("[OCR] 连接失败: " + e);
  213.         printl("[OCR] 请检查: 1.本地OCR服务是否启动 2.frp客户端是否启动");
  214.     }
  215.     return false;
  216. }

  217. // ===== 使用示例 =====
  218. function main() {
  219.     printl("===== 轻量OCR测试 =====");

  220.     // 测试连接
  221.     if (!testOcrServer()) {
  222.         return;
  223.     }

  224.     // 全量识别
  225.     printl("\n--- 全量识别 ---");
  226.     var words = ocrRecognize();
  227.     for (var i = 0; i < words.length; i++) {
  228.         printl("  [" + i + "] " + words[i].text + " (score=" + words[i].score + ")");
  229.     }

  230.     // 获取全部文字
  231.     printl("\n--- 全部文字 ---");
  232.     var allText = ocrGetAllText();
  233.     printl(allText);

  234.     // 查找文字
  235.     printl("\n--- 查找文字 ---");
  236.     var found = ocrFindText("设置");
  237.     if (found.length > 0) {
  238.         printl("找到'设置': " + found[0].x + "," + found[0].y);
  239.     } else {
  240.         printl("未找到'设置'");
  241.     }

  242.     printl("\n===== 测试完成 =====");
  243. }

  244. // 自动执行测试
  245. main();
复制代码







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