feat: 添加依赖自动检测与安装、选项记忆、KDocs登录优化
- 新增依赖检测模块:启动时自动检测wkhtmltoimage和Playwright Chromium - 新增依赖安装对话框:缺失时提示用户一键下载安装 - 修复选项记忆功能:浏览类型、自动截图、自动上传选项现在会保存 - 优化KDocs登录检测:未登录时自动切换到金山文档页面并显示二维码 - 简化日志输出:移除debug信息,保留用户友好的状态提示 - 新增账号变化信号:账号管理页面的修改会自动同步到浏览任务页面 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,7 +11,7 @@ from PyQt6.QtWidgets import (
|
||||
)
|
||||
from PyQt6.QtCore import Qt, pyqtSignal, QSize
|
||||
|
||||
from config import get_config, AccountConfig
|
||||
from config import get_config, save_config, AccountConfig
|
||||
from utils.crypto import decrypt_password, is_encrypted
|
||||
from .constants import (
|
||||
PAGE_PADDING, SECTION_SPACING, GROUP_PADDING_TOP, GROUP_PADDING_SIDE,
|
||||
@@ -33,6 +33,7 @@ class BrowseWidget(QWidget):
|
||||
self._worker = None
|
||||
self._is_running = False
|
||||
self._setup_ui()
|
||||
self._load_task_config()
|
||||
self._refresh_accounts()
|
||||
|
||||
def _setup_ui(self):
|
||||
@@ -125,16 +126,19 @@ class BrowseWidget(QWidget):
|
||||
self.browse_type_combo.setMinimumWidth(140)
|
||||
self.browse_type_combo.setFixedHeight(32)
|
||||
self.browse_type_combo.setStyleSheet("QComboBox { padding-left: 10px; }")
|
||||
self.browse_type_combo.currentTextChanged.connect(self._save_task_config)
|
||||
options_layout.addWidget(self.browse_type_combo)
|
||||
|
||||
options_layout.addSpacing(20)
|
||||
|
||||
self.auto_screenshot_check = QCheckBox("浏览后自动截图")
|
||||
self.auto_screenshot_check.setChecked(True)
|
||||
self.auto_screenshot_check.stateChanged.connect(self._save_task_config)
|
||||
options_layout.addWidget(self.auto_screenshot_check)
|
||||
|
||||
self.auto_upload_check = QCheckBox("截图后自动上传")
|
||||
self.auto_upload_check.setChecked(False)
|
||||
self.auto_upload_check.stateChanged.connect(self._save_task_config)
|
||||
options_layout.addWidget(self.auto_upload_check)
|
||||
|
||||
options_layout.addStretch()
|
||||
@@ -241,7 +245,7 @@ class BrowseWidget(QWidget):
|
||||
self.total_progress.setMaximum(len(accounts))
|
||||
self.total_progress.setValue(0)
|
||||
|
||||
self.log_signal.emit(f"开始任务: {len(accounts)} 个账号, 类型: {browse_type}")
|
||||
self.log_signal.emit(f"🚀 开始任务: {len(accounts)}个账号")
|
||||
|
||||
from utils.worker import Worker
|
||||
|
||||
@@ -251,8 +255,8 @@ class BrowseWidget(QWidget):
|
||||
if _should_stop and _should_stop():
|
||||
break
|
||||
|
||||
_signals.log.emit(f"[{i+1}/{len(accounts)}] 处理账号: {account.username}")
|
||||
_signals.progress.emit(i, f"正在处理: {account.username}")
|
||||
display_name = account.remark or account.username
|
||||
_signals.progress.emit(i, f"正在处理: {display_name}")
|
||||
|
||||
password = decrypt_password(account.password) if is_encrypted(account.password) else account.password
|
||||
|
||||
@@ -265,10 +269,10 @@ class BrowseWidget(QWidget):
|
||||
proxy_config = {"server": cfg.proxy.server}
|
||||
|
||||
browse_result = None
|
||||
with APIBrowser(log_callback=lambda msg: _signals.log.emit(msg), proxy_config=proxy_config) as browser:
|
||||
# 静默模式浏览,不输出详细日志
|
||||
with APIBrowser(log_callback=None, proxy_config=proxy_config) as browser:
|
||||
if browser.login(account.username, password):
|
||||
browser.save_cookies_for_screenshot(account.username)
|
||||
|
||||
result = browser.browse_content(
|
||||
browse_type,
|
||||
should_stop_callback=_should_stop,
|
||||
@@ -278,22 +282,28 @@ class BrowseWidget(QWidget):
|
||||
"total_items": result.total_items,
|
||||
"total_attachments": result.total_attachments,
|
||||
}
|
||||
if result.success:
|
||||
_signals.log.emit(f"✅ {display_name} 浏览完成 ({result.total_items}条)")
|
||||
else:
|
||||
_signals.log.emit(f"❌ {display_name} 登录失败")
|
||||
|
||||
screenshot_path = None
|
||||
if browse_result and browse_result.get("success") and auto_screenshot:
|
||||
from core.screenshot import take_screenshot
|
||||
|
||||
_signals.log.emit("正在截图...")
|
||||
# 静默截图
|
||||
ss_result = take_screenshot(
|
||||
account.username,
|
||||
password,
|
||||
browse_type,
|
||||
remark=account.remark,
|
||||
log_callback=lambda msg: _signals.log.emit(msg),
|
||||
log_callback=None,
|
||||
proxy_config=proxy_config
|
||||
)
|
||||
if ss_result.success:
|
||||
screenshot_path = ss_result.filepath
|
||||
_signals.log.emit(f"📸 {display_name} 截图完成")
|
||||
else:
|
||||
_signals.log.emit(f"⚠️ {display_name} 截图失败")
|
||||
|
||||
if screenshot_path and auto_upload:
|
||||
from core.kdocs_uploader import get_kdocs_uploader
|
||||
@@ -301,18 +311,17 @@ class BrowseWidget(QWidget):
|
||||
|
||||
cfg2 = _get_config2()
|
||||
if cfg2.kdocs.enabled:
|
||||
_signals.log.emit("正在上传到金山文档...")
|
||||
uploader = get_kdocs_uploader()
|
||||
uploader._log_callback = lambda msg: _signals.log.emit(msg)
|
||||
uploader._log_callback = None # 静默模式
|
||||
upload_result = uploader.upload_image(
|
||||
screenshot_path,
|
||||
cfg2.kdocs.unit,
|
||||
account.remark or account.username
|
||||
)
|
||||
if upload_result.get("success"):
|
||||
_signals.log.emit("[OK] 上传成功")
|
||||
_signals.log.emit(f"📤 {display_name} 已上传文档")
|
||||
else:
|
||||
_signals.log.emit(f"上传失败: {upload_result.get('error', '未知错误')}")
|
||||
_signals.log.emit(f"⚠️ {display_name} 上传失败")
|
||||
|
||||
results.append({
|
||||
"account": account.username,
|
||||
@@ -320,7 +329,7 @@ class BrowseWidget(QWidget):
|
||||
"screenshot": screenshot_path,
|
||||
})
|
||||
|
||||
_signals.progress.emit(i + 1, f"完成: {account.username}")
|
||||
_signals.progress.emit(i + 1, f"完成: {display_name}")
|
||||
|
||||
return results
|
||||
|
||||
@@ -332,8 +341,8 @@ class BrowseWidget(QWidget):
|
||||
self._is_running = False
|
||||
self.start_btn.setEnabled(True)
|
||||
self.stop_btn.setEnabled(False)
|
||||
self.current_task_label.setText("当前任务: 完成")
|
||||
self.log_signal.emit(f"任务完成: {message}")
|
||||
self.current_task_label.setText("当前任务: 无")
|
||||
self.log_signal.emit("🎉 全部任务完成")
|
||||
|
||||
def on_result(results):
|
||||
if results:
|
||||
@@ -354,3 +363,31 @@ class BrowseWidget(QWidget):
|
||||
self._worker.stop()
|
||||
self.log_signal.emit("正在停止任务...")
|
||||
self.stop_btn.setEnabled(False)
|
||||
|
||||
def _load_task_config(self):
|
||||
"""加载任务配置"""
|
||||
config = get_config()
|
||||
task = config.task
|
||||
|
||||
# 设置浏览类型
|
||||
index = self.browse_type_combo.findText(task.browse_type)
|
||||
if index >= 0:
|
||||
self.browse_type_combo.setCurrentIndex(index)
|
||||
|
||||
# 设置选项(先断开信号避免循环保存)
|
||||
self.auto_screenshot_check.blockSignals(True)
|
||||
self.auto_upload_check.blockSignals(True)
|
||||
|
||||
self.auto_screenshot_check.setChecked(task.auto_screenshot)
|
||||
self.auto_upload_check.setChecked(task.auto_upload)
|
||||
|
||||
self.auto_screenshot_check.blockSignals(False)
|
||||
self.auto_upload_check.blockSignals(False)
|
||||
|
||||
def _save_task_config(self):
|
||||
"""保存任务配置"""
|
||||
config = get_config()
|
||||
config.task.browse_type = self.browse_type_combo.currentText()
|
||||
config.task.auto_screenshot = self.auto_screenshot_check.isChecked()
|
||||
config.task.auto_upload = self.auto_upload_check.isChecked()
|
||||
save_config(config)
|
||||
|
||||
Reference in New Issue
Block a user