Files
boss_dp/BOSS招聘自动化完整优化说明.md
2026-03-05 10:27:28 +08:00

12 KiB
Raw Blame History

BOSS招聘自动化 - 完整优化说明

优化概述

本次优化解决了以下核心问题:

  1. 消息过滤问题:过滤掉自己发送的包含"微信号"等关键词的消息
  2. 筛选功能:支持活跃度、年龄、学历、期望职位筛选
  3. 联系人记录:自动保存聊天中获取的联系方式
  4. 复聊管理:支持多轮复聊、自定义话术、间隔时间控制

一、消息过滤优化

问题描述

之前的代码会识别到自己发送的包含"微信号"三个字的消息,导致误判。

解决方案

1. 通过 fromId 区分消息来源

def _filter_my_messages(self, messages: list) -> list:
    """过滤掉自己发送的消息,只保留对方的消息。"""
    filtered = []
    for msg in messages:
        # fromId = 0 表示对方发送的消息
        from_id = msg.get("fromId", 0)
        if from_id == 0:
            filtered.append(msg)
    return filtered

2. 在等待回复时过滤发送的话术

# 检查最后几条消息
for text in panel_texts[-5:]:
    # 过滤掉我们发送的消息
    if sent_message in text:
        continue
    
    # 过滤掉包含"微信号"但没有真实微信号的消息
    if "微信号" in text and not self._extract_wechat(text):
        continue

二、筛选功能

支持的筛选条件

1. 活跃度筛选

支持的时间格式:

  • "03月03日" - 自动判断年份
  • "昨天" - 昨天
  • "今天" - 今天
  • "刚刚" - 今天

筛选选项:

  • "今天活跃" - 今天上线
  • "3天内活跃" - 3天内上线
  • "本周活跃" - 7天内上线
  • "本月活跃" - 30天内上线
  • "不限" - 不筛选

2. 年龄筛选

从候选人简历的 resume.age 字段获取,根据 age_minage_max 筛选。

3. 学历筛选

学历等级:初中 < 高中 < 中专 < 大专 < 本科 < 硕士 < 博士

候选人学历需要达到或高于要求学历。

4. 期望职位筛选

从候选人的 jobName 字段匹配配置的职位列表。

配置示例

FilterConfig.objects.create(
    name="Python开发筛选",
    age_min=22,
    age_max=35,
    education="本科",
    activity="3天内活跃",
    positions=["Python开发", "后端开发", "全栈开发"],
    is_active=True
)

三、联系人记录管理

自动保存功能

当从聊天中提取到联系方式(微信号或手机号)时,自动保存到 ContactRecord 表。

保存的信息

  • 姓名
  • 岗位
  • 联系方式(微信或手机)
  • 回复状态
  • 是否交换微信
  • 联系时间
  • 备注

去重逻辑

  • 检查是否已存在相同姓名和联系方式的记录
  • 如果存在则更新,不存在则创建

四、复聊管理系统

核心特性

1. 多轮复聊

  • 支持配置第1天、第2天、第3天...的不同话术
  • 支持配置"往后一直"使用的话术(day_number=0

2. 间隔时间控制

  • 每条话术都有独立的 interval_hours 配置
  • 系统自动检查距离上次发送的时间
  • 只有超过间隔时间才会发送下一条

3. 自定义话术

  • 通过API接口添加、修改、删除话术
  • 支持按岗位配置不同的复聊策略
  • 支持通用配置作为后备

4. 回复追踪

  • 记录每次发送的话术
  • 记录是否得到回复
  • 记录回复内容和时间

复聊流程

第1天发送询问微信号
  ↓
等待24小时
  ↓
第2天如果没有回复发送跟进话术
  ↓
等待24小时
  ↓
第3天如果还没有回复发送第三条话术
  ↓
等待72小时
  ↓
往后每隔72小时发送一次"往后一直"的话术

配置示例

{
  "config": {
    "name": "Python开发复聊配置",
    "position": "Python开发",
    "is_active": true
  },
  "scripts": [
    {
      "day_number": 1,
      "content": "后续沟通会更及时,您方便留一下您的微信号吗?我这边加您。",
      "interval_hours": 24
    },
    {
      "day_number": 2,
      "content": "您好,不知道您是否方便留个联系方式?",
      "interval_hours": 24
    },
    {
      "day_number": 0,
      "content": "您好,如果您感兴趣可以随时联系我。",
      "interval_hours": 72
    }
  ]
}

五、数据库表结构

新增表

1. FollowUpConfig复聊配置表

字段 类型 说明
id INT 主键
name VARCHAR(128) 配置名称
position VARCHAR(64) 岗位类型
is_active BOOLEAN 是否启用
created_at DATETIME 创建时间
updated_at DATETIME 更新时间

2. FollowUpScript复聊话术表

字段 类型 说明
id INT 主键
config_id INT 关联的配置ID
day_number INT 第几天0=往后一直)
content TEXT 话术内容
interval_hours INT 间隔小时数
order INT 排序
is_active BOOLEAN 是否启用
created_at DATETIME 创建时间

