☰
企业微信API怎么实现机器人主动发消息?主动推送机制与开发方法解析
2026/9/30 14:15:45 网站建设 项目流程

最近做的企微二开,机器人不能只等客户发消息才回——客户加好友 3 天没聊要主动推个问候、订单状态变了要主动通知、生日要主动发祝福。和之前聊的定时任务不同,那篇重点是调度引擎,这篇重点是主动推送机制本身——什么时候推、调哪个接口推、频率怎么控、推完怎么确认送达。把调了哪些接口记下来。

Eyun 平台开放的企微 API,统一 POST+JSON,鉴权用 App Token 加 appid(Authorization: Bearer eyk_xxxx),路径{BASE_URL}/wx-api/api/<模块>/<动作>,响应封套{code, data, detail, message, time},code 为 0 成功。

主动推送不是定时发消息

最早理解偏了:以为主动推送就是写个 cron 定时发消息。做完发现主动推送是个完整机制——要有触发条件、内容生成、频率控制、送达确认、失败重试。光定时发不管条件,客户被骚扰;光发不管送达,消息丢了不知道。

触发条件:什么时候推

主动推送的触发有几类:

  • 时间触发:客户加好友 3 天、生日当天

  • 事件触发:订单状态变化、工单状态变化

  • 行为触发:客户浏览了产品页、客户在名片页留资

  • 阈值触发:3 天未跟进、7 天未下单

def check_triggers(appid, customer_uin): triggers = [] # 加好友3天未聊 if days_since_add(appid, customer_uin) == 3 and not has_message(appid, customer_uin): triggers.append({"type": "no_touch_3d", "delay_hours": 0}) # 生日当天 if is_birthday(appid, customer_uin): triggers.append({"type": "birthday", "delay_hours": 9}) # 早上9点发 return triggers

触发检查靠事件加定时——事件触发实时响应,时间触发定时扫描。

主动发消息:调 sendText

触发后调消息接口主动发消息给客户:

import requests BASE = "https://api.eyun.com" HEADERS = {"Authorization": "Bearer eyk_xxxx", "Content-Type": "application/json"} def push_message(appid, to_uin, content): resp = requests.post( f"{BASE}/wx-api/api/message/sendText", headers=HEADERS, json={"appid": appid, "to": to_uin, "content": content} ) body = resp.json() if body["code"] == 0: return body["data"]["msgId"] # 消息ID用于回执 raise Exception(body["message"])

to是客户 uin,主动发消息不用conversationId,用to。返回的msgId用来查送达状态。接口参数在Eyun 开发文档。

发富文本卡片:调 sendRichText

有些推送适合发卡片——产品推荐、订单状态更新:

def push_card(appid, to_uin, title, desc, url): card = { "title": title, "description": desc, "url": url } resp = requests.post( f"{BASE}/wx-api/api/message/sendRichText", headers=HEADERS, json={"appid": appid, "to": to_uin, "cards": [card]} ) return resp.json()["code"] == 0

卡片比文字更吸引注意力,客户点击率高。但卡片成本高(要构造、要图片),不是所有推送都用卡片。

频率控制:不打扰客户

主动推送最容易翻车的是频率——客户一天收 3 条主动推送,直接删好友。频率控制:

def check_frequency(appid, customer_uin, window_hours=24, max_count=2): recent = count_pushed(appid, customer_uin, window_hours) return recent < max_count def push_safe(appid, customer_uin, content): if not check_frequency(appid, customer_uin): return {"status": "rate_limited"} return push_message(appid, customer_uin, content)

每个客户 24 小时内最多收 2 条主动推送。超频次的推送延后或取消。不做频率控制,客户被骚扰删好友,之前做的全都白费。

送达确认:查消息回执

消息发出后要确认送达。调消息接口查回执:

def check_receipt(appid, msg_id): resp = requests.post( f"{BASE}/wx-api/api/message/getMessageReceipt", headers=HEADERS, json={"appid": appid, "msgId": msg_id} ) return resp.json()["data"] # 送达状态

送达状态有:已送达、已读、未读。未读的可以再推一次提醒,但不要频繁——客户没读可能是忙,不是没收到。

失败重试和补偿

推送失败要重试,但不能无限重试:

def push_with_retry(appid, to_uin, content, max_retry=3): for i in range(max_retry): try: return push_message(appid, to_uin, content) except Exception as e: if i == max_retry - 1: log_failed_push(appid, to_uin, content, str(e)) return None time.sleep(60 * (i + 1)) # 退避重试

重试间隔递增——60秒、120秒、180秒。重试 3 次还失败的记日志,人工排查。不做重试,网络抖动导致消息丢了没人管。

推送效果统计

推送上线后要统计效果:

  • 推送成功率:发出去了没

  • 送达率:客户收到了没

  • 已读率:客户看了没

  • 回复率:客户回了没

  • 删好友率:推送后客户删了没(这个最关键)

删好友率是推送效果的负面指标——如果某类推送后删好友率飙升,说明这类推送太扰民,要调整。关于消息接口和推送机制,在Eyun 企业微信 API 平台开通后可以测试。

写在最后

机器人主动推送这套东西,本质是把企微的消息接口用活——sendText 主动发文字、sendRichText 主动发卡片、getMessageReceipt 查送达、加频率控制防骚扰。把触发条件设对、频率控制做严、送达确认做实,主动推送才能真正触达客户而不是赶走客户。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询