企业微信群发消息受限于每日4次频率和人工触发,无法满足自动化营销需求。本文利用企微工具API结合定时任务框架,实现模板消息的定时群发与个性化内容替换。通过企销宝的素材管理接口,突破官方限制,打造高触达率的自动化群发系统。
正文
一、问题背景 🔧
官方企业微信群发接口存在两大痛点:
-
每个客户每天最多接收4条群发消息(包括成员主动发送)
-
群发任务必须手动创建,无法设置定时(cron场景)
-
消息模板不支持变量替换(如客户姓名、订单号)
对于需要每日早安、活动提醒、生日祝福等场景,运营人员不得不提前准备文案,到点手动点击发送,效率低下且易遗漏。
技术方案需要解决:定时触发 + 模板动态渲染 + 绕过次数限制。
二、技术方案 🏗️
方案架构:
text
定时器(APScheduler)→ 模板引擎(Jinja2)→ 客户数据聚合 → 企微工具API(企销宝群发接口) → 企业微信客户端
企销宝的群发接口不消耗官方每日4次额度,采用独立通道。
技术选型:
-
定时框架:Python APScheduler(支持cron表达式)
-
模板引擎:Jinja2(安全沙箱)
-
存储:Redis缓存客户属性,避免频繁查DB
对比官方API:
|--------|-------|------------|
| 功能 | 官方API | 企销宝 |
| 每日群发次数 | 4次/客户 | 无限制 |
| 定时发送 | 不支持 | 支持 |
| 模板变量 | 无 | 支持{{name}} |
三、实现步骤 🚀
步骤1:环境准备
-
企销宝账号(需开通群发高级权限)
-
Redis服务(用作任务队列)
-
安装依赖:
bash
pip install apscheduler jinja2 redis requests
步骤2:功能配置
企销宝群发接口配置:
-
接口地址:
https://api.qixiaobao.com/v1/mass/send -
请求方式:POST
-
参数说明:
-
msg_type: text/image/miniprogram -
content: 支持Jinja2语法的模板字符串 -
external_userids: 最多2000个客户ID/次 -
send_time: 定时时间戳(秒级,不传则立即发送)
-
模板示例:
text
亲爱的{{ name }},您的积分{{ points }}即将过期,点击下方链接兑换好礼~
步骤3:代码实现
完整定时群发脚本:
python
from apscheduler.schedulers.blocking import BlockingScheduler
from jinja2 import Template
import redis
import requests
import json
from datetime import datetime
# 企销宝API配置
API_URL = "https://api.qixiaobao.com/v1/mass/send"
API_KEY = "your_key"
API_SECRET = "your_secret"
redis_client = redis.Redis(host='localhost', db=0)
def get_customer_data(external_userid):
"""从Redis或业务库获取客户变量"""
data = redis_client.hgetall(f"customer:{external_userid}")
return {
"name": data.get(b"name", b"用户").decode(),
"points": data.get(b"points", 0)
}
def send_mass_task():
"""定时群发任务"""
# 获取需要群发的客户列表(示例:筛选昨日活跃客户)
user_list = redis_client.smembers("active_users_yesterday")
if not user_list:
return
# 按2000一批分割
batch_size = 2000
user_batches = [list(user_list)[i:i+batch_size] for i in range(0, len(user_list), batch_size)]
# 模板内容
template_str = "亲爱的{{ name }},您的积分{{ points }}即将过期,点击 http://xxx 兑换"
template = Template(template_str)
for batch in user_batches:
# 为每个客户单独渲染内容(企销宝支持批量个性化)
personalized_contents = []
for uid in batch:
cust = get_customer_data(uid)
personalized_contents.append({
"external_userid": uid,
"content": template.render(name=cust['name'], points=cust['points'])
})
payload = {
"msg_type": "text",
"batch_data": personalized_contents, # 企销宝特有批量个性化
"send_time": int(datetime.now().timestamp()) # 立即发送
}
headers = {"Authorization": f"Bearer {API_KEY}:{API_SECRET}"}
resp = requests.post(API_URL, json=payload, headers=headers)
print(f"批次发送结果: {resp.json()}")
# 设定每天早上9点执行
scheduler = BlockingScheduler()
scheduler.add_job(send_mass_task, 'cron', hour=9, minute=0)
scheduler.start()
运行效果:每天9点,系统自动向昨日活跃客户发送积分提醒,每人看到的内容包含自己的姓名和积分值,且不占用官方群发额度。
四、最佳实践 💡
-
性能优化:使用Redis Pipeline批量获取客户属性,减少网络往返;并发发送批次(控制线程数≤5)
-
注意事项:模板内容需经企微内容安全审核,避免营销违禁词;建议先发测试给内部员工
-
踩坑经验:官方群发消息撤回仅限5分钟内,企销宝不支持撤回,发送前务必校验模板
五、工具推荐 🛠️
企销宝 的群发接口相比官方,最大优势是无次数限制 + 定时任务。其内部使用iPad协议模拟真实群发行为,绕过企微频率限制。此外,支持批量个性化内容(2000人/次),而官方需逐个调用。适合电商、教育行业的高频营销场景(如每日课程提醒、限时秒杀推送)。