Python开发微信服务号消息推送示例

Elena
Elena
发布时间:2026-10-11| 3人浏览过
原创

本文详解如何利用 Python 向微信认证服务号自动推送定时模板消息。文章对比了订阅通知的局限,明确基于固定模板的消息推送方案,并分步给出获取 Access Token、构造请求体及调用模板消息接口的完整代码。附带常见错误码排查指南与最终推送效果验证,帮助开发者快速落地服务端消息触达功能。

技术选型与场景分析

在实际业务中,经常需要通过微信公众号向用户发送特定通知。目前微信官方提供的消息推送能力主要分为两类:订阅消息与模板消息。对于需要长期、稳定且无需用户反复点击授权的场景,推荐采用模板消息。

订阅消息要求用户主动点击一次才能获取一次发送机会,适合课程提醒、抽奖开奖等低频触发场景;而模板消息无需用户预先交互,只要拥有模板 ID 和用户 OpenID,服务端即可随时发起推送。虽然微信对模板消息的标题和关键词进行了统一规范管理,不允许随意自定义,但通过灵活挑选相近行业模板,依然可以满足绝大多数数据通知需求。

微信模板消息筛选与审核规范示意图
微信官方对模板消息的标题与变量命名有严格规范,直接申请自定义常被驳回,建议直接在现有模板库中筛选相近样式。

开发环境与前置准备

在编写代码前,需要完成以下基础配置:

  • 开通认证服务号:登录微信公众平台,获取唯一的 AppID 与 AppSecret。
  • 添加并获取模板 ID:在「功能 → 模板消息」中挑选符合业务需求的模板,记录其 template_id。
  • 解析用户标识:服务端需掌握目标用户的 OpenID,可通过网页授权回调、JSSDK 或关注事件获取。
  • 安装依赖:本例使用业界标准的 HTTP 请求库。
pip install requests

第1步:获取全局 Access Token

所有微信 API 调用均需携带有效的 access_token。该凭证有效期为 7200 秒,为避免频繁请求被封禁,建议在项目中做缓存管理。

import requests
import sys

def get_access_token(app_id: str, app_secret: str) -> str:
    """请求微信接口获取 Access Token"""
    url = ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}")
    post_url = url.format(app_id, app_secret)
    
    try:
        res = requests.get(post_url, timeout=5)
        res.raise_for_status()
        data = res.json()
        if 'access_token' in data:
            return data['access_token']
        else:
            raise KeyError("接口未返回 access_token")
    except Exception as e:
        print(f"获取 access_token 失败,请检查 AppID 和 AppSecret 是否正确: {e}")
        sys.exit(1)

第2步:调用模板消息接口进行推送

获取 Token 后,即可构造 POST 请求发送消息。需注意,请求体中的 data 节点内各字段名(如 thing15、time9)必须与所选模板后台定义的变量 Key 保持一致。

import datetime
import requests

def send_template_message(to_user_openid: str, access_token: str, template_id: str, exchange_rate: float):
    url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}"
    
    current_date = datetime.datetime.now().strftime("%m月%d日")
    payload = {
        "touser": to_user_openid,
        "template_id": template_id,
        "url": "https://gushitong.baidu.com/foreign/global-CNYTWD",
        "data": {
            "thing15": {"value": "汇率通知"},
            "thing16": {"value": f"1 CNY = {exchange_rate} TWD"},
            "time9": {"value": current_date},
            "thing2": {"value": "点击详情查看历史汇率"}
        }
    }
    
    res = requests.post(url, json=payload, timeout=5)
    result = res.json()
    
    if result.get("errcode") == 0:
        print("✅ 推送消息成功")
    elif result.get("errcode") == 40003:
        print("❌ 推送失败:微信号 OpenID 不正确")
    elif result.get("errcode") == 40036:
        print("❌ 推送失败:模板 ID 为空")
    elif result.get("errcode") == 40037:
        print("❌ 推送失败:模板 ID 不合法")
    else:
        print(f"❌ 未知错误,返回信息: {result}")

运行效果与关键结果验证

将上述两个函数串联,配合定时任务(如 Linux Crontab 或 Python APScheduler),即可实现每日自动抓取数据并发放通知。以下为真实设备接收到的推送样式:

微信手机端收到的服务号模板消息通知界面
服务端调用成功后,用户手机将在通知栏或聊天列表收到带有跳转链接的结构化消息卡片。
用户点击进入消息详情页的效果
点击卡片右上角可展开完整内容,支持通过 URL 字段引导至外部网页查询详细业务数据。

排错清单

  • ErrCode 40003:touser 填写的不是合法的 OpenID,或者是未经过授权绑定的用户标识。
  • ErrCode 40036 / 40037:模板 ID 缺失或已被公众号停用、下架,需前往公众平台重新启用或更换新模板。
  • 频率限制:若短时间内密集推送大量消息,可能触发 IP 频次封禁。建议做好 Token 缓存,避免每次发送都重新请求 Token。

扩展思路与总结

当前版本已跑通核心通信链路。在实际项目投产时,通常还需封装用户订阅关系表,允许用户在小程序或 H5 页面自主开关推送权限,并结合数据库轮询实现阈值触发(如汇率跌破指定数值时报警)。

以上就是Python开发微信服务号消息推送示例的详细内容,更多关于python微信服务号定时推送的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。