+
    ܌i                        R t ^ RIt^ RIt^ RIHt ^ RIHtHt ^ RIHtH	t	H
t
 ^ RIHt ^ RIHt ^ RIHt ^RIHtHt ^ R	IHt  ! R
 R]4      tR t ! R R]4      t]R8X  d$   ]P6                  ! ]! RR^RRRRRR^ 4
      4       R# R# )u)   
通用多平台视频上传核心实现
N)datetime)
Playwrightasync_playwright)LOCAL_CHROME_PATHLOCAL_CHROME_HEADLESSBASE_DIR)set_init_script)get_absolute_path)create_logger)PLATFORM_CONFIGSget_type_by_platform_key)check_cookie_genericc                      a  ] tR t^t o RtR tR tV 3R lR ltR tR t	R t
R	 tR
 tR tR tR tR tR tR tRR ltR tR tR tR tRtV tR# )BaseFileUploaderu;  
单个视频上传器通用基类参数说明：
account_file: 账号cookie文件路径
file_type: 文件类型，1为图文，2为视频
file_path: 文件路径
title: 文件标题
text: 文件正文描述
tags: 文件标签，多个标签用逗号隔开
publish_date: 发布时间，格式为YYYY-MM-DD HH:MM:SS
c                   Wn         W n        W0n        W@n        WPn        W`n        Wpn        Wn        Wn        Wn	        \        V n        \        V n        R V n        \        P                   ! V P                   4      V n        V P"                  '       g   \%        RV P                    24      hV P"                  R,          V n        V P"                  R,          V n        V P"                  R,          V n        V P"                  R,          V n        V P"                  R,          V n        V P"                  R,          R,          V n        V P"                  R,          R	,          V n        V P"                  R,          R
,          V n        V P"                  R,          R,          V n        V P"                  R,          R,          V n        V P"                  R,          R,          V n        V P"                  R,          R,          V n        . R"OV n        \A        V P&                  RV P&                   R24      V n!        V P"                  R,          R,          V n"        V P"                  R,          R,          V n#        V P"                  R,          R,          V n$        V P"                  R,          R,          V n%        V P"                  R,          R,          V n&        V P"                  R,          R,          V n'        V P"                  R,          R,          V n(        RV n)        RV n*        RV n+        ^V n,        RV n-        RV n.        ^V n/        ^
V n0        RV n1        RV n2        R .V n3        R!V n4        ^2V n5        . R#OV n6        R # )$Nu   不支持的平台: platform_namepersonal_url	login_urlcreator_video_urlcreator_image_url	selectorsupload_buttonpublish_buttontitle_editortextbox_selectorsthumbnail_buttonthumbnail_finishschedule_buttonzlogs/z.logfeaturesskip_cookie_verifytitletextboxtags	thumbnaillocationscheduleFi0u  `  i  i'  z%Y-%m-%dz%H:%Mzinput[type="file"]zen-US)zdiv:has-text("error"):visiblezdiv:has-text("Error"):visiblezdiv[class*="error"]:visible)z--no-sandboxz--disable-dev-shm-usagez--disable-gpuz--ignore-certificate-errorsz--start-maximizedz---disable-blink-features=AutomationControlled)7platformaccount_file	file_type	file_pathr    textr"   thumbnail_pathr$   publish_dater   local_executable_pathr   headlesslocator_baser   getconfig
ValueErrorr   r   r   r   r   upload_button_selectorspublish_button_selectorseditor_button_locatorsr   thumbnail_button_selectorsthumbnail_finish_selectorsschedule_button_selectorserror_selectorsr
   loggerr   title_supportedtextbox_supportedtags_supportedthumbnail_supportedlocation_supportedschedule_supportedpublish_statusbutton_visible_timeoutpage_load_timeoutcheck_intervalwait_timeout_500mslogin_wait_timeoutmax_publish_attemptsmax_retry_delaydate_formattime_formatfile_input_selectorbrowser_langslow_mobrowser_args)selfr'   r(   r)   r*   r    r+   r"   r,   r$   r-   s   &&&&&&&&&&&\/data/.openclaw/workspace/MediaPublishPlatform/sau_backend/newFileUpload/baseFileUploader.py__init__BaseFileUploader.__init__   s    (""
		, (%6"-  '**4==9{{{3DMM?CDD "[[9 KK7[1!%-@!A!%-@!A (,{{;'?'P$(,K(@AQ(R%&*kk+&>~&N#!%[!9:M!N*.++k*BCU*V'*.++k*BCU*V')-[)ABS)T&
 
 $T%7%75ASAS@TTX9YZ"&++j"9:N"O#{{:6w?!%Z!8!C"kk*5f=#';;z#:;#G "&++j"9*"E"&++j"9*"E#&+#!&"%"'$%!!%"$8#9  $
    c                (  "   V P                   P                  V P                   RV P                   24       V P                  P                  R9   d	   ^V n        MaV P                  P                  R9   d	   ^V n        M>V P                   P                  V P                   RV P                  P                   24       V P                   P                  V P                   RV P
                   24       V P                   P                  V P                   RV P                   24       V P                   P                  V P                   RV P                   24       V P                  '       g9   V P                  RR7      G Rj  xL
 '       g   \        V P                   R	24      h\        4       ;_uu_4       GRj  xL
 pV P                  V4      G Rj  xL
 pV'       gH   V P                   P                  V P                   R
V P                   24        RRR4      GRj  xL
  R# V P                   P                  V P                   RV P                   24        RRR4      GRj  xL
  R#  L L L LS L  + GRj  xL 
 '       g   i     R# ; i5i)u   
主入口函数
u   将上传文件：u   该文件类型暂不支持：u    文件类型：u
    标题：u
    标签：T)handleNu    Cookie验证失败   视频上传失败: Fu   视频上传成功: )z.jpgz.jpegz.pngz.webp)z.mp4z.movz.flvz.f4vz.mkvz.rmz.rmvbz.m4vz.mpgz.mpegz.ts)r;   infor   r*   suffixr)   errornamer    r"   r   platform_setup	Exceptionr   upload)rP   
playwrightupload_results   &  rQ   mainBaseFileUploader.main   s    
 	D..//A$..AQRS >>  $FFDN^^""&}}DNKK!3!3 44RSWSaSaSfSfRghiD..//??OPQD../z$**FGD../z$))EF &&&,,D,9994#5#5"66I JKK $%%%"&++j"99M !!T%7%7$88LTZZL"YZ	 &%%   D$6$6#77KDJJ<!XY &%%	 : &9 &%%%s   E&J)J>I+?	J	.J7I-8J;I5I/I55I5JI1J$5I5J$I3%J-J/I51J3J5J	;I><
J	J			Jc                $   < V ^8  d   QhRS[ RR/# )   r_   returnN)r   )format__classdict__s   "rQ   __annotate__BaseFileUploader.__annotate__   s     d dz dd drT   c                  "    V P                   P                  RV P                   24       VP                  P	                  V P
                  V P                  R7      G Rj  xL
 pV P                   P                  RV P                   R24       VP                  V P                   R7      G Rj  xL
 p\        V4      G Rj  xL
 pV P                   P                  RV P                   R24       VP                  4       G Rj  xL
 pV P                  R	8X  d   V P                  V4      G Rj  xL
  V P                  ^8X  d2   VP                  V P                  R
V P                   R7      G Rj  xL
  M0VP                  V P"                  R
V P                   R7      G Rj  xL
  \$        P&                  ! ^4      G Rj  xL
  V P                   P                  RV P                   R24       V P                  R8X  d   V P)                  V4      G Rj  xL
  V P+                  V4      G Rj  xL
  V P                   P                  RV P                   R24       V P-                  V4      G Rj  xL
 pV'       g   \/        V P                   R24      hV P                   P                  RV P                   R24       V P1                  V4      G Rj  xL
 pV'       g   \/        V P                   R24      hV P                   P                  RV P                   R24       V P3                  V4      G Rj  xL
 pV'       g   \/        V P                   R24      hV P                   P                  RV P                   R24       V P4                  '       dD   V P7                  V4      G Rj  xL
  V P                   P                  RV P                   R24       M)V P                   P                  RV P                   R24       V P8                  '       dV   V P:                  '       dD   V P=                  V4      G Rj  xL
  V P                   P                  RV P                   R24       M)V P                   P                  RV P                   R24       V P>                  '       d_   V P@                  ^ 8w  dN   V PC                  W@P@                  4      G Rj  xL
  V P                   P                  R V P                   R!24       M)V P                   P                  R V P                   R"24       V PE                  V4      G Rj  xL
  V P                   P                  R#V P                   R$24       VPG                  V P                   R%7      G Rj  xL
  V P                   P                  R&V P                   R'24       \$        P&                  ! V PH                  4      G Rj  xL
  \$        P&                  ! ^4      G Rj  xL
  VPK                  4       G Rj  xL
  VPK                  4       G Rj  xL
  V P                   P                  R(V P                   R)24       V PL                  #  EL EL EL ELe EL> EL  EL EL ELg ELQ EL EL ELT EL ELV EL ELW EL L L L Lu  \.         d?   pT P                   PO                  T P                   R*\Q        T4       24        Rp?R+# Rp?ii ; i5i),u2   
作用：执行单个视频上传到某个平台
u   开始上传视频: )r/   executable_pathNzstep1: u   浏览器实例创建成功storage_statezstep2: u   浏览器上下文创建成功tiktokdomcontentloaded
wait_untiltimeoutzstep3: u   页面加载完成	instagramzstep4: u   基础定位器选择完成u    视频文件上传失败zstep5: u   视频文件上传完成u    上传状态检测失败zstep6: u   上传状态检测完成u    标题和标签添加失败zstep7: u   标题和标签添加完成zstep8: u   视频封面上传完成u   跳过设置缩略图zstep9: u   地点添加完成u   跳过添加地点zstep10: u   定时发布设置完成u   跳过定时发布u	   step11：u   视频已点击发布按钮pathu	   step12：u   cookie已更新u	   step13：u   浏览器窗口已关闭rW   F))r;   rX   r    chromiumlaunchr/   r.   r   new_contextr(   r   new_pagechange_languager)   gotor   rD   r   asynciosleephandle_instagram_loginchoose_base_locatorupload_video_filer]   detect_upload_statusadd_title_tagsr?   set_thumbnailr@   r$   set_locationrA   r-   set_schedule_timeclick_publishrm   rE   closerB   rZ   str)	rP   r_   browsercontextpageupload_video_file_resultdetect_upload_status_resultadd_title_tags_resultes	   &&       rQ   r^   BaseFileUploader.upload   s    `	KK3DJJ<@A&//66 $ : : 7  G KKwt'9'9&::UVW $//ARAR@S/UUG+G44GKKwt'9'9&::XYZ !))++D!!X-**4000~~"ii 6 6CU_c_u_uivvvii 6 6CU_c_u_uivvv--"""KKwt'9'9&::LMN!![011$777 **4000KKwt'9'9&::UVW .2-C-CD-I'I$+4#5#5"66O PQQKKwt'9'9&::RST 150I0I$0O*O'.4#5#5"66O PQQKKwt'9'9&::RST +/*=*=d*C$C!(4#5#5"66R STTKKwt'9'9&::UVW '''((...  74+=+=*>>V!WX  74+=+=*>>S!TU &&&4===''---  74+=+=*>>P!QR  74+=+=*>>P!QR &&&4+<+<+A,,T3D3DEEE  8D,>,>+??W!XY  8D,>,>+??Q!RS $$T***KKy););(<<WXY ''0A0A/B'DDDKKy););(<OLM -- 3 3444--""" --/!!--/!!KKy););(<<TUV&&&u V4
 , 1 wv" 8 1 (J +P %D / . F + E 5" "!  	KK!3!3 44HQQR	s  [(AZ  Y!AZ .Y!/Z Y$A Z Y')Z ,Y*-A Z -Y-.0Z Y0Z <Y3=AZ Y6Z (Y9)AZ *Y<+Z 7AZ Y?Z AZ .Z/Z ;AZ Z "Z#A(Z Z Z 2Z3A(Z /Z ZA+Z 7Z8AZ ZAZ ZZ 4Z5Z ZZ $Z%8Z [(Z !Z $Z 'Z *Z -Z 0Z 3Z 6Z 9Z <Z ?Z Z Z Z Z Z Z Z Z Z Z [%'3[ [( [%%[(c                   "   Wn         R# 5i)u   
选择基础定位器
N)r0   rP   r   s   &&rQ   r   $BaseFileUploader.choose_base_locator  s     
 !s   	c                  "   VP                   pV P                  P                  RV 24       RV9   g	   RV9   Ed   V P                  P                  R4        . ROpRpRpV FF  pVP                  V4      P	                  4       G Rj  xL
 pV^ 8  g   K3  VP                  V4      pTp M	  V'       Ed6   V P                  P                  RV 24       VP                  RR	R
7      G Rj  xL
  RpVP                  P                  4       ;_uu_4       GRj  xL
 p	VP                  4       G Rj  xL
  V P                  P                  R4       RRR4      GRj  xL
  X	P                  G Rj  xL
 pV P                  P                  RVP                    24       VP                  4       G Rj  xL
  VP                  4       G Rj  xL
  \        P                  ! ^4      G Rj  xL
  R# R# R#  ELg EL L L L  + GRj  xL 
 '       g   i     L; i L Lj LT L8  \         d3   p
T P                  P                  R\!        T
4       24        Rp
?
R# Rp
?
ii ; i5i)uD   
处理Instagram登录页面
Args:
    page: Playwright页面对象
z[+]Current URL: 	loginpageloginu<   [+]检测到登录页面，尝试点击Instagram登录按钮N u,   [+]找到Instagram登录按钮，选择器: visible  staterr   u9   [+]已点击Instagram登录按钮，等待新页面打开u   [+]新页面已打开: u&   [+]点击Instagram登录按钮失败: )u6   div[role="button"]:has-text("使用 Instagram 登录")z4div[role="button"]:has-text("Log in with Instagram")u*   button:has-text("使用 Instagram 登录")z(button:has-text("Log in with Instagram"))urlr;   rX   locatorcountwait_forr   expect_pageclickvaluer   reloadr|   r}   r]   rZ   r   )rP   r   current_urllogin_buttonslogin_buttonfound_selectorselectorr   ry   new_page_infor   s   &&         rQ   r~   'BaseFileUploader.handle_instagram_login!  s     hh+K=9: +%K)?KK[\&U!  $!# -H"&,,x"8">">"@@Eqy'+||H'=)1 !.  <KK$$'STbSc%de&//i/NNN  $H#||77999]*00222(()de  :9 &3%8%88HKK$$'>x||n%MN"..***++-''!--***#  + *@ A O  :2  :999  9 +'* U!!$J3q6("STTUs  AI/H G.H H 54H )G1*,H G4H G:.G6/G:H G8H -H.?H -H.H HH #H$H (I.H 1H 4H 6G:8H :H	 H
H	H		H H H H I)'IIIIc           	     (  "   V F  pV P                   P                  V4      P                  4       G Rj  xL
 pV^ 8  g   K=  V P                   P                  V4      P                  RV P                  R7      G Rj  xL
  V P
                  P                  RT RV P                   P                  V4      P                  4       G Rj  xL
  24       V P                   P                  V4      u # 	  V P
                  P                  R4       R#  L L LJ5i)u   
通用的按钮查找方法
Args:
    selector_list: 所有可能的按钮选择器列表
Returns:
    找到的按钮定位器对象，如果没找到则返回None
Nr   r   u   找到按钮定位器: u   , 是否可见: u   未找到任何按钮定位器)r0   r   r   r   rC   r;   rX   
is_visible)rP   selector_listr   r   s   &&  rQ   find_buttonBaseFileUploader.find_buttonV  s     &H++33H=CCEEEqy''//9BB\`\w\wBxxx  #:8*DT[_[l[l[t[tu}[~  \J  \J  \L  VL  UM  "N  O((00:: & 	9: F y VLs;   2DDD9D;D<A	DDADDDc                  "    \         P                  ! V P                  4      G Rj  xL
  \         P                  ! ^4      G Rj  xL
  V P                  V P                  4      G Rj  xL
 pV'       g   \        R4      hV P                  P                  R4       VP                  RV P                  R7      G Rj  xL
  VP                  4       ;_uu_4       GRj  xL
 pVP                  4       G Rj  xL
  RRR4      GRj  xL
  XP                  G Rj  xL
 pVP                  V P                  4      G Rj  xL
  V P                  P                  RV P                   24       R#  ELC EL( EL L L L Lt  + GRj  xL 
 '       g   i     L; i L~ L]  \
         d3   pT P                  P                  R\!        T4       24        Rp?R	# Rp?ii ; i5i)
u|   
作用：上传视频文件
网页中相关按钮：上传视频文件的按钮元素为（）
返回：是否上传成功
Nu"   未找到上传图文/视频按钮u(     [-] 将点击上传图文/视频按钮r   r   u)   通过系统文件选择器上传文件: Tu!   选择图文/视频文件失败: F)r|   r}   rE   r   r4   r]   r;   rX   r   rC   expect_file_chooserr   r   	set_filesr*   rZ   r   )rP   r   r   fc_infofile_chooserr   s   &&    rQ   r   "BaseFileUploader.upload_video_filel  sd    	-- 3 3444--""""&"2"243O3O"PPM  DEEKKGH((y$B]B](^^^ //111W#))+++ 21!(.L((888KKHHXYZ 5"P _ 2+ 2111.8  	KK A#a&JK	s   G#F E*F E-"F (E0)F 5AF ;E3< F E5F  E;4E75E;9F E9F F"F ;F<,F (G*F -F 0F 3F 5F 7E;9F ;F	F
F	F		F F G&'GGGGc                \  "     V P                   R8X  d   VP                  R4      P                  4       G Rj  xL
 pV^ 8X  d   V P                  P	                  R4        R# V P                  P                  R4       \        P                  ! V P                  4      G Rj  xL
  K  V P                  V P                  4      G Rj  xL
 pV'       d:   VP                  R4      G Rj  xL
 f   V P                  P                  R4        R# V P                  P                  R4       \        P                  ! V P                  4      G Rj  xL
  V P                  V P                  4      G Rj  xL
 pV'       d8   V P                  P                  R4       V P                  V4      G Rj  xL
  EK  EK   EL{ EL L L Ls LR L  \         d\   pT P                  P                  R	\        T4       24       \        P                  ! T P                  4      G Rj  xL 
   Rp?R
# Rp?ii ; i5i)um   
作用：检测上传状态
网页中相关按钮：发布按钮选择器（）
返回：是否上传成功
Tkuaishouu   text=上传中Nu   图文/视频上传完毕u   正在上传图文/视频中...disabledz.  [-] found error while uploading now retry...z   [-] video uploading... Error: F)r   r   r   r;   successrX   r|   r}   rE   r   r5   get_attributer:   handle_upload_errorr]   r   )rP   r   numberr   error_elementr   s   &&    rQ   r   %BaseFileUploader.detect_upload_status  s     %%3#'<<0@#A#G#G#IIF{++,GH. + (()JK%mmD,?,?@@@ ,0+;+;D<Y<Y+Z%ZN%0L0LZ0X*X*`(()DE  (()JK%mmD,?,?@@@.2.>.>t?S?S.T(T( KK,,-]^"&":":4"@@@ )' J A &[*X
 A(T A   #CCF8!LMmmD$7$7888s   H,3G F3&G H,">G  F6!G %H,'G F9G G &F;'!G H,>G 	F=
"G ,F?-G 9/G (G)G -H,3G 6G 9G ;G =G ?G G H)A
H$HH$H,$H))H,c                  "    V P                   P                  R4       V P                  V P                  4      G Rj  xL
 pV'       dN   VP	                  V P
                  4      G Rj  xL
  V P                   P                  RV P
                   24       R# R#  L[ L2  \         d3   pT P                   P                  R\        T4       24        Rp?R# Rp?ii ; i5i)u   
作用：处理上传错误，重新上传
网页中相关按钮：系统文件管理器的上传按钮（input[type="file"]）
返回：是否重新上传成功
zvideo upload error retrying.Nu   重新上传文件: Tu   重新上传失败: F)	r;   rX   r   rL   set_input_filesr*   r]   rZ   r   )rP   r   file_input_buttonr   s   &&  rQ   r   $BaseFileUploader.handle_upload_error  s     
	KK;<&*&6&6t7O7O&P P '77GGG  #77G!HI ! !QG  	KK 4SVH=>	sV   C9B BB 
