From f9bf443a3b9b8decb16c7d43d45b6bef8786ac90 Mon Sep 17 00:00:00 2001 From: 1xygyty1 <2316900249@qq.com> Date: Thu, 10 Jul 2025 09:31:37 +0800 Subject: [PATCH] =?UTF-8?q?js:=20=E8=AF=86=E5=88=AB=E9=98=9F=E4=BC=8D?= =?UTF-8?q?=E8=A7=92=E8=89=B2=20(#1149)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload 更新了读取五位数的原石和4位数的纠缠 * Add files via upload 减少了空间占用 * Add files via upload * Delete repo/js/OCR读取当前原石以及纠缠之缘记录并发送通知 directory * Add files via upload * Add files via upload * Delete 识别队伍角色 directory * Delete repo/js/识别队伍角色 directory * Add files via upload * Delete repo/js/识别队伍角色/main.js * Delete repo/js/识别队伍角色 directory * Add files via upload * Add files via upload * Add files via upload --- repo/js/OCR读取主界面队伍/Character_log.txt | 1 + .../OCR读取主界面队伍/assets/paimon_menu.png | Bin 0 -> 2372 bytes .../assets/wanderer_icon.png | Bin 0 -> 2513 bytes .../assets/wanderer_icon_no_active.png | Bin 0 -> 2264 bytes repo/js/OCR读取主界面队伍/assets/yin.png | Bin 0 -> 1813 bytes repo/js/OCR读取主界面队伍/assets/yin2.png | Bin 0 -> 2857 bytes repo/js/OCR读取主界面队伍/main.js | 246 ++++++++++++++++++ repo/js/OCR读取主界面队伍/manifest.json | 12 + .../Resources_log.txt | 1 + repo/js/OCR读取当前抽卡资源并发送通知/main.js | 4 +- .../manifest.json | 2 +- 11 files changed, 263 insertions(+), 3 deletions(-) create mode 100644 repo/js/OCR读取主界面队伍/Character_log.txt create mode 100644 repo/js/OCR读取主界面队伍/assets/paimon_menu.png create mode 100644 repo/js/OCR读取主界面队伍/assets/wanderer_icon.png create mode 100644 repo/js/OCR读取主界面队伍/assets/wanderer_icon_no_active.png create mode 100644 repo/js/OCR读取主界面队伍/assets/yin.png create mode 100644 repo/js/OCR读取主界面队伍/assets/yin2.png create mode 100644 repo/js/OCR读取主界面队伍/main.js create mode 100644 repo/js/OCR读取主界面队伍/manifest.json diff --git a/repo/js/OCR读取主界面队伍/Character_log.txt b/repo/js/OCR读取主界面队伍/Character_log.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/repo/js/OCR读取主界面队伍/Character_log.txt @@ -0,0 +1 @@ + diff --git a/repo/js/OCR读取主界面队伍/assets/paimon_menu.png b/repo/js/OCR读取主界面队伍/assets/paimon_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c424325b17a4956f7802352e7609bfcff2721afa GIT binary patch literal 2372 zcmV-K3A^@*P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2-!(QK~z{rt(SRF zR96@7{OrIrs3OB6ST- zP@DTTKA&cd-_x`4ifbQ;v^!UEWYd=r=ft5o>jaWdZ$#*F1Dp=`Lw#i>UdiRG$$NWQ zlS!qJbxWbLunJ)v#?D#+4Ko*L&U1#Kww~+hpIblw8}X6L@I3V>qTOd=&jwpmmE@tP zN6PlU71k%NS0-b{sVwYPN+w3?*E%@$g9jWc1ShNWOUqVas)}Z=D&g zor^(ddmGo&$7^Bli&I(H`jA5yHPeBFc|eOy)65lLn65z7v3Rt#cd}#T%%3oS_UaWY zP8XsoYg`}%_!_r5rlgw?!gfco5(B+3n1mL!af6==BzpXu8{&uT3qW6mS~El zkk8E=nsSFID@2ckOt;?zeTP8kFWU_L<(r{v?++`_P}J1FJ zrGzD=Wn-M71IC)Hz~luUn6cEC1O>prF&HzQw!v`aH!xiFElga#ftK|K6j!LeQ~fcd zu+pkpT)duyod@HvcufdKo4P~8+8;*FJ6JPb9Y(ejI`+W`*mDLlI_jSS1!4JxCG0UD zjGX)uI0x;=R2zR7yM)5TEgZ8vA~DL$8>v}OxltdFg0S1arJ|~;ihCNEj?QkRP&zVj z41%F+IE+Xf^I2P(TeuM)kAkquN&(Ks|A_jR&0Ndi6qZ$E%2INE=P)evj^tWD4GO}l zs|660<>Kz0L`bDQTlvJ_ zd*fhAC$o!g1)mB9VKP}S5-webP*{r6(tI2{eg@gOg$bAczCL=vv$<53XC zkeQu}q9VFy$(tdpeg^M=ojCvFHMF#d*ud8xObT(KlbXT*a1qj;9&~keb5F|ifiUJp zNhv9icK(5G$#b-d>yYrnMFa##prLW#L-Bw@#s88sxTm*NR@Wfn@W}xeH4txvNhA_- zcq#jW+`Iw^Y1d>OFVNK}fV`&#XU@hWEkpUF{2C@MnmesS7C)bBQI0pl_)qhZ`REaH zbDpBOT!@R8ZXho^3q6ur^t9F?BQ1rEbE?8D^!SPMuy^t0T9ku#bS|6c^{Bu}MgWpb_a$GGT7-OE0cORWTp;=~E8}W|#CW zR${z~Eqp`wL7jee<~rcixt~x{E}+8X!^F>HL`^VR!V1gg=di+jLJq*rB>)Q@{g7Lj zN99xl$_gIiNnRc|O*L9+cNVVl#e~`R*dBe9y@5R87vNS>8Xjb1<5}5<`I$FqjvfA{ zJ{#fD2dJ13WAB0QFoW(@F(=Q`N}ACvu7 z94CBkV1wTuWpOIxN6it998EI_F8V*b>3*K`Kbcg3(3`{ZXAAT4bR7q)3 zi8tS63pzXdYS4k;sTtc~=+|VZ=M}SYR<;_3-Qba3-?kI z@t^~J`z(Eg++aT0lFm2#AOF&x$eXiTPDp7 z;rzyS?wDrzH8d>N!Q5>Jw(UO$fv{#+$=c8<2qR6M$*06z3(!p0ZLKAKm_<8f>KcaW zD?;EHxOd1!^DJDqu(_;R)XLV2!$I8I4&R6q7;oW)^}CL8txPKF!PbNS!W0rV$88s8 zyGKB6kw0#xq;n$%hBwJN2#F7dP7#9<6del#`#`8ISPy>D+c2;{HUVl@8(`$M2PW>3 z7-Q~*9Wn7r`7O`VI~H~U2hk!@J|r+OaV_~#E-csV!lVV>RK9J;^`s2e1q2j4nK*SX zGZ)dZKfxvV0K9gdz}34C(5Yl$!kg!F3Wgp>VC)%%!qQ5vd2ljv^5GwL7@MQMN9={` zxc~SmS}1mjByBi&DgoNon-Ca%l1BE@0_1GH$rL%t!bsPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D31&$|K~zXfg_db_ zROK0fZ(9gtA*=~okn9^F>yTt-GMP2WteH$!vXYQ}B@jTV3dmv;EK)2kK@iYNQCR{A zT2?(&QM4$v*5gW5)MM3CD|978H&UcshdEfW@?!7ag(&tv;qe#X5Z7%xC za#&odWqG}oCs)_gR;XiO`2u!5v61~xKE&z0kD%N!X&kB1(`j<5=_}UKSE9v`7KLR_ z9Gb)kYFv7bzp#t7OIumhQp(m94Jb>yD*4^=X4W(nQlU*{%d%?L_EeCbp1{bFBM9&x zP3X8WObGBJJw60Y{B)EfI|u0Xn24SfB>`dR5>wc|x|5Gzdxq!#FhFyeneeHT2=*Vv zsL&B)C554+hQ~0`e;OnFVi*~i$}dMoF>y>7J#H(92Uqdl!A+b!@Ce)c`=~22keU{b z;uoBT-*^pvA!dTY+yqRvFlwxd3BMRm$cPDKhexxb&d$-zEBWrtJ$!z87fM8=of+Xy zrrzNqG|b8PX@!gv0w+1}50(U@Gf_r{6EZdmeS(TEcQMN5UKfw`IN8+gWKGcRWvIV~p|w>gf84m5eS-rW+V&s^9$Ch->lZP!=`IdGb{8)`{%ekGxtn8~ zmvKVI<6G|G_||(-0{ycI3dmqgU^)}VWioA2CQ(zfNQqRFGh2@>%gkJpmG^3*|Yu7#UK?h!8h^XZne5>I5qOIL zVU(Z*PjT`yQ@x|z$N!4nb2~wD?3I<^(0qPoicLg^;JTIQ<~T;iF;g5OSqTcwlQ{)M z%R<~DFqWV(2?PbtCU9)(O@dPh44O?qP$K>TvH1H(p^OiXWL!`VWX_ygxxW}C&(ej( z+<`i)8t<{$+=a>1;Y(zc>jv+!xm%Jp5FcYD*Vu((F?afcwdy+b`erPaZl7c@dWBB( z#!la{Ns`4z<)PLz-j=%2@*|4Kc~PH+$> z)kJE?WRQ!3SGtW>GoSS25{#y9c@%Bv4V|PUxrv@3FRVp^&0b00icv7!LZ@vaHPL}l zR!f)DD)Z_jJ*9+jc~-ZiR-a_by@^rRD%o2|jxQibD*7skl#xWE2 zl2PW7A`@4us?h7&G30ij5-ECmmb?)X?8V|mB%dgfS)}w>E15|}l0+8DD)^Wt5_iGmv#hD)!8B3Nk!Y zXXWwm{5ll-taQq9OR2H8QDtePI`H92ZJ1+p=)>no)e_7pPVUVsU~@waN|jne zqp5^Wdj~BAZ9e9u+o+7w`SD~$Pg;^lkd`}g3&IXHha_%_!*y2+LIPjUIoQyg2{9@@d>|ZP?q|`7>OXd0ag+B*ELbd`zB;NdMZsf#+J_jC!XY|zaQq6NAIJdv>fHyyGLb(c5>y!R>>?adD{}cKOvP)JTu-GaE{+xWlHidQmU;FX}5*0aH7VrgayO_?fc=44Qwn8^D6wcNL;TPmGD$?4xN;h{PQ zD|55xo)ypH^kmwy(pXqm!{VMEdKw$)>FuSZs)|)hp?n5NF_Y+(E0?J&A36H^mQ>(?T&Y>_{ zLy=ZTL24qI=^hfS2S{)oAkpzG@%Cqk&^~~&u%?1}g@srpyH8N7u_ni$()5y8u$u(S zGsNfbBrfkMqI4UHG7qBkHO!+>mf9xm=u=JPB_)!P*+!ymFL9Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2yID3K~zXfg_e1A zRMj2FAIhE(^+178FbM%d2-%ZKW|G<7%w%RVlbK`^l8}VNkYzGS90IZE!KE(5qopn_ z2z4O{Dk*4@_JAG*5e1=$R9xEAYQ?thdU}qnBq52XpZ?w>QUCLg&v|#={oL>U-8*kn zwsZ!$z0tvKO-{N)CZd6SHn)|s^F zNNON=a-E();E?iefl(}O`SqqTntG`3y9SFQ1)-T ziF+fJ_zl^#IrDk;{vP`Kx~Qx1kev8at`T{%qM&s8t*l(IjF@SQxH>i&XJ!`LZ;tTJ zi~XE={!w=HMe!78qs*Tf&(tZ4nLHz1XVMjmNSd3(`cNqcx8BA(2Y=1mhj*Y%ot4AX zYfQ|T=O!k;lxbJzGd(7Sg)`=oHaCIN%uMcD8$eO!giz*GGD)XO2r+4P1(V`RnKZ-3 z6<6jmb@FVKCaaaz78^mM9e19JIm3x5-AVd#7pch}Qj)w}9j~GsxT~52cM5%tJbilu zdvC1diQXWOYzXr3x&Yg|{cLIRqnzA(H?QsOZ?n&;!kh!MUQ=Z`b-`v=4d%2n|}G~(jR1?^Zy-25Nnmw+-!oMT2KZmx~Ec@F7t z3%+qQ@p7sXJ3W!_n7NqPm}SJqE+=MI+V{kyYTJ`YTucISGZREkkjw2_W=>rsB4vO2`gW0?mw_l~hQC#w)$k>Q#@4zLUPUrPFoLxBNye6tn!O@N4l#`a?wOGt8I2qORSl#U5eM^UW!_tl_f?cMv%Q1IF8Tl)NGO!D!L7c%(gBoWC z4Xy}5LybI=eYjE`SQ2uvr+ZNvECE_QVOrb~nnl)*wQ@IxmfNXFu@YEfqI89b&9(rY z-Y^|9eYo^`+8k?HlWr#@t8G|e=Z^APybFs_uFG|CL&Z9}1M6vbw$QNLNY$Jq>K3fv zH<1YYZ`p)5-YAI~@_O^s5;eJq=9##sJiwv8O}ziY(~Nxe7B6nyf-P1aDL31VY+qZ& zA2x5`&xiML@x530_KUX|`}{oLe*PvW9)6HVT3S%ve`O#4{@YP5ef&D3(mC?!Ifg$t z#ijRN)A{oJQ3l^RjKY`i!Y6Mr`meJLUpVz0m;Nrie~OV0&+zpd2T{g8J-x!&3x8xpOVp$buQUAi5r$scDdJ~R&&Pif@hqbsiX>^e_`w;O`Xqy|4lsP=(Q#2v zyey7t;)TxQ7mq&9ur7Xlj!~_? ze`uU#f;$tYQg9# z$NL#NCiO_?pri~Q-_51h1{gXuz<-bL;mboicz5@`C__@y@GDQq)cYAbdw{W%1AO-E zR?cnR#P50%#K-Xj+^^Yi=(H?rs{3il|IULD^X0CoEG%Jy!1MZlf4Hs1Dgx|-#-u-R$Rre4?7z@4oX zys*8OeRs7JQM0KiE+E|2MoWDIZPzu^w7OPqSF4#@8$3MJvx=@&KI#KL!r=(3-EM+; zIr7O^NJXIm<;K1~8mp>sEL}`pWhIfWs5~uHU8*cH=|^{3f-EK&BxJW!ZnomjGvLk0 zpe)}&d4aUEGcaY?Sm}BQrOxZcZ7|4Vq?kaViGZ<)U||8ytW0^&)RX4iO={V5DB+qK zTzPr;3yr#1VKU;%NGH#X4^)(x{d6TU-5s1jRb`U7{F!#0000AE{+^oG@Zr0sfZq|eWKtKcp5CMZCqF_Lc62}G7O$#9^ zVoVBE3ks-U01yC3fS>??sv?p?B!d`(#ucK%PE61Q7{JE}03ZNr5d`rvpo)l~S_KhQ zEBJNO2uIctmv%xl1l8Rb00BV2OM?l(WDt`=P(*>a3^qhDq*_-J?YS4C35W_9R7oH{ zcscO%pfUJ)KmY(m6*Md&nHB(S|5n(s9wR0|f;zBes18G1hPVLH1o-s;CR2SExWK^a8LA`Bv^T2w(*Q7hOuL^TGhpaKdS zhxjcE5U-A~e>GIAsD_xh&OfmIQ#tRRFA75~_f$Ks17vsV6KI5Ve@n*88D43|<;*V-ldm z<6E(|0w`zXYC}|G;=%;+cpn&pB51h};s|!HL&o~>f;7c}ZJ1O(OJ(~yjH#d^ zs45^trE#j`qhJJ$N@zHQ9UZ_9Y$rAujBgmM!GapcMtmhLCY$vLg!OLJGLsTwP8g0NVeBCRF zN@JKzJz6b*@dyVtBEFAT--=d8(8296F^t+6YXTxs@B-+&4U=x3f<_fm?F)#;c7s}~ z+aJJhY)3>Os=!Den#vH{7|FE~RR$=Ij}g@6Fj0`jwzd&8Ou>%qq`c!!#&-4+*DnMq zV#6}nh$ysJgs?P9b#N<{U;)ETFTj-ctR*{h9+mC)679K{%JxU_at#CxtpHFh6MI=I z6a9$sDEB==HLQ~EJd|mNyaZDiSxeB+Lg|s;P%RcIX%nfIsRWH}fIw`imJ3u%qr}BQ zf^5v-Xd|{~B@J_0F!eocjNbZV#)@r>jb-TWnMP%-gjd&qj`vd?-a~n84_>Mcs}a4M zMhUAO*x1Lfj$tb6H<4{v$+TlXNV=heiP14qtvv)@mD1)rsSNMHPiKh2n7(ZTcqyNb z&OYMG1l6iy8s?o&!<-W_ag|KnRKkXXX+Pjl3XfbuG(JeF5HqxEoNCG9`9A4v8sC(t z6pDDhV5p9RjR=Q!6IX``qOAX2&*Z)bOteos60y5dKgRq z8WZGN$WJ?f)+1j}$00AK3TG- z5RMNbUVz`&h7Bu#Vxy33Qx}94#PiXK9Tdh37^|RSs73`Om4hU1v#sYG!MHbfPy zTI#!&5*BYE71hw$@_XjsBli%7NwNoDbJ8B+OfL_AWN7NmYL z3sF_HI*u(5VB;zn4-uihdmdhPG5uRsQ`b_DDU}P8o-{}_s! zuO`(z7n7<-P@?f&R4XCGB~%*mY(S+jPSCWBUHURM^tND%BRj};Eyh+xsSa-=)w&35 zh@w<_?;`*C5u%$W;XsBlvj00000NkvXXu0mjf D`!fsN literal 0 HcmV?d00001 diff --git a/repo/js/OCR读取主界面队伍/assets/yin2.png b/repo/js/OCR读取主界面队伍/assets/yin2.png new file mode 100644 index 0000000000000000000000000000000000000000..a37b591a89e5af1498d0fee84148d49e2e484fca GIT binary patch literal 2857 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 C9L7cf literal 0 HcmV?d00001 diff --git a/repo/js/OCR读取主界面队伍/main.js b/repo/js/OCR读取主界面队伍/main.js new file mode 100644 index 00000000..7ae7ff55 --- /dev/null +++ b/repo/js/OCR读取主界面队伍/main.js @@ -0,0 +1,246 @@ +// ===== 配置与工具函数 ===== +// 字符替换映射表:修正OCR识别的常见错误字符 +const replacementMap = { + "监": "盐", + "姐": "妲", + "干": "千", + "卵": "卯", + "凌": "绫", + "疑": "凝", + "沙": "砂", + "谣": "瑶", + "萤": "荧", + "霄": "宵" +}; + +// 原神角色列表:用于OCR识别后的字符匹配 +const genshinImpactCharacters = [ + "荧", "空", "神里绫华", "琴", "丽莎", "芭芭拉", "凯亚", "迪卢克", "雷泽", "安柏", "温迪", "香菱", + "北斗", "行秋", "魈", "凝光", "可莉", "钟离", "菲谢尔", "班尼特", "达达利亚", "诺艾尔", "七七", + "重云", "甘雨", "阿贝多", "迪奥娜", "莫娜", "刻晴", "砂糖", "辛焱", "罗莎莉亚", "胡桃", "枫原万叶", + "烟绯", "宵宫", "托马", "优菈", "雷电将军", "早柚", "珊瑚宫心海", "五郎", "九条裟罗", "荒泷一斗", + "八重神子", "鹿野院平藏", "夜兰", "绮良良", "埃洛伊", "申鹤", "云堇", "久岐忍", "神里绫人", "柯莱", + "多莉", "提纳里", "妮露", "赛诺", "坎蒂丝", "纳西妲", "莱依拉", "流浪者", "珐露珊", "瑶瑶", + "艾尔海森", "迪希雅", "米卡", "卡维", "白术", "琳妮特", "林尼", "菲米尼", "莱欧斯利", "那维莱特", + "夏洛蒂", "芙宁娜", "夏沃蕾", "娜维娅", "嘉明", "闲云", "千织", "希格雯", "阿蕾奇诺", "赛索斯", + "克洛琳德", "艾梅莉埃", "卡齐娜", "基尼奇", "玛拉妮", "希诺宁", "恰斯卡", "欧洛伦", "玛薇卡", + "茜特菈莉", "蓝砚", "梦见月瑞希", "伊安珊", "瓦雷莎", "爱可菲", "伊法", "丝柯克", "塔利雅" +]; + +// 预加载所有模板图像:避免循环中重复读取文件,提升性能 +const templates = { + wanderer: file.ReadImageMatSync("assets/wanderer_icon.png"), // 流浪者图标(活跃状态) + wandererInactive: file.ReadImageMatSync("assets/wanderer_icon_no_active.png"), // 流浪者图标(非活跃状态) + yin: file.ReadImageMatSync("assets/yin.png"), // 荧的图标模板1 + yin2: file.ReadImageMatSync("assets/yin2.png"), // 荧的图标模板2 +}; + +// 创建模板匹配对象的工具函数:统一参数格式,减少重复代码 +function createTemplateMatch(templateKey, x, y, width, height) { + return RecognitionObject.TemplateMatch( + templates[templateKey], // 使用预加载的模板图像 + x, y, // 识别区域左上角坐标 + width, height // 识别区域宽高 + ); +} + +// 过滤非中文字符的工具函数:处理OCR结果中的无效字符 +function filterChineseChars(text) { + return text?.replace(/[^\u4e00-\u9fa5]/g, '') || ''; // 保留中文字符,其他字符替换为空 +} + +// 图像识别函数:返回布尔值表示是否识别成功 +async function recognizeImage(recognitionObject) { + await sleep(500); // 延迟500ms,避免识别请求过于频繁 + try { + const imageResult = captureGameRegion().find(recognitionObject); + // 当识别结果存在且坐标不为(0,0)时(排除无效识别) + return !!imageResult && imageResult.x !== 0 && imageResult.y !== 0; + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + return false; + } +} + +// OCR文本识别函数:在指定区域重试识别直到超时 +async function recognizeTextInRegion(ocrRegion, timeout = 5000) { + let startTime = Date.now(); // 记录开始时间 + let retryCount = 0; // 重试次数计数 + + // 循环直到超时 + while (Date.now() - startTime < timeout) { + try { + // 创建OCR识别区域对象 + const region = RecognitionObject.ocr( + ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height + ); + // 绘制识别区域红框(调试用) + //captureGameRegion().find(region).DrawSelf("debug"); + + const ocrResult = captureGameRegion().find(region); + if (ocrResult) { + // 应用字符替换映射表修正识别结果 + let correctedText = ocrResult.text; + for (const [wrongChar, correctChar] of Object.entries(replacementMap)) { + correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); + } + return correctedText; // 返回修正后的文本 + } else { + log.warn(`OCR 识别区域未找到内容`); + return null; + } + } catch (error) { + // 记录重试日志 + retryCount++; + log.warn(`OCR 识别失败,正在进行第 ${retryCount} 次重试...`); + } + await sleep(500); // 每次重试间隔500ms + } + log.warn(`经过多次尝试,仍然无法在指定区域识别到文字`); + return null; +} + +// 定义识别对象 +const paimonMenuRo = RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/paimon_menu.png"), + 0, + 0, + genshin.width / 3.0, + genshin.width / 5.0 +); + +// 判断是否在主界面的函数 +const isInMainUI = () => { + let captureRegion = captureGameRegion(); + let res = captureRegion.Find(paimonMenuRo); + return !res.isEmpty(); +}; + +// ===== 主流程逻辑 ===== +(async function () { + // 初始化游戏界面(设置分辨率等) + setGameMetrics(1920, 1080, 1); + await genshin.returnMainUi(); // 返回游戏主界面 + await sleep(2000); // 等待界面响应 + + if (isInMainUI(paimonMenuRo)) { + + + // 按下ESC键(可能用于打开菜单或其他操作) + keyPress("ESCAPE"); + await sleep(1500); // 等待界面响应 + + // 识别玩家名称(主角名称) + const playerNameRegion = { x: 270, y: 40, width: 400, height: 40 }; + let playerName = await recognizeTextInRegion(playerNameRegion); + playerName = filterChineseChars(playerName); // 过滤非中文字符 + log.info(`识别到的主角为:${playerName}`); + + // 返回主界面并等待加载 + await genshin.returnMainUi(); + await sleep(1000); + + if (!isInMainUI(paimonMenuRo)) { + log.error(`返回主界面失败`); + return; + } + + // 初始化角色识别结果数组 + const CharacterJudgment = [false, false, false, false]; // 记录每个角色是否识别成功 + const Character = []; // 存储识别到的角色名称 + + // 并行识别4个角色(使用Promise.all提升效率) + const recognitionPromises = Array(4).fill().map(async (_, i) => { + try { + // 计算第i个角色的OCR识别区域(垂直排列,间隔100px) + const ocrRegion = { + x: 1620, + y: 225 + i * 100, + width: 160, + height: 60 + }; + // 执行OCR识别并过滤字符 + const recognizedText = await recognizeTextInRegion(ocrRegion); + const filteredText = filterChineseChars(recognizedText); + //log.info(`[角色${i + 1}] 识别到的文本:${filteredText}`); + + // 与角色列表进行匹配 + let isCharacterMatched = false; + for (let j = 0; j < genshinImpactCharacters.length; j++) { + if (genshinImpactCharacters[j] === filteredText) { + // 匹配成功,记录结果 + CharacterJudgment[i] = true; + log.info(`[角色${i + 1}] ${filteredText} 匹配成功`); + Character[i] = filteredText; + await sleep(500); // 等待后续操作 + isCharacterMatched = true; + break; + } + } + + // 当OCR未匹配到角色时,尝试通过图像模板识别(散兵/旅行者) + if (!isCharacterMatched) { + const { x, y, width, height } = ocrRegion; // 解构区域坐标 + + // 创建4个模板匹配对象(流浪者和旅行者的不同状态) + const wanderer1 = createTemplateMatch("wanderer", x + 100, y, width + 20, height + 20); + const wanderer2 = createTemplateMatch("wandererInactive", x + 100, y - 10, width + 20, height + 30); + const yin3 = createTemplateMatch("yin", x + 100, y - 10, width + 20, height + 30); + const yin4 = createTemplateMatch("yin2", x + 100, y - 10, width + 20, height + 30); + + // 执行图像识别并处理结果(添加catch避免异常中断) + const result1 = await recognizeImage(wanderer1).catch(() => false); + const result2 = await recognizeImage(wanderer2).catch(() => false); + + if (result1 || result2) { + // 识别到流浪者 + Character[i] = "流浪者"; + log.info(`[角色${i + 1}] 流浪者匹配成功`); + CharacterJudgment[i] = true; + } else { + // 尝试识别旅行者(荧或空) + const result3 = await recognizeImage(yin3).catch(() => false); + const result4 = await recognizeImage(yin4).catch(() => false); + if ((result3 || result4) && filteredText === playerName) { + Character[i] = "荧"; + log.info(`[角色${i + 1}] 荧匹配成功`); + CharacterJudgment[i] = true; + } else if (filteredText === playerName) { + Character[i] = "空"; + log.info(`[角色${i + 1}] 空匹配成功`); + CharacterJudgment[i] = true; + } else { + log.error(`[角色${i + 1}] 散兵/旅行者识别失败`); + } + } + } + } catch (error) { + // 记录详细错误到日志文件 + const errorMsg = `[角色${i + 1}] 识别失败: ${error.message}`; + file.WriteTextSync("Resources_log.txt", errorMsg + "\n", true); + log.warn(errorMsg); + } + }); + + // 等待所有角色识别完成 + await Promise.all(recognitionPromises); + + // 检查是否全部识别成功 + const allRecognized = CharacterJudgment.every(Boolean); + if (allRecognized) { + // 记录识别结果到日志文件 + const now = new Date(); + const logContent = `${now.toLocaleString()} —— 1: ${Character[0]} ——- 2:${Character[1]} ——- 3:${Character[2]} ———— 4:${Character[3]}\n`; + const writeSuccess = file.WriteTextSync("Character_log.txt", logContent, true); + log.info(writeSuccess ? "成功将队伍信息写入日志文件" : "写入日志文件失败"); + } else { + log.error("未能完全识别队伍角色"); + } + + // 等待后返回主界面 + await sleep(500); + await genshin.returnMainUi(); + } else { + log.error(`返回主界面失败,跳过识别`); + } +})(); \ No newline at end of file diff --git a/repo/js/OCR读取主界面队伍/manifest.json b/repo/js/OCR读取主界面队伍/manifest.json new file mode 100644 index 00000000..8decbcc0 --- /dev/null +++ b/repo/js/OCR读取主界面队伍/manifest.json @@ -0,0 +1,12 @@ +{ + "manifest_version": 1, + "name": "OCR主界面读取队伍 ", + "version": "1.0", + "description": "至少0.44.3版本。OCR识别队伍角色", + "authors": [ + { + "name": "未知_" + } + ], + "main": "main.js" +} \ No newline at end of file diff --git a/repo/js/OCR读取当前抽卡资源并发送通知/Resources_log.txt b/repo/js/OCR读取当前抽卡资源并发送通知/Resources_log.txt index e69de29b..8b137891 100644 --- a/repo/js/OCR读取当前抽卡资源并发送通知/Resources_log.txt +++ b/repo/js/OCR读取当前抽卡资源并发送通知/Resources_log.txt @@ -0,0 +1 @@ + diff --git a/repo/js/OCR读取当前抽卡资源并发送通知/main.js b/repo/js/OCR读取当前抽卡资源并发送通知/main.js index 49f083c0..4321ca9b 100644 --- a/repo/js/OCR读取当前抽卡资源并发送通知/main.js +++ b/repo/js/OCR读取当前抽卡资源并发送通知/main.js @@ -113,10 +113,10 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) { // 如果识别到了“常驻祈愿”图标,则识别“原石以及纠缠之缘到数值” if (recognized) { //原石 - let ocrRegionYuanShi = { x: 1480, y: 30, width: 160, height: 36 }; // 设置对应的识别区域 + let ocrRegionYuanShi = { x: 1470, y: 25, width: 180, height: 46 }; // 设置对应的识别区域 let recognizedText1 = await recognizeTextInRegion(ocrRegionYuanShi); //纠缠之缘 - let ocrRegionInterwinedFate = { x: 1660, y: 30, width: 120, height: 36 }; // 设置对应的识别区域 + let ocrRegionInterwinedFate = { x: 1650, y: 25, width: 140, height: 46 }; // 设置对应的识别区域 let recognizedText2 = await recognizeTextInRegion(ocrRegionInterwinedFate); diff --git a/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json b/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json index df092ff2..b123a23f 100644 --- a/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json +++ b/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "读取当前原石以及纠缠之缘记录并发送通知", - "version": "1.2", + "version": "1.4", "description": "至少0.44.3版本。OCR识别原石以及纠缠之缘数值输出到本地", "authors": [ {