From 83bc90ecf2193ee3127140177203b84ea967ea3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=AD=E5=9D=A4?= <10372463+ming-kun@user.noreply.gitee.com> Date: Thu, 30 Apr 2026 10:52:52 +0800 Subject: [PATCH] modified: amazon/__pycache__/approve.cpython-39.pyc modified: amazon/__pycache__/asin_status.cpython-39.pyc modified: amazon/__pycache__/del_brand.cpython-39.pyc modified: amazon/__pycache__/match_action.cpython-39.pyc modified: amazon/__pycache__/price_match.cpython-39.pyc modified: amazon/approve.py modified: amazon/asin_status.py modified: amazon/del_brand.py modified: amazon/match_action.py modified: amazon/price_match.py modified: main.py --- app/amazon/__pycache__/approve.cpython-39.pyc | Bin 32692 -> 32800 bytes .../__pycache__/asin_status.cpython-39.pyc | Bin 18497 -> 18497 bytes .../__pycache__/del_brand.cpython-39.pyc | Bin 18509 -> 18616 bytes .../__pycache__/match_action.cpython-39.pyc | Bin 19276 -> 19336 bytes .../__pycache__/price_match.cpython-39.pyc | Bin 34595 -> 35376 bytes app/amazon/approve.py | 217 ++++++++---- app/amazon/asin_status.py | 2 - app/amazon/del_brand.py | 9 +- app/amazon/match_action.py | 232 ++++++++----- app/amazon/price_match.py | 308 +++++++++--------- app/main.py | 2 +- 11 files changed, 473 insertions(+), 297 deletions(-) diff --git a/app/amazon/__pycache__/approve.cpython-39.pyc b/app/amazon/__pycache__/approve.cpython-39.pyc index d86cdd4d3588961fa0d2ae31faf533a61d37655c..84f4d46d52e464065f3b2b2fbfcb42e6db0aa3c7 100644 GIT binary patch delta 2195 zcma)8Z){Ul6uDX>ML zvI!`Eta)nGtw~G#6Fz|GkSKw~FZ#jw$rwn6pETVv6~RRKq``A;yD<_qzUKbkx##aa z_nmXL^LJ=rNbz*J-8zA1N$YN9ZVHb|wDpXZ{W;xVO>FANk6Q@c?&rKdbQabxy zY4q~+yRU?otqo5XKby{<3Wt~dG;}OHb!K$hHuP%ggUj4&KHa-Y;Tz0>-WH8FfeW+P zyIA8CsjqvVH^+F>y3MC4Uj>X?HViR(xpekIID_RHp3IF+oj+ANaxt8#!+q(k!zJ_3 zjZ4Q%mxf9o9V@**GL<{r*4Ad$^7W30kFNwJe%kCvKbCDo@*#v)guMs}fQXx;D?R}* z;fnQSl4;%-O?K^%^KX#y*8BHV;=|@%Qz0Dvaib`jG9-x}2UD2sR?Np~8_$`GU?s4anJ1g~B zP^wc^ae+mM>Pk@YfklY6SX|U)@2`FQzyaQKFuu7f)!kN!YQ?Y-%{-f~3&pG$x$;!O zdv+WQD(1$0JF`qT98fP-LE)>bLMy7P)(LP!m2a^SiOc=NIPMHO$3V8Jxp1ab}P_k zK{RFaq{EuLoESnn09oMQT+FelExUt*1k0TTZE7zP7;1D!>vqNP8opV7qU^6=fl=&$ zet{4|x|%O6;9vo?pX?ghntP?BUU)&$Abca8CZ`KPt>*zi6&me+?YV0f$h90tfIFH928%@aZ|FZx>7pe`Ut1 zY;oEt{FNCiKaHHR0mDD&PwFj95;$aYw6}fEm9~^W1AeQ>lJSY241Ixnp@1?zfZ2gi zZrj!jN+Qck7tPX{cgjPdHPaw@I8H71`J)keWnz1YsROq{=* z3l~urbYy_4-Ag*+Loe9T1gzV5t4LtT(3vT zhGHFQBMFEZBmM)Zqht2PeSap{2jj_L6wn0Vc^RJc8I}D!e%Q*?QSUU~iwgMAoY_#o zle;Oh72>1yGl(?M2BNJ-u<}zc$Uv#Sj4|Tc<4OS=itr6`-DI3%yS|Jt%6M!q@d!U` z`>4WKeJItVpbW&%Nf?Lpqe zI*yDX(dcy?(!>xzmD0n+0n;powZ5d90TDIeW{_#!34m@8T1VwIh_tB4f|s@n$*2dK zegI82!W1LCp#p2GJG+cq(L=YQ{$&-#YZ|*^DYTmS)>2|OuLX&hD&-KCW_}cz!74ou z-7*^{y9KBXkC9U4Fo6qEs*<*I*bMeT0R?&D58#3=pv$@IF7z`ZMxqMY0@^v48>)>h z$i^>||4%JB_Y;H*Jz_DZR%ithho(Y;#PH@MUMlnvwJlHsQk03&;4}t~O9jP<3yd2D zQ8txiQJvF5#b|!4h3@ET_Ov_E;J|J!xxKMhm615)$u}f3Y)0IXD3+0T0@^Z35^tHO z&x=qURE7XgRe22!RVUsOmZxbLEL&&BauJOgx zSi;K2U{!hV-T8AD7R%o*mM&C2yL{*B=g-Bno4Mhe(w(o*&liddS1&9UPu=CD04ugj=!bK|=&vKFE;v5(AAUdM#!)(I3p$(2_ zQyC*SkUBD^_j^WCL*oNudfNCMd~O8NZ;xaKhX>Nx!9hKpHg59WJzVev@C`GJaf7?3 zj~vyFZlN>uAwy3O4+xv_K6k#t#rj90g|8MsJg;nr@6;TukWZ5XID&mxlRfY#Sdju) z!EM+l`LKjNU~4gBk1uLeFbtjOG(`+9IANUm#wcp5}$ z2C0Fr5$uv1ao_9=-9Pz?^qazVQ5&yf*J%sB&;F+S r*h^*?eBrZZLTR*+pM7dh&f$`u3M&3kTUM>b85I_Gh(_|yBl_ewVW)I8DER0s0W$b>jGA3*mcd=w-EZZFD Nx|xZwYBH;b4FK_s5a|E_ delta 58 zcmX>&f$`u3M&3kTUM>b8Xi<8TX|a*l%94?Nvxntn7Dk)RGIqaM8Iv}PyI3+ZR%{M* N-OR*TGnv)H1_0;=5V8OO diff --git a/app/amazon/__pycache__/del_brand.cpython-39.pyc b/app/amazon/__pycache__/del_brand.cpython-39.pyc index 213f2a36db0734a81cc08397f531e4b5a6e1da8c..6eeeac4b54e9a412c486263c358a29487bad5b8a 100644 GIT binary patch delta 1451 zcmZvbT}&KR6vyYx%zgkn`@zTZwS4aaV{0l%p%s*`vRG{-wQ6*|;tOd=*J=k~il3<+0-trewpro+W)%jk?;9>d!HlTDN)SOF(2E?VkYn78bi%atd8AE- zY5sH5AxB!cr+G>9UJbUyMi7&T3kZh5OqS*zJp`p(*Q>--2laa{ClUTkHQ#6{=3hOg zSw~v((6C z0E^r@Is~I!Y433^WBhe~vV8y^SZnP+%B~IJiLynWJpKrbS~rgu0ucV`6EDIw4xKx7 z`w5sej<|tn6398?6O$Q}t@8Vwk!tLat)Sb*=5$K-q+k-c9oyji>-+#zX4d{t=-e& z3wOIumgC%*-SthOa&nrnRdikF1wGF|oApwU2VC326J=XG-n$I%@IQM;or@Sl`Psfl zJN{eYz{Eeon0FEOEU>KMA~ZowO4tp4uP+F<`Ci|%;^Kt+&jW1nwG$UxM@5(}vn9-H zN1ey)9qg_i9;aP=zi-|(kbqbD?m$n?|IO%QtaJx)*B;L;AzS1F<8cSvL3WFGM5E44 z4Eum*qeozeThYT>)BcsIL4Sfjh#ph%w(^F-(+M0i!(zU3St5ekLEX$wwZ zb?GJyMA{vrW^N2NP?uwLDs5;XD6!gR9an7G`H{_#3_6ybql|S?jx=Vxd`kTQcc{X zhU~khXtktP^H3M@6hL&Sq50YZXkO~wtfQVS(0s(J)ss4{K`4G&FO)`M?cb6_uy?$P zHW1$$XaU+x>gfR*C_q6LZvq3-X}{JYB3o&T$O+PB+Cmy=u%Licgc(19m!z=&0q*`p z7|Pb?lUd5*soPMlu=S6z^kgzOsc(V;;L^9{9T|N3aq}w*g!Egss|t+hJ@zjF#`Hhb z&t;g?xvRqrSNPpp(xixzvUvK%ld%hAr3EO!qP!rBmcWyq4L8G}u)^xZPuVn`W?4Sq zZLYeDDJB7_QlIsHYl3@vhyQ@7DJ>Ls3gJccA_fp|AkOeiU=XJHH-VE-saG_I6!VPG zqk5$E0>B)<6KphRgm9LZgI$o*J#C#bNHJ>>b2BVnHBm zH}=im5gTa0GL z9$y}x?j{Y37~*^g7Y3VC>CxoWF8{0heCv69l}EgbxPS;E))7|_*KuIpOTt_Rai%t5 z*uW$^Ubi{eCH?zj_W_pqC(q7`y*i`M`EY{FSpUbuD$5zh)=*mIGtuMFu74M`gLP9V zF?NIh+`9@N^4I##T9z<|@E`jQpZITu$7a8UF&`m}sbE>nN@$8^DS0%bupoG=VYt4dDsTO9*bE%#ki~dL989Nxo_x@+O~I-noytMFAg2y z>q9S$;;4-}%xLCDcN*b97}vR0SY>M>otw(Cb8H)RJTT3YnR_#nOR&8ap}d3WMHu%- h$xP(fZFIj7$Li&$hl36~h_B+dIPy|n%JSlH=pT`SO?ChP diff --git a/app/amazon/__pycache__/match_action.cpython-39.pyc b/app/amazon/__pycache__/match_action.cpython-39.pyc index 39ebc21a10a2fa5abc6602bc077b64564ac018fd..726e545d4dc38092ac22bd18c71f0b66339409f2 100644 GIT binary patch delta 2372 zcma)7Yiv|S6rQ_F{z1?n0yDi(YRDrJHQ9-n{RjCi2KB6{38%?uzR;-0>ncbDN z&SgQWKoqmds32|4E{V@5K8i*`e8d-OO~4nrMgesTjlcYXe~iI%?zRPfXzb1X_RN`Y z&Y3xPzSGes>GoaJjQV^!fxpn`A6>OOUo+E{^niSnL{XpgsDPj zS|tI?DKtRWuq#I?0k6ATqAch-}; zAY&R5wP2zQ?W?^YmH&UHqFG%iIchlt#Nbcb2}`jS!{CLJ)2tU$+Wr7~&K;MPS!oyS z$`C3m-$^YGINUaInqAC_q)&M8w5)PiD^`U<**ApaS5bw=v>@pwJY=82ja%9f5>DX~ZsEB{ zg&S6rS^#&auzlOu&b@{0uZ}&st*~!TVeruSQxApbT@@bBy)iz#Hyob#>*hzor(PZ$ zcWvHLc;*l{<=VzY3cp6~YMia{nGixAYMiBUiqlz-*44vA)x3KL%_>A1xR3jHHS>}oO`9hfEJ+irZMYbJWiV)S6pyG!WAv)V(P{Z9{J}LA0=TbV75vP2qxmNDJ)K^jliKmplP?7sD zZBN5Ba0&{aQWaWGy;HTkmSOoUQ+T-$2E4w+DDwy}+(%s)fL`GPG=v+_Cv-q_*lU$Q z995LC68ma7gzJ9755pC4R1xOa2w>?I#6emJ3*1KFE}B~@quoj-O}U9nS(zQMeAsRT z!VUn+(*G^Qd26N>!@))>ih=?4xpU+?a@XlQ70YjxPDSf2M$0;|)8-V2-;3v0S(R|W z@@ml3blktKw~##(5`LJe5v3q)6|eqOu#bd)Vso`EWWt(p{z)f%;q!g{6%f?}F;tpz+zi*!VJZ!@~3GQCF-X z7CLg#$e)+@(l!%5e98|nrO~32>Qg1)j4UV|kcF3b7j;^nLfJ$X6y=3-1+`9!8tn1h z+x7iQBrG>AS$usLQ2B!htpGRi_W)BNfbiJsxv`-g<3pQIKf9%{FE_U1?NfUO3Qs&- zkX!isK;R!BYy(&(pK6+?@dv<^pERweh72^<&p3?Jwrtm+bpYW?gk1oUGWlF{{Z;%U zu=DP&_&q%x>thL9vixHteS+{Q0?IM(i*eq=k&}q7jd4^Ux8#Y|V8cN$E8%}$0-FQT z4Tnhss4~!+u|@?;IctErE~W-3t(>YOKezm@(9cFbzxr-UkIH$i4_Ez&(T)P-9Vxyp z@9K^At?P+0{+%3cZJ@7?{N1|5;XHz*uVl;hqgQ{8<~Io60xXND{CON4L%?suzXwR+ zCo2p-{o6a)QwQbP(?d;R{sT_t}m8tt5q;}{bcd){2MdJuj>n2%sb{u!;~2q)yt z%WLRKxqf-XKecWC3r_tCyPd0HnZJ|AmS-x<`0ePv1EC$^ON0}0(~5=kuzYF7;`-U( za61&}Qugzg)8qF9OtW2YBWIyYoi%Q7FRf0KYUx_Jk-jU_D`(O#WNzhg`k~yiY7gy{ Iq16rl07fl%x&QzG delta 2334 zcmaJ>ZERCj7(S=>w(Gjvt{-FF#u(iPW5Y4W7!sf$@-a7vf5Zq(VcB->00$epZ6#f9 zslwbeGE+Gs2G*oqFn)x{$Iu`QqA~t*>O@5xpnvQJN}|7wQQ!BpWm}lG>2uFH?{nVw zc|UqzK2As9q_!5T)k5I&Ov$}HNA+{Iu$!Leuel2yC92HKgOp`5ORurX$V&NT_xz4B z=3+U$v?-Gkam<^#{eih<`~8CytY#qbk(OY`|3k1Wp40ev?3t%sj)jgeO^Zwj-_P?q1M zTMp9=Btmyw2q_WT8!J;vXF5_w|>0Buje^&4>NKwbk%66rLp%jb-bgK9r?{ z6YZ!7I0tJHH6$~kBx2|;?936CTu~)=R7%V5Y!cxOK}beqx|UJq+-ncn1V2yk^HXBN zBr3B4%o~lmE#`=m_vpj()dM>>ecM49KJq;3XM4Zc>E6jLY~H7{xmWecy_sR)vu z@jOV^cIp|rluuZZk%Zx)EGH82LeaO7o?Pgm6ALP|&QEpDpUUW7Dx;QAuQ%ETOFBK2X9`>!#f)PkMtt>%wTN zHnBNzvVrWl^QbQhCY1;wDQ~S? zz>m~D$=5I2Xw=rhdy<#0S|%UD#qGM%Z~$MSiI@8)28Qm&KfD_qN}M`(=fc}7J%KVb zoQ>W&b8I3qIC)_xapdE>FAYrafnTl+CXV$b_=}#3$S@;s?F5Ri@X)ImcPENp==Wvw6_q75WENr5w;>+0;tU4s<)zj zTxshHbo#Ymb7#vwb=(Y?!YuTl0b>d7@+cnj8D{4YmB&h9$I&7d95l1z}?5>l+WyPx$4=V)`k+-S{*8 PoL|{=f;#xN%{Bi5FDzx` diff --git a/app/amazon/__pycache__/price_match.cpython-39.pyc b/app/amazon/__pycache__/price_match.cpython-39.pyc index 6dd70c021beb9073fec6abd7ccea8117e8805470..818c7a4af48ad83c3edce2a6dae9af7c37387ac1 100644 GIT binary patch delta 10116 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ӝs zg!PM}2wrhxz15Fz`fw}wZT&$gMiuH$xCIt4f|EbRc$x~`Yy*ymKE|IKiK*~E3W2Ur zAH2u~32quW62@2)h_ODuOI-I&332sBU@*9M1hxDw24xF{N|Gu^joL(5*BR{%VcbuI z;Eq}pAj#UpKX_&<=q0bHLz|I`94FjzZalm>X6 zd&^bCnkOONltz17!DNOlTdDA}ek+=+mHOS&mTbfK^yO#~bWMJjFja@R#q=9i+%}c* zcno8;OxwyeZL3{iDkqw1s+*&)8B7I%9>#GBL$#uvd?xt+kih{(m({4alk}AczX~r0 z2BW$hfo~{cIMgrTem%hdaBneb<{9@jbcnP>B!pNoF)WirmclT}74HUE17eK`jw3)H zV|cu`5c?efKfV*_R05rSQRYC8mCe6@U+Sg}&;@I%q>h0@;>v^Uyw bJPELAP8vc*;D~K>n#BG6C)Uajq1XQasR=q; delta 9237 zcmbU`Ygkm*wP&9>^8^M)-U2en%Ry8?z(-I~6dxf3pEOj1Bm1BuFoSyrBjn(y7>&7_ zV75)8VgtsuNp51=Ox|kJCh7O}Yn$HYwtsrs-nO?6N^-Ah+BALLUhi7_3=fUzk2^4H z*4cZVwb$#cz1BY8Iwe2-s9fqzNN`B-i5&aA@8QoR>34WB^<#mHTKEQQ$;r}>HxpJv zQ)ntpqvTb!S=`AziH=pLU6sXfxx0 z0dq^CTBH^Z5F$~sQS!`;RLdP?n+&Ve;YtkvG?~R~gpv$tqohe1{PvqP6D1vl6~MSG z#!b`&*OhRs#IDV7y%Mf1culRw*JJBB$)_s~>!Vlr)z?pqKKbJHqt8WO`}XyhU$}Pc z+3Q!nG5Xb4KfZi?^!TyS1DCE|dJW003|)Kv`KzxVhz_0@JMeh)=wrV-aLD0~eXh+H zpPw${A?0#*8p@mkK(Z*rCfiIl68n>Fyvh7i@*Q4aSr8sOaOwJ6CqKS?Ci?J&(I;NG z`ud}|!kfoog==RHM_;=LD}xl#ZyXx^+R*5~9E)B)aQ)Rt^ukjxb^Wz-IQ8)9YtNjB zzIAcz^a&8{+Mze#e-_AAHn+-i_3d+`#}8h;{ABczw}E!-$(Kf7I3GRnMD)UQSKoR& zdQlky4fqC2*j0-176^HTtS0`SmTloq7>F5K)?{JmjB!I#7*QmX1ja2DCST}Rh~&48 z8=jhC^Ac;I=z=dz%nL^VKXZq|C^`i05l#iC)WVYEHsu$sGt;84zkdCjhern@-pX$>Qr!Ng$TjM&#k6z;dx^JP|Z*oc$Qi$5+Nim!lpli~|esCh!Y25N!% zO+tL-HgOkC5!Y=9Sqbi(h?7xXV$aSRGXdEc#xl!644)sCiwwr|SX0BA4?fOLx@ zirhDk@3Cd_U)$d#9)8AAPImAgIgZ4Y041A)AeEP|Pv+fmN)`s2FosQ*NqnkI9Lex? z!8bATSlm}-i=Z#zrOsTU^9E;Litb`+TcE2;^;4C$b~9g_s`G=+G*ZEzbcRTPCnQ#p zx=3B(F+#r0-%rXXt0JEytswT*xbhkR{H80Fub*~kH`)8fa_n40vHRT~RyLAiE1E&278Xwhs8|^tE+(%xpbBoVt}m}t0J&^??3>7nCd__572hoXCSE zKO|%`UtPM_f*ys~dAGD~;bufP0ciAC4Fhe*5eyLBPJO}dPH!(nr5t2zD^A=8z@va8 zm(HmpS0jh!JSwLd>~NMKCi6#Ggh{ceaMxj+6rPcps$1KAe(LS))J;BrNH;UDf2Znk2xIDT?Y>U%XKSdpTh%SW zjvk&-v5WjEa*dh9>jr-2wVs_f-MM8B~QX_rV&C; z5&RLPqzFzU5JI0qOhg;%jKL2-y5bG`{Okmx@j=zg+IF@2{M|j7A$At&&*Ow6HnAh* zXG1)#Dwh=U>Z*Il1%9~dWQmaU&L&3=Li}eCdz>$;E?Id8(=#F3q}jiT)Dt#F@8ZA( z1VaeU@)xR$$X$`2Rp*k~7`3`3M%k22y`$)UIMIzFmyeD3hhBHP0*OG@7S^@mCv@BR@K496fQYH7+*9>iv}eYt8KB$3xlL47vdB%hhss=V)I5Wpb~5d*){iY8eKd>1_;y%@}R=DgOqn^nY3m|o+2kwEdi!TV!c3(uy}wWz;ernCA>Zqo|sw@jhWfJm51KU;7@ z%anrd>%ixpvyzskm1wiIQmqj1qO%fR7p8X)ISh09PiX~OVY<}sxx-T5nX(iH-PEP- zB--z%(El^h3R7sq=VhY}^qwKRA(mzvF5pXQi>(`)r9s=C4Bk`4MRdi-eg;u*{?qx=LE!bZBL zZjnW#w`P8{ZWVbr@_t<&Aq)7&D|>8^EkoW=Pmt49mE;Y6deu+JYQDQZ&vq}Y;34b* z&g+ZGe156EA?^(rVwVwA@M)_*gFI?q(?%+J*P8U4i8(!KN+s2Vg%rEON7gJ%cZsU1 zZWre5jbcsq9`NG-STnuUV`mc#*xR_m6$IZw@LdG&Ab1zSd%SV&>2UF6_JT@74Nb|` zxM8sU2%beSk&lgn<+em9(zvKxaF5rmOl@asaF^KhfN@V3bKtn*4TYFd04+kM;cp{6 zjo>+)xBArwFbOi;f>|E|u`kz&NpD-o7w`v-O+xG$V#hOiDHR2iZU@u&L#^t*HqSgG z6)!~=FCmB^cp1Sf0CW=+FS?!IShtM~@rJugQbhfMJBe6YMg3O<5dey8?s=F4wMN#=!Dy4)d@2= zi+>LIvjDw?W)8(+3lDUOY8=f5{?No9R$7v1(F8TnsqxU*TdAAo0i_E&BTunzZ(=#{ z0BrIGJJ{W*Uju@B5HuoK$IF{OOdAChBCp5q_xX2@mxrUGJjAN6k*{6}-zQyCGmo?8R$q2;{@P zy^6oT`O~y(NR7*}Y5?_~ICcqsxxQscmI&Y1yoy}nZ#5TM{)8ld^xU zv~Q~~q;?rr6Gjx4Gwc<)r(IRRG?Cp8SzbaWF21y5R_bSfHtO+hJ&dW4sf3d{`GXyI zr=|gWmX1KUA_Flq|3$~_3^ds$57Di@U@HyyRR;AFRM&*h=$r#F)X=#iK~$WW>S3o@ z$j^2blRExx=YsNlq!dX{I8fw3A`-%l|F5 zd@Xg+q|U_tX@Wjo&}YPi2}|eTd>Qq|Np0G2(uibSe~}$DCv{{<9nh`{Gfzj6_G|@F z5R?altA zzBKTsOSD>O@)hVfrkBgKqU zZk8s4FE&;&bqxFq9j0c|6iwE$v~0~XViCE`NIB--@5iFW@bCQFqvdmsoaaLSqLv`F zvPXmOoA^7$DV2sNG3Gs0k$kqD#F=m#_!(qzR>&8(xn1#iZ4^N`m_T@UTOmKw=7w_U zQrnmLfj8JinU^tVm5lY>=3*YfyJmhi*o3IN4H( z(%RJJ-Dh-9^MIiz$7mq`e_Q@!ae*h#y3OZr543i{@=$&>NxCyA1e+)|vrvPHdQ(qO z84EC^4|;d1;&@X}h;`JhVy*>_wfD7(qgytcKiiWXcOJDCW#A<&T5`*Q}6%#6cYJ$}rxfKqtt5pnC2n4mm?kg7;h5q{tKxGZr$9!~1$q5|9{c<)>*}DLa%^LRRl8+;udtb$qlKg!`mOrAT zf8gKSS3ce|{Lj7xi6I!(t-Dlslf#1Wo@Yhxhy{z~zCwO)@AL#{>D6xR{ujI1M?9&o zA#6vRVI`$Iws<>x)KzFR<0t`RMpv*7oop5KIOBZAsP>)*3ifLRBFIG7AcAKis`U5` zP^9|048G${lPLQ{A-X`Qv2t7pwi?&8c6)pAWfWV6tQLf(e_&ZT*F06QA4POA`4r{ki3%nsYdQMDoi%3Cc0& z?gUx{JDto*LryI*lsF)8EfHjZ(_I|rf9YRE9_35-uT9(@at%+T^DyfVl0DlaPwd}F zND2Qioa-nB-4>WZ(>Xl(K=tg)pcPwyKpd&u;n=Fhy18lP@=dE&@{R*};dhbr4FvB2 zfOdHz6|u^H#zl~`d(a_`09xX@0@T;uYa|H4^wI=V6Uze<-EK4rm_0gh4#p&z)$wTu zx5iCL_`LUEao!SSyc9t;P{BC@#x<+OflY`l=ifb;PFC=rA6zpY-sOj~cSpXMgGPLc(AU0$ERwN-5LedemNxfPYVTv6R(@AbCBVQhKDeDL>!Kx;&xh8Q-eVTRj% zpSiMf?)<72Q+Zigi*>!v-{kA+?XxfM^7aM%?#&zfk}Jw8s^^qd&Z$`7F0Wo(zF=`> zg~!C^BO4T4oI&k;|3~mCt*^!74e{|53%A1|Yj04O1Mu|)jLq>0n8(8(o_H)5-XP68 zww&1co?|&HFnh372_yEI}Z4^ksKu(@U?A#4{oVl|GL1u|?o;!h?PFs`EfAJUg_V*mgE diff --git a/app/amazon/approve.py b/app/amazon/approve.py index db65147..b18d407 100644 --- a/app/amazon/approve.py +++ b/app/amazon/approve.py @@ -1081,7 +1081,69 @@ class ApproveTask: if shop_name in runing_shop: del runing_shop[shop_name] self.log(f"店铺 {shop_name} 已从执行列表中移除") - + + def action_init(self,driver,country_name,shop_name,risk_listing_filter): + """切换到指定国际 -> 页面 -》 筛选好""" + max_retries = 5 + switch_success = False + switch_success_pg = False + search_success = False + sku_ls = [] + for retry in range(max_retries): + try: + self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") + if retry > 2: + # 刷新不行就重新打开店铺 + self.log("重试前重新打开店铺...") + try: + driver.close_store() + time.sleep(3) + driver.open_shop(shop_name) + except Exception as e: + self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") + # 如果不是第一次尝试,先刷新页面 + if retry > 0: + self.log("重试前刷新页面...") + try: + driver.tab.refresh() + time.sleep(3) + except Exception as e: + self.log(f"刷新页面失败: {str(e)}", "WARNING") + + switch_success = driver.SwitchingCountries(country_name) + if switch_success: + self.log(f"成功切换到国家 {country_name}") + + # 切换到库存管理页面 + driver.SwitchPage() + self.log(f"已切换到库存管理页面") + time.sleep(3) + switch_success_pg = True + + sku_ls = driver.search(filter_type=risk_listing_filter) + search_success = True + self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") + break + else: + self.log(f"切换到国家 {country_name} 失败", "WARNING") + + except Exception as e: + import traceback + self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(2) + + # 如果切换失败,直接返回 + # if not switch_success or not switch_success_pg or not search_success: + # error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + # self.log(error_message, "ERROR") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + return switch_success,switch_success_pg,search_success,sku_ls + def process_country(self, driver: AmzoneApprove, country_code: str, task_id: int, shop_name: str, risk_listing_filter: str): """处理单个国家的审批任务 @@ -1108,87 +1170,98 @@ class ApproveTask: max_retries = 3 switch_success = False - for retry in range(max_retries): - try: - self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") - if retry > 1: - # 刷新不行就重新打开店铺 - self.log("重试前重新打开店铺...") - try: - driver.close_store() - time.sleep(3) - driver.open_shop(shop_name) - except Exception as e: - self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") - - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - switch_success = driver.SwitchingCountries(country_name) - if switch_success: - self.log(f"成功切换到国家 {country_name}") - break - else: - self.log(f"切换到国家 {country_name} 失败", "WARNING") - - except Exception as e: - import traceback - self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - + # for retry in range(max_retries): + # try: + # self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") + # if retry > 1: + # # 刷新不行就重新打开店铺 + # self.log("重试前重新打开店铺...") + # try: + # driver.close_store() + # time.sleep(3) + # driver.open_shop(shop_name) + # except Exception as e: + # self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") + # + # # 如果不是第一次尝试,先刷新页面 + # if retry > 0: + # self.log("重试前刷新页面...") + # try: + # driver.tab.refresh() + # time.sleep(3) + # except Exception as e: + # self.log(f"刷新页面失败: {str(e)}", "WARNING") + # + # switch_success = driver.SwitchingCountries(country_name) + # if switch_success: + # self.log(f"成功切换到国家 {country_name}") + # break + # else: + # self.log(f"切换到国家 {country_name} 失败", "WARNING") + # + # except Exception as e: + # import traceback + # self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") + # self.log(traceback.format_exc(), "ERROR") + # + # # 如果还有重试机会,等待后继续 + # if retry < max_retries - 1: + # time.sleep(2) + # + # # 如果切换失败,直接返回 + # if not switch_success: + # error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + # self.log(error_message, "ERROR") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + # return + # + # # 切换到库存管理页面 + # try: + # driver.SwitchPage() + # self.log(f"已切换到库存管理页面") + # except Exception as e: + # import traceback + # self.log(f"切换页面失败: {str(e)}", "ERROR") + # self.log(traceback.format_exc(), "ERROR") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + # return + # + # # 搜索需要审批的商品,最多重试3次 + # sku_ls = [] + # for retry in range(max_retries): + # try: + # self.log(f"尝试搜索需要审批的商品 (第 {retry + 1}/{max_retries} 次)") + # sku_ls = driver.search(filter_type=risk_listing_filter) + # break + # except Exception as e: + # self.log(f"搜索商品异常: {str(e)}", "ERROR") + # if retry < max_retries - 1: + # try: + # driver.tab.refresh() + # time.sleep(3) + # except Exception as refresh_error: + # self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") + # + max_retries = 5 + switch_success, switch_success_pg, search_success,sku_ls = self.action_init(driver, country_name, shop_name, + risk_listing_filter) # 如果切换失败,直接返回 - if not switch_success: - error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + if not switch_success or not switch_success_pg or not search_success: + error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" self.log(error_message, "ERROR") if task_id in runing_task: runing_task[task_id]["processed_countries"] += 1 return - - # 切换到库存管理页面 - try: - driver.SwitchPage() - self.log(f"已切换到库存管理页面") - except Exception as e: - import traceback - self.log(f"切换页面失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # 搜索需要审批的商品,最多重试3次 - sku_ls = [] - for retry in range(max_retries): - try: - self.log(f"尝试搜索需要审批的商品 (第 {retry + 1}/{max_retries} 次)") - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - self.log(f"搜索商品异常: {str(e)}", "ERROR") - if retry < max_retries - 1: - try: - driver.tab.refresh() - time.sleep(3) - except Exception as refresh_error: - self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") - - # 如果没有需要审批的商品,直接返回 + + # # 如果没有需要审批的商品,直接返回 if len(sku_ls) == 0: self.log(f"国家 {country_name} 没有需要审批的商品") if task_id in runing_task: runing_task[task_id]["processed_countries"] += 1 return - + self.log(f"国家 {country_name} 有 {len(sku_ls)} 个需要审批的商品,开始处理...") # 处理所有需要审批的商品(通过yield获取结果) diff --git a/app/amazon/asin_status.py b/app/amazon/asin_status.py index 9160f21..8a5ad46 100644 --- a/app/amazon/asin_status.py +++ b/app/amazon/asin_status.py @@ -537,8 +537,6 @@ class StatusTask: self.log(f"切换页面失败重试退出", "ERROR") return - - # 处理所有需要审批的商品(通过yield获取结果) # 指定 asin diff --git a/app/amazon/del_brand.py b/app/amazon/del_brand.py index af7c8ee..884b093 100644 --- a/app/amazon/del_brand.py +++ b/app/amazon/del_brand.py @@ -8,11 +8,12 @@ import json import os from typing import Literal -from DrissionPage import Chromium +from DrissionPage import Chromium,ChromiumOptions from DrissionPage.common import By from DrissionPage._pages.chromium_tab import ChromiumTab + def kill_process(version: Literal["v5", "v6"]): """杀紫鸟客户端进程(独立函数版本)""" driver = ZiniaoDriver({}) @@ -205,7 +206,11 @@ class ZiniaoDriver: Returns: Chromium: DrissionPage浏览器实例 """ - browser = Chromium(port) + co = ChromiumOptions() + # 设置不加载图片、静音 + co.set_local_port(port) + co.no_imgs(True).mute(True) + browser = Chromium(co) return browser def start_client(self): diff --git a/app/amazon/match_action.py b/app/amazon/match_action.py index 7745f20..07f2516 100644 --- a/app/amazon/match_action.py +++ b/app/amazon/match_action.py @@ -468,6 +468,70 @@ class MatchTak: del runing_shop[shop_name] self.log(f"店铺 {shop_name} 已从执行列表中移除") + def action_init(self,driver,country_name,shop_name,risk_listing_filter): + """切换到指定国际 -> 页面 -》 筛选好""" + max_retries = 5 + switch_success = False + switch_success_pg = False + search_success = False + sku_ls = [] + for retry in range(max_retries): + try: + self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") + if retry > 2: + # 刷新不行就重新打开店铺 + self.log("重试前重新打开店铺...") + try: + driver.close_store() + time.sleep(3) + driver.open_shop(shop_name) + except Exception as e: + self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") + # 如果不是第一次尝试,先刷新页面 + if retry > 0: + self.log("重试前刷新页面...") + try: + driver.tab.refresh() + time.sleep(3) + except Exception as e: + self.log(f"刷新页面失败: {str(e)}", "WARNING") + + switch_success = driver.SwitchingCountries(country_name) + if switch_success: + self.log(f"成功切换到国家 {country_name}") + + # 切换到库存管理页面 + driver.SwitchPage() + self.log(f"已切换到库存管理页面") + time.sleep(3) + switch_success_pg = True + + sku_ls = driver.search(filter_type=risk_listing_filter) + search_success = True + self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") + break + else: + self.log(f"切换到国家 {country_name} 失败", "WARNING") + + except Exception as e: + import traceback + self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(2) + + # 如果切换失败,直接返回 + # if not switch_success or not switch_success_pg or not search_success: + # error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + # self.log(error_message, "ERROR") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + return switch_success,switch_success_pg,search_success,sku_ls + + + def process_country(self, driver: AmzoneMatchAction, country_code: str, task_id: int, shop_name: str, risk_listing_filter: str,limit:str=None): """处理单个国家的审批任务 @@ -491,90 +555,108 @@ class MatchTak: runing_task[task_id]["current_country"] = country_name # 切换国家,最多重试3次 - max_retries = 3 - switch_success = False - - for retry in range(max_retries): - try: - self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") - if retry > 1: - # 刷新不行就重新打开店铺 - self.log("重试前重新打开店铺...") - try: - driver.close_store() - time.sleep(3) - driver.open_shop(shop_name) - except Exception as e: - self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") - - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - switch_success = driver.SwitchingCountries(country_name) - if switch_success: - self.log(f"成功切换到国家 {country_name}") - break - else: - self.log(f"切换到国家 {country_name} 失败", "WARNING") - - except Exception as e: - import traceback - self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - + # max_retries = 3 + # switch_success = False + # + # for retry in range(max_retries): + # try: + # self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") + # if retry > 1: + # # 刷新不行就重新打开店铺 + # self.log("重试前重新打开店铺...") + # try: + # driver.close_store() + # time.sleep(3) + # driver.open_shop(shop_name) + # except Exception as e: + # self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") + # + # # 如果不是第一次尝试,先刷新页面 + # if retry > 0: + # self.log("重试前刷新页面...") + # try: + # driver.tab.refresh() + # time.sleep(3) + # except Exception as e: + # self.log(f"刷新页面失败: {str(e)}", "WARNING") + # + # switch_success = driver.SwitchingCountries(country_name) + # if switch_success: + # self.log(f"成功切换到国家 {country_name}") + # break + # else: + # self.log(f"切换到国家 {country_name} 失败", "WARNING") + # + # except Exception as e: + # import traceback + # self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") + # self.log(traceback.format_exc(), "ERROR") + # + # # 如果还有重试机会,等待后继续 + # if retry < max_retries - 1: + # time.sleep(2) + # + # # 如果切换失败,直接返回 + # if not switch_success: + # error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + # self.log(error_message, "ERROR") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + # return + # + # # 切换到库存管理页面 + # try: + # driver.SwitchPage() + # self.log(f"已切换到库存管理页面") + # except Exception as e: + # import traceback + # self.log(f"切换页面失败: {str(e)}", "ERROR") + # self.log(traceback.format_exc(), "ERROR") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + # return + # + # # 搜索需要审批的商品,最多重试3次 + # sku_ls = [] + # for retry in range(max_retries): + # try: + # self.log(f"尝试搜索匹配操作商品 (第 {retry + 1}/{max_retries} 次)") + # sku_ls = driver.search(filter_type=risk_listing_filter) + # break + # except Exception as e: + # self.log(f"搜索商品异常: {str(e)}", "ERROR") + # if retry < max_retries - 1: + # try: + # driver.tab.refresh() + # time.sleep(3) + # except Exception as refresh_error: + # self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") + # + # # 如果没有需要审批的商品,直接返回 + # if len(sku_ls) == 0: + # self.log(f"国家 {country_name} 没有搜索出的商品") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + # return + # + max_retries = 5 + switch_success, switch_success_pg, search_success, sku_ls = self.action_init(driver, country_name, shop_name, + risk_listing_filter) # 如果切换失败,直接返回 - if not switch_success: - error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + if not switch_success or not switch_success_pg or not search_success: + error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" self.log(error_message, "ERROR") if task_id in runing_task: runing_task[task_id]["processed_countries"] += 1 return - - # 切换到库存管理页面 - try: - driver.SwitchPage() - self.log(f"已切换到库存管理页面") - except Exception as e: - import traceback - self.log(f"切换页面失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # 搜索需要审批的商品,最多重试3次 - sku_ls = [] - for retry in range(max_retries): - try: - self.log(f"尝试搜索匹配操作商品 (第 {retry + 1}/{max_retries} 次)") - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - self.log(f"搜索商品异常: {str(e)}", "ERROR") - if retry < max_retries - 1: - try: - driver.tab.refresh() - time.sleep(3) - except Exception as refresh_error: - self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") - - # 如果没有需要审批的商品,直接返回 + + # # 如果没有需要审批的商品,直接返回 if len(sku_ls) == 0: - self.log(f"国家 {country_name} 没有搜索出的商品") + self.log(f"国家 {country_name} 没有需要审批的商品") if task_id in runing_task: runing_task[task_id]["processed_countries"] += 1 return - + self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") # 处理所有需要审批的商品(通过yield获取结果) diff --git a/app/amazon/price_match.py b/app/amazon/price_match.py index 4ce5d2b..fc57491 100644 --- a/app/amazon/price_match.py +++ b/app/amazon/price_match.py @@ -16,28 +16,32 @@ from amazon.tool import show_notification,get_shop_info,remove_special_character from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE - class RepricingLogic: @staticmethod def situation_1_general_decrease(my_price, rank1_price, is_first_time=False): """ 情况1:常规递减跟价 (最左侧独立长图块) - 当不是自己购物车时,按总价当作第一名递减。 """ if is_first_time: return rank1_price - 0.3 - diff = my_price - rank1_price + # 这里的 diff 算出的是一个正数,代表“我比第一名低多少” + diff = rank1_price - my_price - # 精简了原图中长串的阶梯逻辑 + # 如果当前价格高于或等于第一名,默认按照第一名减0.3处理 + if diff <= 0: + return rank1_price - 0.3 + + # 逻辑更清晰的写法:第一名价格 - (差价 + 对应阶梯值) + # 例如差价0.7,则相当于 第一名价格 - (0.7 + 0.5) = 第一名价格 - 1.2 if diff <= 0.3: - return rank1_price - 0.5 + return rank1_price - (diff + 0.5) elif diff <= 0.8: - return rank1_price - 0.7 + return rank1_price - (diff + 0.7) elif diff <= 10.5: - # 0.8 到 10.5 之间,原图逻辑全部是“减1” - return rank1_price - 1.0 + # 0.8 到 10.5 之间全部是在减1 + return rank1_price - (diff + 1.0) else: return None # 相差10.5以上,跳过 @@ -45,55 +49,56 @@ class RepricingLogic: def situation_2_own_buybox(my_price, rank2_price): """ 情况2:已经是自己购物车 - 逻辑:判断与第二名的差价,如果拉开足够差距,则稍微降一点点(减0.5)保持优势,防止卖太便宜。 """ diff = rank2_price - my_price - # 1. 绝对差价2欧以上 if diff >= 2.0: return rank2_price - 0.3 - # 2. 产品售价区间判定 (是否要提高价格) if (20 <= my_price < 30 and diff >= 4) or \ (30 <= my_price < 60 and diff >= 8) or \ (60 <= my_price <= 150 and diff >= 15): - return rank2_price - 0.3 # 满足区间大差价,提价至第二名之下 + return rank2_price - 0.3 - return my_price # 不满足条件则保持原价 + return my_price @staticmethod def situation_3_not_own_buybox(my_price, rank1_price): """ - 情况3:不是自己购物车 (常规情况) + 情况3:不是自己购物车 (除Amazon US外) """ - diff = my_price - rank1_price + diff = rank1_price - my_price - if diff <= 0.3: - return rank1_price - 0.5 - elif 0.5 <= diff <= 0.8: - return rank1_price - 0.7 - elif 0.8 < diff <= 2.5: - return rank1_price - 1.0 - elif diff > 2.5: # 2.5-3.5以上跳过 - return None + if diff <= 0: + return rank1_price - 0.3 + + # 逻辑更清晰的写法:第一名价格 - (差价 + 对应阶梯值) + if diff <= 0.3: + return rank1_price - (diff + 0.5) + elif diff <= 0.8: + return rank1_price - (diff + 0.7) + elif diff <= 2.5: + return rank1_price - (diff + 1.0) + else: + return None # 2.5-3.5以上跳过 - return rank1_price - 0.3 # 默认按第一名减0.3 - @staticmethod def situation_4_encounter_amz_us_1st(my_price, amz_us_price): """ - 情况4:第一名是 Amazon US 卖家 + 情况4:遇到第一名是 Amazon US 卖家 """ - diff = my_price - amz_us_price + diff = amz_us_price - my_price - if diff <= 3: - return amz_us_price - 2 - elif 4 <= diff <= 6: + if diff <= 0: return amz_us_price - 3 - elif 8 <= diff <= 12: - return None # 跳过不跟价 - return amz_us_price - 3 # 默认直接按照 Amazon US 减去3 + # 逻辑更清晰的写法:第一名价格 - (差价 + 对应阶梯值) + if diff <= 3: + return amz_us_price - (diff + 2) + elif diff <= 6: + return amz_us_price - (diff + 3) + else: + return None # 超过6直接跳过 @staticmethod def situation_5_im_1st_amz_us_2nd(my_price, amz_us_price): @@ -103,7 +108,7 @@ class RepricingLogic: diff = amz_us_price - my_price if diff <= 7: - return None # 相差5以内跳过 (保持原价) + return None # 相差7以内跳过 (保持原价) else: return amz_us_price - 5 @@ -133,16 +138,6 @@ def calculate_target_price( price_col = recommended_price + recommended_shipping print(f"【紫鸟后台价格】{is_my_buybox} 推荐价格: {recommended_price},推荐运费: {recommended_shipping},总和: {price_col}") return RepricingLogic.situation_1_general_decrease(my_price,price_col,is_my_buybox) - # backend_base_price = recommended_price - # backend_shipping = recommended_shipping - # total_price = backend_base_price + backend_shipping - # - # if is_my_buybox: - # # 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整 - # return None - # else: - # # 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑 - # return calculate_standard_competitor_pricing(my_price, total_price) # # 第一名是自己, 第二名 Amazon US 卖家 的情况 shop_name_1 = front_end_data.get("top_sellers")[0].get("shop_name") @@ -152,13 +147,11 @@ def calculate_target_price( return RepricingLogic.situation_5_im_1st_amz_us_2nd(my_price,price_2) # --- Step 3: 常规核心分流逻辑 (如果没有紫鸟后台数据) --- - # 分支 A:第一名是 Amazon US 卖家 (特殊强敌优先) price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 if "Amazon" in shop_name_1: return RepricingLogic.situation_4_encounter_amz_us_1st(my_price,price_1) - # 分支 B:不是 Amazon US,且目前是自己的购物车 elif is_my_buybox: price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格 @@ -650,6 +643,13 @@ class AmzonePriceMatch(AmamzonBase): print(f"【{self.mark_name}】获取到 {len(sku_ls)}") if len(sku_ls) == 0: + if mode == "asin": + print(f"asin 模式查询不到,{asin}") + yield (asin, { + "statu": "查询不到" + }) + break + retry_num += 1 print(f"没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}") self.tab.refresh() @@ -680,19 +680,16 @@ class AmzonePriceMatch(AmamzonBase): bottom_price = f"{sum(split_currency_values(bottom_price_text))}" except Exception as e: print("最低价提取失败",e) + current_price_ele = sku_ele.eles('xpath:.//b[text()="价格"]/../..//kat-input',timeout=5) if len(current_price_ele) > 0: current_price = current_price_ele[0].attr("value") print("获取到当前价格为 ->",current_price) # 如果紫鸟里当前价格低于最低价则删除,否则跳过 - if mode == "status" and miniprice_info.get(asin): + # if mode == "status" and miniprice_info.get(asin): + if miniprice_info.get(asin): backend_price = float(miniprice_info.get(asin)) if float(current_price) <= backend_price: - # yield (asin, { - # "statu": "删除(当前价格低于最低价)", - # "deleteSkipAsin": True, - # "removeAsin": asin, - # }) yield (asin, { "statu": "跳过(当前价格低于或等于最低价)", "currentPrice": current_price, @@ -764,6 +761,9 @@ class AmzonePriceMatch(AmamzonBase): print(asin,"-->>",f"【逻辑计算后的价格】",adjust_prices) if adjust_prices is not None and adjust_prices != float(current_price): #修改价格 + print("准备填入的原始值:",adjust_prices) + adjust_prices = round(adjust_prices, 2) + print("保留两位小数后的::",adjust_prices) self.tab.actions.click(current_price_ele[0]) time.sleep(1) current_price_ele[0].input(f"{adjust_prices}", clear=True) @@ -784,12 +784,12 @@ class AmzonePriceMatch(AmamzonBase): "statu" : "改价成功", "currentPrice" : current_price, "recommendedPrice" : f"{recommendedPrice}", - "minimumPrice" : bottom_price, #最低价格 + "minimumPrice" : f"{miniprice_info.get(asin)}" if miniprice_info.get(asin) else "",#bottom_price, #最低价格 "firstPlace": price_1, "secondPlace": price_2, "cartShopName" : cartShopName, "shippingFee" : f"{shipping_fee}", - "priceChangeStatus" : f"{adjust_prices}", + "priceChangePrice" : f"{adjust_prices}", "priceChangeStatus" : "改价成功", }) else: @@ -803,12 +803,14 @@ class AmzonePriceMatch(AmamzonBase): "statu": "跳过,无需改价", "currentPrice": current_price, "recommendedPrice": f"{recommendedPrice}", - "minimumPrice": bottom_price, # 最低价格 + # "minimumPrice": bottom_price, # 最低价格 + "minimumPrice": f"{miniprice_info.get(asin)}" if miniprice_info.get(asin) else "", "firstPlace": price_1, "secondPlace": price_2, "cartShopName": cartShopName, "shippingFee": f"{shipping_fee}", "priceChangeStatus": "跳过,无需改价", + "priceChangePrice": f"{adjust_prices}".replace("None",""), }) already_asin.add(asin) @@ -1029,6 +1031,68 @@ class PriceTask: return driver return driver + def action_init(self,driver,country_name,shop_name,risk_listing_filter): + """切换到指定国际 -> 页面 -》 筛选好""" + max_retries = 5 + switch_success = False + switch_success_pg = False + search_success = False + sku_ls = [] + for retry in range(max_retries): + try: + self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") + if retry > 2: + # 刷新不行就重新打开店铺 + self.log("重试前重新打开店铺...") + try: + driver.close_store() + time.sleep(3) + driver.open_shop(shop_name) + except Exception as e: + self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") + # 如果不是第一次尝试,先刷新页面 + if retry > 0: + self.log("重试前刷新页面...") + try: + driver.tab.refresh() + time.sleep(3) + except Exception as e: + self.log(f"刷新页面失败: {str(e)}", "WARNING") + + switch_success = driver.SwitchingCountries(country_name) + if switch_success: + self.log(f"成功切换到国家 {country_name}") + + # 切换到库存管理页面 + driver.SwitchPage() + self.log(f"已切换到库存管理页面") + time.sleep(3) + switch_success_pg = True + + sku_ls = driver.search(filter_type=risk_listing_filter) + search_success = True + self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") + break + else: + self.log(f"切换到国家 {country_name} 失败", "WARNING") + + except Exception as e: + import traceback + self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(2) + + # 如果切换失败,直接返回 + # if not switch_success or not switch_success_pg or not search_success: + # error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + # self.log(error_message, "ERROR") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + return switch_success,switch_success_pg,search_success + def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str, user_id=None, stage_index=None, final_stage: bool = True, limit: str = None): @@ -1149,94 +1213,42 @@ class PriceTask: runing_task[task_id]["current_country"] = country_name # 切换国家,最多重试3次 - max_retries = 3 - switch_success = False - - for retry in range(max_retries): - try: - self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") - if retry > 1: - # 刷新不行就重新打开店铺 - self.log("重试前重新打开店铺...") - try: - driver.close_store() - time.sleep(3) - driver.open_shop(shop_name) - except Exception as e: - self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - switch_success = driver.SwitchingCountries(country_name) - if switch_success: - self.log(f"成功切换到国家 {country_name}") - break - else: - self.log(f"切换到国家 {country_name} 失败", "WARNING") - - except Exception as e: - import traceback - self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) + max_retries = 5 + switch_success,switch_success_pg,search_success = self.action_init( driver, country_name, shop_name, risk_listing_filter) # 如果切换失败,直接返回 - if not switch_success: - error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" + if not switch_success or not switch_success_pg or not search_success: + error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" self.log(error_message, "ERROR") if task_id in runing_task: runing_task[task_id]["processed_countries"] += 1 return - # 切换到库存管理页面 - for retry in range(max_retries): - try: - driver.SwitchPage() - self.log(f"已切换到库存管理页面") - except Exception as e: - import traceback - self.log(f"切换页面失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - if retry >= max_retries-1: - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - self.log(f"切换页面失败重试退出", "ERROR") - return - # 搜索需要审批的商品,最多重试3次 - sku_ls = [] - for retry in range(max_retries): - try: - self.log(f"尝试搜索匹配操作商品 (第 {retry + 1}/{max_retries} 次)") - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - self.log(f"搜索商品异常: {str(e)}", "ERROR") - if retry < max_retries - 1: - try: - driver.tab.refresh() - time.sleep(3) - except Exception as refresh_error: - self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") + # sku_ls = [] + # for retry in range(max_retries): + # try: + # self.log(f"尝试搜索匹配操作商品 (第 {retry + 1}/{max_retries} 次)") + # sku_ls = driver.search(filter_type=risk_listing_filter) + # break + # except Exception as e: + # self.log(f"搜索商品异常: {str(e)}", "ERROR") + # if retry < max_retries - 1: + # try: + # driver.tab.refresh() + # driver.tab.wait.doc_loaded() + # time.sleep(3) + # except Exception as refresh_error: + # self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") + # + # # 如果没有需要审批的商品,直接返回 + # if len(sku_ls) == 0: + # self.log(f"国家 {country_name} 没有搜索出的商品") + # if task_id in runing_task: + # runing_task[task_id]["processed_countries"] += 1 + # return - # 如果没有需要审批的商品,直接返回 - if len(sku_ls) == 0: - self.log(f"国家 {country_name} 没有搜索出的商品") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") + self.log(f"国家 {country_name} ,开始处理...") # 处理所有需要审批的商品(通过yield获取结果) @@ -1350,13 +1362,14 @@ class PriceTask: "firstPlace": status.get("firstPlace") if status.get("firstPlace") else "", "secondPlace": status.get("secondPlace") if status.get("secondPlace") else "", "cartShopName": status.get("cartShopName") if status.get("cartShopName") else "", - "priceChangeStatus": "UPDATED", + # "priceChangeStatus": "UPDATED", "deleteSkipAsin": status.get("deleteSkipAsin",False), "removeAsin": status.get("removeAsin") if status.get("removeAsin") else "", "modifyCount": "1", "shippingFee" : status.get("shippingFee") if status.get("shippingFee") else "", "status": status.get("statu"), "priceChangeStatus" : status.get("priceChangeStatus") if status.get("priceChangeStatus") else "", + "priceChangePrice" : status.get("priceChangePrice") if status.get("priceChangePrice") else "", } ] }, @@ -1405,20 +1418,20 @@ class PriceTask: if __name__ == '__main__': # 使用示例 # user_info = { - # "company": "rongchuang123", + # "company": "尾号5578的公司115", # "username": "自动化_Robot", # "password": "#20zsg25" # } - # shop_name = "郭亚芳" - # country = "德国" + # shop_name = "刘建煌" + # country = "法国" # kill_process('v6') # driver = AmzonePriceMatch(user_info) # browser = driver.open_shop(shop_name) # sw_suc = driver.SwitchingCountries(country) # driver.SwitchPage() # risk_listing_filter = "Active" - # _shopMallName = "yafang123" - # ap_asin ="B0BTHBJDKG" + # _shopMallName = "Jianhuang 888" + # ap_asin ="B0F25Y52PH" # skip_asin = [] # for _ in range(3): # try: @@ -1436,14 +1449,19 @@ if __name__ == '__main__': # print(f"ASIN {asin} 的处理结果: {status}") # print("已完成操作") - front_end_data = {'top_sellers': [{'rank': 1, 'price': '50.24', 'stock': '26', 'shop_name': 'yafang123'}, {'rank': 2, 'price': '44.35', 'stock': '100', 'shop_name': 'QinPimy'}], 'cart_seller': 'Amazon US', 'timestamp': '2026-04-27 16:17:42'} + front_end_data = {'top_sellers': [{'rank': 1, 'price': '52.51', 'stock': '100', 'shop_name': 'Amazon US'}, {'rank': 2, 'price': '62.58', 'stock': '30', 'shop_name': 'Amazon US'}], 'cart_seller': 'Jianhuang 888', 'timestamp': '2026-04-30 09:52:49'} - current_Price = 44.35 - current_shop_name = "yafang123" - recommended_price = 44.35 + current_Price = 52.51 + current_shop_name = "Jianhuang 888" + recommended_price = 52.51 recommended_shipping =0.0 res = calculate_target_price( front_end_data, current_Price, current_shop_name, recommended_price, recommended_shipping ) - print(res) \ No newline at end of file + print(res) + + + # task_data = {'type': 'price-track-run', 'ts': 1777388166302, 'data': {'task_id': 4892, 'result_id': 6685, 'shop_name': '魏振峰', 'shop_id': '27543917795757', 'platform': '亚马逊', 'company_name': 'rongchuang123', 'shop_mall_name': 'WEIZHENFENG168', 'matched': True, 'match_status': 'MATCHED', 'match_message': None, 'success': False, 'error': None, 'output_filename': None, 'download_url': None, 'task_status': 'RUNNING', 'loop_run_id': 168, 'round_index': 1, 'country_codes': ['DE', 'UK', 'FR', 'IT', 'ES'], 'mode': 'asin', 'skip_asins': {}, 'skip_asins_by_country': {}, 'skip_asin_details_by_country': {}, 'minimum_price_by_country_and_asin': {'DE': {'B0CFY5M3XJ': '38', 'B0DSJGJBWV': '9'}, 'UK': {'B0G2LPSGP5': '30', 'B0G1LY2K8L': '10'}}, 'skip_asin_delete_policy': {'enabled': False, 'mode': 'NONE', 'deleteWhenPriceBelowMinimum': False, 'compareField': 'price', 'thresholdField': 'minimumPrice', 'target': 'skip_asin', 'source': 'frontend-price-track'}, 'delete_skip_asin_when_price_below_minimum': False, 'deleteSkipAsinWhenPriceBelowMinimum': False, 'asin_rows_by_country': {'DE': [{'shopMallName': '', 'asin': 'B0CFY5M3XJ', 'price': '', 'recommendedPrice': '', 'minimumPrice': '38', 'firstPlace': '', 'secondPlace': '', 'cartShopName': '', 'priceChangeStatus': '', 'modifyCount': '', 'status': ''}, {'shopMallName': '', 'asin': 'B0DSJGJBWV', 'price': '', 'recommendedPrice': '', 'minimumPrice': '9', 'firstPlace': '', 'secondPlace': '', 'cartShopName': '', 'priceChangeStatus': '', 'modifyCount': '', 'status': ''}], 'UK': [{'shopMallName': '', 'asin': 'B0G2LPSGP5', 'price': '', 'recommendedPrice': '', 'minimumPrice': '30', 'firstPlace': '', 'secondPlace': '', 'cartShopName': '', 'priceChangeStatus': '', 'modifyCount': '', 'status': ''}, {'shopMallName': '', 'asin': 'B0G1LY2K8L', 'price': '', 'recommendedPrice': '', 'minimumPrice': '10', 'firstPlace': '', 'secondPlace': '', 'cartShopName': '', 'priceChangeStatus': '', 'modifyCount': '', 'status': ''}]}, 'taskId': 4892, 'resultId': 6685, 'shopName': '魏振峰', 'shopId': '27543917795757', 'platformName': '亚马逊', 'companyName': 'rongchuang123', 'shopMallName': 'WEIZHENFENG168', 'matchStatus': 'MATCHED', 'matchMessage': None, 'outputFilename': None, 'downloadUrl': None, 'taskStatus': 'RUNNING', 'loopRunId': 168, 'roundIndex': 1}} + # price_cls = PriceTask(user_info) + # price_cls.process_task(task_data) \ No newline at end of file diff --git a/app/main.py b/app/main.py index cd6403f..148cb5f 100644 --- a/app/main.py +++ b/app/main.py @@ -438,7 +438,7 @@ def main(): window.expose(api.close, api.minimize, api.maximize, api.toggle_maximize, generate_images, api.save_image, api.save_image_to_folder, api.select_folder, api.select_brand_xlsx_files, api.select_brand_folder, api.save_file_from_url, api.save_template_xlsx,api.save_template_zip,api.upload_file_to_java,api.open_external_url,api.enqueue_json,api.get_detail_del,api.save_file_from_url_new) webview.start( - debug=False, + debug=True, storage_path=cache_path, private_mode=False )