B (B),B CB B C('CCCCc                Z  "    V P                   '       EdO   V P                  '       Ed<   V P                  V P                  4      G Rj  xL
 pV'       g   \	        R4      hV P
                  P                  RVP                  4       G Rj  xL
  24       VP                  4       G Rj  xL
  VP                  P                  R4      G Rj  xL
  VP                  P                  R4      G Rj  xL
  VP                  V P                  4      G Rj  xL
  VP                  P                  V P                  4      G Rj  xL
  VP                  V P                  4      G Rj  xL
  V P                  '       EdD   V P                  '       Ed1   V P                  V P                   4      G Rj  xL
 pV'       d5   V P
                  P                  RVP                  4       G Rj  xL
  24       VP                  4       G Rj  xL
  VP                  P                  R4      G Rj  xL
  VP                  P                  R4      G Rj  xL
  VP                  V P                  4      G Rj  xL
  VP                  P                  V P                  4      G Rj  xL
  VP                  V P                  4      G Rj  xL
  V P"                  '       d   V P$                  '       d   VP                  P                  R4      G Rj  xL
  VP                  P                  R4      G Rj  xL
  \'        V P$                  ^R7       Fq  w  rEV P
                  P                  R	V,          4       VP                  P                  R
V R24      G Rj  xL
  VP                  V P                  4      G Rj  xL
  Ks  	  R#  ELk EL- EL EL EL EL EL ELh EL" EL EL EL EL ELt ELJ EL* L L La L@  \         d3   pT P
                  P)                  R\+        T4       24        Rp?R# Rp?ii ; i5i)u   
