下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:1133
这个实现包含三个主要模块:核心生成器类、预定义模板类和主程序入口。核心类负责获取微信access_token、生成XML格式的卡片消息以及发送消息。模板类提供了几种常见的卡片模板,主程序演示了如何使用这些功能。使用时需要替换示例中的微信公众号配置信息。
import xml.etree.ElementTree as ET
import time
import hashlib
import requests
class WXCardGenerator:
def init(self, app_id, app_secret):
self.app_id = app_id
self.app_secret = app_secret
self.access_token = None
self.token_expire = 0
def _get_access_token(self):
if time.time() < self.token_expire and self.access_token:
return self.access_token
url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={self.app_id}&secret={self.app_secret}"
response = requests.get(url)
data = response.json()
self.access_token = data['access_token']
self.token_expire = time.time() + data['expires_in'] - 300
return self.access_token
def generate_card_xml(self, template_id, data_dict, to_user, from_user):
root = ET.Element('xml')
ET.SubElement(root, 'ToUserName').text = to_user
ET.SubElement(root, 'FromUserName').text = from_user
ET.SubElement(root, 'CreateTime').text = str(int(time.time()))
ET.SubElement(root, 'MsgType').text = 'news'
ET.SubElement(root, 'ArticleCount').text = '1'
articles = ET.SubElement(root, 'Articles')
item = ET.SubElement(articles, 'item')
for key, value in data_dict.items():
if key == 'Title':
ET.SubElement(item, 'Title').text = value
elif key == 'Description':
ET.SubElement(item, 'Description').text = value
elif key == 'PicUrl':
ET.SubElement(item, 'PicUrl').text = value
elif key == 'Url':
ET.SubElement(item, 'Url').text = value
return ET.tostring(root, encoding='unicode', method='xml')
def send_card_message(self, openid, xml_content):
access_token = self._get_access_token()
url = f"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}"
headers = {'Content-Type': 'application/xml'}
response = requests.post(url, data=xml_content.encode('utf-8'), headers=headers)
return response.json()
CardTemplates:
@staticmethod
def news_template():
return {
'Title': '新闻资讯',
'Description': '点击查看最新新闻动态',
'PicUrl': 'https://example.com/news.jpg',
'Url': 'https://example.com/news'
}
@staticmethod
def product_template():
return {
'Title': '新品上市',
'Description': '限时优惠,立即购买',
'PicUrl': 'https://example.com/product.jpg',
'Url': 'https://example.com/product'
}
@staticmethod
def event_template():
return {
'Title': '活动通知',
'Description': '参与活动赢取大奖',
'PicUrl': 'https://example.com/event.jpg',
'Url': 'https://example.com/event'
}
name == "main":
# 配置微信公众号信息
APP_ID = 'your_app_id'
APP_SECRET = 'your_app_secret'
TO_USER = 'target_openid'
FROM_USER = 'your_wechat_id'
# 初始化生成器
generator = WXCardGenerator(APP_ID, APP_SECRET)
# 选择模板并生成XML
template = CardTemplates.news_template()
xml_content = generator.generate_card_xml('template_001', template, TO_USER, FROM_USER)
# 发送卡片消息
result = generator.send_card_message(TO_USER, xml_content)
print("发送结果:", result)
print("生成的XML内容:")
print(xml_content)