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

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

相关推荐
像我这样帅的人丶你还15 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩15 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia16 小时前
Mybatis的日志输入
java
亦暖筑序18 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户2986985301421 小时前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao21 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿21 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
鹤望兰6751 天前
字节跳动国际支付-后端开发-三面面经
java
Flittly1 天前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
RainCity1 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端