Files
autoAiWorkSys/_doc/MQTT指令列表.md
张成 933f1618ca 1
2025-12-25 23:01:21 +08:00

20 KiB

自动找工作系统 - 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 消息格式

服务端 → 客户端 (指令)

{
  "commandId": "uuid",
  "taskId": "uuid",
  "platform": "boss",
  "action": "search_jobs",
  "data": {
    "keyword": "全栈工程师",
    "city": "101020100",
    "page": 1
  }
}

客户端 → 服务端 (响应)

{
  "commandId": "uuid",
  "taskId": "uuid",
  "code": 200,
  "message": "执行成功",
  "data": {
    // 返回数据
  }
}

客户端 → 服务端 (心跳)

{
  "sn_code": "device001",
  "platform": "boss",
  "timestamp": 1672531200000,
  "status": "online",
  "version": "1.0.0"
}

二、已实现指令列表

2.1 用户登录指令

get_login_qr_code - 获取登录二维码

指令格式

{
  "action": "get_login_qr_code",
  "platform": "boss",
  "data": {}
}

返回格式

{
  "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 - 获取用户信息

指令格式

{
  "action": "get_user_info",
  "platform": "boss",
  "data": {}
}

返回格式

{
  "code": 200,
  "message": "获取成功",
  "data": {
    "userId": "123456",
    "userName": "张三",
    "phone": "138****5678",
    "isLoggedIn": true
  }
}

说明: 获取当前登录用户的基本信息,验证登录状态


2.2 简历管理指令

get_online_resume - 获取在线简历

指令格式

{
  "action": "get_online_resume",
  "platform": "boss",
  "data": {}
}

返回格式

{
  "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 - 搜索岗位 (已实现但需完善)

指令格式

{
  "action": "search_jobs",
  "platform": "boss",
  "data": {
    "keyword": "全栈工程师",
    "city": "101020100",
    "page": 1
  }
}

返回格式

{
  "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 - 获取岗位列表

指令格式

{
  "action": "get_job_list",
  "platform": "boss",
  "data": {
    "page": 1,
    "pageSize": 20
  }
}

返回格式

{
  "code": 200,
  "message": "获取成功",
  "data": {
    "total": 50,
    "page": 1,
    "jobList": [
      // 同 search_jobs 的 jobList 格式
    ]
  }
}

说明: 获取推荐岗位列表


2.4 投递管理指令

apply_job - 投递岗位 (基础实现)

指令格式

{
  "action": "apply_job",
  "platform": "boss",
  "data": {
    "jobId": "job123456",
    "expectSalary": "20-30K"
  }
}

返回格式

{
  "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 - 获取聊天列表

指令格式

{
  "action": "get_chat_list",
  "platform": "boss",
  "data": {
    "page": 1,
    "pageSize": 20
  }
}

返回格式

{
  "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 - 发送聊天消息

指令格式

{
  "action": "send_chat_message",
  "platform": "boss",
  "data": {
    "conversationId": "conv123456",
    "jobId": "job123456",
    "content": "您好,我对这个岗位很感兴趣..."
  }
}

返回格式

{
  "code": 200,
  "message": "发送成功",
  "data": {
    "messageId": "msg123456",
    "sendTime": "2025-12-25 10:30:00"
  }
}

说明: 向HR发送聊天消息


2.6 测试和调试指令

open_bot_detection - 打开测试页

指令格式

{
  "action": "open_bot_detection",
  "platform": "boss",
  "data": {}
}

返回格式

{
  "code": 200,
  "message": "测试页已打开",
  "data": {}
}

说明: 打开测试页面,用于调试


三、待开发指令列表

3.1 搜索投递增强指令 (优先级: HIGH)

search_jobs_enhanced - 增强搜索岗位

指令格式

{
  "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

返回格式

{
  "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搜索岗位

指令格式

{
  "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
  }
}

返回格式

{
  "code": 200,
  "message": "搜索成功",
  "data": {
    // 同 search_jobs_enhanced 返回格式
  }
}

说明:

  • 直接使用Boss直聘的搜索URL
  • 自动解析URL参数
  • 支持所有筛选条件

3.2 批量投递指令 (优先级: HIGH)

batch_apply_jobs - 批量投递岗位

指令格式

{
  "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

返回格式

{
  "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 - 刷新简历

指令格式

{
  "action": "refresh_resume",
  "platform": "boss",
  "data": {}
}

返回格式

{
  "code": 200,
  "message": "简历刷新成功",
  "data": {
    "refreshTime": "2025-12-25 10:30:00",
    "nextRefreshTime": "2025-12-25 12:30:00"
  }
}

说明:

  • 刷新简历提升排名
  • 每2小时可刷新一次

3.4 账号保活指令 (优先级: HIGH)

auto_active - 自动活跃账号

指令格式

{
  "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 - 修改简历可见性

返回格式

{
  "code": 200,
  "message": "活跃操作完成",
  "data": {
    "executedActions": ["browse_jobs", "view_company"],
    "duration": 120,
    "timestamp": "2025-12-25 10:30:00"
  }
}

说明:

  • 模拟真实用户行为
  • 随机时间间隔
  • 避免账号被标记为机器人

3.5 聊天增强指令 (优先级: MEDIUM)

get_chat_detail - 获取聊天详情

指令格式

{
  "action": "get_chat_detail",
  "platform": "boss",
  "data": {
    "conversationId": "conv123456",
    "page": 1,
    "pageSize": 50
  }
}

返回格式

{
  "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 - 发送打招呼

指令格式

{
  "action": "send_greeting",
  "platform": "boss",
  "data": {
    "jobId": "job123456",
    "content": "您好,我对这个岗位很感兴趣,期待能有机会详聊。"
  }
}

返回格式

{
  "code": 200,
  "message": "打招呼成功",
  "data": {
    "conversationId": "conv123456",
    "messageId": "msg001",
    "sendTime": "2025-12-25 10:30:00"
  }
}

说明: 主动向HR发起沟通


3.6 数据采集指令 (优先级: MEDIUM)

get_job_detail - 获取岗位详情

指令格式

{
  "action": "get_job_detail",
  "platform": "boss",
  "data": {
    "jobId": "job123456"
  }
}

返回格式

{
  "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 - 获取公司信息

指令格式

{
  "action": "get_company_info",
  "platform": "boss",
  "data": {
    "companyId": "company123"
  }
}

返回格式

{
  "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 - 短期开发 (保活和聊天)

  1. auto_active - 账号保活
  2. send_greeting - 发送打招呼
  3. get_chat_detail - 聊天详情

P2 - 中期开发 (数据采集)

  1. get_job_detail - 岗位详情
  2. get_company_info - 公司信息

文档维护: 开发团队 最后更新: 2025-12-25