作用：添加标题和标签
网页中相关按钮：添加标题和标签的按钮选择器（）
返回：是否添加成功
Nu   未找到标题输入框u      [-] 将点击标题输入框: z	Control+ADeleteu      [-] 将点击正文输入框: Enter)startzSetting the %s tag# Tz$Failed to add title, text and tags: F)r<   r    r   r6   r]   r;   rX   text_contentr   keyboardpresswait_for_timeoutrF   insert_textr=   r+   r   r>   r"   	enumeraterZ   r   )rP   r   editor_buttontextbox_buttonindextagr   s   &&     rQ   r   BaseFileUploader.add_title_tags  s'    0	###


&*&6&6t7R7R&S S$#$>??  #C-JdJdJfDfCg!hi#))+++ mm))+666mm))(333++D,C,CDDD mm//

;;;++D,C,CDDD %%%$)))'+'7'78N8N'O!O!KK$$'GnNiNiNkHkGl%mn$**,,,mm))+666mm))(333++D,C,CDDD mm//		:::++D,C,CDDD """tyyymm))'222mm))'222"+DIIQ"?JEKK$$%9E%AB--33auAJ???//0G0GHHH	 #@
 S !T Eg+ 73D <D
 "PHk,63D ;D 32 @H 	KK DSVHMN	s  P+%O+ O+ N3	O+ 4O+ 	N6

