From ab2dbb0de641792ceae89b55f30edb671cf401c3 Mon Sep 17 00:00:00 2001 From: home-dev-pookz Date: Tue, 9 Dec 2025 15:01:04 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=8A=96=E9=9F=B3=E6=88=91=E8=BF=99?= =?UTF-8?q?=E8=BE=B9=E9=81=87=E5=88=B0=E5=BF=85=E9=A1=BB=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=B0=81=E9=9D=A2=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=8C=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=AE=BE=E7=BD=AE=E7=AC=AC=E4=B8=80=E4=B8=AA=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E5=B0=81=E9=9D=A2=EF=BC=88=E5=A4=A7=E6=A6=82=E7=8E=87?= =?UTF-8?q?=E9=A6=96=E5=B8=A7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.example.py | 2 +- uploader/douyin_uploader/main.py | 40 +++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/conf.example.py b/conf.example.py index 7f45d63..a7ef98f 100644 --- a/conf.example.py +++ b/conf.example.py @@ -3,4 +3,4 @@ from pathlib import Path BASE_DIR = Path(__file__).parent.resolve() XHS_SERVER = "http://127.0.0.1:11901" LOCAL_CHROME_PATH = "" # change me necessary! for example C:/Program Files/Google/Chrome/Application/chrome.exe -LOCAL_CHROME_HEADLESS = True +LOCAL_CHROME_HEADLESS = False diff --git a/uploader/douyin_uploader/main.py b/uploader/douyin_uploader/main.py index c4095f0..9bcc180 100644 --- a/uploader/douyin_uploader/main.py +++ b/uploader/douyin_uploader/main.py @@ -213,6 +213,8 @@ class DouYinVideo(object): douyin_logger.success(" [-]视频发布成功") break except: + # 尝试处理封面问题 + await self.handle_auto_video_cover(page) douyin_logger.info(" [-] 视频正在发布中...") await page.screenshot(full_page=True) await asyncio.sleep(0.5) @@ -223,7 +225,43 @@ class DouYinVideo(object): # 关闭浏览器上下文和浏览器实例 await context.close() await browser.close() - + + async def handle_auto_video_cover(self, page): + """ + 处理必须设置封面的情况,点击推荐封面的第一个 + """ + # 1. 判断是否出现 "请设置封面后再发布" 的提示 + # 必须确保提示是可见的 (is_visible),因为 DOM 中可能存在隐藏的历史提示 + if await page.get_by_text("请设置封面后再发布").first.is_visible(): + print(" [-] 检测到需要设置封面提示...") + + # 2. 定位“智能推荐封面”区域下的第一个封面 + # 使用 class^= 前缀匹配,避免 hash 变化导致失效 + recommend_cover = page.locator('[class^="recommendCover-"]').first + + if await recommend_cover.count(): + print(" [-] 正在选择第一个推荐封面...") + try: + await recommend_cover.click() + await asyncio.sleep(1) # 等待选中生效 + + # 3. 处理可能的确认弹窗 "是否确认应用此封面?" + # 并不一定每次都会出现,健壮性判断:如果出现弹窗,则点击确定 + confirm_text = "是否确认应用此封面?" + if await page.get_by_text(confirm_text).first.is_visible(): + print(f" [-] 检测到确认弹窗: {confirm_text}") + # 直接点击“确定”按钮,不依赖脆弱的 CSS 类名 + await page.get_by_role("button", name="确定").click() + print(" [-] 已点击确认应用封面") + await asyncio.sleep(1) + + print(" [-] 已完成封面选择流程") + return True + except Exception as e: + print(f" [-] 选择封面失败: {e}") + + return False + async def set_thumbnail(self, page: Page, thumbnail_path: str): if thumbnail_path: douyin_logger.info(' [-] 正在设置视频封面...')