3. FollowUpRecord复聊记录表

字段 类型 说明
id INT 主键
contact_id INT 联系人ID
config_id INT 配置ID
script_id INT 话术ID
day_number INT 第几天
content TEXT 发送的内容
sent_at DATETIME 发送时间
got_reply BOOLEAN 是否得到回复
reply_content TEXT 回复内容
replied_at DATETIME 回复时间

六、API接口

复聊配置

  • GET /api/followup-configs - 获取配置列表
  • POST /api/followup-configs - 创建配置
  • GET /api/followup-configs/{id} - 获取配置详情
  • PUT /api/followup-configs/{id} - 更新配置
  • DELETE /api/followup-configs/{id} - 删除配置

复聊话术

  • GET /api/followup-scripts - 获取话术列表
  • POST /api/followup-scripts - 创建话术
  • GET /api/followup-scripts/{id} - 获取话术详情
  • PUT /api/followup-scripts/{id} - 更新话术
  • DELETE /api/followup-scripts/{id} - 删除话术

复聊记录

  • GET /api/followup-records - 获取记录列表
  • POST /api/followup-records/send - 手动发送消息

七、使用步骤

1. 运行数据库迁移

python server/manage.py migrate

2. 初始化配置(可选)

python scripts/init_followup_config.py

3. 通过API配置复聊策略

创建配置

POST /api/followup-configs
{
  "name": "Python开发复聊",
  "position": "Python开发",
  "is_active": true
}

添加话术

POST /api/followup-scripts
{
  "config_id": 1,
  "day_number": 1,
  "content": "您的自定义话术",
  "interval_hours": 24,
  "order": 1,
  "is_active": true
}

4. 运行招聘任务

系统会自动:

  • 应用筛选条件
  • 过滤自己的消息
  • 保存联系人记录
  • 按配置进行复聊

八、关键代码说明

1. 消息过滤

# 过滤掉自己发送的消息
filtered_messages = self._filter_my_messages(messages)
has_contact_keyword = self._has_contact_keyword(filtered_messages)

2. 筛选应用

# 应用筛选条件
friend_list = self._apply_filters(friend_list)

3. 保存联系人

# 保存并获取contact_id
contact_id = self._save_contact_record(name, job_name, contacts, action_state)

4. 复聊管理

# 进行复聊管理
reply_result = self._handle_follow_up_chat(tab, name, job_name, contact_id)

九、文件清单

代码文件

  • worker/tasks/boss_recruit.py - 招聘任务处理器(已优化)
  • server/models.py - 数据模型新增3个表
  • server/serializers.py - 序列化器新增3个
  • server/api/followup.py - 复聊配置API新增
  • server/urls.py - URL路由已更新
  • server/migrations/0004_add_followup_config.py - 数据库迁移(新增)

脚本文件

  • scripts/init_followup_config.py - 初始化复聊配置
  • scripts/test_recruit_features.py - 功能测试