O+ 'N9("O+ 
N<"O+ -N?."O+ O,O+ =O>"O+  O!O+ 8O+ O+ )O*O+ 6)O+ O
 O+ =O>"O+  O!"O+ O"O+ &O',O+ O"O+ 6O 7O+ O+ O+ =O#>"O+  O%!A$O+ O'"O+ (O))O+ 1P+3O+ 6O+ 9O+ <O+ ?O+ O+ O+ O+ O+ O+ O+ O+ O+ O+ O+  O+ #O+ %O+ 'O+ )O+ +P(6'P#P+#P((P+c                  "   V P                   '       Ed8   V P                  P                  RV P                  V P                  4      P                  4       G Rj  xL
  24       V P                  V P                  4      P                  4       G Rj  xL
  V P                  P                  RV P                  V P                  4      P                  4       G Rj  xL
  24       V P                  V P                  4      P                  V P                   4      G Rj  xL
  VP                  R4      G Rj  xL
  V P                  P                  RV P                  V P                  4      P                  4       G Rj  xL
  24       V P                  V P                  4      P                  4       G Rj  xL
  V P                  P                  RV P                  V P                  4      P                  4       G Rj  xL
  24       V P                  V P                  4      P                  4       G Rj  xL
  VP                  R4      G Rj  xL
  R# V P                  P                  R4       V P                  V P                  4      G Rj  xL
 pV'       d   VP                  4       G Rj  xL
  VP                  R4      G Rj  xL
  V P                  P                  R4       V P                  V P                  4      G Rj  xL
 pV'       d   VP                  4       G Rj  xL
  VP                  R4      G Rj  xL
  R#  EL EL ELm EL. EL EL EL EL\ EL( EL L L L Lc LE L.5i)	u   
