From 7d6089112a3a80c5322c78dd87be87ed8202d06b Mon Sep 17 00:00:00 2001 From: Qiufeng Date: Fri, 21 Aug 2026 22:43:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(tencent):=20=E5=9B=BE=E6=96=87=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E6=94=B9=E7=94=A8=E7=8B=AC=E7=AB=8B=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E9=A1=B5=20finderNewLifeCreate=EF=BC=88=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E5=9C=A8=E8=A7=86=E9=A2=91=E8=A1=A8=E5=8D=95=E9=87=8C=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E6=A8=A1=E5=BC=8F=EF=BC=89=EF=BC=9B=E5=85=A8=E9=9D=A2?= =?UTF-8?q?=E6=8B=89=E9=95=BF=20timeout=20=E9=80=82=E9=85=8D=E6=85=A2?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=EF=BC=9B=E6=B8=85=E7=90=86=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs/tencent_mounted_form.html | 32 +++++++++ logs/tencent_note_form_debug.html | 7 ++ logs/tencent_note_form_debug.png | Bin 0 -> 65441 bytes uploader/tencent_uploader/main.py | 109 ++++++++++++++++++++---------- 4 files changed, 113 insertions(+), 35 deletions(-) create mode 100644 logs/tencent_mounted_form.html create mode 100644 logs/tencent_note_form_debug.html create mode 100644 logs/tencent_note_form_debug.png diff --git a/logs/tencent_mounted_form.html b/logs/tencent_mounted_form.html new file mode 100644 index 0000000..fffee51 --- /dev/null +++ b/logs/tencent_mounted_form.html @@ -0,0 +1,32 @@ + + +
+ + + + + \ No newline at end of file diff --git a/logs/tencent_note_form_debug.html b/logs/tencent_note_form_debug.html new file mode 100644 index 0000000..0136ac3 --- /dev/null +++ b/logs/tencent_note_form_debug.html @@ -0,0 +1,7 @@ +===== frame[0] https://channels.weixin.qq.com/platform/post/create ===== +