文档文件

  • BOSS招聘优化说明.md - 详细功能说明
  • 复聊配置API使用指南.md - API使用指南
  • 快速参考指南.md - 快速参考
  • 代码变更清单.md - 变更记录
  • 优化完成总结.md - 完成总结
  • BOSS招聘自动化完整优化说明.md - 本文件

十、测试验证

语法检查

python -m py_compile worker/tasks/boss_recruit.py

通过

功能测试

python scripts/test_recruit_features.py

全部通过


十一、常见问题

Q1: 为什么会识别到自己发送的消息?

A: 已修复。现在通过 fromId 字段区分消息来源,只识别 fromId=0 的消息(对方发送的)。

Q2: 如何配置复聊话术?

A: 通过 /api/followup-scripts 接口创建话术,设置 day_numberinterval_hours

Q3: 如何设置"往后一直"的话术?

A: 创建话术时设置 day_number=0,系统会在没有特定天数话术时使用它。

Q4: 复聊间隔时间如何控制?

A: 每条话术都有 interval_hours 字段,系统会自动检查距离上次发送的时间。

Q5: 如何手动发送复聊消息?

A: 使用 POST /api/followup-records/send 接口,传入 contact_idcontent

Q6: 联系人记录在哪里查看?

A: 通过 /api/contacts 接口查询,或在数据库的 contact_record 表中查看。

Q7: 如何为不同岗位配置不同的复聊策略?

A: 创建多个 FollowUpConfig,设置不同的 position 字段。系统会优先匹配岗位配置。


十二、优化效果

提高效率

  • 通过筛选减少无效沟通
  • 自动化复聊,节省人工时间

提高质量

  • 消息过滤避免误识别
  • 多轮复聊提高回复率

数据管理

  • 自动保存联系人记录
  • 完整的复聊记录追踪

十三、后续建议

  1. 优化筛选条件:根据实际效果调整筛选参数
  2. 优化话术内容:根据回复率调整话术
  3. 添加数据统计:统计筛选通过率、回复率等
  4. 添加黑名单:避免重复联系
  5. 智能话术选择:根据候选人回复内容智能选择话术

十四、技术细节

时间解析逻辑

if "昨天" in last_time:
    last_active = now - timedelta(days=1)
elif "今天" in last_time or "刚刚" in last_time:
    last_active = now
elif "月" in last_time and "日" in last_time:
    match = re.search(r"(\d+)月(\d+)日", last_time)
    if match:
        month = int(match.group(1))
        day = int(match.group(2))
        year = now.year
        # 如果月份大于当前月份,说明是去年的
        if month > now.month:
            year -= 1
        last_active = datetime(year, month, day)

学历比较逻辑

edu_levels = ["初中", "高中", "中专", "大专", "本科", "硕士", "博士"]
candidate_level = next((i for i, edu in enumerate(edu_levels) if edu in candidate_edu), -1)
required_level = next((i for i, edu in enumerate(edu_levels) if edu in required_edu), -1)
return candidate_level >= required_level

复聊触发逻辑

# 1. 获取该联系人的最后一次复聊记录
last_record = FollowUpRecord.objects.filter(contact_id=contact_id).order_by('-sent_at').first()

# 2. 确定当前是第几天
if not last_record:
    day_number = 1  # 第一次复聊
else:
    hours_since_last = (now - last_record.sent_at).total_seconds() / 3600
    if hours_since_last < last_script.interval_hours:
        return  # 间隔时间不足,跳过
    day_number = last_record.day_number + 1

# 3. 获取该天的话术
script = FollowUpScript.objects.filter(config_id=config.id, day_number=day_number).first()
if not script:
    # 使用"往后一直"的话术
    script = FollowUpScript.objects.filter(config_id=config.id, day_number=0).first()

十五、完成时间

2026年3月5日


附录:快速命令

# 运行数据库迁移
python server/manage.py migrate

# 初始化复聊配置需要Django环境
python scripts/init_followup_config.py

# 测试功能
python scripts/test_recruit_features.py

# 检查语法
python -m py_compile worker/tasks/boss_recruit.py