设置视频封面
u#     [-] 将点击封面选择按钮: Nu#     [-] 将点击封面上传按钮:   u#     [-] 将点击封面确认按钮: u#     [-] 将点击封面关闭按钮: u!     [-] 将点击封面选择按钮u!     [-] 将点击封面确认按钮)r,   r;   rX   r   r7   r   r   thumbnail_upload_selectorsr   r   r8   thumbnail_close_selectors)rP   r   r   r   s   &&  rQ   r   BaseFileUploader.set_thumbnail  s     KKBIYIYZ^ZyZyIz  JH  JH  JJ  DJ  CK  L  M""4#B#BCIIKKKKKBIYIYZ^ZyZyIz  JH  JH  JJ  DJ  CK  L  M""4#B#BCSSTXTgTghhh''---KKBIYIYZ^ZyZyIz  JH  JH  JJ  DJ  CK  L  M""4#B#BCIIKKKKKBIYIYZ^ZxZxIy  JG  JG  JI  DI  CJ  K  L""4#A#ABHHJJJ''---KK@A%)%5%5d6U6U%VV&,,...''---KK@A$($4$4T5T5T$UU&,,...''---) DJK DJh- DJK DIJ-  W.-U.-s0  AM'L=
6M'M AM'M
AM'MM'1M	2AM'8M
96M'/M0AM'6M
76M'-M.M'M?M'MM'M'&M'M'?M =M'=M!>M'
M'M#M'6M%7M' M'M'M'	M'M'M'M'M'M'M'M'M'!M'#M'%M'c                  "   V P                   '       g   R# VP                  R4      P                  4       G Rj  xL
  VP                  P	                  R4      G Rj  xL
  VP                  R4      G Rj  xL
  VP                  P                  \         4      G Rj  xL
  VP                  RRR7      G Rj  xL
  VP                  R4      P                  P                  4       G Rj  xL
  R#  L L L} LX L? L5i)u   
