前言
保险代理人的日常工作高度依赖微信:拉新客户、发产品介绍、回答投保问题、定期发续期提醒。然而纯手工操作效率极低——一个代理人平均要同时跟进数十到数百位潜在客户,每天光是复制粘贴话术就占掉大量时间,还容易漏跟客户导致流失。
随着 HTTP 接口技术的普及,现在完全可以用编程方式接管微信账号,构建一套"展业机器人":自动推送、智能答疑、精准提醒,解放代理人双手。本文从业务拆解出发,逐步讲清楚如何用 Python + 微信 REST 接口实现一套完整的保险展业自动化系统。
一、保险展业的核心业务场景拆解
在动手写代码之前,先把业务逻辑理清楚,后续的技术选型和模块划分才有根基。
1.1 获客阶段
保险代理人的获客渠道通常是:朋友圈曝光 → 好友添加 → 初次沟通 → 发送产品介绍。机器人要介入的节点包括:
- 自动通过好友申请(被动添加)
- 新好友通过后立即发送欢迎话术
- 定时向好友列表推送朋友圈内容
- 根据关键词回复(如回复"重疾险"自动发对应产品 PDF)
1.2 答疑阶段
客户在购买保险前通常有大量问题:等待期多久?能否报销自费药?有没有健康告知要求?这类问题重复度高,非常适合用规则引擎或 LLM 自动回复。
机器人要实现:
- 监听私信消息,解析意图
- 匹配 FAQ 库给出标准答案
- 复杂问题转人工,并通知代理人介入
1.3 续期提醒阶段
已投保客户的续期提醒是代理人必做的维护动作,但手动管理几百份保单日期几乎不可能。机器人可以:
- 从本地保单数据库读取续期日期
- 提前 30 天、15 天、7 天、3 天分别发送定制提醒消息
- 对已续期客户自动打标记,停止重复提醒
二、系统架构设计
整个展业机器人可以拆成四个模块:
┌─────────────────────────────────────────────┐
│ 保险展业机器人 │
├──────────────┬──────────────┬───────────────┤
│ 消息收发层 │ 业务逻辑层 │ 数据存储层 │
│ (HTTP API) │ (Python) │ (SQLite/CSV) │
├──────────────┴──────────────┴───────────────┤
│ 调度层 (APScheduler) │
└─────────────────────────────────────────────┘
- 消息收发层:通过 HTTP REST 接口与微信账号交互,接收回调、发送消息
- 业务逻辑层:FAQ 匹配、意图识别、保单续期日期计算
- 数据存储层:客户信息、保单记录、消息历史
- 调度层:定时任务,驱动续期提醒、朋友圈定投
三、环境搭建与初始化
3.1 依赖安装
bashpip install requests flask apscheduler sqlite3
3.2 配置占位符
python# config.py
BASE = "https://你的接口域名" # 注册后在官方文档获取
TOKEN = "你的Token"
APPID = "你的appId"
HEADERS = {"token": TOKEN} # 鉴权字段名以官方文档为准
# 代码为示例,具体接口/字段以官方文档为准
3.3 登录与在线维持
首次使用需要扫码登录,拿到 appId 后后续所有接口都用这个 ID 标识设备。
pythonimport requests
def get_qrcode():
"""获取登录二维码"""
url = f"{BASE}/login/getLoginQrCode"
resp = requests.post(url, headers=HEADERS, json={})
data = resp.json()
if data["ret"] == 200:
# data["data"]["qrCodeUrl"] 是二维码图片地址
return data["data"]
raise RuntimeError(f"获取二维码失败: {data}")
def check_login(uuid):
"""轮询登录状态"""
url = f"{BASE}/login/checkLogin"
resp = requests.post(url, headers=HEADERS, json={"uuid": uuid})
return resp.json()
def check_online():
"""检查当前账号是否在线"""
url = f"{BASE}/login/checkOnline"
resp = requests.post(url, headers=HEADERS, json={"appId": APPID})
return resp.json()["data"]["isOnline"]
四、获客模块:自动通过好友 + 欢迎语
4.1 设置消息回调
所有入站消息(好友申请、文字、图片等)都通过回调接收。需要先注册回调地址:
pythondef set_callback(callback_url: str):
"""注册消息回调地址,需公网可达"""
url = f"{BASE}/tools/setCallback"
resp = requests.post(url, headers=HEADERS, json={
"appId": APPID,
"token": TOKEN,
"callbackUrl": callback_url
})
return resp.json()
回调地址要能公网访问(本地开发可用 ngrok),并且收到 POST 后必须返回 HTTP 200,否则平台会重试。
4.2 Flask 回调服务
pythonfrom flask import Flask, request, jsonify
import json
app = Flask(__name__)
@app.route("/wechat_callback", methods=["POST"])
def wechat_callback():
data = request.json
msg_type = data.get("type")
if msg_type == 37: # 好友申请
handle_friend_request(data)
elif msg_type == 1: # 文字消息
handle_text_message(data)
return jsonify({"code": 200})
def handle_friend_request(data):
"""自动通过好友申请并发送欢迎语"""
from_wxid = data["fromWxid"]
# 通过申请(具体接口字段以官方文档为准)
requests.post(f"{BASE}/contacts/addContacts", headers=HEADERS, json={
"appId": APPID,
"wxid": from_wxid,
"type": 1 # 1=通过申请
})
# 延迟2秒后发欢迎语,避免太机械
import time
time.sleep(2)
send_welcome(from_wxid)
4.3 发送欢迎语
pythonWELCOME_MSG = """您好,我是[代理人姓名],专注保险规划10年+。
添加成功后可直接问我:
📋 想了解哪类保险(重疾/医疗/寿险/年金)
🎂 被保人年龄和健康情况
💰 预算范围
我会为您匹配最合适的方案,回复"方案"即可开始。"""
def send_welcome(to_wxid: str):
requests.post(f"{BASE}/message/postText", headers=HEADERS, json={
"appId": APPID,
"toWxid": to_wxid,
"content": WELCOME_MSG
})
五、答疑模块:FAQ 关键词匹配 + 转人工
5.1 FAQ 库设计
用 Python 字典存储关键词到答案的映射,实际项目可改用数据库或配置文件:
pythonFAQ = {
"等待期": "大多数重疾险等待期为90-180天,意外险无等待期。具体以保单条款为准。",
"健康告知": "投保前需如实填写健康告知,常见问询包括:近5年内是否患过高血压、糖尿病、肿瘤等。如有疑问请直接咨询我。",
"报销": "普通医疗险报销住院及门诊费用(视条款),百万医疗险通常赔付扣除免赔额后合规医疗费用的100%。",
"续期": "保费续期一般在生效周年日前后30天内缴纳,逾期会有宽限期(通常60天),超期保单失效需复效。",
"理赔": "理赔需提交:理赔申请书、诊断证明、住院病历、费用发票等。我可以帮您整理材料清单,请告知险种。",
"方案": "好的,请告诉我:①被保人年龄 ②是否有既往症 ③预算(年缴)。我来为您匹配产品。",
}
ESCALATE_KEYWORDS = ["投诉", "退保", "骗", "假"] # 触发转人工
AGENT_WXID = "代理人自己的微信ID" # 转人工通知目标
5.2 消息处理逻辑
pythondef handle_text_message(data):
from_wxid = data["fromWxid"]
content = data.get("content", "")
# 检查是否需要转人工
for kw in ESCALATE_KEYWORDS:
if kw in content:
escalate_to_agent(from_wxid, content)
return
# FAQ 匹配
for kw, answer in FAQ.items():
if kw in content:
requests.post(f"{BASE}/message/postText", headers=HEADERS, json={
"appId": APPID,
"toWxid": from_wxid,
"content": answer
})
return
# 无匹配,发兜底话术
requests.post(f"{BASE}/message/postText", headers=HEADERS, json={
"appId": APPID,
"toWxid": from_wxid,
"content": "感谢您的提问,我已收到,稍后为您详细解答。如需快速回复请直接发送关键词:重疾险 / 医疗险 / 理赔 / 方案"
})
def escalate_to_agent(client_wxid: str, content: str):
"""通知代理人介入处理"""
notice = f"[转人工提醒]\n客户: {client_wxid}\n消息: {content}\n请尽快介入处理。"
requests.post(f"{BASE}/message/postText", headers=HEADERS, json={
"appId": APPID,
"toWxid": AGENT_WXID,
"content": notice
})
六、续期提醒模块:基于保单数据库的定时推送
6.1 保单数据库初始化
pythonimport sqlite3
from datetime import datetime, timedelta
def init_db():
conn = sqlite3.connect("policies.db")
conn.execute("""
CREATE TABLE IF NOT EXISTS policies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
client_wxid TEXT NOT NULL,
client_name TEXT,
policy_no TEXT,
product TEXT,
renew_date DATE,
reminded INTEGER DEFAULT 0 -- 位掩码:1=30天 2=15天 4=7天 8=3天
)
""")
conn.commit()
conn.close()
6.2 续期提醒调度
pythonfrom apscheduler.schedulers.background import BackgroundScheduler
REMIND_DAYS = [30, 15, 7, 3]
BIT_MAP = {30: 1, 15: 2, 7: 4, 3: 8}
def check_renewals():
"""每天早上09:00执行,检查需要提醒的保单"""
conn = sqlite3.connect("policies.db")
cursor = conn.cursor()
today = datetime.today().date()
for days in REMIND_DAYS:
target_date = today + timedelta(days=days)
bit = BIT_MAP[days]
cursor.execute(
"SELECT client_wxid, client_name, policy_no, product, renew_date, reminded "
"FROM policies WHERE renew_date = ? AND (reminded & ?) = 0",
(target_date.isoformat(), bit)
)
rows = cursor.fetchall()
for wxid, name, policy_no, product, renew_date, reminded in rows:
send_renew_reminder(wxid, name, policy_no, product, renew_date, days)
# 标记已提醒
cursor.execute(
"UPDATE policies SET reminded = reminded | ? WHERE client_wxid = ? AND policy_no = ?",
(bit, wxid, policy_no)
)
conn.commit()
conn.close()
def send_renew_reminder(wxid, name, policy_no, product, renew_date, days_left):
msg = (
f"[续期提醒] {name} 您好,\n"
f"您的「{product}」保单(编号:{policy_no})将于 {renew_date} 到期,"
f"还剩 {days_left} 天。\n"
f"请确认续期缴费,保障不断档。如有疑问欢迎随时联系我。"
)
requests.post(f"{BASE}/message/postText", headers=HEADERS, json={
"appId": APPID,
"toWxid": wxid,
"content": msg
})
def start_scheduler():
scheduler = BackgroundScheduler()
scheduler.add_job(check_renewals, "cron", hour=9, minute=0)
scheduler.start()
return scheduler
七、朋友圈定投:产品种草与权益科普
对于潜在客户,朋友圈内容曝光是重要的"养客"手段。机器人可以定时发布科普内容,保持存在感。
需注意:新账号上线后要等至少 1 天再操作朋友圈;获取他人动态频率不超过 200 次/天;点赞评论之间加随机间隔(5-20 秒),避免触发风控。
pythonimport time
import random
MOMENTS_CONTENT = [
"【重疾险小知识】重疾险赔付的是确诊金,不是报销医疗费,两者定位不同,建议搭配配置。",
"【医疗险提醒】很多百万医疗险有免赔额(通常1万元),日常小病报销靠的是门诊医疗附加险。",
"【年金险适合谁】对强制储蓄有需求、希望锁定利率、或规划子女教育金/退休金的人群。",
]
def post_moment(text: str):
"""发布文字朋友圈"""
resp = requests.post(f"{BASE}/sns/sendTextSns", headers=HEADERS, json={
"appId": APPID,
"content": text
})
return resp.json()
def daily_moment_post():
"""每日选一条朋友圈内容发布"""
from datetime import date
idx = date.today().toordinal() % len(MOMENTS_CONTENT)
content = MOMENTS_CONTENT[idx]
result = post_moment(content)
print(f"[朋友圈] 发布结果: {result}")
八、接口调用频率与风控建议
保险展业场景下账号安全尤为重要,频繁操作极易触发微信风控。以下是经过验证的合理频率参考:
| 操作类型 | 建议频率 | 注意事项 |
|---|---|---|
| 被动通过好友 | ≤200 人/天 | 超出易触发账号审查 |
| 主动添加好友 | 24h 内 5-15 个 | 每 2h 不超过 5 个,随机间隔 |
| 发文字消息 | 无硬性上限 | 避免群发模板,内容需个性化 |
| 朋友圈发布 | 1-3 条/天 | 新号上线 1 天后再操作 |
| 获取好友列表 | 低频,按需 | 不做高频轮询 |
| 点赞/评论 | 随机间隔 5-20s | 避免机械等时间间隔 |
此外建议:
- 新账号上线后先在线 3 天,再启动自动加好友,降低封号风险
- 每条消息之间加 2-5 秒随机延迟,模拟人工操作节奏
- 将客户分组,分批次推送,不要同一时刻向全部好友群发
九、完整入口与部署
python# main.py
import threading
from flask import Flask
def main():
init_db()
# 检查在线状态
if not check_online():
print("账号不在线,请先扫码登录")
qr = get_qrcode()
print(f"二维码地址: {qr.get('qrCodeUrl', '见接口返回')}")
return
# 设置回调(替换为你的公网地址)
set_callback("https://你的服务器域名/wechat_callback")
# 启动定时任务
scheduler = start_scheduler()
# 朋友圈每天上午10点发布
scheduler.add_job(daily_moment_post, "cron", hour=10, minute=0)
# 启动 Flask 回调服务
app.run(host="0.0.0.0", port=5000)
if __name__ == "__main__":
main()
WechatApi 提供扫码登录、消息收发、好友与群管理等 REST 接口,HTTP 调用即可,适合像本文这类需要长期运行、多功能集成的展业机器人场景。
部署时推荐使用云服务器(阿里云/腾讯云等),保证回调地址公网可达,并用 supervisor 或 systemd 管理进程,实现开机自启和崩溃重启。
部署上线前,建议先在测试账号上跑通全流程:手动触发一次好友申请、回复一条消息、插入一条即将到期的保单记录并观察提醒是否准时发出。排查时重点检查回调地址是否可达、Token 是否过期、数据库路径是否正确。常见坑:服务器防火墙未放行 5000 端口导致回调收不到消息;APScheduler 在 Flask 开发模式下可能因 Reloader 重启调度器,生产环境应关闭 debug 模式(app.run(debug=False))。
十、实操注意事项
10.1 账号准备
建议使用专门注册的展业微信号,不要与个人日常账号混用。原因有三:一是自动化操作存在封号风险,独立账号被限制不影响日常社交;二是展业账号可以系统性维护客户标签和备注,数据更整洁;三是合规层面,展业行为与私人聊天分离,出现纠纷时记录更清晰。
10.2 话术合规
保险营销受《保险法》及监管规定约束,自动回复的内容需特别注意:不得夸大保险责任、不得承诺保证收益(年金险除外且措辞要准确)、不得发送未经审核的宣传材料。FAQ 库内容建议由合规部门审核后上线,并定期随产品条款更新同步修订。
10.3 客户分层运营
并非所有客户都适合高频触达。建议在数据库中增加 stage 字段(如 lead/prospect/client/vip),根据阶段设置不同的触达频率和话术风格:潜在客户每周 1-2 次科普推送;已投保客户以服务通知为主;高净值客户降低自动化比例、增加人工个性化跟进。
10.4 异常监控
机器人长期运行必然遇到账号掉线、接口超时等情况。建议增加简单的健康检查机制:每小时调用一次在线状态接口,掉线时通过邮件或企业微信机器人通知代理人手动重新扫码。对于消息发送失败的情况,记录到日志表并在下次检查时重试,避免客户因接口抖动而漏收重要提醒。
总结
本文从保险代理人的三个核心场景(获客、答疑、续期提醒)出发,逐模块实现了一套基于 Python + HTTP 接口的微信展业机器人,涵盖回调监听、FAQ 自动回复、保单数据库驱动的定时提醒以及朋友圈定投。额外补充了部署调试技巧、账号合规准备、客户分层策略和异常监控建议,帮助开发者在实际落地时少走弯路。代码中所有接口地址和字段均为示例占位,实际开发请以官方文档为准。
