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

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

相关推荐
小李子呢02112 小时前
前端八股---axios封装
java·前端·javascript
斌味代码2 小时前
SpringBoot 实战总结:踩坑与解决方案全记录
java·spring boot·后端
摇滚侠2 小时前
Groovy 中如何定义集合
java·开发语言·python
wzl202612132 小时前
企微工具对比:第三方SCRM与自动化工作流集成
运维·自动化·企业微信
0xDevNull2 小时前
Spring Boot 3.0动态多数据源切换实战教程
java·spring boot·后端
代码漫谈2 小时前
微服务 vs 单体架构:架构选型、实战拆解与决策指南
java·微服务·springboot·springcloud
神龙斗士2402 小时前
第一个Spring Boot程序
java·spring boot·java-ee·tomcat
gelald2 小时前
Spring Boot - 配置加载
java·spring boot·后端·spring
中国胖子风清扬2 小时前
基于GPUI框架构建现代化待办事项应用:从架构设计到业务落地
java·spring boot·macos·小程序·rust·uni-app·web app