设置视频发布位置
Nu3   div.semi-select span:has-text("输入地理位置")	Backspacer   z#div[role="listbox"] [role="option"]r   rr   )	r$   r   r   r   r   r   typewait_for_selectorfirstr   s   &&rQ   r   BaseFileUploader.set_location  s      }}}llPQWWYYYmm!!+...##D)))mm  ***$$%JTX$YYYll@AGGMMOOO 	Z.)*YOsi   7C;C/"C;C1C;5C36&C;C5C;7C780C;(C9)C;1C;3C;5C;7C;9C;c                  "   V P                  V P                  4      G Rj  xL
 pV'       g   \        R4      hV P                  P	                  RVP                  4       G Rj  xL
  24       VP                  RR7      G Rj  xL
  VP                  4       G Rj  xL
  Tp\        V\        4      '       d   \        P                  ! V4      pVP                  RVP                  V P                  4      4      G Rj  xL
  VP                  RVP                  V P                  4      4      G Rj  xL
  V P                  P	                  RV 24       R#  EL2 L L L L` L/5i)	u   
设置定时发布时间
Nu   未找到定时发布按钮u#     [-] 将点击定时发布按钮: r   )r   z[aria-label="Date"]z[aria-label="Time"]u#     [-] 定时发布时间设置为: )r   r9   r]   r;   rX   r   r   r   
isinstanceintr   fromtimestampfillstrftimerJ   rK   )rP   r   r-   r   publish_datetimes   &&&  rQ   r   "BaseFileUploader.set_schedule_time   s-    
 !% 0 01O1O PP9::>_EaEaEc?c>def&&Y&777##%%% (lC(('55lC ii-/?/H/HIYIY/Z[[[ii-/?/H/HIYIY/Z[[[>?O>PQR! Q @d7% 	\[so   E EE 4E "E
#E EE EA E ;E<2E .E/%E E E E E E c                N  "   V P                   p^ pW28  Edd   V P                  '       EgQ   V^,          p V P                  V P                  4      G Rj  xL
 pV'       d   VP	                  4       G Rj  xL
  \
        P                  ! V P                  4      G Rj  xL
  V P                  R8X  d    VP                  RRR7      G Rj  xL
  V P                  P                  R4       V P                  P                  R4      P	                  4       G Rj  xL
  V P                  P                  R4       VP                  R	4      G Rj  xL
  V P                  P                  R4       VP$                  pV P                  P                  RV 24       V P&                  ^8X  d   V P(                  pMV P*                  pWv9  d	   RV n        MV P                  V P,                  4      G Rj  xL
 pV'       de   V P                  P                  RT RVP/                  4       G Rj  xL
  24       VP1                  RV P2                  R7      G Rj  xL
  RV n        M"V P                  P                  RV R24       EKj  V P                  '       d(   V P                  P                  R4       V P                  # V P                  P9                  RV R24       V P                  #  EL ELo ELJ EL  EL EL  \         d3   pT P                  P!                  R
\#        T4       24        Rp?ELRp?ii ; i ELI EL L  \         d_    T P                  P!                  RT R24       \
        P                  ! \5        T^,          T P6                  4      4      G Rj  xL 
   EK  i ; i5i)u   
