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