diff --git a/spider/task.py b/spider/task.py index cd89ae8..0599b2d 100644 --- a/spider/task.py +++ b/spider/task.py @@ -6,18 +6,18 @@ import sys import threading import time import uuid +from datetime import datetime import pyotp import pywintypes import requests -from fake_useragent import UserAgent # 导入 UserAgent import win32api import win32con from PIL import ImageGrab +from fake_useragent import UserAgent # 导入 UserAgent from loguru import logger from playwright._impl._page import Page from playwright.sync_api import sync_playwright, Error, TimeoutError -from concurrent.futures import ThreadPoolExecutor from const import BUCKET, BASE_PATH from exceptions import AuthException, OperationFailed @@ -231,6 +231,55 @@ def playwright_like(cookies, target_url): } +# 获取个个人主页视频数量 +def get_video_count(page, cookies): + # 进入个人主页视频页面获取最新视频链接 + cookies = {i['name']: i['value'] for i in parse_cookies(cookies)} + uid = cookies['c_user'] + videos_url = f"https://www.facebook.com/profile.php?id={uid}&sk=videos" # 替换为实际的个人主页URL + retry_goto(page, videos_url) + videos = page.query_selector_all('//img[@alt="View photo"]') + return len(videos) + + +def retry_get_new_video(page, cookies, video_count): + """ + 每分钟重试一次,5分钟内没获取到新视频则抛出Timeout异常 + + Args: + page: Playwright页面对象 + cookies: Cookies + video_count: 初始视频数量 + + Returns: + 函数执行结果或抛出Timeout(如果超时) + """ + max_duration = 5 * 60 # 5分钟(秒) + start_time = time.time() + attempt = 1 + + while time.time() - start_time < max_duration: + # 获取当前视频数量 + new_videO_count = get_video_count(page, cookies) + # 如果新视频数量大于初始视频数量,则表示有新视频上传 + if new_videO_count > video_count: + page.query_selector_all('//img[@alt="View photo"]')[0].click() + page.reload() + return page.url + + # 计算下一次重试时间 + elapsed = time.time() - start_time + if elapsed < max_duration: + sleep_time = 60 - (elapsed % 60) # 确保每分钟执行一次 + print(f"等待 {sleep_time:.1f} 秒后重试...") + time.sleep(sleep_time) + + attempt += 1 + + print("5分钟超时,退出重试") + raise TimeoutError("未获取到新视频(可能视频上传失败),已超时5分钟") + + def playwright_post(cookies, content, image_key=None): path = os.path.join(BASE_PATH, 'chrome', '130-0008', 'chrome.exe') with lock: @@ -244,9 +293,15 @@ def playwright_post(cookies, content, image_key=None): page = context.new_page() check_account_status(page, parse_cookies(cookies)) + # 声明默认发布视频数量 + video_count = 0 url = 'https://facebook.com' try: + # 先获取视频数量 + if ".mp4" in image_key: + video_count = get_video_count(page, cookies) + retry_goto(page, url) time.sleep(random.randint(3, 10)) time.sleep(5) @@ -272,6 +327,9 @@ def playwright_post(cookies, content, image_key=None): time.sleep(5) page.reload() post_url = page.url + # 视频格式要单独去获取链接 + if ".mp4" in image_key: + post_url = retry_get_new_video(page, cookies, video_count) except Error as e: raise OperationFailed(f'操作超时,请重试{e}')