From 245253cd9e0ebaad3b9b4efbfae8c0e3090afc9b Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期三, 30 七月 2025 22:00:53 +0800
Subject: [PATCH] 添加 AI 生成/改写 docx ;添加微信公众号自动发布

---
 auto_media_publisher/uploaders/uploader_baijiahao.py |  101 ++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 72 insertions(+), 29 deletions(-)

diff --git a/auto_media_publisher/uploaders/uploader_baijiahao.py b/auto_media_publisher/uploaders/uploader_baijiahao.py
index a3f3600..9c743ad 100644
--- a/auto_media_publisher/uploaders/uploader_baijiahao.py
+++ b/auto_media_publisher/uploaders/uploader_baijiahao.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from playwright.async_api import Playwright, Page
 import asyncio
-import random
+import datetime
 
 from auto_media_publisher.uploaders.uploader_base import UploaderBase
 
@@ -10,40 +10,76 @@
                                  
 
 class UploaderBaijiahao(UploaderBase):
-   
+
+
+    async def virtual_scroll_select(self,page,text, wrapper_index = 0,panel_selector="div.rc-virtual-list-holder-inner",
+                                item_selector_template='div.cheetah-select-item-option-content:has-text("{text}")',
+                                step=200,    # 姣忔婊氬姩鍍忕礌
+                                max_attempts=15,
+                                direction="down"  # "down" 鎴� "up"
+                               ):
+        await page.locator('div.select-wrap').nth(wrapper_index).click()
+        await asyncio.sleep(1) 
+
+        panel = page.locator(panel_selector).nth(wrapper_index)
+        item_selector = item_selector_template.format(text=text)
+        
+
+        for i in range(max_attempts):
+            # 灏濊瘯鏌ユ壘
+            items = page.locator(item_selector)
+            if await items.count() > 0:
+                # 鎵惧埌浜嗭紝婊氫笅鍘讳繚璇佸彲瑙侊紝鍐嶇偣鍑�
+                await items.first.scroll_into_view_if_needed()
+                await items.first.click()
+                return
+
+            # 娌℃壘鍒板氨婊氫竴杞�
+            delta = step if direction == "down" else -step
+            await panel.evaluate(f"(el) => el.scrollTop += {delta}")
+            await asyncio.sleep(0.2)
+        await asyncio.sleep(1)
+
+        
     async def set_schedule_time(self, page):
         """
         TODO 鏃堕棿閫夋嫨锛屾棩鍚庡湪澶勭悊 鐧惧鍙风殑鏃堕棿閫夋嫨涓嶅噯纭紝鐩墠鏄殢鏈�
         """
-        publish_datetime_day = f"{self.publish_datetime.month}鏈坽self.publish_datetime.day}鏃�" if self.publish_datetime.day >9  else f"{self.publish_datetime.month}鏈�0{self.publish_datetime.day}鏃�"
-        publish_datetime_hour = f"{self.publish_datetime.hour}鐐�"
-        publish_datetime_min = f"{self.publish_datetime.minute}鍒�"
+        scheduled_time_day = f"{self.scheduled_time.month}鏈坽self.scheduled_time.day}鏃�" if self.scheduled_time.day >9  else f"{self.scheduled_time.month}鏈�0{self.scheduled_time.day}鏃�"
+        scheduled_time_hour = f"{self.scheduled_time.hour}鐐�"
+        scheduled_time_min = f"{self.scheduled_time.minute}鍒�"
         await page.locator("div.cheetah-modal-confirm-body-wrapper").wait_for(state='visible',timeout=30000)
+
+        current_hour = datetime.datetime.now().hour
+        current_min = datetime.datetime.now().minute
+        direction_hour = "down" if self.scheduled_time.hour > current_hour else "up"
+        direction_minute = "down" if self.scheduled_time.minute > current_min else "up"
+
+        print(direction_hour)
+        print(dir)
+
 
         try:
             await page.locator('div.select-wrap').nth(0).click()
             await asyncio.sleep(1) 
-            target = page.locator(f'div[title="{publish_datetime_day}"]')
-            await target.wait_for(state='visible')
+            target = page.locator(f'div[title="{scheduled_time_day}"]')
+            #await target.wait_for(state='visible')
             await target.click()
             await asyncio.sleep(1) 
-            await page.locator('div.select-wrap').nth(1).click()
-            await asyncio.sleep(1) 
-            target = page.locator(f'div.cheetah-select-item-option-content:has-text("{publish_datetime_hour}")')
-            await target.wait_for(state='visible')
-            await target.click()
-            await asyncio.sleep(1)
-            await page.locator('div.select-wrap').nth(2).click()
-            await asyncio.sleep(1) 
-            target = page.locator(f'div.cheetah-select-item-option-content:has-text("{publish_datetime_min}")')
-            await target.wait_for(state='visible')
-            await target.click()
-            await asyncio.sleep(1)
+            await self.virtual_scroll_select(page,scheduled_time_hour,wrapper_index=1,direction=direction_hour)
+            await self.virtual_scroll_select(page,scheduled_time_min,wrapper_index=2,direction=direction_minute)
+            #await page.locator('div.select-wrap').nth(2).click()
+            #await asyncio.sleep(1) 
+            #target = page.locator(f'div.cheetah-select-item-option-content:has-text("{scheduled_time_min}")')
+            #await target.wait_for(state='visible')
+            #await target.scroll_into_view_if_needed()
+            #await target.click()
+            #await asyncio.sleep(1)
 
         except Exception as e:
             self.logger.error(f"[Baidu BaiJiaHao] 璁剧疆鏃堕棿鍙戠敓閿欒.{e}")
         
