commit
This commit is contained in:
@@ -85,12 +85,16 @@ class MIPAdAutomation:
|
|||||||
|
|
||||||
if not has_ad:
|
if not has_ad:
|
||||||
logger.info("未检测到商业广告,跳过该链接")
|
logger.info("未检测到商业广告,跳过该链接")
|
||||||
|
# 记录无广告
|
||||||
|
self._record_click_failure(url, "未检测到商业广告")
|
||||||
return False, False
|
return False, False
|
||||||
|
|
||||||
# 点击广告
|
# 点击广告
|
||||||
logger.info("检测到商业广告,准备点击")
|
logger.info("检测到商业广告,准备点击")
|
||||||
if not self._click_advertisement(ad_element):
|
if not self._click_advertisement(ad_element):
|
||||||
logger.warning("点击广告失败")
|
logger.warning("点击广告失败")
|
||||||
|
# 记录点击失败
|
||||||
|
self._record_click_failure(url, "广告点击失败,页面未跳转")
|
||||||
return False, False
|
return False, False
|
||||||
|
|
||||||
# 记录点击到数据库
|
# 记录点击到数据库
|
||||||
@@ -110,6 +114,11 @@ class MIPAdAutomation:
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"处理链接异常: {str(e)}")
|
logger.error(f"处理链接异常: {str(e)}")
|
||||||
|
# 记录异常
|
||||||
|
try:
|
||||||
|
self._record_click_failure(url, f"异常: {str(e)}")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
return False, False
|
return False, False
|
||||||
finally:
|
finally:
|
||||||
# 尝试关闭当前标签页,返回主窗口
|
# 尝试关闭当前标签页,返回主窗口
|
||||||
|
|||||||
@@ -18,14 +18,30 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
|
|||||||
from typing import List, Dict, Optional
|
from typing import List, Dict, Optional
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
# 配置日志(添加线程标识)
|
# 配置日志(添加线程标识 + 文件输出)
|
||||||
logger.remove()
|
logger.remove()
|
||||||
|
|
||||||
|
# 控制台输出
|
||||||
logger.add(
|
logger.add(
|
||||||
sys.stdout,
|
sys.stdout,
|
||||||
format="<green>{time:HH:mm:ss}</green> | <cyan>[{thread.name}]</cyan> | <level>{level: <8}</level> | <level>{message}</level>",
|
format="<green>{time:HH:mm:ss}</green> | <cyan>[{thread.name}]</cyan> | <level>{level: <8}</level> | <level>{message}</level>",
|
||||||
level="INFO"
|
level="INFO"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 文件输出
|
||||||
|
from pathlib import Path
|
||||||
|
log_dir = Path("./logs")
|
||||||
|
log_dir.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
logger.add(
|
||||||
|
log_dir / "db_tasks_{time:YYYY-MM-DD}.log",
|
||||||
|
format="{time:YYYY-MM-DD HH:mm:ss} | [{thread.name}] | {level: <8} | {message}",
|
||||||
|
level="INFO",
|
||||||
|
rotation="00:00", # 每天凌晨切割日志
|
||||||
|
retention="30 days", # 保留30天
|
||||||
|
encoding="utf-8"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DatabaseTaskExecutor:
|
class DatabaseTaskExecutor:
|
||||||
"""数据库任务执行器"""
|
"""数据库任务执行器"""
|
||||||
@@ -45,13 +61,15 @@ class DatabaseTaskExecutor:
|
|||||||
self.client = AdsPowerClient()
|
self.client = AdsPowerClient()
|
||||||
self.dm = DataManager()
|
self.dm = DataManager()
|
||||||
|
|
||||||
# 创建截图目录
|
# 创建截图目录(按日期组织)
|
||||||
self.screenshot_dir = Path("./screenshots")
|
timestamp = datetime.now().strftime('%Y%m%d')
|
||||||
self.screenshot_dir.mkdir(exist_ok=True)
|
self.screenshot_dir = Path("./test") / f"batch_{timestamp}"
|
||||||
|
self.screenshot_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
logger.info(f"执行模式: {'并发' if max_workers > 1 else '串行'}")
|
logger.info(f"执行模式: {'并发' if max_workers > 1 else '串行'}")
|
||||||
logger.info(f"最大并发数: {max_workers}")
|
logger.info(f"最大并发数: {max_workers}")
|
||||||
logger.info(f"使用代理: {use_proxy}")
|
logger.info(f"使用代理: {use_proxy}")
|
||||||
|
logger.info(f"截图目录: {self.screenshot_dir}")
|
||||||
|
|
||||||
def get_active_tasks(self, limit: Optional[int] = None) -> List[Dict]:
|
def get_active_tasks(self, limit: Optional[int] = None) -> List[Dict]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user