20 KiB
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 指令处理
-
接收指令
- 解析JSON格式
- 验证必需字段
- 记录指令日志
-
执行指令
- 根据action分发到对应处理器
- 更新执行状态
- 捕获异常错误
-
返回响应
- 统一响应格式
- 包含commandId用于追踪
- 返回详细的执行结果
5.3 异常处理
- 网络异常: 自动重试
- 登录过期: 通知服务端重新登录
- 页面加载失败: 刷新页面重试
- 元素定位失败: 记录截图,返回错误
5.4 日志记录
- 请求日志: 记录所有接收到的指令
- 响应日志: 记录所有返回的响应
- 错误日志: 记录所有异常和错误
- 操作日志: 记录关键操作步骤
六、开发优先级
P0 - 立即开发 (投递核心功能)
- ✅
search_jobs_enhanced- 增强搜索 - ✅
search_by_url- URL搜索 - ✅
batch_apply_jobs- 批量投递 - ✅
refresh_resume- 简历刷新
P1 - 短期开发 (保活和聊天)
- ✅
auto_active- 账号保活 - ✅
send_greeting- 发送打招呼 - ✅
get_chat_detail- 聊天详情
P2 - 中期开发 (数据采集)
- ⭐
get_job_detail- 岗位详情 - ⭐
get_company_info- 公司信息
文档维护: 开发团队 最后更新: 2025-12-25