_f5D*J7o ziB@?#kcyI(uu=Qud3?dp2py*@qqigLaD1+B_6tf)cnW*v0cKO`4XR0n(`U%0R(mLS z<;=ysh6zrK?r!tHv?s(iOZ>w+`@{waW;l<&$wYT;)P3!rc! z?2{>WbG}2MR9ytKFo_ROvU-nh2X75&#IC8a29Jp}f=%nIX>Lbca8I<>o3LAX#%ESIW*`>~NRy&)_4O_yO*& z$!soQK0+9lnY{$TEZ4C%j2+OL?8GKJwinl06azq2wL#a`HgrqR%qTlWw?0 zgg2QQpBof)lUFi=NztMc3c`?ZU=Jj|zavYNzbe^t;@?L~raql8YdmM9;s&T#<8D4fWMwuTbR>lkvi% zHWT#}^c8)q7qhA5FRW!D*_IovI%r3<(WqZl2>DGs-|snp)#=oW;l>AzVmZEjs4OH%vG{484Zx$| zHf6nRqNk1t)-}-%9fi0aLIR;5bp&;5lef0;JftS6DZJ3A00yMTBK#@KBVS$JW#)3z z3ecftMsncKV=u__-W`Mj0lkPRW82|w+~h)~Fey0pYStJn$Imx|>Kk#wA24BXuiIH- zK%=izUw!Dv16)|Ht^(*jb{OODj@cdXpGcAQ@;+)re|^2$XJq}bK={m;uM*0lKIboa z43>=9x5Y`xNba#df!<@Ca}r?inmBPPSAF=cla~AZfImd_FtScNUr3vy_7}zDF5n&S z;6D?7qr&|=gZg;`c1aP#T4ITs$#@z3-3Mg4d6q9`A(zrU<3jx zUtGq1?id{hP0;yoKY#Z~dP*MD`!U_l!*jIytRh6W`KdAh*j<)se&-dO&7S3xVShlb%B@` z$(sspdo9ix1o0DynmD}^as=u@#xeApB^(s2KF6~z*T5G+GS;$ch=fJXjT>jV`9LAG zz~=8`tGWPDiE|X)0g&wf%J>O2q7^6yms3DEM*tOW@EsNy+2{^LuRlp;@D=3sfvV_M zx+WI{%fQe=e>>*$S8?v89UlVeQHI`vpB}utp?_i@f>OiAo z4xy8IoUBfRCB?ttdp-#d?=gf|rp|Dy{T#%igK8(<&1Voon<@|I+D;kw2ZQZ`3xr<~ zKm>8D4(joiVAq^>eJqxbFNH;1Ee$iTN|a0P^i>*)fxO=(GY^uam7E67PuaL+@@FZR zM4Cc@U1?xCs&0HpBiGUat%4PG1C}tBkO@)NPg3GVwH3607-GYV|=<~G2RXI$e<^7Th>P_ z!cCYua9iliNZJq?RqP9-Y%_BuA_i_sgSlQHPLzTgyh%KfcxlP;GkI}#cJ>3S0?Hl7 zE#Z*ir#w7DL9dMnZuh}h4eP3~>f^YRGJ-Yrie#UbyyQl?EHDF7eaC(A!8_M0 z^*?M8Z$i)}NtTv=*0GLhj7kVTu7fz98n13i|)wM1P`vQU_y!~@XeBB{Gq z7qRi;U}1I>Da4!$g*&=;`ewWfhSqQqeSK}@aB&S}u&KN%7psygg$&m9yk}KedAQPn zqF?xJXSewp=P~19A6VcT#h^>{K01&v2;h~vndE#AtAab!0Is#`+0?af|Ha>P|Y#17NuqP28kt^HmPYmpEeN z(mePUCXOKa!%zgn9`~&~E}Ve7Aag4}9__+87*%0f1nCH1AoZdz!;Xb-pw0u$SOuEN zsuZVe9QRfAk-F8lYl?eV4}eGiARO}G8)Hcjdgan=)E1dsKX zQ}5M>5BNusk1gBBzN!H=8VsI_RsEYt@hITn`3wCxYHVA=k2IdgQN6vdA)tj!WB>7C zG%|mp1*L<%6t50?A*W6jL;UER`*A`f-nnS6OUenCJGJ>+_-92p`nJZ_5}4yw_QL!} zhmrO`-n?b952q99lgZQm=$PDxRi|o422G_QPzlLd)FN#2KpbGaF#Sk*!*-gftX1ND z*tp@}Rl_;-ss_bi$r=1of^AaYg3LUmL!vF6T@b}m9-ML>GX<3kT8~kzGoPNTJwbwW zH5yUjsC%fxFcZn@qyg7!h{eKx<<7VChahxC`a88whJEN$2hQ)JtetqU14Z{%j{D9! z;yB0Q1QntejwL)=xb0{H>?eQj8U%aXC?BOBDvory&~eKxK}he4o{8C%blFc3)-N)D zW}&uzTi-JWWv$T8{7KW~s)3wwBtQu!H_^~2-})Qa8GGm`Z35&R35ogxBk5dt-wbS2 z%eEBCTMciG;`JOWrCeT$EUFr1y47CEVHi&uqb)ISO$Rw}?|T?tIGT7TJ)nw89fjoy zenbLm(Wx@2Px6oAU9}U%rod{hF$ZBWW%T}YCLAvT5OK=qv;}7#1r8+AXSi}v)eG@t z&+3H1JTOq@&QU<>SLGu94^mNYN2lC!)J|I6*v(gO|R|i&ker~un=EbW>a)< zK_|TaW9@Jv;k#Wx$fwWG!bkW>Lq1gw-YezDY;Ru!mpFDL4V%`2( zW$S{S2Q_8E;U%!|5x;Ack@?NW2QG9Z+*#|X57BG`i9g!LaC5Dp1ghDEQoixFWp2%2 zv~mgDxB*9swQ9z|ow-+;hVhCj&2?_{$bQ@*V-uqf`aGv$hu-e&Cf?chKiX@tdAl|> z3pBI!d^uDfe*<}0!!ITqc}HU2eK^n*oSf-j5#Y-i7{Mugp$)tr}9*ORy9rRBjh9q(ZRWd`Rg@}g-qIe28quy`BYH4{9(9Ww~2yE zLLKE&inumh!SK+JOQhBg%M*=ejJAlQtY0kWv>KbaB5R=>2vh;b!Z%yESCpIe6%iKU zQ{a78u)LgNw8#k7g{%)pU53|S+egAdhL0hxSo)p|u+-LDp6I|C^Pe;vut?a$=Z<93 z!Ci~|IA9k&QD1R_CWc4a71Bi=FZ={hiHAnnzsRbw0dfd|%9N1R4L>~_^clhjBO@X- zsXm~#JS`}g2PwzXeX}Nr`I8fM%Wa85GL!y0j|?#m6oy!z+w@%;{T(UZA@jv{6UKlH zv5PX_5`?Og`>o900SMaxP7IsxQfXFh8|oK~Wz|}QN*Uhq(l#>a!wkFZ3E|0SR=(B- zue!Z~P1TdU0hMQbE%*?Rt=3+fs{jtvz5|pEj1);&Z=l_e2ZPltJ#6k$XLFLjj~5oI zw*2Z^*yYVN9V?I!0QsB*zfQ`6Hmn3*5d+~SjYeeZrBMGExH0tirF%0XGhkRj#}4i= zCx2jdz{s)zT0fiQAjG5q^;@kkmHSr#v_WGqr3(^~klT74B%KB4pwD`MGlC16d>x8H zZ7LTL$$FLW{PwXg$sw>WWe417YvvG4aa`?)UE{#o$C-`eAB3XDZMOAKtqlR*#sGG&-k#{)So=YDU?~IOVfC zX<&G;OJ=q(ed61}5=OqvcNj6-L5`xf0!QsmS*|9Y1SARForgBhrQoi7`_duWZ3h_7)tEz-1SJ*Q6a~L zQsyY`J4os!L~Xj!d}FcU-J?lsjN|9iGB}8-ij0mPP!v&ARP4wci!;kFh7%~k8Eowl zM?}1h5YIc@-SCpNBmf0xheFgZWC_AVI2}0ichX!zQ%)9!{K!8rS`OQj^9gF;Rr4hh z%jdv0rm@h+Po)CkJ3tBSGgH97bfAfRg_>3U=c*Z@wi*YAR^pt(akCcgO7P42p}wO! zAtS-~i`B9v+$IQ3H0A^SCd46fK{o_Z*7rCk&hlnnDBWLl%Dq;bk<$2J7a6meVp>%BBw#!^iV6Z+8) zV*f8%@tq*^z|iVHHTE!)yy@0rU98peBkl}mKB+U839)M4)9GdT?Em@{;wJX#ZPupp zP_-uGu2wq_e;qWk5-?%7LA|@?&KXM$#Izj5yzKuGUXfG)HK19a1<9Xy8<=Nj`h%+IcVC}MeU8AYuodZcNa=2cQ7B< z0_W3%KrA&PBj8=)0XF-Rr|PuEQ&!JAGK)LhBYC7nS1r4+O(d{NBpp+{|C;;{5}fE! zs|=mO4xUI(7zJ-OO4BMVq%U!KvhWe3Ct4v+{gR zeu@p6FLfDmccC|x`C~(zvE}e1K?o#cvnZXr>M{l5UN&StRj-Cx6gr06Lj^E zwvGP1o4o+%=+=6%|1Z|QI~?o(Z~LO8kV~u>_j~{D=YIZrj^pk)e#h}U`ijeEyxyJwJX{f=>L)Zk>{N4Ud@z!m-6+p*ylaX*_bp<`t5h zid-{u-o%+cp~khRS-$dnjjrb#bm|9Bhf;m98Xvop>hxakWTAXeHYKL18^JSj&BQzC zoj}d*+4H@h_qCOcLVo+4rFK}mMYX~ghFQHj)EYD8s}XYJ*CW*CjXRPZ$+N@X;=5&S ziuRPZzT?13Ta@C$CaL0n<1<%vKZsA0l2`c|>f9P_a(em6X=1Zd$LuGx3~@I@oWpVa zExrErrb2y?o|MfKuxcE1!{N-yk7LpZum`HIf{B1F#R-9N+Tjn!9gthl%` z(m8j##?MVlwxIG!V$s)k0<_I{SEMmo*!a*qd>oEg#yyH7M#IoWYVoOmKU27&Uu4w& zp8dgO<_;xfoLDq7S6xU-#3F!po7Q)vJl^yRCjcW-vs)I$OTK@RcOAc>yH$FK7OTT0 z)GkLHPK5Vkp{noMQ4Vx5V}|fS8v1_VBlIGe@Xv(W)a`7R&WCEMT?N4^ignQ*h*`8w zE3z5R)$8UOtMZS~R*6|N8mz(5r+euxv-}Xx@Qh`@*9-61yUmfsx!ny|y&tX+!dt(i z1aN`E_mJkY)x~{BE^i6;lKr#H59`_8`)Sj;n&x+>TE{%44p|lWl{UkPWJEd1D_Sd3 zU+O17{3Ukei>3c2-yTW}(X}kzV!m0h0%?{DZ2@TtTL>B$nZ>=Hz1SZ3Z1nOxhE2Dt z_;E82*k9aofAW04c`ba@m-Ie>14th&!N$P?c9<6-BWLpAVRWH(frfJn|xrAiq%(sb~`Hz!7x090RZO=6-WF@}k(@m;B0!TwCp>xQ{iTB~Q zq^z{};q9yIobrVGzXCQqn1}6;23VQ4SkEN?iv@5U(Hz}hLgM^Ve*%s0I99Jr9p@BfNaF7i zbz82!vi7-5$*f#Xw-s#TdEK6T+;Aw=f~}fWAgE0~#&4W>?IG0&Zf-0oAutO^RgKntLs zap6vAw`1PXOKEE!W42QJ>mPNJq*dwJ(05Z`VrQ0ARg0nG{w2$b+3G%rAa6>cYR53R{B+~WdV!Kf*l8Xc7xQwsr}%4Qp@cfitWnhxFiF3=v+u*51<;6oQixHg%~_Xu zv3=am)~~1iCb|;~=dB0MQbk9Cld}_T4O%?LMcsCC@KF+T#O-k&Dx?56cYHC4`k`4V zjd*hA!$YP+*~IBA(&|*~)Dm}sD(XU@Qr#aJs{OvX<(-ykigx5JTVA~n=@-y3mPMh|Bk2x5e8(~6krM9BVo&DJy?bBxT za+->(+jBYq+(QF>*rb$HLb4XtvWRcGw_o}EG|@)VcHjJtm||EuHU;cY)ObsH7O@2^ zy*)v<{%Qbci0Xlv2;L;aFn8VUqnC?*Z4pch?Jllge(B8Jt45h$es{_3*yQ2Alw#IBt0Pz$tEc)L43y4;wx}7?R>UP2ujF!S)XtjU zNpTWuIiTLBx5l6_N;Gd);fkJ00R)DEt%Ljdk3nSEFVyqFELgZHc$D2n$+&9auIdD< zR$M#aScU658A^o@KP^v|n$*qJ(_(5)$)8A@G0$(!?{Lk>^@0!M5%^idZ#IN||7OBr zZPp|wKEiE?NCem`mYt1pvbr(W_#t5yUhwSNb*~$Iq(LvC(Wo zfpbFp#kuqdE9{0<7P}q!l^$sn_liWh*W{dCp8m>(l6Npo4olF4d8YfHzB*B+i@)g3$|(}Jh>!jfy5ViRZe`ioB<4^L)+MYLDy zT|9E&Qnvvc(;)xZRrK_s`h)xrE=ri$X)Yyeihb!>{_X6=p_%`Bv7rD?c1G}Az^FI) z%55LXcp&j~`aNjR^&arEvcb;C&=M%whUfV?~msdk})IuC?h<=iAl z66=y)xhTTq$!C+H$=beh-cKPGskPs+aJvXkh?HXwd&KslSXt6$9w~wc>Vjj&l`kh_ z4YCOpPpa!6V~31Qds?9opLh+)()EUIEgjAHBPE z<`YLA8ZTsX(*K_JG@V~HdPkz?v1{f2GaXknLu)**oKI2zSmxS=703ebeIlZw8GuF2 zbS1_OerKDn##mor_-K_0#bHpKwXrrWEu7@IcWka`^$t zQABVs_>+A+6IWNzle4_%x}4#6|E@xjCdJqUqf-X|Te2#zUeb_zO29WDMaB$2fxVbfcG1%X!F5LVSyd5AF4n)X*wsb2@J(17@(x;9 zv&IL#g_U6FVF$Rp@!SRBphxl(^jEp&8{qe&jzn@%Q{(13Q+S+wUSrtDKD}n?e#>2c8ME`} z={V4bSyo}wHoL_!e`t@-xp%`&nEXj$kDr^TjrH!?|Gq8Ib##~%YWmCVluz1e6&0C5 z9*S^)C&NxZt~%vwzAX1nBMfI^=lDvKP`k8z=JXkJmQ^0?G@I$RH~T}fQIC%prj<_x!{0on}C1-1G5{=G)nuOujuLN9Xoam_87_PeB$EbFxP~a(X1g? zvFN5)ejS=|K@y2~i=P{d0EzdJpY>v9MjHmuY?$T+qbqD1#Xn(W7pQ*`ylZk4u~w6- z=uWv`yFL}Y1Rs=pw)QfCK|!(F7xD$+#Wi19j1IcKOT)XNc~W1bWUe`rcbOLT%U~xh zNiy>No-+0OEirE(KSs;EXV0Fu2C)XYKv03dR1iXS_4KLOD#Jwt)KhO0ULLhi3W&%{ zBH!apCRza)N;EmFW@2hgvO+)N;*w{-40g}DyGYk@0K9J7eTMF`vNAx_M5w)kYH9u$ z^?s7~7=N_YC0K66+}p~+65Z}dSU9(&UE0=QSbUPMJu-58@enGzWmWAk^5I2s8n}NG zEiM_wS{3=GxtUq2aY?t`g)f*c2ymyacD^{5M2dW~owUM-p7rf+9V#VNKUc{41v!=> zDR@^1Ii7EhY)>5vdGv^wpg~f`#>H8-pU>)ucq=yUUuV5tG^DNUV2mNZ;U|3dLYXlhB zDFZ)%AsQ{qr@Iu7wQJXk@spbguQK@lw_mgPm`W}P6{&MO#nJZ4)BSIX707u!>lz}egA!!0HOSfk;~17@8)1bY%-=C?P_5kHs0i(3Mk(3f#=Wk+fIzdg`dB>Q9G3 zYkl*xXU|qX+oNZ-&QY6BvyGw>f4c*4k;ZMU9POrdS2;FE%6hFrE}!fqfLB`eP0d-6 zqr7kV%PB8y%h{8DCMps`^27LrcEle6x`j6mHr0{haQe zqfYslOJPxrp+X@v`26~e$;%*8b8Ndp25l1#P^Dg0m7sWN>Je9qHr@VEkoT^gI}Myh z!ouXm_+_lp6mK+VP_xO4mfACJYz}NUM?LH9zegdASrSjWtCgD|468me^8*t+(UmpD zkn8pm6=Bw3c&y~VJs%CbbqF+iyMrxZ;#rZ{~nizqACavR*Ih|e|s0Md)wUlhQFvh9v7;Q|{@N;!djV^i; z9-hJ^4!X7fq=qr&jI6AWeeTnzPYH73IMrW0+Ok~8{u~}w5A;33yMB=O@w=+?wptKnI7i+|~%` ztG?B$M1B&%f?fa&M!jKm9TH470vxe%MM0q6(oRtAqwUrwkyJbXJi-j;S&|od*W*=g zaIMbFgkJ!iCYubAtqVsISc%@cd6Swq#Nxw7$7V$lZn_qo$YOHxi-e_hR_Ub~khf8qqMdAoCVY7k*`WmSj%)N(w2OOmy* zzjoSANlAn6nlw5)4CFbprh>nepQ$Wvr258%Rwah^WzF(`@nz z(#t+dXZD1YESVUcR7GZZSQ$$VX|GG2$cN*p&Cz@{n(W@AwexDU+HsTvVuQOm6uPLL zWbM!?ub{q}Aw{xQq*R}YxL-%K=f$>+*qynw=~c^jA(ZI&UJVU9p@uEXOjL}V7rPf;kLPMUQVP96-sX!!QhY8-tmJIH1)}H}5`B@gB!WVrW22G2Q-Y?G4()1I(qB&oJs}w@$rZQ{Dcc z;YDaT7?+XZy+n%RN6*ab7Kw(1Imgo2anQWD{0mUA{(~f*#1kW;4?B42vhDv13m{&4 z>!w-C-MZo88G*MlFIHc;aA9|ROk8|?p+O>ttjIZL`dd%doIf03KA&%}l2+Dh`pmJ| z9ZCDzHeIB-huSWO2P!mwr3}wopvnA2Vi)Tp@m?;x6L%gn=&u7^B3@^j4W7G7ZI=zk zi>Qbes{dP@pV$Qmk}w;T_x3c1>#Fo;Np>qJ=|>;9P0B3`Q<9z$!NR64eL6a>1Ej6` zPNnUuTz1vY-Mb?cRL*?r3$0JDkCav5lD!i2EGQ^AB(CJ#j;JWMomKi1>uLA(3eoOk zPz`)+vZd03Jlg&ueDvh0f?Ht;0~QmX;V?2%$N3k!>ZaB;X)0^B}+ z{CLgrb`_p(`-p^*$!<6H$0kv#s0cf^?~Au;hs?_)F>I1z(H)UUt z2F2(_NiJd3<5y{DHf%5zB=LNFw*RzlTN~?D;cXzSCP*Nx#v9by>(f;kW!J>6%aa~p z7ut%)Uvj&UP%UlezVmOH7gra{GXMcJy=9Z8aI7xqLc+o` z1u6hHc91;l2%dE!CY(8V*IWqySUb8cQg_8}9iKwH_jD#K0_Pz#q%I5y&67z<0-f09 zVU+DVe0f5(W@{5Z-zIK*f8slAlU>OE%{gTqZ@hnfyDEa`m@zyT5lX>rrMq=*o*8Ws z|1lJ`l0M1dJQ_Jt(QWjNr7NDU*|?&N zaEJGX8wV6kO67Uy2CSc2Hl)FNsAuG0z&;c-xTzBC)Qq4s-=-HCHzLpz3#^^ZIY&2;uUDkU0F z8_^k2IB)$qB6Dv}|3{fo&D!=lK@#z_kz7cRP4f2_>C&BLs2!)VOxklFklU>g@SAW zvr&0@xkBCY*1_pv?fhq3rbapw`hBX5ub6A#qnIvTF6rl76-7OzdITSk|OU=zMTbw>qz2KN&l znXKgv_K#+EUA5XCH9^Gt+&|Qv2TKmP@co9Zcj#MW?R;~p4O`|X!!Byq?%iLZ>wt+O z;Q-YX?MrOv3Gm8<`erhFd3kAl=;w4;3hjzp9x-)S&9a?&uD^H1@F+vlW|t(67jc;l zzgt~o-*Z=ek57I$>75+@*m1UcN6GDFZwrl*$?O$rze-(;N5r0gKN#60wVat;j|Cgs#lsh|jTO=qFrmvW&w%GHiePQoP~)g)?>2+PqAaNd#C!E(XH<4JPw?dhNK5 z$cfrE^$n~1Mo5VBMhXadb$m<=?{0}SBGI?Emk6r+X!~&zlu1<}-}xYgJu5;@omZrH z)V@utY7?m{`Eg&%$*lR_uN9Y^!rDTg1xO8lEPeHO*;^*)!S!(cD3$a7^J4upKki-Sd_+h2@v-65 z-=&Ye*1nZ-?*zz8u(}>rV?*-s$C9~xAaKbBQGNUNYC-;H;?z@f1;sV+al@{Y2F_iM zgh^9=(xO48nNm`W{j=G&`KV*z%i@C*(1HjCx-6APCnqe37kbSw-k)aVGxyc5ZIiCb zo@(CWHRCo<=ezv!HBFiKi2nQKCE;2l36aRA;$`jAt2_dJ5AiLLKkK=M|2p50cI2T~ z@wMybcwZH-nI?^!h{qL)o^G|JVK|QC6iur&eG4>5&^LEU^PdGfgsF>h_3HFrX@-Tf zclJi;^k1$L%uS%R4sJ@gm8>4=6X?EUO2$0wz;oo6*4EaeScDNubX%T*4@5)H?#N6 z4Ws>ecXxHxnpHnNTlNBg5fzR#9j}0&T2-mhA9N0~K$F&=Q3(=6r9b*)lEY=@(%MZ@ zqEF~@YCpAQohaFNNcxMou9g1NsdQ%1%t`o#+nuf;f8v4|QU8*6bE!E{1NKj-JyZawfm_T@BZ z=)Ol2V^w?>x1RsmQc}yUxxd$+(z5Ykj@r&$gv20}0ph ztJ@#+vZ3L5u%^IFAWL`qk{cJ!3Q{01)BtK@*__AsXJlj)IFFAt9IYVYs6?G#P%IDA zoA7H-XLqWU1O%J-=5O#>9)D&xZSb4xmhL9SpbJa%tlYI*o=y)ldWevS^ewX}2*fbD zWROY+Mb@x)zS*rKCrjf3e^|YrKwb#@epsPBVWyIZOdz5A1msS!Q z&Ms_JE$&G2W870l>rsXkIz&i31~t^_)M2Cd6HpW&1?el7pY@V=ZAuE{+x~f#!Ee9* zxaz>nAH$1QMnhVInc{83uO=?pWlDH1b#%_j*E?Dych!`%m6me68{U4Cj+MU>p`hG- zciBwX)FV75PZu(K7-1FAVWPJTO`|`zjI@~83w|Ub=K5fumD`%1iO%GAz z>)=5~gev{ARaLDAXcg#{oxD3NFz^8U3%kH3G#@yk@#Xf0T}JjOQFkc~^Ay`SrZD$r zez5{?k(f;R=ARS`Te?Due@)wBNVK8q*hQ&>7Sr{VpL=3ycg;Ud^Balc?K^qm?i>$qswhR-zCiCcKtczp1A7_l*0mmg3IIDQCUn^QGKVG7`Z_**~fjs@yA{ zjQjzXrz?yEOR(IeC$e|1IZ{2~lM8!t-~Pj5?@g=P+S+Cb zOSTB`!-MilHuGuTOID}eFB^m{!Ti#yA?8k1+;q{Af=+x5_Vf~DQ<(K~dQbFe-QuXO z_%u0UlA2&9Bw|S;?enAV^2RUE`>aOl-MhbUBKhqQrZ=&VzJv_ltlmfB&tXIJIb7U+ z0CJ(q;H5A3Sb5ZCWJ)lZ$Hc|qY{-WWlQ3zWp(M82g-zJQkUWz}Jn4)zoyqd9BDYyO z+Gtc^LKnM_%q!@Fi9p`zhZcm10tT;z+0kLi4Yg2cH13~MCX^hYuZl$H38$Z@bN=3o zuSb}y{jwEG2BQ1&_otsOspcU)FW;?0@)M30_Gx(i>v$yPrx;D^%t}GV77!v z-5$av0gS;~Zs{VRmDD%n&*V5V>D{|`h-LmXt!?53HBvSa6GWiCL~+Xy)QGFbYpQe$ zzbIAjS8mCY;GBIIyngh$1jajZ$9*>$eFMHbb>}#7*4ujrJqdr2EpqP7Y7LuaX0%m? zbe4?Fd*%jeOPv;K(hf7Z&^y&v%+W6gsJ_T#FOp7t~-S09mPRM&Oaisf3n? zP>R92^~JRbuxm|9G>yX!E6E^XAP7MJc}M zE-dFpde;uuS^1(DH@AK4)tC8a{w|#hN+2btQx`^YO*e6H=p+BoGzPz*utDCw9XpQh z&OIH$ef>rEuuOU7xf&&k@y6`{Cl5G{=}Y=oOy zKcGDnh!a6)-BSRx{YC?arx=+e&4f8TsS`6GP>N@8;hX-5LqKY#QDeYXr**kRFTDJz z)XD__n8D|_X9eVR_2Ctnoy6nAvT-A!Us@hp7U^7ohsJs28N9BBg5TYGgJq_hIQs8 z$l0f%qb2N@TtJg2X0mSl{kO}^LwUdiBh2hS#$x8A8 z6gqdnlb=3)idTF#i6=8LA<3GErJefbL$d-6nlln8TbF=G=V4z1yILz(u6$}|>*3)6 z(&DW@ch84D%rZ;Rht*^hh|4^&3@BW_P%G3tYP)xq^W(q{9vi7M5rxGd$Y8^x#|V1t zJgY-Q;8k2D(^1|18}?^r2#|OJrF$2i>gQeL8CB9$bORMa z`9Au$&E17}0f8w%{;DJ`_vDGTjEFh3L~LlcW70DMw!wluoX~8(!803?9Vv;38Ubvd z5OU+%*HJZ&0S?0+T)hA?g~yF$8OAz@W;RBY$YoxHpN9F7j`h^fy->>b7TMd;^0#Y#h69yBuT3-_9`3b+aGTm2T^v{mAyz}RN4&P7lGrA*mq>9yl%Zl%@$#?s*>gxeMFg$w1?h_!# zZR1&5^HjqihK0?CO_y-e!8<1>hp6nO_d3v(L%kei7$g&P3^;G1EupgnEpiFlv*;&a zQS%L6#}Hy$I5|0?mxjsrJSx&BYa49$5SfL=S131A?ymnn-SX{$#Fz^*cBD}u3S)6> zp(V*CvFfALl@60n1j~3WuH3Sj_w003ZEfX)2Ln%TnzI^`v|PVJ*hDyPrYwikw!ba4G(v$w4T3)KRwtle#%LINZ?#S@q$? z5Tk2_{f-REgJssC)LVpIdymGj%RSnhP5^?<2R%~S%gr)UtK@v_ z4-K@fohX=|cHmNc$)Ew@rvR%;%+|a+-eg|dEnBvH;7eS{45}!qmwm~GlFY)wVzlSp zqq+!649#ZV=GCRVq{LOWpPw`Q1*1EmlBNMAQD#w!$4UCZ{^Ni&{sh##s_UU88D!<< z9cH}z8um4K+6@|u zUHAR%sX_g1_yYm`^L50x!#|L<0KW2HU=2P;&%5;({{lrMpYikmOd0>4T*OaZ2T+Ij zI{CkW(5htofL@_JWyfg#IcY=)*ujT53wnQTM#wXP;9TBFl(=5GKflC3U-!T9E8v5W zVrlWc$Ih_`u=)TMB9T0}k4NHC{k@X@I|z^m7wHgY3*x%tQ%nB)b+{h*Bb)fYehFOj zX^BL{W@f!~Qe^8+BJ$^_v@m@yUY!ZATVU|?NUGNV3_E`~S(R(1+HSxxErofP$ZLjC zoN@{%+=8uKwJmrdpa8#q?b=8%Lz z^eFzE;^*cdNcjLY_CQfHfZ-A>@<9Y`<%%i^+68MhN@vb=WSE{oFWl&YpuaOP#Dvb4 zxb$GvH6AHn6T9$!eU}%McnT%N3K($x=(ME-KIYJqnI325dLf}h!1Sm>IvNMS!#DJ> z=)MGT1^}JoRYZi~*AI^kX(v{!lU%=X;}oDLOJYw3KELO2wn6581?7ei!`}xs7dOV@ zb5|YHnlA&JP~7!*xTp-co%kfL(oXT0GGvjbLQr`=wsH<>&H4@p8# zf}KoSg3?E0(~ONuD4q4^>F=Q|SHtCn5!g4w(2gBD6eRF&qi(C6_wXnpm$Li$m5<`8 zqOml_d?G19>~mv;#r5I;%*6Ed*560p?*J(@s+PJGGHstr|D>y&`(Yi zwJ}eWubN3TH;vJ9jK6XdOG-)<-eBiXNINwQ7}*&Pz})sc2G4Y}d(c5hJf9vO9DEWI zV!1BqWR!X`WdW>_-58VgA7rFY;`8UvN1Vs3X$D0x{^57)#sk-_8bi|>HfPo1Rdc%J zxyR(4{?)}`9-A|^+2DqV)Bp4U-|Y_Bw3#bTNQ^F(O}L{WlCBwD@z@)q3gJq>#CoD% z9z)g;TCqKYqrBf%tz5~(dAQ#67oG&LRsp^{&)QwW=ZNoF^n2~2jZy$ic$`0)l&p{@ zH5|k@O0CErvZ`Cgv%npC?B!(oOi56mJp&UHp+moR&JvPg%1?*}I|vNNELRjHRyHId zJVrqtc*vVXvB=y7#D5y0X>oNB_(_0nL|#IN6`x?CBIo^`4<%MSCK94!7#qln^+|=t@mKxNX2y3ZXI6Ww}0NMXleS^rP|8Z&2k#|4;?r#jowK; zOUtwM0G3kCK;Y#|K<+(>v$Up58uCuY?k@)PakGriNSruxFY5Q4UIymM0P;K@Qbp4w4wlJ1z*w7^b!!y;te&oC&cL zboZ0iSnhj3H!c#Dd+j>i&)s{1&&9SqJZ8Iq{;AxF0=qAxjA=l^9iO-D6-7Xn5&GlH}db&o3x8`t`$& zhxPRgkNO2&ZkJH9s!bmXyt{mHqw~0Z{k3Pz?PE?qzB>b`13B7U9;9vLN`wjnd?EC> zP*BeTf>}jJ*FTo_Lg1|Hny>!!P;oFn;BG0)%ftn`bDQ_f0-c|j=Z%@8&F^%%E#Jv= zM5x8|+>6T^mQ2bt+~Q;=bo~NDMYAu`in@V!pM1b+F-AnrpeLRoGNobtjp*Tl{7O7c zc#of(yI;5vLr0niRowaJr#b7kCa)E=E65Ws=y-Lfqm)l6HqwV3Ntb7xi8@NBW?!*O zgWgHGB<^E1Yxpmwvvb5mjH0Dbf~q--fjbm(ApjwSTP#Kwz|)OpfIt=+HB=nOySq#) z0PA$S4X5NEasluj{fwVO_6IlyIGV_WAN88+5{74++x zlGVCsRqcL=%&ityS(h-K^vz0K;T1djP-5gGS^<|w+@B<9Y>Di_3EjY(J}mzJ`M8~q zJ~WXh{D9z+4xtpjM%^?jXKO(F@IRZBe>)fAst^PefuO6tJSRttysz&6w=P5L>|vJ) z6J_NGy3(PW25X7d88bd|xGfBC0N(R}YS>kJ8rIT8WI+jAW=00aHSeDjX9e+Sw&0X| zLAfzKQtSLUAOOGW0o& zvuAB-#wC!j5=jJ)CJ`XxJ|}^OrHlQfQ>RV=1IkW5z6#Q~f{~0WhZC~$>+NLH0;sllz}Ylr>4m?sG6USNYPbZhon8=ozq_Z6-tYWMujp&*xKKk;{ZS z@Rn7S;s8;*J2BN@ckCr9f~5zVf@8;zKX)7A`xNgsb1gM&9zv`5xVVsh1~xM0FCsji zJVB-cV9-aEDcBm+960y+%NIx-#lZJ(;sd?999wjK45C>r8z`=7b9g>6Wi=qUoF48!DUpG8EqTpfqC8nB?qC zIyV4$Jy9^8KHWTHft-=8XiI*-*{H(MlS}>=3rKjifQOohepdJnGY#b%&yh?m?CikjB1NY8GNA<%NoCsklfAP z-wJGi{|T8R4H-bb!vIf)i<|sr&G6nN9x@mognrJlyoeoUNGS}NqUp@s2|R*=O8vGr zO2QgaO#$KIo~Wdts4_Q5iGAP1b4U8(0QWMTv+NGUW%|%h6t10MZ?Yi9TPP(W=9=wlFUQE5{Cndb#dOZS zY%{rvpY-*{r?$IJAZ zSnI(G4X`iDL#;*t47vS>AGttJMCJ=stKY-UzKzYIM!d8#?CRC43gvDp;QLu`&WP5y z<`*<2)&KscHX6~tc__I9DR%s2WEQKVv5sA2(i1^_t*cr*267jRbw*2$WiL4tB*nvF zLf63|%P8a8OXl?n@na#vic(LQ4>bavnRZTPTTu~Sp2EBtrCGSnp5{aknUMOlq;hS^ z`}Rj^gr1U@_B9uEz52>o0X9tnw+qszL>B>-ms$9>tKuVJ%stA*dOc`tB+^P;`FJ*G zd=6Erq&^6EZ%-VdO*!>RUVn=YKGtUtpoP<#S_0asoy2|=Zz1+82XC>?kHMg?U!U!2 z&^jV}E-;k@z)B|c$6K?`85rYRP~*^*Yn^T;A6Sq}Jxtx4yqfBKlFfonvqG=8-D&<3 zEO-v(pu4emdfDwg>a$HOJSd5xljFm3bh$UkYep=(zjI4#jIkrwE;_JXe}+Zjt$4tx zAqvzqq)tGWzWl@AJE0&nBBC3g4?R-Su|ktF+9tD_wiJfkN^8Ft1Rnn(R|tb!ONzd^ zcx^l7+Y$gyBCQ!zDu|}MY0cGPVphR9FK91$70zMRPJHhuYBTR?y$5_Ra4sAAIu*|9 zC){daE&qkhvDF3cbGBW?dW|iye!FY6n<35sY?H@Uk=@c1>5DyzSIQa4Igb`S5PO=R z-K3LmXIgb7*wJgRo|WTZp`Nxpx4^slD>gm%HXl+~S7#_>VrJd)*xlaTL}F<`oAcz^ zU8EHxpL1z|T>UHwdvt0Ua&|hD4t2%sP9!D&+zL~vt;yuzJ*455cy?M^T2>#&(4JMq z2&DH?AspfX)jmzRGd#JHgS=V`O9(?JFm=gX`wBK~-sc_8+50)Tstqd!K%=z#Qy26C z&!1*Jhr=yM-0+$wg15aQlOCpqTn27e87yd}@Q&O{EwQW!KCf&|aZp;u#26B7YdbU` z*^%==g41!IGv&AF#&cUBG*u_3`vmNCMsUvp?Vq{`@?y_hnN6!q_tSO3gxj02Qj1p> zJ1ekj*Lm!?5u#=U3ZilyvUf}GKb2#akV1QzW>c3d))s>Wbk7CXSU0SbobZ`awKQkQ z^7F-5XK!JQ6>6!(jD|1hT~@8zW-UWCq(nH_igfvnsLN7U@h=^DQpWa^@{wYr^=myB z7uU9JMzIQPRgXFZ<$bjrXMj!XExW(Xc)+@Q_wJ|a>G){r>H8!|R$Y3`1E~)LzTK&A z_6evIUlB^zkk<0&^+W$LvC~&2HZdu+fGi^Ng9xYp@<2l1U9vVo@rm2TM7IO?R&uKO z@IeH$d2xa%yqKTyzki>wMK|1v+jUVmsghdY zFvezH{j|?RTesk%GNWb)Miau_A)EuoVTOGwW-J1)ZxFQxl!vf$eKzNyro=k4gVk^J zZg#r{eY2OzI{%J&aG4Pjk;+R3M^qKX|B%yv#KV{c2`<;Sk9d(ga#9rTqV0abu9&Y* z^AnE;qehV0y>ck6X3l}#0MhnUIqIzZk!6d>X<~f#ns1t5vAG#I5Wmm z%WxUF6LiXgobV)iX>diaF10-|CkN0jCJ4DL9S)fckBzd2QWZ-4UM%deWhiRj*yP2g z&=m1YN{vfDt;qP0)7McKR&?qxwL0>g$v_# zCw<2*oPctw7258XGt`}-V9VZ*$34UNNdT4aEi|8R6itO7zlu4B&I-G=F_B#t-i)R8!igbuj>t)w)gw; ziPUR_BLYhNKu3y(=jS_nSrarT4e`}o&OKd_f0|OEJ>O3^4a_T2_7^T$V&@Up$qN)? zbPYC{k8mPj$t*OQx+vd>*sUW8I-c15w$I4oa+r}y#Kx(!MM6w?3bd@ep6Tc_J8C9p8%(Q{Pk- z>G=~!&pgtJ)f`NW2rAQ@p^!8jouS7ExH3>Fg^Q`Bq|;vy&2FqTkF3p`YRZd=kx2ve zPgxaV z0mC29;S&1LY&azEnA>h6HWbx4>ZanbJ_=yYKx#xqzIAH& z$7QaQH)zM~2hTsShctH#|08*@m)yJhXDr%Rw~gc?YhVyYmse(5iOhA?Kw=#Fe{fUT zKVa%z(rYDymC%L!75VO?J3wGS{}Vd?x2X9z)2&)%W@f5OQs5x%}zQL6CZDGZm#c}h(?y(Z!g6MSKVim>4ghnlFuMqW@D5+ z?eO)Kho+`)Z?6gCrdxjoqVJo0oWGl2Id$>kv2)RMk#9cA>vLajNR$5~s{MDkjQ~86 znVIpSRCdjab=lJG3qJZ2EB|S(X(s4CeqM|=?%^Fy4>cT30&MZ zF01z60VWj4N#1CB;Ra89OvK?UqIa2?SoQHF12hbq8@}>CvH3qUDxLca)1OZ7-9s<}rFUUL^oJ}UzU~FS8UFCH;R9aY1dS^RzY6JJ zJYV)Nn)Qciz)#4#L%{A6JArQl+0Jp=e8@Ho%oL=t1ZE~Jyzc5NVu1-51;1T?IK zoBc80-WLLMC;POlnA0F?`z4-AQ#{bIFg*8bE%4TM9(V+fv zqznf^vo~D~hUw=lItK|E3jjs7%L^?f7?=*{mVhxJEc4o4!-lC5E23#vfTBSD^YDm4 z^)Ov8BT+W+thw$W@%ON+%GBQ#CCxhNF*RCK zK2Ahh+AHaLWy!3af`Xr`X1+68JhTtQ#vEv2y=&L6XImdjG*8S}!VH>sVAZNs!F(ET z7wp4k@m}D;SpV4_i#MV4E=@g*xX2yQoCb0ro)`2ZR z!iwm1dHJ#5tel+I;(O{Du0*S1y_G*3I${CiSDglqd@3lUdjxyzss!5!tpy$o20|Zj zFPNVA>29mD>`Z7j(Hs<-R4>H{fSPw4IHlCO;7o{kEifEGg=n{}R1%5U0JN*a#4{o1 z0?78v@1ZG_txjs! z-8*+)l33w)Y@G;bkbu{}3X6zb0s6%$gvCyMTn%qj%0Z^m0rgTct#Rq8?|9V>&;sJq ze1}N~KH^W{P6=PFWU{Fl=*#e*9k%%`!qr;_wtU{dI(m?>oLGnnXEQ)c!2H{w6+*Q} z?Dg}wP`hl$sH}B>Ak`~cJ1Ny#&vGH+8Mts>ZWwZz>9MX3NlRf8?@5P7YoskN7(BlE z=y_IF7W}w~ICj+e2^N{bXMT*KLj``>mAPZnjidAIS7-E~QRCRKK?KZHkT;=7^DwuIr<;Fr@s@Ls=)+AMG)*_foP(j7Dp+|5rK`{cEjft_;%j$qB3pbonBUFkn z^+?;8e+b~Aa_A36ZykrJc|b&jZElur*8&E<_=({!(Zi7ZGZ*8WIb-@e5)RmP^VYQI1YKw$#MBmZaQXWGE|J6Fx>=KvV0^SkSWv)V;H&g zf;zB6GjuC4`V8*;lH1baqUO#V&X$!<=92bhny#-fV!|iR0HRyx1w2PxhEg9I_DXeGsNtk-0MND>;A+4w&AQOCw<|2D86Z{_%$#3(Y zzagoT(RvYo5lj2O@E6A-QOtc!?VAqZxnr?b} zpvc?&)Q(M(XgZZ%&OhH=Hru#CSatH-@f2bmhh6e2CPk9!2)fgl_}E8Y zS6NOILY)8J=GrM(Vzu`_ZSMWQ{~|U%{?<)jD4G84il1_MEXELgU?8mTWq6xML4Av-Q z@n}CR=fOaIYG?>tkQn-H&WH|8No6Iarb)1W zGb5-U^>(tdvgp+W(H{_3RJDk&AHwT{5OJJ-ya#oMa5mP|Y=q9?;A!NgZIx zU^bSkX9q$rSyo`&?eau&C@ZrS6mZv8T!yX}Gk776UqK?covsgxUJNt*cSCL`DTYd{ z0k853f+>Z3Ajr)xS2#9@TI|)QGqgDiXRFFox8>|`BFRd(F`>3HcjyzS7R)z;HdN*! z&`heK~~REQY0@RNp2;fx#QU`rt@JA2$cx1SSzID3Y7RA_QB ztBQD_BPTDC1A`%9TZi`(vCz!`C5ABnQ+}tw>2_h*JjOK_%gK$pJO)jVv#+qZum#L4 zN8h{dcI1+V{Lbl;U3`3}^R=V&{L#RuzY}P@NW*hY+7wP`XgrMY)J%<}+Yc&x#(~px zHrmp<SR-OBb7ZPur3D{WsP z-(2`FsI5!PaRu>{@H_F;A{u~Vw6{;HL_ph!m$u{(nf<%uR~khunK3Kn>NLz<@ivtwY7M3c5w}uVzQhSo9{}l62ci9 zvgW2#c3&E)a5`4|1)lXayqOHdDx zrIAwot{)p3(FLgtK~x*^Jus0YP((W#oryh_S)ZbRNahxR#!B+Xz=Jc=ym2Sxb8{BNiokk(`=Nu9T}r0OZUwwaxjJ_B^8+Rlq28u?RnnX0tP>Gvkvc;nw~?u^8t zz{cbKagqp-IM5o;UW|m%pqnOvy0hm=eLoO5v<&HsHEI7*z;hO zpV%OiHT$U&BYEQFsCYWr0Y395usXhYLnvI$wED0X(F37<@cG}zn)VSxC`4C$ZqGz= z7iJQtJK(+9UyzqaEY({G_7|Xq>486I>|kypEwx)}(B2j^bHcU!b14t@z;)@?ty`hP z95B28rp0Dh{M?L6-k%+0m)5PG!iJ4!H@yeRNgh_>dtRxNn}xk9^rY_Q#F-@Py=+dQ zBn6+F!m|a{TU^9YoMn1WvNXGD#^HZ)W%M74FSY2pQA(fgzpC^?y$w!PS&5^HVdT zG_A!0M)6ozXGG~FDJG3jb*zkKK2%qv_yXRukRXVLyDS+Bg|i2T5{U*ypx?9<$7?2Kq%E%{pies+=r8WEzT~>qNmJQ==Phe znJ_h2wT9%;d}GZ`2N6LsM{VM9_&jK>TiS2Q*=f)?+m8ji>q~XWN~Ji zTlC$&-tAF5TJd8@Lsspx=&5aez6|N&9v6dacK@6ggE%AX@iW3$Ss7u=ub~f2hc=P0 zIwfv2IrA47>^LCC441%IL*AFCg(%n_NYmNs(6lGj;%;z3O9pxy=jsI(y)`dfN}#ER zeo^y-J+2tvWQRRq}ACSw!^XT*Ik>SuH`tBMHE4idR z^`iLxo|G|z9)q5eHzq$rASR};B$sO{Rxy)$9sShz9LCOp_KZ>0kEAaEzaWEoUs>5; zXu8kyU2TMv1er|5W49m{U7n_{3(#Yfar^f(UbqFbnr|zru3o=|P(Y*0-2IBa`oB`W zZ28!Ro9A01AFTdXqjrRH&}mG-ZLg!^QOB9ZoV0+nfOOsFtP+M(q z=f=^AlR(W~#THqDdm~(;G2RI+VPgVH7lu|7G>v1f^GJY8MbAShj|2r_;v-VW24Mm$ zy+#U=AZ>!X?mqqP(X(f+Xk#U{*Dx~jBQoaC$D2qv##HKiWj@;8)(KD!cC_1Im~Lrl zsj8}qXM**xRb#^0ZIo@`u^h&-3FA&sRGZSU56}7HgccXOWb0ls4;@ z*r=qIQc;RB$h~%5a%*>z#D=v^7ey(PYokIj#E8m}SZy~nE;a7fE%(HsQ7$ucKCkDT z=REuW{^j8h%zIgMxBItjQ4~E zMNyG=05;MlLXQ4|-D*(4OubiERJ;}+-_w}wl;7;nRI;x4e{luCw%b@ZV713aK1R!5 zLhHguiMn-d-H(+VDEgNs3rv?sqBsnm1JeqrMyqJ;BvA?(8qxvDhM3U2_=izqg+f&IB_Hee6LqYUZXj6rHc3W+u`(;*{srL+8 z5l6dO$m?QSQNhzp%41Lm>$RuGoR!D>qJ`K=(rP)w`uv!tc!845jJSw(Z(EqCJTtj zI2}Vjgxa*SoR4i8yA%>nC@LzdhYj5#$O3?nrcV6Vk0+~jaD18NY;KR2$Xt&-rNMP7+P^s1URX0BfTTZ;kQ-{cG_vw#q%tok{PS=FLtc2_roq0dJ zwB|B0)=N)kgUrdu&~ctPg9XRZN_3%a#fDS`hKw}Nne)J_4fm=h0%mUA%YOKC7gn zayOv`8KfguC(<2T>M_cpcvUayqF7Vmw~>qN9udPDF1?Me!We8jrc0sg%sg~V_R^+}vLe5$ze-R_D1WuH*be+58B?%;bbKd#=s1@6 zanzh8cGmr@);VGL`(X|9+(&Bq9{K^o>D3!_cCoCjb6qly*#B74#CFfJIC8)_Ry%%H z9N1s9=!DMaZ-IMm1ziDftwJmu2hz&6NT3%;at_=UN#I=fDtl(R4$@!;uRSj*-ADLX zY}P}R&gji{GvS?<>qWhrMbzYp1W#o7BSH=j4`2UbvCkWTDt2SwKHz3_Ma#^eBy*=R zTMRD~VG`UTN&UuOtEu^8PZfij51|u8U@rr^Xyvo$(fCy)e`E9zRQpL`0?Z3+C=Wl` zN#ubxbqFjjUOsx+^SR9^^>w8^%SV6|yVHV{b8SrSwcOpW&d<_Q_w?~B-#frSz_4LU z`TUQ}I}kYv{Pfz$f$A@3HELh_)M=0OMT;ULVn=qqxYyC16L_O*$@oyqs&CeshWGKF zzEHf%cF=Vxa%N2a^H$H{Tgl0XL@HrhC*VLu1i6e+Q>6AFN@u+733h@4AB={?Krw)S zd!C3z;blX91nov;;Z58Q+Gj+4>SD63a_>dazq#{5+gT#7g8^ZdY&b+KDuQ->vOOIt zy_)z4!FvQ7_8$l;0x0Q=O?~C5&-IhH>}QX%_xX3xc6=w{#2i7w9HF%+3?IJ_NMbI3 zO0Eu@)?49?&12vQhw3ZAEd*@KWQU@^)m1-^HkBZIALK(g6bd(VD@Dci7A^c~8}oh< zeOVJbAvxZyoX)+{{k=FUDk0%gbwhvjZ&KT%#T!jFY}D#np;I!SyKETN`UKCu-ricz zANUH8-kFi+@>HE~?Fga&~W*0W__^GDgX4jmS(PFW-m~N#>iVjvU zqvl`Iva%bF&F^Xp;Ah?$cBlv`?w@8}qqclTXk(s0_p{=-#%%~L7%j*GM;FF*VG+qQ z9?`{-7k4U#S`I+{zFIN|K{VzC=}$H^yG{WU&WTc6xibF?z!gvs6TyRVfbWNtYe&^X zyMIkK^4aVmaMUn@UJ3vB<}b>AnW0N_0UjrvD-HrN(yu`+rq1B~E;u4Sbc+Div9@3;iE zN^Se>pHRCHx21!9h`XJ@DeDR7Q7s`jChzKmZ&5W71Pt&A^7g9Lt7%7QkI+;*#pR@? zpBhN+sLLPupud)_(5`@y%ss6>>93DH0;$B!rpth)q z2u8Jwih8^u;|0z+`aw}1g1I8(+?zLVPMO&`Fna(349wKy zCbHQA3}hy#JvN*Tp7X9_oqn|@@fUb;nz-51WiYv5R(zL(+({%m94hV5T$;|lBm?t8 zF22Ln&0@J7V@&;n?`}>gaEk5jm|4T!jB@OPcXI|pq+;0x67wZ%w^i~q)P5K;z)UWj zxw!7h5E2A>K>I2Xpl;A)3U{F9gC(}#(8!23hw0&vd;rydIi7=DmapX3MV3eQpRLg^ ztDVWOdG)+>)X>9`rSuksh8Qt#k=jPvT;H|eG~G^m^AFUaEhodZT0m6omWzZX>-s0? z%&siF21-|}sFl=X10yA@6Hii+k5Z4^!#u#l2d$hA*;zK@$wGxBK%gXcV?L2GbMu1I z7op!5xn~=v2o@GgBZ()O`Ae6A^M!sU2qeIe=9?=-0vJ^}?NW79vx1(*A3iyLb_^n$ z3Y1KhIm#6f+tby*)UsaCR!|u4F7H`#i1D<~vfF~Ko#@S8dU@G~5hT6>dO=kP1U)dW zJ;Muj=;a>J;ijt_*X{hUejcBNvL)*)sfk0f`z;-^JhsWoGrkx2DQ9iBu+V)+M(zON z@@FiK(%U8TaLanNwu9{w`ZE9JOQaJ3g*A>?!wNX*A(>Jq*3s00%c`!zcvYfZRh5Kyw zc(rd?{Ln&kHIWDN#@U)|@9;RCvzsvj7eb87Dv}&|I=Oa~n_n6<67uG6rfU8Uy65ls q9aUm{VzHRM^UYa&Mj6trN>R?K>OY)cd4&9gVr98+N4|w;^nU>DF3F?- literal 0 HcmV?d00001 diff --git a/uploader/tencent_uploader/main.py b/uploader/tencent_uploader/main.py index 6930aa2..4af8316 100644 --- a/uploader/tencent_uploader/main.py +++ b/uploader/tencent_uploader/main.py @@ -23,6 +23,8 @@ TENCENT_LOGIN_URL = "https://channels.weixin.qq.com" TENCENT_HOME_URL = "https://channels.weixin.qq.com/platform" TENCENT_UPLOAD_URL = "https://channels.weixin.qq.com/platform/post/create" TENCENT_MANAGE_URL = "https://channels.weixin.qq.com/platform/post/list" +# 图文发布有独立创建页,不需要在视频表单里切换模式 +TENCENT_NOTE_CREATE_URL = "https://channels.weixin.qq.com/platform/post/finderNewLifeCreate" TENCENT_PUBLISH_STRATEGY_IMMEDIATE = "immediate" TENCENT_PUBLISH_STRATEGY_SCHEDULED = "scheduled" @@ -697,28 +699,59 @@ class TencentBaseUploader(BaseVideoUploader): if any("open.weixin.qq.com/connect/qrconnect" in fr.url for fr in page.frames): raise RuntimeError("视频号 cookie 已失效(被跳转到登录页),请重新扫码登录后再发布") try: - await page.wait_for_load_state("networkidle", timeout=15000) + await page.wait_for_load_state("networkidle", timeout=30000) except Exception: pass - # 注意:get_by_text("发表视频") 会命中一个隐藏的说明