作用：点击发布按钮并等待发布完成
参数：
    page: Playwright页面对象
返回值：
    bool: 发布是否成功
Nrn   zLbutton.TUXButton.TUXButton--primary div.TUXButton-label:has-text("Post now")r   r   u=     [-]检测到版权检查弹窗，准备点击Post now按钮zHbutton.TUXButton.TUXButton--primary div.TUXButton-label >> text=Post nowu     [-]已点击Post now按钮r   u4     [-]未检测到版权检查弹窗或点击失败: u   等待发布完成...u   当前url: Tu   发布尝试 u   ，上传按钮可见状态: r   r   u   ，未找到上传按钮u    失败，等待重试...u   视频发布完成u   视频发布失败，已尝试 u    次)rH   rB   r   r5   r   r|   r}   rE   r   r   r;   rX   r0   r   r   r]   warningr   r   r)   r   r   r4   r   r   rC   minrI   rZ   )	rP   r   max_attemptsattemptr   r   r   
target_urlr   s	   &&       rQ   r   BaseFileUploader.click_publish7  s6     00 $T-@-@-@qLG-L'+'7'78U8U'V!V!(..000!--(;(;<<<))X5	q"&"8"8  :H  RV"8  #W  W  W KK,,-lm"&"3"3";";  =G  #H  #N  #N  #P  P  P KK,,-KL"&"7"7"===   !89"hh  ;{m!<=>>Q&!%!7!7J!%!7!7J0*.D'&*&6&6t7S7S&T T KK$$}WI=Zanayaya{[{Z|%}~'00y$JeJe0fff*.D'KK$$}WI=U%VW KK12 """ KK ?~TRS"""e "W0<
 W P >( q KK//2fgjklgmfn0oppq" !U[{f
  L##mG9<U$VWmmC!T5I5I$JKKKLs-  (N%	N%L9 KL9  L9 3K"4'L9 K%L9 2K1 K(	AK1 K+3K1 K.	K1 A<L9 	N%
L9 (L1)L9 5,L9 !L4"*L9 L7L9 N%L9 8N%AN%L9 "L9 %L9 (K1 +K1 .K1 1L.<'L)#L9 )L..L9 4L9 7L9 9AN"NN"N%!N""N%c                  "   \        V P                  R4      p\        P                  P	                  V4      '       d   V P                  4       G Rj  xL
 '       gu   V'       g   R# V P                  P                  R4       V P                  W P                  V P                  V P                  V P                  V P                  4      G Rj  xL
  R#  L L5i)u   
设置平台账户cookie
cookiesFileNFu0   Cookie文件不存在，需要获取新的CookieT)r	   r(   osru   existscookie_authr;   rX   get_platform_cookier.   rD   r   rG   rM   )rP   rV   r(   s   && rQ   r\   BaseFileUploader.platform_setup|  s      )):):MJww~~l++9I9I9K3K3KKKOP**<9S9SUYUkUkmqm{m{  ~B  ~U  ~U  W[  Wh  Wh  i  i  i 4L is1   ACC	CC$A'CCCCc                b  "    \        V P                  4      pV'       g,   V P                  P                  RV P                   R24       R# \        P
                  P                  V P                  \        P
                  P                  \        R4      4      p\        W4      G Rj  xL
 pV'       d   V P                  P                  R4       V# V P                  P                  R4       V#  LF  \         d3   pT P                  P                  R\        T4       24        Rp?R# Rp?ii ; i5i)	u#   
验证平台的cookie是否有效
u   平台 u    类型未找到Fr   Nu   Cookie有效u   Cookie已过期u   Cookie验证失败: )r   r'   r;   rZ   r   ru   relpathr(   joinr   r   rX   r]   r   )rP   platform_typecookie_file_pathis_validr   s   &    rQ   r   BaseFileUploader.cookie_auth  s     	4T]]CM !!GDMM?:J"KL  "wwt/@/@"'',,xYfBgh 2-RRH  0 O !!"34O S  	KK 4SVH=>	s`   D/AC/ 
D/AC/ &C-'C/ 3C/ D/C/ ,D/-C/ /D,:'D'!D/'D,,D/c                X  "   \        4       ;_uu_4       GRj  xL
 pRRV 2.RRRV/pVP                  P                  ! R/ VB G Rj  xL
 p	V	P                  4       G Rj  xL
 p
\	        V
4      G Rj  xL
 p
V
P                  4       G Rj  xL
 pVP                  V P                  RVR7      G Rj  xL
  VP                  4       G Rj  xL
  V P                  P                  R	V P                   R
24       VP                  V4      G Rj  xL
  V
P                  VR7      G Rj  xL
  V P                  P                  RV 24       V	P                  4       G Rj  xL
  RRR4      GRj  xL
  R#  ELZ EL- EL EL L L L Lx L` L, L  + GRj  xL 
 '       g   i     R# ; i5i)u   
获取平台登录cookie
Nargsz--lang r/   Frk   ro   rp   u   请在浏览器中登录u   账号rt   u   Cookie已保存到:  )r   rv   rw   rx   r   ry   r{   r   pauser;   rX   r   r   rm   r   )rP   r(   rk   rr   r   rG   rM   r_   optionsr   r   r   s   &&&&&&&     rQ   r   $BaseFileUploader.get_platform_cookie  se     $%%%l^, E!?G '//66AAAG#//11G+G44G ))++D))DNN7ISZ)[[[**,KK78J8J7K6RS''(:;;;''\':::KK3L>BC--/!!/ &%% B14+[ <:!/ &%%%s   F*E3F*,F	E6
F!E9"F4E<5FE?%F2F3F
FAFFF&F'5FF	F!F*,F-F*6F9F<F?FFFFF	FF*F'	F
F'	F'	!	F*c                  "   VP                   P                  V P                  V P                  V P                  V P
                  R7      G Rj  xL
 p\        V P                  R4      p\        P                  P                  V4      '       d1   VP                  VR7      G Rj  xL
 p\        V4      G Rj  xL
 pW$3# \        RV 24      h L} L* L5i)u   
设置上传浏览器
)r/   rk   r   rN   Nr   rl   u   Cookie文件不存在: )rv   rw   r/   r.   rO   rN   r	   r(   r   ru   r   rx   r   FileNotFoundError)rP   r_   r   r(   r   s   &&   rQ   setup_upload_browser%BaseFileUploader.setup_upload_browser  s     
 #++22]] 66""LL	 3 
 
 )):):MJ77>>,''#//l/KKG+G44G###&=l^$LMM
 L4s7   ACCAC"C#C5C6CCCc                R  "   VP                  R RR7      G Rj  xL
  VP                  RRR7      G Rj  xL
  \        P                  ! ^4      G Rj  xL
  VP	                  RRR7      G Rj  xL
  VP                  R4      P                  4       G Rj  xL
 R8X  d   R# VP                  R4      P                  4       G Rj  xL
  VP                  R4      P                  4       G Rj  xL
  VP                  R4      P                  4       G Rj  xL
  R#  L L L L L L^ L9 L5i)	zhttps://www.tiktok.comr&   r   Nro   z[data-e2e="nav-more-menu"]Morez[data-e2e="language-select"]z9#creator-tools-selection-menu-header >> text=English (US))r{   wait_for_load_stater|   r}   r   r   r   r   r   s   &&rQ   rz    BaseFileUploader.change_language  s     ii0%i@@@&&'95&IIImmA$$%A5$QQQ:;HHJJfTll78>>@@@ll9:@@BBBllVW]]___ 	AIQJ@B_s   D'DD'DD'DD'-D.&D'D-D'D!&D')D#*&D'D%D'D'D'D'D'!D'#D'%D')1r(   rO   rM   rC   rE   r2   r   r   rJ   r6   r:   rL   r*   r)   r/   r.   r$   r@   r0   r;   r   rG   rH   rI   rD   r   r'   r   r5   r-   rB   r9   rA   r   rN   r"   r>   r+   r   r=   r7   r8   r,   r?   rK   r    r<   r4   rF   N)F)__name__
