下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:1133
这个QQ卡片生成工具包含完整的XML生成逻辑、工具类、Web服务和配置模块。主模块QQCardGenerator.py实现了核心的XML生成功能,CardUtils.py提供辅助方法,WebService.py提供HTTP接口,config.py包含各种配置参数。使用时可以通过Web服务接口传入URL和标题等参数,获取生成的QQ卡片XML代码。
import xml.etree.ElementTree as ET
import json
import base64
from datetime import datetime
class QQCardGenerator:
def init(self):
self.template = {
'msg': {
'appmsg': {
'appid': '',
'sdkver': '',
'title': '',
'des': '',
'action': '',
'type': '',
'showtype': '',
'mediatagname': '',
'messageext': '',
'messageaction': '',
'content': '',
'contentattr': '',
'url': '',
'lowurl': '',
'dataurl': '',
'lowdataurl': '',
'appattach': {
'totallen': '',
'attachid': '',
'fileext': ''
},
'extinfo': '',
'sourceusername': '',
'sourcedisplayname': '',
'thumburl': '',
'md5': '',
'statextstr': ''
},
'fromusername': '',
'scene': '',
'appinfo': {
'version': '',
'appname': ''
},
'commenturl': ''
}
}
def generate_xml(self, card_data):
root = ET.Element('msg')
appmsg = ET.SubElement(root, 'appmsg')
# 添加基础字段
ET.SubElement(appmsg, 'appid').text = card_data.get('appid', '')
ET.SubElement(appmsg, 'sdkver').text = card_data.get('sdkver', '')
ET.SubElement(appmsg, 'title').text = card_data.get('title', '')
ET.SubElement(appmsg, 'des').text = card_data.get('des', '')
ET.SubElement(appmsg, 'action').text = card_data.get('action', '')
ET.SubElement(appmsg, 'type').text = card_data.get('type', '')
# 添加appattach节点
appattach = ET.SubElement(appmsg, 'appattach')
ET.SubElement(appattach, 'totallen').text = card_data.get('appattach', {}).get('totallen', '')
ET.SubElement(appattach, 'attachid').text = card_data.get('appattach', {}).get('attachid', '')
ET.SubElement(appattach, 'fileext').text = card_data.get('appattach', {}).get('fileext', '')
# 添加其他字段
ET.SubElement(appmsg, 'url').text = card_data.get('url', '')
ET.SubElement(appmsg, 'lowurl').text = card_data.get('lowurl', '')
ET.SubElement(appmsg, 'thumburl').text = card_data.get('thumburl', '')
# 生成XML字符串
xml_str = ET.tostring(root, encoding='unicode', method='xml')
return xml_str
def generate_from_url(self, url, title='', description=''):
card_data = {
'appid': '123456',
'sdkver': '1.0',
'title': title,
'des': description,
'action': 'view',
'type': 'url',
'url': url,
'lowurl': url,
'thumburl': self._generate_thumb(url)
}
return self.generate_xml(card_data)
def _generate_thumb(self, url):
# 生成缩略图URL的模拟方法
return f"https://thumb.example.com/{base64.b64encode(url.encode()).decode()[:10]}.jpg"
import hashlib
import random
import string
class CardUtils:
@staticmethod
def generate_random_id(length=32):
"""生成随机卡片ID"""
chars = string.asciiletters + string.digits
return ''.join(random.choice(chars) for in range(length))
@staticmethod
def generate_md5(content):
"""生成内容MD5"""
return hashlib.md5(content.encode('utf-8')).hexdigest()
@staticmethod
def validate_url(url):
"""验证URL有效性"""
return url.startswith(('http://', 'https://'))
@staticmethod
def format_timestamp(timestamp=None):
"""格式化时间戳"""
if timestamp is None:
timestamp = datetime.now().timestamp()
return str(int(timestamp))
flask import Flask, request, jsonify
from QQCardGenerator import QQCardGenerator
app = Flask(name)
generator = QQCardGenerator()
@app.route('/generate', methods=['POST'])
def generate_card():
data = request.json
if not data or 'url' not in data:
return jsonify({'error': 'Missing required parameter: url'}), 400
title = data.get('title', '')
description = data.get('description', '')
xml = generator.generate_from_url(
url=data['url'],
title=title,
description=description
)
return jsonify({
'code': 0,
'message': 'success',
'data': {
'xml': xml,
'timestamp': datetime.now().isoformat()
}
})
if name == 'main':
app.run(host='0.0.0.0', port=5000)
数据库配置
DATABASE = {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'password',
'db': 'qq_card'
}
应用配置
APP_CONFIG = {
'max_url_length': 1024,
'default_title': 'QQ卡片分享',
'default_description': '点击查看详情',
'rate_limit': '100/hour'
}
CDN配置
CDN_CONFIG = {
'thumb_host': 'https://thumb.example.com',
'cache_time': 3600
}