12 KiB
12 KiB
BOSS招聘自动化 - 完整优化说明
优化概述
本次优化解决了以下核心问题:
- ✅ 消息过滤问题:过滤掉自己发送的包含"微信号"等关键词的消息
- ✅ 筛选功能:支持活跃度、年龄、学历、期望职位筛选
- ✅ 联系人记录:自动保存聊天中获取的联系方式
- ✅ 复聊管理:支持多轮复聊、自定义话术、间隔时间控制
一、消息过滤优化
问题描述
之前的代码会识别到自己发送的包含"微信号"三个字的消息,导致误判。
解决方案
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_min 和 age_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_number 和 interval_hours。
Q3: 如何设置"往后一直"的话术?
A: 创建话术时设置 day_number=0,系统会在没有特定天数话术时使用它。
Q4: 复聊间隔时间如何控制?
A: 每条话术都有 interval_hours 字段,系统会自动检查距离上次发送的时间。
Q5: 如何手动发送复聊消息?
A: 使用 POST /api/followup-records/send 接口,传入 contact_id 和 content。
Q6: 联系人记录在哪里查看?
A: 通过 /api/contacts 接口查询,或在数据库的 contact_record 表中查看。
Q7: 如何为不同岗位配置不同的复聊策略?
A: 创建多个 FollowUpConfig,设置不同的 position 字段。系统会优先匹配岗位配置。
十二、优化效果
提高效率
- 通过筛选减少无效沟通
- 自动化复聊,节省人工时间
提高质量
- 消息过滤避免误识别
- 多轮复聊提高回复率
数据管理
- 自动保存联系人记录
- 完整的复聊记录追踪
十三、后续建议
- 优化筛选条件:根据实际效果调整筛选参数
- 优化话术内容:根据回复率调整话术
- 添加数据统计:统计筛选通过率、回复率等
- 添加黑名单:避免重复联系
- 智能话术选择:根据候选人回复内容智能选择话术
十四、技术细节
时间解析逻辑
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