1. 项目背景与需求解析
最近在帮某医疗机构的运营团队做内容自动化改造时,遇到一个典型场景:他们每天需要将Excel中的患者随访数据生成符合微信排版规范的MD文档。手工操作不仅效率低下,还经常出现格式错乱的情况。这个Python脚本正是为了解决这个痛点而生。
MDI(Markdown Improved)是我自定义的扩展格式,在标准Markdown基础上增加了对微信特色排版元素的支持:
- 特殊字体颜色标识(如
[red]重要提示[/red]) - 微信独有的卡片式引用样式
- 自动生成带编号的医疗注意事项清单
- 符合微信规范的图片尺寸压缩标记
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案设计
2.1 核心架构设计
采用三层处理架构:
- 数据层:Pandas处理Excel输入数据
- 转换层:自定义MDI模板引擎
- 输出层:微信公众号API对接
python复制class WeChatMDIGenerator:
def __init__(self, template_path):
self.template = jinja2.Template(open(template_path).read())
def render(self, data_df):
# 预处理医疗数据
processed_data = self._preprocess(data_df)
# 生成带样式的MD文本
return self.template.render(processed_data)
2.2 关键技术选型
-
模板引擎:选用Jinja2而非标准string.Template,因为:
- 支持条件判断和循环控制
- 可以扩展自定义过滤器
- 错误提示更友好
-
微信API对接:使用官方素材管理接口
python复制def upload_draft(content):
url = "https://api.weixin.qq.com/cgi-bin/draft/add"
params = {"access_token": get_access_token()}
return requests.post(url, params=params, json={"content": content})
3. 实现细节剖析
3.1 医疗数据特殊处理
针对医疗场景的特殊需求:
python复制def _preprocess(self, df):
# 处理药品名称标注
df['medication'] = df['medication'].apply(
lambda x: f"[warning]{x}[/warning]")
# 生成注意事项清单
df['notes'] = df.apply(lambda row:
f"{row['index']}. {row['content']}", axis=1)
return df
3.2 MDI扩展语法实现
扩展的微信专属标记处理:
python复制def parse_mdi(text):
# 处理颜色标签
text = re.sub(r'\[red\](.*?)\[/red\]',
'<span style="color:#FF0000">\\1</span>', text)
# 转换微信卡片
text = re.sub(r'\[card\](.*?)\[/card\]',
'<div class="weui-card">\\1</div>', text)
return text
4. 完整工作流实现
4.1 从Excel到草稿的全流程
python复制def generate_wechat_draft(excel_path, template_path):
# 读取数据
df = pd.read_excel(excel_path)
# 初始化生成器
generator = WeChatMDIGenerator(template_path)
# 生成MDI内容
mdi_content = generator.render(df)
# 上传到微信
response = upload_draft(mdi_content)
return response.json()
4.2 模板文件示例
template.mdi:
jinja2复制# {{ title }}
{% for note in notes %}
> {{ note }}
{% endfor %}
[card]
**用药提醒**:{{ medication }}
[/card]
5. 实战踩坑记录
5.1 微信API的坑
- access_token缓存:必须实现本地缓存,不能每次调用都获取
python复制def get_access_token():
if cache.exists('wx_token'):
return cache.get('wx_token')
# ...获取逻辑...
cache.set('wx_token', token, timeout=7000) # 微信默认7200秒过期
- 内容长度限制:超过2000字符需要分批次上传
5.2 医疗数据敏感处理
- 患者信息脱敏:必须在内置预处理环节完成
python复制df['patient'] = df['patient'].str.replace(
r'(\d{3})\d{4}(\d{4})', r'\1****\2')
- 药品名称校验:需要对接医疗知识图谱验证
6. 性能优化方案
6.1 批量处理加速
使用Pandas的向量化操作替代循环:
python复制# 劣质写法
for idx, row in df.iterrows():
row['processed'] = process(row['content'])
# 优化写法
df['processed'] = df['content'].map(process)
6.2 内存管理技巧
处理大型Excel文件时:
python复制# 使用chunksize分块读取
reader = pd.read_excel('large.xlsx', chunksize=1000)
for chunk in reader:
process_chunk(chunk)
7. 扩展应用场景
7.1 对接医院HIS系统
通过增加数据中间件,可以直接从医院信息系统拉取数据:
python复制def fetch_his_data(patient_id):
his_api = HISClient(
endpoint='https://his.internal/api',
auth=('user', 'pass'))
return his_api.get_patient_data(patient_id)
7.2 自动排版增强
集成CSS自动优化:
python复制def inject_styles(md_text):
css = """
<style>
.weui-card { border-left: 3px solid #1AAD19; }
</style>
"""
return css + md_text
这个项目在实际医疗场景中已经稳定运行半年,日均处理200+篇患者教育内容。核心价值在于:
- 将内容生产时间从2小时/篇缩短到5分钟
- 统一了全院健康教育内容的输出规范
- 通过自动化校验降低了医疗信息错误率
最近正在扩展对视频号内容脚本的自动生成支持,后续会分享更多跨平台内容自动化实践。