__module____qualname____firstlineno____doc__rR   ra   r^   r   r~   r   r   r   r   r   r   r   r   r   r\   r   r   r  rz   __static_attributes____classdictcell__)rg   s   @rQ   r   r      s     	q
f!Fd dL!3Uj,6$L$6p.8PS.B#J
:"<N*` `rT   r   c
                   "   \        WW#WEWgW4
      p VP                  4       G Rj  xL
 #  L  \         d3   pTP                  P	                  R\        T4       24        Rp?R# Rp?ii ; i5i)u2   
运行单个文件上传到某个平台的任务
Nu   上传任务失败: F)r   ra   r]   r;   rZ   r   )r'   r(   r)   r*   r    r+   r"   r,   r$   r-   kwargsuploaderr   s   &&&&&&&&&&,  rQ   
run_uploadr    se       	e[_qy  IH]]_$$$  4SVH=>s6   A-- +- A-- A*'A%A-%A**A-c                   6   a a ] tR tRt oRtV 3R ltRtVtV ;t# )XiaohongshuFilei  u   小红书文件上传器c
                0   < \         S
V `  R WW4WVWxV	4
       R# )xiaohongshuN)superrR   )rP   r(   r)   r*   r    r+   r"   r,   r$   r-   	__class__s   &&&&&&&&&&rQ   rR   XiaohongshuFile.__init__  s$    SW_m  zF  	GrT   r   )	r  r  r  r  r  rR   r  r  __classcell__)r  rg   s   @@rQ   r  r    s     "G GrT   r  __main__r  zcookies/xhs_cookie.jsonzvideos/demo.mp4u   测试视频标题u   测试视频正文u   测试 标签zthumbnails/demo.jpgu   测试地点)r  r   r|   r   playwright.async_apir   r   confr   r   r   utils.base_social_mediar   utils.files_timesr	   	utils.logr
   platform_configsr   r   myUtils.authr   objectr   r  r  r  runr   rT   rQ   <module>r(     s    
   = C C 3 / # H -R`v R`p	G& G zKK
!		  rT   