(不可点); - # 首页真正可点的入口是 button.weui-desktop-btn。 - publish_entry = page.locator("button.weui-desktop-btn", has_text="发表视频").first + # 注意:「发表视频」按钮在首页的 post-card.html iframe 里,不在顶层文档, + # 必须用 frame_locator 进入该 iframe 才能点到;用 page.locator 只搜顶层会找不到, + # 导致走兜底直接 goto post/create,表单 iframe 只挂载空壳(Vue 不渲染)。 + clicked = False try: - await publish_entry.wait_for(state="visible", timeout=30000) + publish_entry = page.frame_locator('iframe[src*="post-card"]').locator( + "button.weui-desktop-btn", has_text="发表视频" + ).first + await publish_entry.wait_for(state="visible", timeout=60000) await publish_entry.click() + clicked = True except Exception: - # 兜底:按钮没点到时退回老逻辑直接跳转(可能仍是空壳,但保持向后兼容) + # 兜底:遍历所有 frame 找「发表视频」按钮 + for fr in page.frames: + try: + entry = fr.locator("button.weui-desktop-btn", has_text="发表视频").first + if await entry.count() and await entry.is_visible(): + await entry.click() + clicked = True + break + except Exception: + continue + if not clicked: + # 最后兜底:按钮没点到时退回老逻辑直接跳转(可能仍是空壳,但保持向后兼容) + tencent_logger.warning(_msg("⚠️", "未在首页找到「发表视频」入口,退回直接打开发布页")) await page.goto(TENCENT_UPLOAD_URL, timeout=120000, wait_until="domcontentloaded") + else: + tencent_logger.info(_msg("🖱️", "已点击首页「发表视频」入口")) try: await page.wait_for_url("**/platform/post/create", timeout=120000) except Exception: pass + # 追踪:点击后各 frame 状态,确认表单是否真正挂载 + try: + frame_info = [] + for fr in page.frames: + try: + fi = await fr.locator('input[type="file"]').count() + frame_info.append(f"{fr.url[:45]}(file_input={fi})") + except Exception: + frame_info.append(f"{fr.url[:45]}(err)") + tencent_logger.info(_msg("🔍", f"打开发布页后 frame 状态: {frame_info}")) + except Exception: + pass # 上传表单在 micro/content/post/create 这个 iframe 里,domcontentloaded 时它还是空的。 # 不等网络静默就去找 input[type=file],会误报「未找到视频号文件上传框」—— # 失败截图上左栏渲染正常、主内容区一片空白,看起来完全不像加载没完成。 try: - await page.wait_for_load_state("networkidle", timeout=30000) + await page.wait_for_load_state("networkidle", timeout=60000) except Exception: pass # 静默不了就算了,下面还有重试兜底 @@ -735,7 +768,7 @@ class TencentBaseUploader(BaseVideoUploader): fi = await find_file_input() clicked_publish = False - for _ in range(60): + for _ in range(120): if fi is not None: break if not clicked_publish: @@ -1288,33 +1321,13 @@ class TencentNote(TencentBaseUploader): self.image_paths = normalized_image_paths async def switch_to_note_mode(self, page: Page) -> None: - """切换到图文发布模式。 + """切换到图文发布模式(已废弃)。 - 视频号发布页(/platform/post/create)默认是视频模式,图文需切到图片模式。 - 优先点「发表图片」入口,再尝试页面内「图片/图文」tab,找不到则按当前页面继续。 + 图文发布有独立创建页 platform/post/finderNewLifeCreate, + open_note_page 已直接导航到图文表单,不需要再在视频表单里切换模式。 + 保留此方法仅为向后兼容,实际不再被调用。 """ - for label in ["发表图片", "发布图片", "图片动态"]: - try: - entry = page.locator("button", has_text=label).first - if await entry.count(): - await entry.wait_for(state="visible", timeout=8000) - await entry.click() - await page.wait_for_timeout(1500) - tencent_logger.info(_msg("🖼️", f"已点击「{label}」切换到图文模式")) - return - except Exception: - continue - for text in ["图片", "图文"]: - try: - tab = page.locator('[role="tab"]', has_text=text).first - if await tab.count(): - await tab.click(timeout=5000) - await page.wait_for_timeout(1000) - tencent_logger.info(_msg("🖼️", f"已点击「{text}」tab 切换到图文模式")) - return - except Exception: - continue - tencent_logger.warning(_msg("⚠️", "未找到明确的图文入口,按当前页面继续尝试上传图片")) + pass async def upload_note_images(self, page: Page) -> None: """上传图文图片(优先 accept 含 image 的 file input,兜底任意 file input)。""" @@ -1366,10 +1379,36 @@ class TencentNote(TencentBaseUploader): await self.apply_original_statement(page) async def upload_note_content(self, page: Page) -> None: - await self.switch_to_note_mode(page) + # 图文发布有独立创建页(finderNewLifeCreate),open_note_page 已直接导航到图文表单, + # 不需要再在视频表单里切换模式 await self.upload_note_images(page) await self.prepare_note_for_publish(page) + async def open_note_page(self, page: Page) -> None: + """打开图文发布页(独立路径,不需要在视频表单里切换模式)。 + + 图文发布有独立创建页 platform/post/finderNewLifeCreate,直接导航即可。 + 网络慢时表单挂载较慢,拉长等待时间。 + """ + await page.goto(TENCENT_NOTE_CREATE_URL, timeout=180000, wait_until="domcontentloaded") + # cookie 失效时前端 JS 会跳转到登录页, 提前发现并报明确的错误 + try: + await page.wait_for_url("**/login.html**", timeout=10000) + raise RuntimeError("视频号 cookie 已失效(被跳转到登录页),请重新扫码登录后再发布") + except TimeoutError: + pass # 10 秒内未跳转, 正常 + except RuntimeError: + raise + except Exception: + pass + if any("open.weixin.qq.com/connect/qrconnect" in fr.url for fr in page.frames): + raise RuntimeError("视频号 cookie 已失效(被跳转到登录页),请重新扫码登录后再发布") + # 等表单挂载,网络慢时拉长等待 + try: + await page.wait_for_load_state("networkidle", timeout=60000) + except Exception: + pass + async def upload(self, playwright: Playwright) -> None: tencent_logger.info(_msg("🧍", "小人先检查 cookie、图文图片和发布时间")) await self.validate_upload_args() @@ -1381,7 +1420,7 @@ class TencentNote(TencentBaseUploader): try: page = await context.new_page() - await self.open_upload_page(page) + await self.open_note_page(page) tencent_logger.info(_msg("🏃", f"小人开始搬运图文,共 {len(self.image_paths)} 张图片")) await self.upload_note_content(page)