B2BÍøÂçÈí¼þ

 ÕÒ»ØÃÜÂë
 Á¢¼´×¢²á ÉóºËÍøÕ¾ºÅ:QQ:896757558
ËÑË÷
²é¿´: 1|»Ø¸´: 0
´òÓ¡ ÉÏÒ»Ö÷Ìâ ÏÂÒ»Ö÷Ìâ

MQTTÔ¶³Ì±¾µØ¾ÖÓòÍøOCRÀý×Ó

[¸´ÖÆÁ´½Ó]

1169

Ö÷Ìâ

1174

Ìû×Ó

7953

»ý·Ö

abc

Rank: 9Rank: 9Rank: 9

»ý·Ö
7953
Ìø×ªµ½Ö¸¶¨Â¥²ã
Â¥Ö÷
MQTTÔ¶³Ì±¾µØ¾ÖÓòÍøOCRÀý×Ó
MQTTÔ¶³Ì±¾µØ¾ÖÓòÍøOCRÀý×Ó B2BÍøÂçÈí¼þ

MQTTÔ¶³Ì±¾µØ¾ÖÓòÍøOCRÀý×Ó B2BÍøÂçÈí¼þ

MQTTÔ¶³Ì±¾µØ¾ÖÓòÍøOCRÀý×Ó B2BÍøÂçÈí¼þ

  1. /**
  2. * ±¾µØ OCR ʶ±ðʾÀý£¨AIWROK ¶Ë£©
  3. * ==================================================================
  4. * ÓÃÄã×Ô¼ºµçÄÔÉ쵀 OCR_LAN_Server
  5. * ÊÖ»ú½ØÍ¼ ¡ú ·¢¸øµçÄÔʶ±ð ¡ú ÄûØÎÄ×ÖºÍ×ø±ê ¡ú ¿Éµã»÷¡£
  6. *
  7. * ·þÎñ¶Ë½Ó¿Ú£¨Ô´Âë OCR_LAN_Server/server/app.py£©
  8. *   GET  /health      ·þÎñÊÇ·ñÔÚÏß
  9. *   POST /ocr_all     È«ÆÁʶ±ð£¬·µ»Ø lines[{text,x,y,confidence}...]
  10. *   POST /ocr_find    ÕÒÎÄ×Ö£¬·µ»Ø {found,best:{center_x,center_y}}
  11. *   POST /ocr_smart   ÖÇÄÜ·ÓÉ£¨×Ô¶¯Ñ¡ÒýÇæ/·Ö¿é/»º´æ£©£¬¿É´ø text Ö±½ÓÕÒ×Ö
  12. *
  13. * Á½¸ö±ØÐëÖªµÀµÄ¿Ó£¨±¾Ê¾ÀýÒÑÕýÈ·´¦Àí£©
  14. *   1) region ÊÇ¡¾°Ù·Ö±È¡¿[x,y,w,h]£¬·þÎñ¶Ë crop_by_percent ²ÃÍê²»»¹Ô­×ø±ê£¬
  15. *      ·µ»ØµÄÎÄ×Ö×ø±êÊÇ"²Ã¼ôͼ"ÀïµÄ£¬±ØÐë¿Í»§¶Ë×Ô¼º¼Ó»ØÆ«ÒÆÁ¿£¬·ñÔòµãÆ«¡£
  16. *   2) Èç¹ûΪÁËÊ¡Á÷Á¿°Ñ½ØÍ¼ËõСÔÙÉÏ´«£¬·þÎñ¶Ë·µ»ØµÄÊÇ"ËõСͼ"µÄ×ø±ê£¬
  17. *      ±ØÐë°´±ÈÀý·Å´ó»ØÆÁÄ»×ø±ê¡£
  18. *
  19. * Ó÷¨£º¸ÄÏÂÃæ OCR_SERVER ΪÄãµçÄÔ¾ÖÓòÍø IP£¨ÊÖ»úºÍ·þÎñ¶Ëͬһ WiFi£©£¬
  20. *       ÔÚ AIWROK ÀïÖ±½ÓÔËÐб¾½Å±¾£¬¿´ÈÕÖ¾¡£
  21. * ==================================================================
  22. */

  23. // ==================== ÅäÖÃ ====================
  24. // µçÄÔµØÖ·ºòÑ¡±í£ºÖð¸öÊÔ /health£¬Ë­Í¨ÓÃË­¡£µçÄÔ IP ±äÁ˲»ÓøÄÂß¼­£¬
  25. // Ö»Òª°ÑµçÄÔµ±Ç°µÄ IPv4 ¼Ó½øÕâ¸ö±í¼´¿É£¨±¾»úʵ²â¾Í´Ó .103 ±ä³ÉÁË .104£©
  26. var OCR_SERVERS = [
  27.     "http://192.168.10.104:9999",
  28.     "http://192.168.10.103:9999"
  29. ];
  30. var OCR_SERVER = "";     // ÓÉ ocrPickServer() ×Ô¶¯Ñ¡¶¨£¬±ðÊÖ¸Ä
  31. var OCR_MAXW   = 960;    // ÉÏ´«Ç°°Ñ½ØÍ¼Ëõµ½¸Ã¿í¶È¡£·þÎñ¶Ë±¾À´¾Í»áËõµ½ 960£¬
  32.                          // Ìî 960 ²»¶ª¾«¶È»¹Ê¡Ô¼ 1/3 Á÷Á¿£»Ìî 0 = ²»Ëõ·Å
  33. var TIMEOUT_MS = 30000;  // µ¥´Îʶ±ð³¬Ê±
  34. // ==============================================

  35. // ---------- С¹¤¾ß ----------
  36. function L(s) { try { printl("[OCR] " + s); } catch (e) {} }
  37. function pad2(n) { return n < 10 ? "0" + n : "" + n; }

  38. var SCREEN_W = 1080, SCREEN_H = 1920;
  39. try { SCREEN_W = screen.getScreenWidth(); SCREEN_H = screen.getScreenHeight(); } catch (e) {}
  40. L("ÆÁÄ» = " + SCREEN_W + "x" + SCREEN_H);

  41. /** ÒÀ´Î̽²âºòÑ¡µØÖ·£¬Ñ¡¶¨¿ÉÓõÄÄǸö */
  42. function ocrPickServer() {
  43.     for (var i = 0; i < OCR_SERVERS.length; i++) {
  44.         var url = OCR_SERVERS[i];
  45.         try {
  46.             var http = new okHttp();
  47.             try { http.setTimeout(4000); } catch (e) {}
  48.             var r = JSON.parse("" + http.get(url + "/health"));
  49.             if (r.code == 0) {
  50.                 OCR_SERVER = url;
  51.                 L("Ñ¡¶¨·þÎñµØÖ· " + url + "£¨ºòÑ¡µÚ " + (i + 1) + " ¸ö£©¡ú ÔÚÏß¿ÉÓÃ");
  52.                 return true;
  53.             }
  54.             L(url + " ÓÐÏìÓ¦µ«Òì³££º" + ("" + JSON.stringify(r)).slice(0, 80));
  55.         } catch (e2) {
  56.             L("ºòÑ¡ " + url + " Á¬²»ÉÏ£º" + e2);
  57.         }
  58.     }
  59.     L("ËùÓкòÑ¡¶¼²»Í¨£¬ÅŲéËIJ½£º");
  60.     L("  1 µçÄÔ OCR ·þÎñ¿ªÁËÂð£ºOCR_LAN_Server\\dist\\OCR_LAN_Server\\OCR_LAN_Server.exe");
  61.     L("  2 µçÄÔÕæÊµ IP ÊǶàÉÙ£ºcmd Ö´ÐÐ ipconfig£¬¿´¡¸IPv4 µØÖ·¡¹£¬");
  62.     L("    ±ðÓà 192.168.163.x / 192.168.248.x£¨VMware ÐéÄâÍø¿¨£¬ÊÖ»úÁ¬²»µ½£©");
  63.     L("  3 ÊÖ»úºÍµçÄÔÊÇ·ñͬһ WiFi/Íø¶Î£¨ÊÖ»úÉèÖÃÀï¿´ WiFi µÄÍø¹Ø£©");
  64.     L("  4 °ÑµçÄÔµ±Ç°µØÖ·¼Ó½ø±¾½Å±¾¶¥²¿ OCR_SERVERS Áбí");
  65.     return false;
  66. }

  67. /**
  68. * ½ØÍ¼²¢£¨¿ÉÑ¡£©Ëõ·Å£¬·µ»Ø base64 ºÍ»»Ëã±ÈÀý
  69. * factor = ÉÏ´«Í¼¿í / ÆÁÄ»¿í£¬ºóÃæÒª°Ñ·þÎñ¶Ë×ø±ê³ýÒÔËü
  70. */
  71. function shotForOcr(maxW) {
  72.     // ×¢Ò⣺AIWROK µÄ screenShotFull() ·µ»ØËü×Ô¼ºµÄ Image ¶ÔÏó£¬Ö»ÓÐ
  73.     // cutImagePercent / toBase64 / getWidth / getHeight / recycle£¬
  74.     // ûÓÐ android Bitmap µÄ compress¡¢createBitmap ¡ª¡ª ±¾»úËõ·Å»áÖ±½Ó±¨
  75.     // "Can't find method android.graphics.Bitmap.createBitmap(...)"¡£
  76.     // ËùÒÔÒ»ÂÉԭͼÉÏ´«£¬Ëõ·Å½»¸ø·þÎñ¶Ë£¨ËüÄÚ²¿±¾À´¾Í»áËõµ½ 960£©£¬
  77.     // factor ºãΪ 1£¬×ø±êÎÞÐèÔÙ»»Ëã¡£
  78.     var bmp = screen.screenShotFull();
  79.     if (!bmp) throw new Error("½ØÍ¼·µ»Ø¿Õ");
  80.     var b64 = "" + bmp.toBase64();
  81.     var w0 = 0, h0 = 0;
  82.     try { w0 = bmp.getWidth(); h0 = bmp.getHeight(); } catch (e) {}
  83.     try { bmp.recycle(); } catch (e2) {}
  84.     var sentW = w0 || SCREEN_W, sentH = h0 || SCREEN_H;
  85.     L("½ØÍ¼ÉÏ´« " + sentW + "x" + sentH + " Ô¼ " + Math.round(b64.length / 1024) + "KB£¨Ô­Í¼£¬Ëõ·ÅÓÉ·þÎñ¶Ë×ö£©");
  86.     return { b64: b64, sentW: sentW, sentH: sentH, factor: 1 };
  87. }

  88. /** POST JSON£¬·µ»Ø½âÎöºóµÄ¶ÔÏó£»Òì³£·µ»Ø {code:-1,err:...} */
  89. function post(path, obj) {
  90.     try {
  91.         var http = new okHttp();
  92.         try { http.setTimeout(TIMEOUT_MS); } catch (e) {}
  93.         try { http.setHeader("Content-Type", "application/json"); } catch (e) {}
  94.         var t0 = (new Date()).getTime();
  95.         var resp = "" + http.json(OCR_SERVER + path, obj);
  96.         var ms = (new Date()).getTime() - t0;
  97.         var r;
  98.         try { r = JSON.parse(resp); }
  99.         catch (e) { L("·µ»Ø²»ÊÇ JSON£¨·þÎñû¿ª»òµØÖ·´í£©£º" + resp.slice(0, 120)); return { code: -1, err: "·ÇJSONÏìÓ¦" }; }
  100.         L(path + " Íù·µ " + ms + "ms£¬·þÎñ¶Ë " + (r.elapsed != null ? r.elapsed + "s" : "?") +
  101.           (r.strategy ? ("£¬²ßÂÔ=" + r.strategy) : "") + (r.count != null ? ("£¬½á¹ûÊý=" + r.count) : ""));
  102.         return r;
  103.     } catch (e2) {
  104.         L(path + " ÇëÇóʧ°Ü£º" + e2);
  105.         return { code: -1, err: "" + e2 };
  106.     }
  107. }

  108. /** ½¡¿µ¼ì²é£¨±£Áô¾ÉÃû×Ö£¬ÄÚ²¿×ß¶àºòѡ̽²â£© */
  109. function ocrHealth() {
  110.     if (OCR_SERVER) {
  111.         try {
  112.             var http = new okHttp();
  113.             try { http.setTimeout(5000); } catch (e) {}
  114.             var r = JSON.parse("" + http.get(OCR_SERVER + "/health"));
  115.             return r.code == 0;
  116.         } catch (e2) { return false; }
  117.     }
  118.     return ocrPickServer();
  119. }

  120. /**
  121. * °Ñ·þÎñ¶Ë·µ»ØµÄ×ø±ê»»Ëã³ÉÕæÊµÆÁÄ»×ø±ê
  122. * r    : ·þÎñ¶Ë·µ»Ø¶ÔÏó
  123. * shot : shotForOcr µÄ·µ»Ø£¨º¬ factor£©
  124. * reg  : [x,y,w,h] °Ù·Ö±È »ò null
  125. */
  126. function toScreen(r, shot, reg) {
  127.     var out = [];
  128.     var list = r.words || r.lines || [];
  129.     var offX = 0, offY = 0;
  130.     if (reg) {                                  // ²Ã¼ôÆ«ÒÆ£¨ÔÚÉÏ´«Í¼×ø±êϵÀ
  131.         offX = shot.sentW * reg[0] / 100;
  132.         offY = shot.sentH * reg[1] / 100;
  133.     }
  134.     for (var i = 0; i < list.length; i++) {
  135.         var w = list[i];
  136.         var cx = (w.center_x != null ? w.center_x : w.x);
  137.         var cy = (w.center_y != null ? w.center_y : w.y);
  138.         out.push({
  139.             text: w.text,
  140.             x: Math.round((cx + offX) / shot.factor),   // ¼Ó²Ã¼ôÆ«ÒÆ ¡ú ³ýËõ·Å±ÈÀý
  141.             y: Math.round((cy + offY) / shot.factor),
  142.             conf: w.confidence
  143.         });
  144.     }
  145.     return out;
  146. }

  147. /** ʶ±ðÈ«²¿ÎÄ×Ö£¬·µ»Ø [{text,x,y,conf}] */
  148. function ocrList(reg) {
  149.     var shot = shotForOcr(OCR_MAXW);
  150.     var req = { image: shot.b64 };
  151.     if (reg) req.region = reg;
  152.     var r = post("/ocr_smart", req);
  153.     if (r.code != 0) return [];
  154.     return toScreen(r, shot, reg);
  155. }

  156. /** ʶ±ð²¢Æ´³ÉÒ»¶ÎÎı¾ */
  157. function ocrText(reg) {
  158.     var list = ocrList(reg);
  159.     var s = [];
  160.     for (var i = 0; i < list.length; i++) s.push(list[i].text);
  161.     return s.join("  ");
  162. }

  163. /** ÕÒÎÄ×Ö£¬·µ»Ø {found,x,y,text} ²»µã»÷ */
  164. function ocrFind(text, reg, mode) {
  165.     var shot = shotForOcr(OCR_MAXW);
  166.     var req = { image: shot.b64, text: text, mode: mode || "include" };
  167.     if (reg) req.region = reg;
  168.     var r = post("/ocr_smart", req);
  169.     if (r.code != 0) return { found: false };
  170.     if (!r.found || !r.best) return { found: false, text: text };
  171.     var offX = reg ? shot.sentW * reg[0] / 100 : 0;
  172.     var offY = reg ? shot.sentH * reg[1] / 100 : 0;
  173.     return {
  174.         found: true, text: text, matches: r.count_matches || 1,
  175.         x: Math.round((r.best.center_x + offX) / shot.factor),
  176.         y: Math.round((r.best.center_y + offY) / shot.factor)
  177.     };
  178. }

  179. /** ÕÒ×Ö²¢µã»÷ */
  180. function ocrClick(text, reg, mode) {
  181.     var f = ocrFind(text, reg, mode);
  182.     if (!f.found) { L("ûÕÒµ½¡¸" + text + "¡¹"); return false; }
  183.     auto.clickPoint(f.x, f.y);
  184.     L("Òѵã»÷¡¸" + text + "¡¹(" + f.x + "," + f.y + ") ¹² " + f.matches + " ´¦");
  185.     return true;
  186. }

  187. /** ÅÐ¶ÏÆÁÄ»ÉÏÓÐûÓÐij¸ö×Ö */
  188. function ocrExists(text, reg) {
  189.     return ocrFind(text, reg).found === true;
  190. }

  191. /**
  192. * µÈij¸ö×Ö³öÏÖ²¢µã»÷£¬³¬Ê±·µ»Ø false
  193. * gapMs ĬÈÏ 3200 ºÁÃ룺·þÎñ¶Ë½á¹û»º´æ TTL ÊÇ 3 Ã룬¶øÇÒûÓÐ"µ¥´ÎÇëÇóÈÆ»º´æ"µÄ²ÎÊý¡£
  194. * ÂÖѯ±È 3 Ãë¿ìµÄ»°£¬Äõ½µÄÍùÍùÊÇÉÏÒ»Ö¡µÄ»º´æ½á¹û£¨ÈÕÖ¾Àï strategy=cache_hit£©£¬
  195. * »­ÃæÆäʵÒѾ­±äÁËÒ²¿ÉÄܱ»ÅгÉ"ûÕÒµ½"¡£Òª¸ü¿ìÏìÓ¦£¬¾ÍÈ¥·þÎñ¶Ë
  196. * ocr_config.json °Ñ cache_ttl µ÷С»ò enable_cache Éè false¡£
  197. */
  198. function ocrWaitClick(text, sec, reg, gapMs) {
  199.     var gap = gapMs || 3200;
  200.     var end = (new Date()).getTime() + (sec || 10) * 1000;
  201.     var tryN = 0;
  202.     L("¿ªÊ¼µÈ´ý¡¸" + text + "¡¹£¬Ã¿ " + gap + "ms ²éÒ»´Î£¨Òª¿ì¾Íµ÷С·þÎñ¶Ë cache_ttl£©");
  203.     while ((new Date()).getTime() < end) {
  204.         tryN++;
  205.         L("µÚ " + tryN + " ´Î²éÕÒ¡¸" + text + "¡¹¡­");
  206.         if (ocrClick(text, reg)) return true;
  207.         try { sleep.millisecond(gap); } catch (e) { java.lang.Thread.sleep(gap); }
  208.     }
  209.     L("µÈ " + sec + " ÃëÈÔδ³öÏÖ¡¸" + text + "¡¹£¬·ÅÆú");
  210.     return false;
  211. }

  212. // ==================================================================
  213. // ÑÝʾÖ÷Á÷³Ì£ºÃ¿Ò»²½¶¼´òÈÕÖ¾
  214. // ==================================================================
  215. function main() {
  216.     L("================ ±¾µØ OCR ʾÀý¿ªÊ¼ ================");
  217.     if (!ocrHealth()) { L("·þÎñ²»¿ÉÓã¬Ê¾Àý½áÊø"); return; }

  218.     // 1) È«ÆÁʶ±ð£¬ÁгöËùÓÐÎÄ×ÖºÍ×ø±ê
  219.     L("--- 1. È«ÆÁʶ±ð ---");
  220.     var all = ocrList(null);
  221.     L("¹² " + all.length + " ¸öÎÄ×ֿ飺");
  222.     for (var i = 0; i < all.length && i < 40; i++) {
  223.         L("  [" + (i + 1) + "] ¡¸" + all[i].text + "¡¹ ×ø±ê(" + all[i].x + "," + all[i].y + ") ÖÃÐÅ¶È " +
  224.           (all[i].conf != null ? all[i].conf.toFixed(2) : "?"));
  225.     }
  226.     if (all.length > 40) L("  ¡­ÆäÓà " + (all.length - 40) + " ÌõÊ¡ÂÔ");

  227.     // 2) ֻʶ±ðÉϰëÆÁ£¨ÇøÓòÓðٷֱȣ©
  228.     L("--- 2. ÇøÓòʶ±ð£¨ÉϰëÆÁ 0,0,100,50£© ---");
  229.     var top = ocrList([0, 0, 100, 50]);
  230.     L("ÉϰëÆÁ " + top.length + " ¸öÎÄ×ֿ飺" + (top.length ? ("¡¸" + top[0].text + "¡¹(" + top[0].x + "," + top[0].y + ") ¿ªÍ·¡­") : "ÎÞ"));

  231.     // 3) Æ´³ÉÕû¶ÎÎı¾
  232.     L("--- 3. ÕûÆÁÎı¾ ---");
  233.     L(ocrText(null).slice(0, 300));

  234.     // 4) ÕÒ×Ö£¨²»µã£©
  235.     L("--- 4. ÕÒ×Ö²âÊÔ ---");
  236.     var probe = all.length ? all[0].text : "ÉèÖÃ";
  237.     var f = ocrFind(probe, null);
  238.     L(f.found ? ("ÕÒµ½¡¸" + probe + "¡¹ÔÚ (" + f.x + "," + f.y + ")£¬¹² " + f.matches + " ´¦")
  239.               : ("ûÕÒµ½¡¸" + probe + "¡¹"));

  240.     // 5) ÕÒ×Ö²¢µã»÷£¨Ê¾ÀýÓÃµÚ 4 ²½ÕÒµ½µÄ´Ê£¬»»³ÉÄã×Ô¼ºµÄ¹Ø¼ü´Ê£©
  241.     L("--- 5. ÕÒ×Ö²¢µã»÷ ---");
  242.     if (f.found) {
  243.         L("ÑÝʾµã»÷£º" + probe);
  244.         ocrClick(probe, null);
  245.     } else {
  246.         L("ûÕÒµ½¿ÉµãµÄ´Ê£¬Ìø¹ýµã»÷");
  247.     }

  248.     // 6) µÈij¸ö×Ö³öÏÖÔٵ㣨°Ñ"µãÔÞ"»»³ÉÄãµÄÄ¿±ê´Ê£©
  249.     L("--- 6. µÈ´ý²¢µã»÷£¨10 Ã볬ʱ£© ---");
  250.     var waitWord = "µãÔÞ";
  251.     L("ÑÝʾµÈ´ý¡¸" + waitWord + "¡¹³öÏÖ£¨Ã»ÓÐÊôÕý³££¬³¬Ê±¼´Í˳ö£©");
  252.     ocrWaitClick(waitWord, 10, null);

  253.     L("================ ʾÀý½áÊø ================");
  254.     L("³£Óú¯Êý£ºocrHealth() ocrList(ÇøÓò) ocrText(ÇøÓò) ocrFind(´Ê,ÇøÓò) ocrClick(´Ê,ÇøÓò) ocrExists(´Ê) ocrWaitClick(´Ê,Ãë,ÇøÓò)");
  255.     L("ÇøÓòÒ»ÂÉÓÃ°Ù·Ö±È [x,y,w,h]£¬Àý£º[0,60,100,40] = ϰëÆÁ");
  256. }

  257. main();
