From ad2bb0a6ea3f31916ae8cd086ac1a2cc68f635b3 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: Sat, 11 Apr 2026 23:00:55 +0800 Subject: [PATCH] modified: app/amazon/__pycache__/approve.cpython-39.pyc modified: app/amazon/__pycache__/del_brand.cpython-39.pyc modified: app/amazon/__pycache__/main.cpython-39.pyc modified: app/amazon/__pycache__/match_action.cpython-39.pyc modified: app/amazon/__pycache__/tool.cpython-39.pyc modified: app/amazon/approve.py modified: app/amazon/del_brand.py modified: app/amazon/main.py modified: app/amazon/match_action.py modified: app/amazon/tool.py modified: app/assets/delete-brand.js modified: app/new_web_source/delete-brand.html --- app/amazon/__pycache__/approve.cpython-39.pyc | Bin 26270 -> 26738 bytes .../__pycache__/del_brand.cpython-39.pyc | Bin 17460 -> 17677 bytes app/amazon/__pycache__/main.cpython-39.pyc | Bin 16993 -> 17469 bytes .../__pycache__/match_action.cpython-39.pyc | Bin 16804 -> 18698 bytes app/amazon/__pycache__/tool.cpython-39.pyc | Bin 2926 -> 3949 bytes app/amazon/approve.py | 51 +++++++++++------- app/amazon/del_brand.py | 19 ++++--- app/amazon/main.py | 22 ++++++-- app/amazon/match_action.py | 37 ++++++++++--- app/amazon/tool.py | 39 ++++++++++++++ 10 files changed, 133 insertions(+), 35 deletions(-) diff --git a/app/amazon/__pycache__/approve.cpython-39.pyc b/app/amazon/__pycache__/approve.cpython-39.pyc index fb67c0155ef6ffc129729ffc47d9af3ee5449551..694a2d5cee1d64f680bb9ed8b176ebd347fd507a 100644 GIT binary patch delta 6032 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 delta 5580 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 diff --git a/app/amazon/__pycache__/del_brand.cpython-39.pyc b/app/amazon/__pycache__/del_brand.cpython-39.pyc index 7f3c49bad65cfdd0dda0e2641ebb0887112ebb76..1e620db2ce747d939e99c0319aadb7bbc4bd21e7 100644 GIT binary patch delta 723 zcmZuu&ubGw6rQ&~lFeqbO^Qk?QZZDUK(HwJ>5qoi5Tpk$u?P(wqT?Z3SnFg0ZQa;I z1WP5DItc1%bMq?kCZ0U$Ur+)bMLc;CZx-JqsTWW{mJ=T+^Z|%R9K}%`jVe^7T34Bz=v1cx8tf`<-~kUhK#g^cm3fec zI+#VxDxqqXq{8BL=FxGsf;GR-B2?HD#8w4CoXpOh@fH@E8+EsK_rA;P4Y!%(_cnPl zl}>zn_5SOJ7m1X(n!OND8EhFd*fj|!B_C~^UTX*N(xjvX>_A3-xKC(!U1bN{qL!T1NNSKqjs$p`|IdR! zZV_r%36JV>M6^8j2bpN6Jpcdz delta 503 zcmaJ-&r2IY82#St><`z?A|g^y6iS4qdZ?0^C`dp>u%|*OVxfnYIV2H+UDtzgqe#?> z5>&o_VB^tSN$IKoLywjAR_ei<^w3*NC$f0((1H2pz4v{*H#4ncd_02xCY5qYudDV| z<$Cpl|0+8*p=m@_szN~tWwb;Cp@`6gl4~+}5*o^E0;H@GDZ4}&hd*U^L_N*Rxip{V zo|#J-84U8*+;i*B+v4%*;_h#4TmSsP*ocf+Ter1c(veA|jAU%IDbZzY-eV{;nK2`? zDyx=ema})2D|=8sBmF@cCk< uh;#liGYPLVF#AWq?ex#p1kQM`_!dK*pT&KFNv_Oq!|q(q8v@{)#q>XFHF*dC diff --git a/app/amazon/__pycache__/main.cpython-39.pyc b/app/amazon/__pycache__/main.cpython-39.pyc index 7e85b187afbc2b7090094c38afc93fc0e785abd3..a10a71e7886c2b513db55352c45091b8b4c2110a 100644 GIT binary patch delta 4549 zcmbtXdvKK1760zH?`JlT&2y71AqgyykPwkbVgN+}MSNm#tFG&QUy{vZH@V-pK+VTMWb;@c; z>5BJ%pH)Kf1+_UVhy-`Jt#QXZ&wz3uW zkG#ua7p+7vBlr<~tkBU)EG{r^tqhR_7S;x51Vz0W(EO88Iql zoc%N&krgGRhLs+=p8dmBzK}a(0}9`WaI;jp4(24b+PxZNCfpAZM z*=8B{04!xJ=<`riq7Sl93M=O|6`i!7xr&tPC<^NYh!_B_{}lq^fe*Sw zd7qstdf6sEVNN-SIq}1wGg+p3j<>sk*Z4ssis6odO(Q+&66g{TrC$4zh&0p zwff<}Vb?&7q)oE{hflLfMLh;ip`yiH(M39MJEVaTao~Kckjq)D*-#nDhDxwVNp31I zYS2fLJ!x$hVrz|p>KzdWj}Rf5M}(nTzHf<!*xX4%gJOabH@{ z$L+#=z5vfpwF^Vbz;*-uC6{*#MrTw+pFkYTQ)vhgchgFo0-aiU0E~myX_a)lZkppAy3iX4KRlqiESl%dH}7qTO-UOT&c>eW40Prs9W_aqdfuP?vE z{#ag}N-WTsrjGnHd-R3ur5CTUOW6Z&OkLPB_1=l>nK7L;5dg0LWXYcU@zh(de0}*) zmL1MsIx%_j;^g5sSNnPOOgLf7egjieU*1C%6WQyERBZvrkRz(WCg^Y=YW1TWBXYW@Q++$F~PgAVGLAw-> zgnHv)NtQD9m@G>$=#0iFmR_2V8;z>GQ_UE=m3WL6;1-k4p{Hv0Rpp}1Gr2nGi1fz6 zp^*Bi94OQi_e=(+-6+pSWhK$8V*c(yaZW7M;n-j(7VeYjR`!%X(8LQ}0=ccg-5-xB za?k*s1$Rc!#T5uCi3nC;z1UW;H~jvRIVHCPB)ktFyTuBZ~} z66RQ3*A{}AK<=#gMv#vOSwTt#$XKY{0dDG|J8^0dVLCY57q>kv0!YL{aIi5^6l8zGp>m=!rpBV9DY za+<0`Rmk>Vy9b%kIgrVqS&zmfc_&3(dAO(^9$YpnJ&91SLbtKwO)CrLgylKlIKw_| z`i*zSKK%tuU;dxp5)wCXbMgMtXAta)#enw zh%L~xa_8_Hy%rbolG0NM`t=1W;L>mDyow>`ocqGB6xZl9uFls5KPwmnVG&!^JYeS6 z?lgO|xg1{chs{-{jY-qcFWBFj+fu4Ya%<*pGw<8X-4-bael?9iMHD6I?5-DRY@Vdt zhp~!^QXcSIcmtG=&68%*jFO4BIlt%Y1)51R6$#KRm^CAychtl?MeDdtDnu&gIJuJ2Hj@?Va_oQYdP^8-`anBtqFiBLs^F3XGeG z#3vd_jtGPqKH@*k7CUjW&s$fKPF8aJZ)^F($HOw_o*iM@sm#rum{bliZ`;XgA5i+^ z!G>fGU&e?(yiT!SwN;T?_LsJ%R1GrSHM3_EQt$=@YD8Fva3{iMfQ%s;Q)veda}Y3P zQ%n%lgzzi^+NY!8DZ%6&DU-{Em-+xx`}wG*qW9$n@ zV`HpxU5W2Jj;)~(&V)h%zaC~T;L&yx0U=Gig$F7 delta 4155 zcmbtXZEO_B8Q$6ZKHr_s_W2VVpUoM2{e{6XA>bGY;hPWy4JOx+^KrZ2!}gs$y9YMi z;~eY&Ap{HqjUsB-rlf@k1*?t_RY9uS{%MQUMwL)>|0?Am{HWTh;!oQoecxGQ8`ns! zYHOdHoq6W{n0e=YXYZXRe;Ov9u-okv;P2wZ7tvhxf~S<+y-@dI?PfuC$j)Iwb`FWb z5;;qD4GY0VN~!Gb66qaf(U3p{nd}iH&xL>edCDzb7fA)XZEhvrslS`Il14v>q*Vw@ z0n!dF+M}pixTlv^U?+!495Hpr4^>PZw(b*28T*y}Oz}(5`|#Yy4=>%$oSw{_9)JAN zwG4ab(R*jvn4`+QcJ3$(dyCjL$Ggi>oJ4|VIUZ9aF)cPWrOCnhnw+iOQB{k?dwSb; zv!L_$`3*3OmLXUX79*6fwya*_XScH23g%gA0sE;|$4sscvT;gwjggL4n6gu{Qk0Yy zqjK8SOXCqmRYO`>?V_(>w?m`hh;kqt=}J2f#%WJj3n~2($wd7yN;e{GLU>jiMMuNz zfM+%68ujcZS<8^rgs_GEBfFU_VvXM5D~1IQnu7zm2;8f!*jj|J4FL_I+YxpENVYk; zUt_=ZRu?a1!Fr&^rkpuulWQe3chV9RP|ZqwdzZJN7?HjRKS8tF8UK%Mb+jH*VoHB6 zZTkpkt!5LxFG(RgnO{z7*pKro$#>Xq@&g5EKHUe9wy9dYw^xxRLU%J$L8osw_F5E5 z<5bF~sE{_WR6&_l!e%YIT2Q}?`?UezXPtA*ac(Edu;E^WqB4D*eO*w#psTn@L#(Ax z4IDyY3P8jJ@bu3I4KF;XO5Mrs7hZLc{g;wiBjnghcC@G`wK7(q3*$sC)*V-bQBihG zh;TlfNxNu4g9Qwy z4*aA;cL3uP-60otnRpAe7L{_5Wd^w&j^>Ei_td1t>~Fqav;eY+in90yc#&Qv-H^O|5(bOatGaHmQHMqPbSsuTG^5OLZrO~@WcY(e|U33qCU24@fLP#aX_RkY-{;>3&j+| zz9?T~!8Edo75Wd7{p`5^jfR5hqygQu13^SEvIn-X?4>O<96O}YMHef4#m<2d9-Y%riYz6IRRW)nLN~Y9=tvq}8vimh>s#<`R_Neg$jVPO< z-3s?}7f!`(p*;YJa@Odt6lo3nq14c}A9|#mIa?G)UI#)SK-#2*52S5WIS4D+NmcCE z5R8=1oV9IRBKYn=@=VzctI?R0XKcyy7X#<%~U2R)8bQ|#Bxbz~R&YjXvOvfLN;uHiMd1IKU&jElqxYz-mI-va1M zTU8}YBb_wNe)K{h@uzs&*wp-74M7mbSF` z=552fz&Oj|Eq~0P@y`hT>8NjC84@>hcQHU|3V}x@!PX!`J3=7>t{Odq@BzX(g!2d^ z2=BA6SM5k)$nS&;6u)JKv7fIRMj>SgMtnj`avNc|pkc_I7au%?265mL!a_H)VF4~B zMeKJk^#ypCA@P}eiXA$#;Nka_4%V@{($bo=9J|9#t!_){*27lW1K0OqC<&sRJzJsh z#vpt5U>OnR9OUsEKrY?@bc=45ExgX(=i_<0MYa?QP%W*x8PGRs!IGxg#_e)Gwqh>M zE07Cue!I|D3Z>35k|G29pt#uJvLSOqk>=EG)0YiSomB-ln^l}s{J$!LtBN;iJ8tVM zHGc7`g6%zmD3!3!*Gx9xsY?_AWF|+yx^+2oW$eqlCJOSe5(>IWu2Woc{I(J(!v&QFdVK+xHPwU-0@lYyU=a-8(+ z=}nvQ&VQPnUsp*2?5FFRQ%jJ9!E2na&DesF7pNHlKZ)piglzz6Q#7VgEQT~20W&hi zd_XM-!wBdd?LZhsm{rePmDraD;D$%77ldVk9sIZF#l^Mao zC4a~YH%tW$i;zdh5Ek%0ZEx*~%ZYBKjQ~Rp0NBA(JE-sxFA2Z{Dovi0@buqm_t?q5 E0j_n+mH+?% diff --git a/app/amazon/__pycache__/match_action.cpython-39.pyc b/app/amazon/__pycache__/match_action.cpython-39.pyc index a9709a9254dc99927db160298f3cae76456ab039..cfa3167a941aae7a852edd94c76aa6b5098d1715 100644 GIT binary patch delta 7316 zcmbtZeQ+Dcb-z6v4u?;IAP9orAVo<8MTwM5Nw!2`*Rf-^I?Nt-xs>!!&yZKqACk51dPooQ#H zw4J`U2YyJVGo2|hc-VXQcK7YueZTkK^71r!?(-y&^!q&m{QdAZt@N#_vwY~aifhwwJ+L5S&XE*i0vu9dN1l4Nl9T#T^W7J3eG(f8^I1(WmOw`co zL|FCG&@>@}TBX8oqE@Y)ji@zclBk1LR1HI`9$F1$fe5rF(Wo}j@HE*i96pd}E|j8b z?O2Q2NNZ1%MC(BinIT8J4+=*=lms<4L#8^3kZ2=9p+#+1+xRrKW2XEA&E7b+y_$O{g#~p~`AIjoAHW*OUdAw&jqRSexhsex15D{Hj2sYUiuM zMG1vq@=vJk=6N!*O0=rA(cJN&Y)(%Pr&CEioy%JO5mg@o_T*4HJDi)V7H^28Y3>)& zkHqEx*p^ixAwX_9fb4lgWI^Qk&3|$oCBC`eQk-N*HE=9R&8V8?$f#LXgU>Ds3|*y` zq^BoT%c*5lb&`d!bC|zZv&kbFm9mI=$-R|CP0KyvZNk@_G|&B-=QfG7A%p9H+U#NN z_}pP0^2K-ItoC>~AL|5SxgR`{QYUd?tQ(o@fy5mwitWuPKvaA9${gSI{i}m?nBNLE zH}aWcD7d)p%5troR`jPBFasbJaLG2YI&kF>Xp`rIEL=u&1Pp{(P{1mY6_*39%5Wd{Bfmm)likhCBm|Wh?oNm}vi(Bf0?=JXi4RF?H#KL*= zuNtKy`7=8dI8JD7a=xY8X z(lygyv%dVw}<6&yl8m^zz~1l>0yPHiDV z5s<$y2y6Cd{KYD+LMKi_<9fgdpd~L#vw|@7Q`4$^9cgJ>;ljbwA4l-(fDK^}f29bEsazFsGq$9aphGlU$#7;|2 z<+8)+5r#2`yDl5YR>s`X*8V7m&PPzpq3O)>4CmNHQXf)Jq!2byE{9|iC0u$^8;3

w}|2sMAp3WXs@?EjUQA1FaCgV71Tf(Q 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 delta 5270 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 ADF6Tf diff --git a/app/amazon/__pycache__/tool.cpython-39.pyc b/app/amazon/__pycache__/tool.cpython-39.pyc index c74884ac75fc090d7b26aefbd2ac4c9a868b6d67..08dd8590af1e5cee96d4d65de2c5eef675565bde 100644 GIT binary patch delta 1265 zcmZ`&-*4MQ9FOh9aowcjhXg8&>9mK@bd8;~O`4T#8X{ayJ)pt$Y+CKN} z46ssV6KIprwr(m+NbAHZm>5W7op^z563_e#C-Jr{sSxnO1A-UM={owto$mYV?)%aA z*Zuy=Z-@F|GO0%R8b85I>BZ}P2L*Kf=)g<_36{7Zq6iW#$&M~Wg$U}!F&snDO%cVA z{BdkSMv2gZ#pO6sHYL=9RBly}Fc(QBcS6wVl)z%Eb>ia(?k|EMeLpS!85h__Sv_(r z%I|566PEDc60X?T^I#RT9)nnfR&3}pWwBc6YAn9&aS352;BO+df8&mNTu5yEsvd2= z&Jq6Zulc@P()EIt9m#9iqLv*SDP;?pLMA1#9VfOs+oO#AgbyHc3`jKU!AvUB&6!oG6 zN?wVr#TqeQhQ9jG97hFwb+$ihe|op|*~OiWhpkKZI`=O;y?Up${$=;F}e2+P>Ji^lj^tyPcnIcD62qGqY2m{rE<^dHceCfW7=mU}9zxw7z)Q z-a6mf+-}`E&oOo$ect)*t0#}H0)v+TJo(|?)Aehu^&7hYy9Fr$idXB{^F3`AdoFQ2 z3|jYp>^#`&z6uWO&^2|4Y}3)hXq#ypI=pS3ZcvP{RTDDIE0<9PzV%jp~2Os1|Q((e%EqoR)o-%zsH!`M;%2NavK*$FE)&P6#9}HJ9BlX|ahN18JC(3Gf=pQ1xQ5k6ep&o#^ 0: print(f"ASIN {asin} 存在修复商品信息按钮,正在点击...") self.clear_tab() @@ -556,11 +560,9 @@ class ApproveTask: if not task_id: self.log("任务ID为空,跳过", "WARNING") return - if not items: self.log("店铺列表为空,跳过", "WARNING") return - if not country_codes: self.log("国家列表为空,跳过", "WARNING") return @@ -673,16 +675,28 @@ class ApproveTask: if browser and browser != "店铺不存在": self.log(f"成功打开店铺 {shop_name}") - break + # break else: self.log(f"打开店铺失败: {browser}", "WARNING") driver = None + continue # 判断是否需要登录 need_login = driver.need_login() + print("【是否需要登录】:",need_login) if need_login: self.log(f"店铺 {shop_name} 需要登录,正在登录...") - password = "" + # 获取店铺凭证 + response = get_shop_info(shop_name) + print("【获取店铺凭证返回】:",response.text) + shop_data = response.json() + if not shop_data: + mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" + self.log(mes, "ERROR") + show_notification(mes, "ERROR") + continue + + password = shop_data["data"]["password"] login_success = driver.login(password) if login_success: @@ -697,7 +711,8 @@ class ApproveTask: else: self.log(f"店铺 {shop_name} 登录失败", "WARNING") driver = None - + else: + break except Exception as e: import traceback self.log(f"打开店铺异常: {traceback.format_exc()}", "INFO") diff --git a/app/amazon/del_brand.py b/app/amazon/del_brand.py index d0f60f2..4c92467 100644 --- a/app/amazon/del_brand.py +++ b/app/amazon/del_brand.py @@ -489,7 +489,9 @@ class AmamzonBase(ZiniaoDriver): 处理流程: """ - need_login_ele = self.tab.eles('xpath://h1[@class="a-spacing-small"]',timeout=5) + time.sleep(3) # 等待页面可能的登录元素加载,避免跳转等等 + self.tab.wait.doc_loaded(timeout=30, raise_err=False) + need_login_ele = self.tab.eles('xpath://h1[@class="a-spacing-small"]|//span[contains(text(),"登录")]',timeout=5) if len(need_login_ele) >0: print("检测到需要登录元素") return True @@ -497,13 +499,15 @@ class AmamzonBase(ZiniaoDriver): def login(self,password,username=""): try: - pwd_input = self.tab.ele('xpath://input[@type="password"]',timeout=10) - pwd_input.input(password) - submit_btn = self.tab.ele('xpath://input[@id="signInSubmit"]',timeout=10) - submit_btn.click() + pwd_input = self.tab.eles('xpath://input[@type="password"]',timeout=10) + if len(pwd_input) > 0: + pwd_input[0].input(password) + submit_btn = self.tab.eles('xpath://input[@id="signInSubmit"]',timeout=10) + if len(submit_btn) > 0: + submit_btn[0].click() self.tab.wait.doc_loaded() - opt_code_input = self.tab.ele('xpath://input[@name="otpCode"]',timeout=10) + opt_code_input = self.tab.ele('xpath://input[@name="otpCode"]',timeout=60) opt_code_input.wait.displayed(timeout=10,raise_err=False) for _ in range(30): if opt_code_input.value is not None and opt_code_input.value.strip() != "": @@ -512,6 +516,9 @@ class AmamzonBase(ZiniaoDriver): submit_btn.click() self.tab.wait.doc_loaded() return True + time.sleep(1) + submit_btn = self.tab.ele('xpath://input[@id="auth-signin-button"]',timeout=10) + submit_btn.click() except Exception as e: print("登录过程中发生异常:" + traceback.format_exc()) return False diff --git a/app/amazon/main.py b/app/amazon/main.py index 1f7d6f7..0e072bc 100644 --- a/app/amazon/main.py +++ b/app/amazon/main.py @@ -10,6 +10,9 @@ from amazon.approve import ApproveTask from amazon.match_action import MatchTak +from amazon.tool import get_shop_info,show_notification + + class TaskMonitor: """任务监控器:负责监控队列并执行品牌删除任务""" @@ -64,13 +67,13 @@ class TaskMonitor: if task_type == "delete-brand-run": # 提交删除品牌任务到线程池 - self.log(f"接收到删除品牌任务,提交到线程池处理...") + self.log(f"接收到【删除品牌】任务,提交到线程池处理...") future = self.executor.submit(self._process_task_wrapper, task_data) futures.append(future) elif task_type in task_type_info: # 提交产品风险审批任务到线程池 - self.log(f"接收到产品风险审批任务,提交到线程池处理...") + self.log(f"接收到任务,提交到线程池处理...") future = self.executor.submit(self._process_approve_task_wrapper, task_data, task_type_info[task_type]) futures.append(future) @@ -242,10 +245,22 @@ class TaskMonitor: driver = None # 判断是否需要登录 + driver.tab.wait.doc_loaded(timeout=30, raise_err=False) # 等待页面加载,避免过早判断登录状态 need_login = driver.need_login() + print("【是否需要登录】:",need_login) if need_login: self.log(f"店铺 {shop_name} 需要登录,正在登录...") - password = "" + # 获取店铺凭证 + response = get_shop_info(shop_name) + print("【获取店铺凭证返回】:",response.text) + shop_data = response.json() + if not shop_data: + mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" + self.log(mes, "ERROR") + show_notification(mes, "ERROR") + continue + + password = shop_data["data"]["password"] login_success = driver.login(password) if login_success: @@ -611,6 +626,7 @@ class TaskMonitor: verify=False # 忽略SSL证书验证 ) print("【结果提交】:",payload) + print("【结果提交返回】:",response.text) if response.status_code == 200: self.log(f"结果回传成功: {url}") diff --git a/app/amazon/match_action.py b/app/amazon/match_action.py index e0ad574..1841aa8 100644 --- a/app/amazon/match_action.py +++ b/app/amazon/match_action.py @@ -7,7 +7,7 @@ from config import runing_task, runing_shop from datetime import datetime from amazon.del_brand import AmamzonBase, kill_process -from amazon.tool import show_notification +from amazon.tool import show_notification,get_shop_info class AmzoneMatchAction(AmamzonBase): @@ -273,6 +273,8 @@ class MatchTak: try: self.process_shop(shop_item, country_codes, task_id, risk_listing_filter, user_id, stage_index, final_stage) + + # self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) # 更新已处理店铺数 if task_id in runing_task: runing_task[task_id]["processed_shops"] += 1 @@ -299,6 +301,7 @@ class MatchTak: runing_task[task_id]["status"] = "failed" runing_task[task_id]["error"] = str(e) + # def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str): 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): """处理单个店铺 @@ -350,16 +353,27 @@ class MatchTak: if browser and browser != "店铺不存在": self.log(f"成功打开店铺 {shop_name}") - break else: self.log(f"打开店铺失败: {browser}", "WARNING") driver = None + continue # 判断是否需要登录 need_login = driver.need_login() + print("【是否需要登录】:",need_login) if need_login: self.log(f"店铺 {shop_name} 需要登录,正在登录...") - password = "" + # 获取店铺凭证 + response = get_shop_info(shop_name) + print("【获取店铺凭证返回】:",response.text) + shop_data = response.json() + if not shop_data: + mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" + self.log(mes, "ERROR") + show_notification(mes, "ERROR") + continue + + password = shop_data["data"]["password"] login_success = driver.login(password) if login_success: @@ -374,6 +388,8 @@ class MatchTak: else: self.log(f"店铺 {shop_name} 登录失败", "WARNING") driver = None + else: + break except Exception as e: import traceback @@ -409,7 +425,9 @@ class MatchTak: import traceback self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") self.log(traceback.format_exc(), "ERROR") + # 最后回传,标记完成 try: + # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) if final_stage: self.post_result(task_id, shop_name, country_code, "", "", is_done=True) else: @@ -564,7 +582,6 @@ class MatchTak: runing_task[task_id]["processed_countries"] += 1 self.log(f"国家 {country_name} 处理完成") - def post_stage_finished(self, task_id: int, user_id, stage_index): import requests from config import DELETE_BRAND_API_BASE @@ -639,8 +656,8 @@ class MatchTak: max_retries = 3 for retry in range(max_retries): try: - print("================回传处理结果====================") - self.log(f"尝试回传结果 (第{retry + 1}/{max_retries} 次)") + print("================【匹配】=====================") + self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") self.log(f"回传URL: {url}") self.log(f"回传数据: {payload}") response = requests.post( @@ -653,9 +670,10 @@ class MatchTak: self.log(f"回传结果: {response.text}") data = response.json() if response.text else {} if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"回传结果成功: {asin} - {status}") + self.log(f"结果回传成功: {asin} - {status}") return - self.log(f"回传结果失败,状态码: {response.status_code}", "WARNING") + else: + self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") print("=====================================") except Exception as e: @@ -666,7 +684,10 @@ class MatchTak: if retry < max_retries - 1: time.sleep(2) + self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") raise RuntimeError("已达到最大重试次数,结果回传最终失败") + + if __name__ == "__main__": user_info = { diff --git a/app/amazon/tool.py b/app/amazon/tool.py index 4f688cc..af48ded 100644 --- a/app/amazon/tool.py +++ b/app/amazon/tool.py @@ -5,6 +5,9 @@ except ImportError: webview = None +import requests +from urllib.parse import quote + def show_notification(message: str, message_type: str = "error"): """显示 pywebview 顶层通知(5秒后自动消失) @@ -75,3 +78,39 @@ def show_notification(message: str, message_type: str = "error"): print(f"显示通知失败: {str(e)}") + + +def get_shop_info(shop_name: str, base_url: str = "http://8.136.19.173:18080") -> requests.Response: + """ + 调用商铺凭证接口 + :param shop_name: 商铺名称,将自动进行 URL 编码 + :param base_url: API 基础地址,默认从 curl 中提取 + :return: requests.Response 对象 + """ + url = f"{base_url}/api/admin/shop-manages/credential" + params = {"shopName": shop_name} + + headers = { + "Accept": "*/*", + "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Pragma": "no-cache", + "Referer": "http://8.136.19.173:18080/doc.html", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36", + "X-Internal-Token": "59c6691199917a2095827b5188502029", + } + + response = requests.get( + url, + params=params, + headers=headers, + verify=False, + timeout=30 + ) + return response + + + + +