# 自动找工作系统 - MQTT指令列表 > 版本: v1.0 | 更新日期: 2025-12-25 ## 文档说明 本文档定义了服务端通过MQTT向客户端下发的所有指令格式和规范。所有操作都通过任务和指令的方式异步执行。 --- ## 一、MQTT通信架构 ### 1.1 通信流程 ``` ┌──────────────┐ ┌──────────────┐ │ 服务端 │ │ 客户端 │ │ (Node.js) │ │ (设备端) │ └──────┬───────┘ └──────┬───────┘ │ │ │ ① 创建任务(task_status表) │ │ ② 生成指令(task_commands表) │ │ │ │ ③ MQTT Publish │ │ Topic: {sn_code}/command │ │ ─────────────────────────────> │ │ │ │ ④ 执行指令 │ │ ⑤ 生成结果 │ │ │ │ ⑥ MQTT Publish │ │ Topic: response │ │ <───────────────────────────── │ │ │ │ ⑦ 更新指令状态(task_commands) │ │ ⑧ 更新任务状态(task_status) │ │ │ ``` ### 1.2 MQTT配置 - **Broker地址**: `mqtt://192.144.167.231:1883` - **订阅主题**: - `heartbeat` - 设备心跳信息 - `response` - 设备响应信息 - **发布主题**: - `{sn_code}/command` - 向指定设备发送指令 ### 1.3 消息格式 **服务端 → 客户端 (指令)** ```json { "commandId": "uuid", "taskId": "uuid", "platform": "boss", "action": "search_jobs", "data": { "keyword": "全栈工程师", "city": "101020100", "page": 1 } } ``` **客户端 → 服务端 (响应)** ```json { "commandId": "uuid", "taskId": "uuid", "code": 200, "message": "执行成功", "data": { // 返回数据 } } ``` **客户端 → 服务端 (心跳)** ```json { "sn_code": "device001", "platform": "boss", "timestamp": 1672531200000, "status": "online", "version": "1.0.0" } ``` --- ## 二、已实现指令列表 ### 2.1 用户登录指令 #### get_login_qr_code - 获取登录二维码 **指令格式** ```json { "action": "get_login_qr_code", "platform": "boss", "data": {} } ``` **返回格式** ```json { "code": 200, "message": "二维码获取成功", "data": { "qrCode": "https://example.com/qrcode.png", "qr_code_url": "https://example.com/qrcode.png", "expire_time": 300 } } ``` **说明**: 获取登录二维码,用户扫码登录后客户端需要保存cookies/token --- #### get_user_info - 获取用户信息 **指令格式** ```json { "action": "get_user_info", "platform": "boss", "data": {} } ``` **返回格式** ```json { "code": 200, "message": "获取成功", "data": { "userId": "123456", "userName": "张三", "phone": "138****5678", "isLoggedIn": true } } ``` **说明**: 获取当前登录用户的基本信息,验证登录状态 --- ### 2.2 简历管理指令 #### get_online_resume - 获取在线简历 **指令格式** ```json { "action": "get_online_resume", "platform": "boss", "data": {} } ``` **返回格式** ```json { "code": 200, "message": "获取成功", "data": { "baseInfo": { "name": "张三", "gender": 1, "age": 28, "account": "138****5678", "emailBlur": "zhang***@qq.com", "workYears": 5, "workYearDesc": "5年", "degreeCategory": "本科" }, "expectList": [{ "positionName": "全栈工程师", "locationName": "上海", "salaryDesc": "20-30K", "industryDesc": "互联网" }], "workExpList": [{ "companyName": "XX科技公司", "positionName": "高级前端工程师", "startDate": "2020-01", "endDate": "2023-12", "workContent": "负责前端架构设计和开发..." }], "projectExpList": [{ "name": "电商平台项目", "roleName": "技术负责人", "startDate": "2022-01", "endDate": "2023-06", "projectDesc": "项目描述...", "performance": "项目成果..." }], "educationExpList": [{ "school": "XX大学", "major": "计算机科学与技术", "degreeName": "本科", "endYear": 2018 }], "userDesc": "熟悉Vue、React、Node.js等技术栈...", "certificationList": [] } } ``` **说明**: 获取用户在招聘平台上的完整简历信息 --- ### 2.3 岗位搜索指令 #### search_jobs - 搜索岗位 (已实现但需完善) **指令格式** ```json { "action": "search_jobs", "platform": "boss", "data": { "keyword": "全栈工程师", "city": "101020100", "page": 1 } } ``` **返回格式** ```json { "code": 200, "message": "搜索成功", "data": { "total": 150, "page": 1, "jobList": [{ "jobId": "job123456", "jobTitle": "全栈工程师", "companyName": "XX科技公司", "companySize": "100-499人", "salary": "20-30K", "location": "上海·浦东新区", "experience": "3-5年", "education": "本科", "jobRequirements": "1. 熟悉Vue/React...", "jobDescription": "岗位职责...", "bossName": "张经理", "bossTitle": "技术总监" }] } } ``` **说明**: 当前实现基础,需要扩展支持更多搜索条件 --- #### get_job_list - 获取岗位列表 **指令格式** ```json { "action": "get_job_list", "platform": "boss", "data": { "page": 1, "pageSize": 20 } } ``` **返回格式** ```json { "code": 200, "message": "获取成功", "data": { "total": 50, "page": 1, "jobList": [ // 同 search_jobs 的 jobList 格式 ] } } ``` **说明**: 获取推荐岗位列表 --- ### 2.4 投递管理指令 #### apply_job - 投递岗位 (基础实现) **指令格式** ```json { "action": "apply_job", "platform": "boss", "data": { "jobId": "job123456", "expectSalary": "20-30K" } } ``` **返回格式** ```json { "code": 200, "message": "投递成功", "data": { "applyId": "apply123456", "jobId": "job123456", "applyTime": "2025-12-25 10:30:00", "status": "success" } } ``` **错误码** - `400` - 参数错误 - `403` - 已投递过该岗位 - `429` - 投递次数达到上限 - `500` - 投递失败 **说明**: 向指定岗位投递简历 --- ### 2.5 聊天管理指令 #### get_chat_list - 获取聊天列表 **指令格式** ```json { "action": "get_chat_list", "platform": "boss", "data": { "page": 1, "pageSize": 20 } } ``` **返回格式** ```json { "code": 200, "message": "获取成功", "data": { "total": 15, "chatList": [{ "conversationId": "conv123456", "jobId": "job123456", "jobTitle": "全栈工程师", "companyName": "XX科技", "bossName": "张经理", "lastMessage": "您好,请问...", "lastMessageTime": "2025-12-25 10:30:00", "unreadCount": 2, "hasInterview": false }] } } ``` **说明**: 获取与HR的聊天会话列表 --- #### send_chat_message - 发送聊天消息 **指令格式** ```json { "action": "send_chat_message", "platform": "boss", "data": { "conversationId": "conv123456", "jobId": "job123456", "content": "您好,我对这个岗位很感兴趣..." } } ``` **返回格式** ```json { "code": 200, "message": "发送成功", "data": { "messageId": "msg123456", "sendTime": "2025-12-25 10:30:00" } } ``` **说明**: 向HR发送聊天消息 --- ### 2.6 测试和调试指令 #### open_bot_detection - 打开测试页 **指令格式** ```json { "action": "open_bot_detection", "platform": "boss", "data": {} } ``` **返回格式** ```json { "code": 200, "message": "测试页已打开", "data": {} } ``` **说明**: 打开测试页面,用于调试 --- ## 三、待开发指令列表 ### 3.1 搜索投递增强指令 (优先级: HIGH) #### search_jobs_enhanced - 增强搜索岗位 ⭐⭐⭐⭐⭐ **指令格式** ```json { "action": "search_jobs_enhanced", "platform": "boss", "data": { "keyword": "全栈工程师", "city": "101020100", "page": 1, "pageSize": 20, // 新增搜索条件 "experience": "3", "degree": "203", "salary": "406", "scale": "303", "stage": "807", "position": "100109", // 滚动加载方式 "scrollLoadType": "auto", "maxScrollPages": 5 } } ``` **参数说明** | 参数 | 说明 | 示例值 | |------|------|--------| | keyword | 搜索关键词 | "全栈工程师" | | city | 城市代码 | "101020100" (上海) | | page | 页码 | 1 | | pageSize | 每页数量 | 20 | | experience | 工作经验 | "1"=1年以下, "3"=1-3年, "4"=3-5年, "5"=5-10年, "6"=10年以上 | | degree | 学历要求 | "202"=不限, "203"=大专, "204"=本科, "205"=硕士, "206"=博士 | | salary | 薪资范围 | "402"=3-5K, "403"=5-10K, "404"=10-15K, "405"=15-20K, "406"=20-30K, "407"=30-50K, "408"=50K以上 | | scale | 公司规模 | "302"=0-20人, "303"=20-99人, "304"=100-499人, "305"=500-999人, "306"=1000人以上 | | stage | 融资阶段 | "801"=未融资, "802"=天使轮, "803"=A轮, "804"=B轮, "805"=C轮, "806"=D轮及以上, "807"=已上市, "808"=不需要融资 | | position | 职位类型 | "100109"=全栈, "100110"=前端, "100111"=后端, "100112"=移动端 | | scrollLoadType | 加载方式 | "auto"=自动滚动, "manual"=手动翻页 | | maxScrollPages | 最大滚动页数 | 5 | **返回格式** ```json { "code": 200, "message": "搜索成功", "data": { "total": 150, "page": 1, "hasMore": true, "jobList": [{ "jobId": "job123456", "jobTitle": "全栈工程师", "companyName": "XX科技公司", "companySize": "100-499人", "companyIndustry": "互联网", "companyStage": "已上市", "salary": "20-30K", "salaryMonth": "14薪", "location": "上海·浦东新区", "longitude": 121.5273, "latitude": 31.2172, "experience": "3-5年", "education": "本科", "skills": ["Vue", "React", "Node.js"], "jobRequirements": "1. 熟悉Vue/React...", "jobDescription": "岗位职责...", "welfare": ["五险一金", "带薪年假", "弹性工作"], "bossName": "张经理", "bossTitle": "技术总监", "bossActiveStatus": "刚刚活跃", "publishTime": "2025-12-25", "viewCount": 150, "applyCount": 30, "isOutsourcing": false, "jobLink": "https://www.zhipin.com/job_detail/xxx" }] } } ``` **说明**: - 支持Boss直聘完整的搜索筛选条件 - 支持自动滚动加载更多岗位 - 返回更详细的岗位信息 --- #### search_by_url - 通过URL搜索岗位 ⭐⭐⭐⭐⭐ **指令格式** ```json { "action": "search_by_url", "platform": "boss", "data": { "url": "https://www.zhipin.com/web/geek/jobs?city=101020100&query=%E5%85%A8%E6%A0%88%E5%B7%A5%E7%A8%8B%E5%B8%88", "scrollLoadType": "auto", "maxScrollPages": 5 } } ``` **返回格式** ```json { "code": 200, "message": "搜索成功", "data": { // 同 search_jobs_enhanced 返回格式 } } ``` **说明**: - 直接使用Boss直聘的搜索URL - 自动解析URL参数 - 支持所有筛选条件 --- ### 3.2 批量投递指令 (优先级: HIGH) #### batch_apply_jobs - 批量投递岗位 ⭐⭐⭐⭐⭐ **指令格式** ```json { "action": "batch_apply_jobs", "platform": "boss", "data": { "jobIds": ["job001", "job002", "job003"], "expectSalary": "20-30K", "applyInterval": 30, "maxApplyCount": 10 } } ``` **参数说明** | 参数 | 说明 | 示例值 | |------|------|--------| | jobIds | 岗位ID数组 | ["job001", "job002"] | | expectSalary | 期望薪资 | "20-30K" | | applyInterval | 投递间隔(秒) | 30 | | maxApplyCount | 最大投递数量 | 10 | **返回格式** ```json { "code": 200, "message": "批量投递完成", "data": { "total": 10, "success": 8, "failed": 2, "results": [{ "jobId": "job001", "status": "success", "applyId": "apply001", "message": "投递成功" }, { "jobId": "job002", "status": "failed", "message": "已投递过该岗位" }] } } ``` **说明**: - 批量投递多个岗位 - 控制投递间隔避免被限制 - 返回每个岗位的投递结果 --- ### 3.3 简历刷新指令 (优先级: HIGH) #### refresh_resume - 刷新简历 ⭐⭐⭐⭐ **指令格式** ```json { "action": "refresh_resume", "platform": "boss", "data": {} } ``` **返回格式** ```json { "code": 200, "message": "简历刷新成功", "data": { "refreshTime": "2025-12-25 10:30:00", "nextRefreshTime": "2025-12-25 12:30:00" } } ``` **说明**: - 刷新简历提升排名 - 每2小时可刷新一次 --- ### 3.4 账号保活指令 (优先级: HIGH) #### auto_active - 自动活跃账号 ⭐⭐⭐⭐ **指令格式** ```json { "action": "auto_active", "platform": "boss", "data": { "actionType": "random", "actions": ["browse_jobs", "view_company", "search_keyword", "update_visibility"] } } ``` **参数说明** | 参数 | 说明 | 可选值 | |------|------|--------| | actionType | 动作类型 | "random"=随机, "sequence"=顺序 | | actions | 动作列表 | ["browse_jobs", "view_company", "search_keyword", "update_visibility"] | **动作说明** - `browse_jobs` - 浏览岗位(随机点击5-10个岗位) - `view_company` - 查看公司主页 - `search_keyword` - 搜索关键词(随机关键词) - `update_visibility` - 修改简历可见性 **返回格式** ```json { "code": 200, "message": "活跃操作完成", "data": { "executedActions": ["browse_jobs", "view_company"], "duration": 120, "timestamp": "2025-12-25 10:30:00" } } ``` **说明**: - 模拟真实用户行为 - 随机时间间隔 - 避免账号被标记为机器人 --- ### 3.5 聊天增强指令 (优先级: MEDIUM) #### get_chat_detail - 获取聊天详情 ⭐⭐⭐ **指令格式** ```json { "action": "get_chat_detail", "platform": "boss", "data": { "conversationId": "conv123456", "page": 1, "pageSize": 50 } } ``` **返回格式** ```json { "code": 200, "message": "获取成功", "data": { "conversationId": "conv123456", "jobId": "job123456", "messages": [{ "messageId": "msg001", "senderId": "boss123", "senderType": "boss", "content": "您好,请问什么时候方便面试?", "sendTime": "2025-12-25 10:30:00", "isRead": true, "messageType": "text", "isInterviewInvitation": true }] } } ``` **说明**: 获取完整的聊天历史记录 --- #### send_greeting - 发送打招呼 ⭐⭐⭐ **指令格式** ```json { "action": "send_greeting", "platform": "boss", "data": { "jobId": "job123456", "content": "您好,我对这个岗位很感兴趣,期待能有机会详聊。" } } ``` **返回格式** ```json { "code": 200, "message": "打招呼成功", "data": { "conversationId": "conv123456", "messageId": "msg001", "sendTime": "2025-12-25 10:30:00" } } ``` **说明**: 主动向HR发起沟通 --- ### 3.6 数据采集指令 (优先级: MEDIUM) #### get_job_detail - 获取岗位详情 ⭐⭐⭐ **指令格式** ```json { "action": "get_job_detail", "platform": "boss", "data": { "jobId": "job123456" } } ``` **返回格式** ```json { "code": 200, "message": "获取成功", "data": { "jobId": "job123456", // 完整的岗位详情(同search_jobs_enhanced中的jobList项) "companyDetail": { "companyId": "company123", "companyName": "XX科技公司", "companyLogo": "https://...", "companySize": "100-499人", "companyIndustry": "互联网", "companyStage": "已上市", "companyAddress": "上海市浦东新区...", "companyDesc": "公司介绍..." } } } ``` **说明**: 获取岗位的完整详情信息 --- #### get_company_info - 获取公司信息 ⭐⭐⭐ **指令格式** ```json { "action": "get_company_info", "platform": "boss", "data": { "companyId": "company123" } } ``` **返回格式** ```json { "code": 200, "message": "获取成功", "data": { "companyId": "company123", "companyName": "XX科技公司", "companyLogo": "https://...", "companySize": "100-499人", "companyIndustry": "互联网", "companyStage": "已上市", "companyAddress": "上海市浦东新区...", "companyDesc": "公司介绍...", "companyBenefit": ["五险一金", "带薪年假"], "companyPhotos": ["https://...", "https://..."], "jobCount": 50, "isVerified": true } } ``` **说明**: 获取公司的详细信息 --- ## 四、指令执行规范 ### 4.1 指令生命周期 ``` 1. 创建 (pending) ↓ 2. 下发 (sent) ↓ 3. 执行中 (executing) ↓ 4. 完成 (completed) / 失败 (failed) / 超时 (timeout) ``` ### 4.2 超时设置 | 指令类型 | 超时时间 | 重试次数 | |---------|----------|----------| | 登录类指令 | 60秒 | 1次 | | 简历获取 | 30秒 | 2次 | | 岗位搜索 | 60秒 | 2次 | | 岗位投递 | 30秒 | 1次 | | 聊天消息 | 30秒 | 2次 | | 保活操作 | 120秒 | 0次 | ### 4.3 错误码规范 | 错误码 | 说明 | 处理方式 | |--------|------|----------| | 200 | 成功 | - | | 400 | 参数错误 | 不重试 | | 401 | 未登录 | 触发重新登录 | | 403 | 无权限/已操作 | 不重试 | | 429 | 请求过于频繁 | 延迟后重试 | | 500 | 服务器错误 | 重试 | | 503 | 服务不可用 | 延迟后重试 | | 600 | 网络超时 | 重试 | | 700 | 客户端错误 | 记录日志,不重试 | ### 4.4 重试策略 - **指数退避**: `delay = min(1000 * 2^(retryCount-1), 30000ms)` - **最大重试次数**: 根据指令类型决定(见4.2表格) - **可重试错误**: 429, 500, 503, 600 - **不可重试错误**: 400, 401, 403, 700 --- ## 五、客户端实现要求 ### 5.1 MQTT客户端 - **连接保持**: 断线自动重连 - **心跳间隔**: 10秒 - **订阅主题**: `{sn_code}/command` - **发布主题**: `response`, `heartbeat` ### 5.2 指令处理 1. **接收指令** - 解析JSON格式 - 验证必需字段 - 记录指令日志 2. **执行指令** - 根据action分发到对应处理器 - 更新执行状态 - 捕获异常错误 3. **返回响应** - 统一响应格式 - 包含commandId用于追踪 - 返回详细的执行结果 ### 5.3 异常处理 - **网络异常**: 自动重试 - **登录过期**: 通知服务端重新登录 - **页面加载失败**: 刷新页面重试 - **元素定位失败**: 记录截图,返回错误 ### 5.4 日志记录 - **请求日志**: 记录所有接收到的指令 - **响应日志**: 记录所有返回的响应 - **错误日志**: 记录所有异常和错误 - **操作日志**: 记录关键操作步骤 --- ## 六、开发优先级 ### P0 - 立即开发 (投递核心功能) 1. ✅ `search_jobs_enhanced` - 增强搜索 2. ✅ `search_by_url` - URL搜索 3. ✅ `batch_apply_jobs` - 批量投递 4. ✅ `refresh_resume` - 简历刷新 ### P1 - 短期开发 (保活和聊天) 5. ✅ `auto_active` - 账号保活 6. ✅ `send_greeting` - 发送打招呼 7. ✅ `get_chat_detail` - 聊天详情 ### P2 - 中期开发 (数据采集) 8. ⭐ `get_job_detail` - 岗位详情 9. ⭐ `get_company_info` - 公司信息 --- **文档维护**: 开发团队 **最后更新**: 2025-12-25