¸´ÖÆ´úÂë




»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

±¾°æ»ý·Ö¹æÔò

¹Ø±Õ

QQ|»ÓªÏúÈí¼þ×ÛºÏÌÖÂÛ|»ÓªÏúÈí¼þÓÐÎʱشð|»ÓªÏúÈí¼þ½Ì³Ì×¨Çø|»ÓªÏúÈí¼þPOST½Å±¾·ÖÏí|»ÓªÏúÈí¼þÆÕͨ½Å±¾·ÖÏí|»ÓªÏúÈí¼þÈí¼þ×ÊѶ|»ÓªÏúÈí¼þ¾«Æ·Èí¼þ|»ÓªÏúÈí¼þ¸üй«¸æ|ÓªÏúÈí¼þ|B2BÈí¼þ|B2BÍøÂçÈí¼þ ( ¾©ICP±¸09078825ºÅ )±¾ÍøÕ¾¿ª·¢µÄÓªÏúÈí¼þÊÇÒ»¿îеÄÍøÂçÓªÏúÈí¼þ£¬Õâ¿îÓªÏú¿ÉÒÔÈ¥ÍøÕ¾Èí¼þ£¬²©¿ÍÈí¼þ£¬B2BÈí¼þ£¬·ÖÀàÐÅÏ¢Íø·¢Ìù£¬¿ÉÒÔÇÀɳ·¢£¬¿ÉÒÔµ½°Ù¶ÈÎÄ¿âÉÏ´«WORDÎĵµ£¬¿ÉÒÔµ½Ò»Ð©ÊÇÏà²áÍøÕ¾×Ô¶¯ÉÏ´«Í¼Æ¬£¬Õâ¸ö×Ô¶¯·¢ÌûÈí¼þ×Ô´øÔÆÖ©Ö룬¼Ó¿ìÊÕ¼£¬ÓÐ6ÖÖ¶Ô½Ó´òÂë½Ó¿Ú£¬·½±ã£¬Ð§Âʸߣ¬Ëٶȿ죬¶øÇÒ¶ÔÍ϶¯µÄÑéÖ¤ÂëÈ«ÍøµÚÒ»¼Ò¶À¼ÒÖ§³Ö£¬È«²¿Ô­´´¼¼Êõ£¬¶À¼ÒÑз¢£¬Õý°æÔ­´´´ø°æÈ¨Èí¼þ¡£Ñ¡ÔñÍòÄÜÓªÏúÈí¼þ£¬¾ÍÑ¡ÔñÁËÒ»ÖÖ׬ǮµÄЧÂÊ£¬´ÓûÓб»³¬Ô½¹ý£¬Ò»Ö±ÔÚŬÁ¦Ñз¢Ð¼¼Êõ¡£·Å·ÉÃÎÏ룬½â·ÅË«ÊÖ£¬À´µã´´Ò⣬³É¾ÍÄãµÄÃÎÏ룬¾ÍÔÚÍòÄÜÓªÏúÈí¼þ¿ªÊ¼

map2

GMT+8, 2026-9-4 07:36 , Processed in 0.137661 second(s), 33 queries .

¿ìËٻظ´ ·µ»Ø¶¥²¿ ·µ»ØÁбí