-        await page.locator("div.cheetah-modal-confirm-btns > button").nth(1).click()
+        #await page.locator("div.cheetah-modal-confirm-btns > button").nth(1).click()
 
     async def handle_upload_error(self, page):
         # 鏃ュ悗瀹炵幇锛岀洰鍓嶆病閬囧埌
@@ -87,7 +123,7 @@
                 raise  # 閲嶆柊鎶涘嚭寮傚父锛岃閲嶈瘯瑁呴グ鍣ㄦ崟鑾�
 
     async def publish_video(self, page: Page):
-        if self.publish_datetime != 0:
+        if self.scheduled_time != 0:
             # 瀹氭椂鍙戝竷
             await self.set_schedule_publish(page)
         else:
@@ -115,21 +151,28 @@
 
             page = await self.context.new_page()
             await page.goto(CONTENT_UPLOAD_URL, timeout=120000)
-            self.logger.info(f"姝e湪涓婁紶-------{self.path_video}")
+            self.logger.info(f"姝e湪涓婁紶-------{self.path_media}")
             await page.wait_for_url(CONTENT_UPLOAD_URL, timeout=120000)
 
             # 鐐瑰嚮 "涓婁紶瑙嗛" 鎸夐挳
-            await page.locator("div[class^='video-main-page'] input").set_input_files(self.path_video)
+            upload_div  =  page.locator(".PL3VsCg3MxIPY5UYiCS_")
+            await upload_div.wait_for(state="visible", timeout=10000)
+            async with page.expect_file_chooser() as fc_info:
+                await upload_div.click()
+            file_chooser = await fc_info.value
+            await file_chooser.set_files(self.path_media)
+            await asyncio.sleep(2)
 
             # 绛夊緟椤甸潰璺宠浆鍒版寚瀹氱殑 URL
-            while True:
-                # 鍒ゆ柇鏄槸鍚﹁繘鍏ヨ棰戝彂甯冮〉闈紝娌¤繘鍏ワ紝鍒欒嚜鍔ㄧ瓑寰呭埌瓒呮椂
+            for i in range(10):
                 try:
                     await page.locator("div#formMain:visible").wait_for(timeout=30000)
                     break
                 except:
-                    self.logger.info("姝e湪绛夊緟杩涘叆瑙嗛鍙戝竷椤甸潰...")
+                    self.logger.info(f"绗� {i+1} 娆″皾璇曪細姝e湪绛夊緟杩涘叆瑙嗛鍙戝竷椤甸潰...")
                     await asyncio.sleep(0.1)
+            else:
+                self.logger.warning("瓒呰繃鏈�澶у皾璇曟鏁帮紝浠嶆湭杩涘叆瑙嗛鍙戝竷椤甸潰銆�")
 
             # 濉厖鏍囬鍜岃瘽棰�
             # 杩欓噷涓轰簡閬垮厤椤甸潰鍙樺寲锛屾晠浣跨敤鐩稿浣嶇疆瀹氫綅锛氫綔鍝佹爣棰樼埗绾у彸渚х涓�涓厓绱犵殑input瀛愬厓绱�
@@ -139,13 +182,13 @@
 
             upload_status = await self.uploading_video(page)
             if not upload_status:
-                self.logger.error(f"鍙戠幇涓婁紶鍑洪敊浜�... 鏂囦欢:{self.path_video}")
+                self.logger.error(f"鍙戠幇涓婁紶鍑洪敊浜�... 鏂囦欢:{self.path_media}")
                 raise
 
             # 鍒ゆ柇瑙嗛灏侀潰鍥炬槸鍚︾敓鎴愭垚鍔�
             while True:
                 self.logger.info("姝e湪纭灏侀潰瀹屾垚, 鍑嗗鍘荤偣鍑诲畾鏃�/鍙戝竷...")
-                if await page.locator("div.cheetah-spin-page img").count():
+                if await page.locator("div.erVanTLKMOvnU7OgFaoD img").count():
                     self.logger.info("灏侀潰宸插畬鎴愶紝鐐瑰嚮瀹氭椂/鍙戝竷...")
                     break
                 else:
@@ -166,5 +209,5 @@
 
             return True
         except Exception as e:
-            self.logger.error(f"{self.user} upload video {self.path_video} fails, error is :{e}")
+            self.logger.error(f"{self.user} upload video {self.path_media} fails, error is :{e}")
             return False
\ No newline at end of file

--
Gitblit v1.9.1