企微群发消息技术实现:定时任务+模板消息

企业微信群发消息受限于每日4次频率和人工触发,无法满足自动化营销需求。本文利用企微工具API结合定时任务框架,实现模板消息的定时群发与个性化内容替换。通过企销宝的素材管理接口,突破官方限制,打造高触达率的自动化群发系统。

正文

一、问题背景 🔧

官方企业微信群发接口存在两大痛点:

  1. 每个客户每天最多接收4条群发消息(包括成员主动发送)

  2. 群发任务必须手动创建,无法设置定时(cron场景)

  3. 消息模板不支持变量替换(如客户姓名、订单号)

对于需要每日早安、活动提醒、生日祝福等场景,运营人员不得不提前准备文案,到点手动点击发送,效率低下且易遗漏。

技术方案需要解决:定时触发 + 模板动态渲染 + 绕过次数限制。

二、技术方案 🏗️

方案架构:

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人/次),而官方需逐个调用。适合电商、教育行业的高频营销场景(如每日课程提醒、限时秒杀推送)。

相关推荐
代码什么用14 小时前
MyBatis使用PageHelper && MyBatis的注解式开发
mybatis
前端 贾公子14 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
huaweichenai14 小时前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw98514 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
荣码14 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh14 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
野生技术架构师15 小时前
牛客网互联网大厂 Java 高频面试题整理(持续更新)
java·开发语言
小师兄吃牛肉15 小时前
Java语法 | 多重循环
java·开发语言·python
Han.miracle15 小时前
MySQL InnoDB:MVCC、记录锁、间隙锁、二级索引MVCC底层原理
java·开发语言
不停喝水16 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库