diff --git a/build_client.spec b/build_client.spec
index bcc0aa4..fcfb5a2 100644
--- a/build_client.spec
+++ b/build_client.spec
@@ -1,21 +1,41 @@
# -*- mode: python ; coding: utf-8 -*-
# 客户端 GUI 打包配置
-# 用法: 在项目根目录执行 pyinstaller build_client.spec
+# 用法: 在项目根目录 (boss_dp) 执行: pyinstaller build_client.spec
import os
-_project_root = os.path.dirname(os.path.abspath(SPECPATH))
+_spec_dir = os.path.dirname(os.path.abspath(SPECPATH))
+_run_client = os.path.join(_spec_dir, 'run_client.py')
+if not os.path.isfile(_run_client):
+ _spec_dir = os.getcwd()
+ _run_client = os.path.join(_spec_dir, 'run_client.py')
block_cipher = None
a = Analysis(
- [os.path.join(_project_root, 'run_client.py')],
- pathex=[_project_root],
+ [_run_client],
+ pathex=[_spec_dir],
binaries=[],
datas=[],
hiddenimports=[
'client_gui',
'client_gui.main',
'client_gui.config_store',
+ 'worker',
+ 'worker.main',
+ 'worker.ws_client',
+ 'worker.bit_browser',
+ 'worker.browser_control',
+ 'worker.config',
+ 'worker.tasks',
+ 'worker.tasks.registry',
+ 'worker.tasks.base',
+ 'worker.tasks.boss_recruit',
+ 'worker.tasks.check_login',
+ 'tunnel',
+ 'tunnel.client',
+ 'tunnel.protocol',
+ 'common',
+ 'common.protocol',
'PyQt5',
'PyQt5.QtCore',
'PyQt5.QtWidgets',
diff --git a/client_gui/main.py b/client_gui/main.py
index 1bd277d..0c80096 100644
--- a/client_gui/main.py
+++ b/client_gui/main.py
@@ -72,21 +72,23 @@ def _is_frozen() -> bool:
return getattr(sys, "frozen", False)
-def _get_worker_launcher() -> tuple[str, str]:
+def _get_worker_launcher() -> tuple[str, str, bool]:
+ """返回 (可执行路径, 工作目录, 是否用 --worker 模式)。"""
if _is_frozen():
exe_dir = os.path.dirname(sys.executable)
- worker_exe = os.path.join(exe_dir, "worker.exe")
- if os.path.isfile(worker_exe):
- return worker_exe, exe_dir
+ return sys.executable, exe_dir, True
project_root = get_project_root()
- return sys.executable, project_root
+ return sys.executable, project_root, False
def run_worker(server_url: str, worker_id: str, worker_name: str, log_callback) -> subprocess.Popen | None:
- """启动 Worker 子进程。"""
- launcher, cwd = _get_worker_launcher()
- is_python = launcher == sys.executable
- if is_python:
+ """启动 Worker 子进程(同一 exe 的 --worker 模式或 python -m worker.main)。"""
+ launcher, cwd, use_worker_flag = _get_worker_launcher()
+ if use_worker_flag:
+ cmd = [launcher, "--worker", "--server", server_url, "--worker-id", worker_id, "--worker-name", worker_name]
+ env = os.environ
+ encoding = "gbk" if sys.platform == "win32" else "utf-8"
+ else:
cmd = [
launcher, "-m", "worker.main",
"--server", server_url,
@@ -95,11 +97,6 @@ def run_worker(server_url: str, worker_id: str, worker_name: str, log_callback)
]
env = {**os.environ, "PYTHONIOENCODING": "utf-8"}
encoding = "utf-8"
- else:
- cmd = [launcher, "--server", server_url, "--worker-id", worker_id, "--worker-name", worker_name]
- env = os.environ
- # worker.exe 在 Windows 上可能用 GBK 输出
- encoding = "gbk" if sys.platform == "win32" else "utf-8"
try:
return subprocess.Popen(
cmd, cwd=cwd, env=env,
diff --git a/run_client.py b/run_client.py
index db244c1..18d9770 100644
--- a/run_client.py
+++ b/run_client.py
@@ -1,11 +1,22 @@
# -*- coding: utf-8 -*-
"""
-客户端 GUI 启动入口。
-使用方式: python run_client.py
+客户端统一入口:根据参数决定启动 GUI 或 Worker 模式。
+- 无参数 / 正常启动 → GUI 界面
+- 带 --worker 参数 → Worker 模式(由 GUI 点击「启动」时调用)
"""
from __future__ import annotations
-from client_gui.main import main
+import sys
+
+
+def main():
+ if "--worker" in sys.argv:
+ from worker.main import main as worker_main
+ worker_main()
+ else:
+ from client_gui.main import main as gui_main
+ gui_main()
+
if __name__ == "__main__":
main()
diff --git a/worker/main.py b/worker/main.py
index 82ac675..9365c17 100644
--- a/worker/main.py
+++ b/worker/main.py
@@ -25,6 +25,7 @@ logger = logging.getLogger("worker.main")
def parse_args():
parser = argparse.ArgumentParser(description="Browser Control Worker Agent")
+ parser.add_argument("--worker", action="store_true", help=argparse.SUPPRESS)
parser.add_argument(
"--server",
default=config.SERVER_WS_URL,
diff --git a/部署说明.md b/部署说明.md
index 8398a5c..4388e77 100644
--- a/部署说明.md
+++ b/部署说明.md
@@ -25,18 +25,8 @@ python app.py
### 方式 B:打包为 exe(推荐,无需 Python)
1. 安装 PyInstaller:`pip install pyinstaller`
-2. 在项目根目录执行打包:
- ```bash
- # 打包客户端 GUI
- pyinstaller build_client.spec
-
- # 打包 Worker(供 GUI 的「启动」按钮调用)
- pyinstaller build_worker.spec
- ```
-3. 将生成的文件合并:
- - `dist/BOSS直聘Worker客户端/` 为 GUI 输出目录
- - 将 `dist/worker/worker.exe` 复制到 `dist/BOSS直聘Worker客户端/` 目录内
-4. 将整个 `BOSS直聘Worker客户端` 文件夹发给客户,客户双击 `BOSS直聘Worker客户端.exe` 即可使用
+2. 在项目根目录执行打包:`pyinstaller build_client.spec`
+3. 将 `dist/BOSS直聘Worker客户端/` 文件夹发给客户,客户双击 `BOSS直聘Worker客户端.exe` 即可使用(GUI 与 Worker 已合并为同一程序,无需 worker.exe)
### GUI 功能说明
diff --git a/页面模板.html b/页面模板.html
deleted file mode 100644
index f00c3e1..0000000
--- a/页面模板.html
+++ /dev/null
@@ -1,3695 +0,0 @@
-
-
-
-
-
- Boss自动化助手 - 控制面板
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
- |
- 账号名称 |
- Boss账号 |
- 线程数 |
- 今日联系 |
- 微信交换 |
- 状态 |
- 操作 |
-
-
-
-
-
-
-
-
-
-
-
- 已选择 2 个账号
- 状态: 2运行中 0已暂停 0已停止
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 14:25:32
- [INFO]
- 系统初始化完成,准备开始运行
-
-
- 14:25:45
- [SUCCESS]
- 成功启动3个自动化线程
-
-
- 14:26:10
- [INFO]
- 开始执行筛选:年龄22-35,学历本科,3天内活跃
-
-
- 14:26:35
- [SUCCESS]
- 账号"张三的账号"成功发送5条招呼
-
-
- 14:27:05
- [INFO]
- 检测到2条新回复消息
-
-
- 14:27:30
- [SUCCESS]
- 成功与候选人交换微信
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | 账号名称 |
- Boss账号 |
- 密码 |
- 线程数 |
- 每日上限 |
- 状态 |
- 操作 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | 用户ID |
- 姓名 |
- 岗位 |
- 联系方式 |
- 联系时间 |
- 回复状态 |
- 微信交换 |
- 操作 |
-
-
-
-
-
-
-
-
-
-
- 显示 1 - 10 条,共 50 条
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
联系趋势图表
-
显示每日联系人数和回复率变化
-
-
-
-
-
-
-
-
-
-
-
-
成功率分布图表
-
按岗位、年龄、学历等维度分析
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
基本设置
-
-
-
-
-
-
自动备份数据
-
每天自动备份用户数据到本地
-
-
-
-
-
-
-
-
-
-
-
性能设置
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file