政务网站的内容编辑,十有八九都有过这种经历:公众号发完一篇工作动态,领导转头就问“网站为什么还没同步?”于是打开CMS后台,新建文章,从手机微信里翻出链接复制正文,再一张张把图片另存下来传上去。字号全乱、图片裂掉、排版崩掉,折腾半个多小时,最后发出来还是丑得没法看。这种“双阵地手工搬运”,就是政务CMS里“微信公众号图文导入”这个功能存在的真实背景。
这篇文章我想完整讲一遍我在政务CMS中设计和实现微信图文导入的思路,包括数据获取的方案取舍、正文清洗的核心逻辑、图片转存与防盗链处理、审核发布闭环,以及上线后踩过的一堆细节坑。内容偏实战,适合正在做政务内容管理、或者企业CMS需要对接微信公众号的开发者参考;如果你是产品经理或运营人员,也能从这里看懂“一键导入”背后到底在做哪些事。
1. 从“手工搬运”到“一键引入”:这个功能到底在解决谁的什么痛点
1.1 政务门户与公众号之间的“信息断桥”
几乎所有政务单位都同时运营两个内容阵地:一个是正式的门户网站,承担信息公开、政策解读、通知公告等法定职能;另一个是微信公众号,承担日常动态发布、便民服务触达。两者的受众、场景、排版要求完全不同,但内容来源往往是同一批稿子,于是问题就来了。
门户网站的内容管理系统(CMS)对格式有严格的规范,比如标题层级、正文字体、附件挂载、密级标识等;公众号编辑器的排版则更偏向移动阅读,字号普遍偏小、行距疏松、大量使用内联样式。同一篇原稿,在两个系统里完全是两种呈现形态,靠人工复制粘贴必然要重新排版。
我接触过不少政务网站的技术运维和内容编辑,他们最常吐槽的并不是“功能不够强”,而是“每天有半小时以上的重复劳动被浪费在搬运上”。这种劳动强度会导致两种后果:要么门户网站更新滞后,要么编辑为了省事直接贴富文本导致页面样式失控。
所以功能上线之前,第一步不是选技术方案,而是算清楚一笔账:一次导入帮编辑省下30分钟,一天全市或全单位有多少篇公众号内容需要同步到网站?一个月能省出多少个工作日?这笔账算清楚,项目立项和资源投入才顺理成章。
1.2 为什么不能指望微信官方给一个“一键同步”
很多非技术背景的同事会问:微信后台不是有API吗?为什么还要单独开发?这里先澄清一个关键事实:微信公众号平台对外开放的接口,主要集中在素材管理、群发消息、用户管理和数据统计这些能力上,但这些接口面向的是“开发者操作公众号本身”,而不是面向“第三方系统拉取公众号已发布内容”的开放生态。
也就是说,你可以通过接口往公众号的素材库里传图文、可以群发、可以拿到群发任务的送达数据,但如果你想让某个外部CMS定时“爬取”这个公众号已经群发出去的图文列表和正文,微信官方并没有提供一个干净、稳定的“导出接口”。素材库接口能拿到有一部分素材,但群发后的文章和素材的对应关系、特殊状态、图片域名的访问限制,都是需要额外处理的。
因此,所有政务CMS的“微信图文导入”,本质都是在微信官方能力边缘做组合:要么走素材接口,要么走链接抓取,要么让运营者从微信编辑器里复制内容再交给后台清洗。理解这个边界,就不会对方案抱有不切实际的期待。
1.3 明确需求边界:是“导入图文”,不是“网站抓取器”
需求刚提出来的时候,最容易失控的是范围蔓延。有人会希望“把公众号历史所有文章自动同步到网站”,有人会希望“以后公众号发文网站自动就能出现”,还有人会希望“顺便把其他单位公众号的内容也采集过来”。
我的看法是,第一版只需要解决一个核心场景:运营人员拿到一篇公众号图文链接或素材ID,把它导入到政务CMS的编辑页面,经过审核后发布到网站。至于自动监测公众号更新、定时批量同步,属于增强功能,可以放到二期。范围一旦收窄,技术方案就立刻清晰了:核心就是“取内容—清洗—转存—入库”四个环节,每个环节都可以独立验证。
2. 三种可行的数据获取方案,以及我最终的选择
先说明一下,微信图文内容进入CMS,实际能走通的路径主要有三条,每条路径的权限要求、数据完整度和维护成本都不一样。
| 方案 | 权限要求 | 数据完整度 | 维护成本 | 适用场景 |
|---|---|---|---|---|
| 素材管理接口 | 公众号开发者权限 | 高,含结构化正文 | 低,但受素材状态限制 | 本单位运营者导入自己的素材 |
| URL链接抓取 | 无接口权限,仅需链接 | 中,依赖页面解析 | 中,需维护抓取适配规则 | 外部单位供稿或历史文章回填 |
| 编辑器全文粘贴 | 无,人工操作 | 高,但样式混乱 | 零开发,但体验不稳定 | 临时应急或低频场景 |
2.1 素材管理接口:最“正规”但也有限制
如果政务CMS运营者本身就是公众号的管理员,并且能拿到开发者凭证,那么通过素材管理接口的方式最干净。公众号的永久图文素材接口能够返回标题、作者、正文HTML、封面缩略图、摘要等结构化字段,直接拿到正文原始HTML之后,清洗工作就变得单纯很多。
需要注意的是,接口拿到的正文HTML,和最终公众号文章页渲染出来的HTML略有不同。素材接口返回的正文里包含的图片链接,通常还是微信图片服务器的地址;而且当年创建素材时的编辑状态,可能与最终发布的版本存在差异。我在实际开发中做过对比,多数情况下素材和已发布正文的差异很小,但碰到运营者在素材中插入过临时活动链接、后来手动修改过已群发文章的场景,素材里的正文可能与线上文章对不上。
所以我的做法是:素材接口作为主要数据来源,但在导入结果页给出提示“本次导入的内容来自素材库,可能与已发布版本存在差异”,同时提供“原文链接查看”按钮,供编辑人工比对。
2.2 URL链接抓取:绕不开的环境识别和登录态问题
第二种方案是让编辑直接粘贴公众号文章链接,后台去抓取链接对应的HTML,解析出正文。这个方案的好处是权限门槛低,政务网站编辑不需要拿到公众号开发者权限,外部单位也可以通过分享链接投稿。
但微信公众号链接的抓取比想象中麻烦。同一个URL,用手机浏览器打开、用PC浏览器打开、用爬虫UA直接请求,返回的HTML结构可能完全不同;部分链接在无登录态的情况下会跳转到环境验证页面,而不是直接返回正文。我排查了很久才定位到,微信的HTML在PC端和移动端存在两套渲染逻辑,抓取端必须模拟移动端浏览器的User-Agent,并且在请求头里携带微信认可的Host和Accept信息,成功率才会明显提升。
抓取到HTML之后,还需要自己定位正文节点。微信文章页的正文通常包裹在ID为js_content的一个div节点下,但这个节点里依然嵌套了大量section、span、img等标签以及各种内联样式,不能直接把整段HTML塞进政务CMS。这个方案适合作为辅助通道,比如处理外部单位供稿、转载文章回填,但不适合作为主数据源。
2.3 从微信编辑器复制全文再粘贴:最容易被低估的过渡方案
还有一条看起来很“土”的路:让运营者在微信编辑器里全选复制正文,然后粘贴到政务CMS的富文本编辑器里,由编辑器内的粘贴清洗插件把微信样式过滤掉。这条路不需要任何接口权限,也不需要解析URL,上线速度最快。
微信复制的内容粘贴到富文本编辑器后,通常会带着大量内联样式、空span、嵌套的div,普通富文本编辑器(比如老旧的UEditor、或基于ckeditor的定制版)默认是不清理这些的,需要额外写粘贴处理逻辑。不过如果CMS侧能把这块做好,这个方案的接受度其实并不低,因为运营者打开微信后台和打开CMS后台的动作并不冲突,复制粘贴的肌肉记忆已经形成了。
我在这套方案里补了两个细节:一是从复制内容里自动提取标题(通常微信复制内容的第一段是标题,正文中会有大量空行),二是粘贴后自动弹窗询问“是否已包含封面图片或视频卡片”,引导运营者补充素材。这个小改动显著降低了编辑的后续手动步骤。
2.4 方案对比与选型逻辑:主用素材接口,链接抓取做兜底
综合评估下来,我最终在政务CMS里同时实现了素材接口导入和链接抓取导入两个入口。菜单设计成“从公众号导入”和“从链接导入”,前者面向本单位运营者,要求配置公众号参数;后者面向所有编辑,粘贴链接即可。这两种方式共用同一套正文清洗、图片转存和审核发布流程,因此开发工作量并没有翻倍。
选型的底层逻辑是权限最小化。政务系统对账号权限管理非常严格,不能要求每个编辑都有公众号后台权限,但也不能因为权限问题就放弃功能。所以把“需要高权限”的素材接口和“无需权限”的链接抓取都做出来,让不同角色按需选择,既满足使用场景,又不违背账号权限管理的要求。
3. 正文解析与样式清洗:把“微信排版”翻译成“门户排版”
3.1 微信图文HTML到底长什么样
拿到素材接口返回的正文HTML之后,如果直接塞到政务CMS的编辑器里预览,大概率是灾难现场。群发级别的一篇图文,正文里可能充斥着几十个class名、上百个内联style,常见的结构是:
<div class="rich_media_content" id="js_content"> <section style="margin: 0px; padding: 0px; color: rgb(34, 34, 34); font-size: 16px;"> <section style="padding: 10px;"> <p style="text-align: justify; letter-spacing: 1px;"> <span style="font-size: 15px; font-family: -apple-system, BlinkMacSystemFont, ...;">正文内容</span> </p> </section> </section> </div>这些HTML的共性非常明显:标签嵌套深、语义标签使用率低(大量用section代替p)、样式全部写死在内联style里、class名对业务无意义。而且不同编辑器模板生成的HTML结构差异很大,使用135编辑器、秀米、或微信自带编辑器的文章,其HTML结构都有自己的“脾气”。
因此我把清洗逻辑设计成可配置的规则链,而不是写死在代码里。遇到一种新的编辑模板,管理员可以通过配置规则适配,不需要改代码重新发版。
3.2 清洗规则的五个层次:从挖正文到裁样式再到映射
清洗处理我拆成五步,每一步都有独立的验证节点:
第一步是正文节点定位。素材接口返回的HTML是完整页面结构,不能全量入库,只需要提取正文片段。我一般同时适配两种特征:优先匹配id为js_content的节点,取不到再回退到class包含rich_media_content的节点。
第二步是标签白名单过滤。微信图文里面的script标签、iframe标签、style标签、带data-属性的卡片节点,按环境逐一处理:script直接删除,iframe保留src并转为CMS的嵌入视频标签,小程序卡片信息提取出标题和链接后用CMS的自定义链接块替换。
第三步是属性裁剪。正文节点内所有元素的class、id、data-*属性、aria-*属性一律移除,但href、src、alt、title这些业务属性必须保留。这里有个坑:如果使用通用的HTML解析器(比如Java的jsoup或Python的BeautifulSoup)做属性清理,一不小心会把a标签的href里的tracking参数一起清掉,所以我单独保留了URL清洗逻辑,把微信链接里附带的from、isappinstalled、wx_header等参数去掉,防止后续点击统计失效。
第四步是样式映射。微信正文内联样式里最常见的几个属性是font-size、font-family、color、text-align、letter-spacing、text-indent、line-height。政务网站一般有自己的排版规范,比如正文统一用仿宋或宋体、字号14px或16px、行高1.6到2.0。所以我把样式映射做成两种模板:默认清洗模板尽量保留微信原有的排版观感,政务规范模板则强制覆盖字体、字号、行高,让内容符合网站发布规范。
第五步是空节点回收。经过上面几步之后,页面里会出现大量空的span、空的section、带多余margin的空div,这些空节点如果不回收,发布后会出现大段空白。我写了一个递归清收算法:如果一个节点的子节点全部为空或该节点自身无有效文本、无图片、无链接,则整个节点删除。实测下来,一篇正常的微信公众号文章经过清洗后,HTML体积通常能下降40%左右。
3.3 政务公文格式的特殊适配:字体映射和段落间距
政务内容和普通企业公众号文章有一个明显区别:很多稿件本身是公文格式,比如大标题用方正小标宋、正文用仿宋GB2312、首行缩进两个字符、行间距固定值。但在微信公众号编辑过程中,这些字体样式绝大部分不会保留,编辑器默认的字体是系统字体。
我做政务规范模板的时候,专门处理了字体和缩进:如果清洗后的文本检测到有“各段首行无缩进但段落结构明显”的情况,则自动给正文段落添加首行缩进样式;字体的映射不是简单地把所有内容设为同一种字体,而是保留小标题和正文字体的区分,一级小标题用黑体,正文用仿宋,这个映射规则是请教了单位的排版老师傅之后定下来的,上线后反馈很好。
此外,政务网站对“来源”“作者”“发布时间”这些元信息要求很严格,公众号文章本身可能没有这些字段,我在导入界面单独做了“补充来源”的必填项,让编辑在导入时选择“本单位原创”“转载自某媒体”“合作供稿”等来源类型。
3.4 规则迭代的笨办法:手工标注20篇测试文章
清洗规则最大的挑战不是“写出来”,而是“改到对”。我建议接手这种需求的同学,第一件事不是写代码,而是找运营收集20篇风格有代表性的公众号图文,覆盖不同编辑器模板、不同内容形态(纯文字、图文混排、表格、视频、投票),人工标注出每一篇的“正文起始位置”“不需要的冗余块”“图片位置”。然后用标注结果反推清洗规则。
那20篇测试文章我在迭代过程中用了一周多的时间来回调整,每次调整规则之后重新跑一遍,逐项对比清洗结果。这个过程枯燥但非常必要,微信编辑器模板日新月异,没有一套规则能一劳永逸,自己维护的测试集越接近真实数据,规则改起来就越有信心。
4. 图片转存与防盗链处理:不解决这个,导入全是裂图
4.1 为什么微信图片不能直接拿来用
公众号正文里的图片,几乎都托管在微信的图片服务域名下,典型地址长这样:
https://mmbiz.qpic.cn/mmbiz_jpg/XXXXXX/0?wx_fmt=jpeg这背后有两层问题。第一层是防盗链:微信图片服务器会校验请求来源的HTTP Referer信息,如果图片被嵌入了外部网站,页面访问者在加载图片时,请求的Referer是外部网站的域名,微信服务器大概率返回403,最终表现就是图片裂掉。第二层是长期可用性:虽然微信图片地址一般很稳定,但外链依赖第三方服务,一旦微信调整策略或图片被清理,历史页面就会立刻裂图。政务网站的内容有存档和审计要求,任何外部依赖都不可接受。
所以政务CMS做图片转存是刚需,不能省。导入过程中必须把微信图片下载到政务CMS自己的存储资源中,再把正文里的图片链接替换为本地地址。
4.2 转存流程:解析、下载、重传、替换四步走
图片转存的流程,写出来很简单,核心就四步:
获取正文中所有img节点的src列表,同时采集alt文本和排序信息;后端根据src逐个下载图片字节流;将字节流上传到政务CMS的存储服务(无论是本地磁盘还是对象存储),生成新的图片URL;把正文HTML中对应的img节点的src替换为新URL,并保持alt文本不变。
真正要留心的是几个细节。下载时需要用合适的请求头,直接裸请求微信图片地址成功率偏低,我的做法是下载请求不设置Referer或设置为空,并携带移动端User-Agent,这样能显著提高抓取成功率。上传之前要通过Content-Type识别真实图片格式,不能直接看URL后缀,微信图片地址的wx_fmt=jpeg参数和实际编码未必完全一致。
4.3 下载稳定性:并发、超时与重试的工程细节
微信图片服务器对单IP的请求频率有一定限制,政务CMS导入一篇文章少则三五张图、多则二三十张图,如果不控制并发,很容易出现大面积下载失败。
我设定的参数是:并发数控制在3到5,单张图片超时时间12秒,失败自动重试2次,重试间隔2秒、4秒。超过重试次数后不中断整个导入流程,而是把失败的图片记录在导入日志里,正文中对应位置保留原始微信图片链接并添加一个醒目的角标标记,告知编辑“该图片转存失败,请手动处理”。这个设计避免了一篇文章因为一张图失败导致整个流程卡死。
转存完成后,不要急着告诉编辑“导入成功”,先在后台跑一次完整性检查:统计原图数量、成功转存数量、失败数量、平均耗时,给编辑一个明确的预览反馈。如果失败率过高,则提示编辑检查网络策略或稍后重试。
4.4 政务场景的图片合规:存储位置和审计记录
图片转存除了技术问题,还有一个政务特有的话题:内容安全。公众号原文里的图片,导入到政务CMS之后,就属于网站发布内容的一部分,必须纳入网站的内容安全审查范围。
在实现上,我在转存功能里增加了“敏感图片识别校验”的开关。开启后,下载得到的图片会先经过一次内容识别引擎(包括二维码检测、敏感标识检测、涉敏人物检测等)打分,分数超过阈值则在导入结果里标记“需人工复核”。同时,每一次转存操作都会生成审计记录,包含原图地址、转存后的地址、操作人、操作时间、对应文章标题,以便后续追溯。
这个环节在前期设计时很容易被忽略,等到文章发布后因为图片问题被上级检查出来再补救,代价就大了。宁可技术上多一道校验,也别给内容安全留死角。
5. 政务内容审核与发布闭环:导入只是上半场
5.1 必须强制“审核后发布”,不能自动直接出稿
一部分开发背景的同学做这个功能时,天然会觉得“公众号已经发过了,导入网站就是搬运,直接发布就行”。这个想法在政务场景非常危险。
严格来说,公众号平台的发布流程和门户网站的发布流程是两个独立的审批链条。公众号已经经过一轮审核,但网站有自己独立的审核义务,尤其是涉及领导职务表述、政策表述、统计数据等内容,必须经过网站这边的编辑审核和分管负责人审核后再发布。CMS里的“导入”动作只是把草稿准备好了,绝不能取代审核环节。
所以我做的第一件事,是把导入的文章默认放进一个“待审核箱”,状态是“草稿”,不是“已发布”。编辑打开待审核箱,可以查看清洗后的正文、来源链接、导入时间和操作人,再走一遍常规的“编辑—审核—发布”流转。
5.2 审核环节的技术设计:内容快照与差异比对
政务CMS的审核过程通常涉及多人协作:编辑改稿、审核人看稿、发布人终审。为了让审核人更高效,我在审核页面里增加了“与原文差异比对”的功能:左侧展示微信原文链接的页面快照,右侧展示清洗后的CMS内容,两者不同之处高亮显示。
这个功能实现起来不难:清洗后的内容在导入时保存一份HTML快照,审核页面用并排iframe展示原文和草稿;差异比对则基于正文文本内容做逐段匹配计算。审核人可以快速发现“图片是否缺失”“段落是否错位”“链接是否被误删”,不用完全依赖肉眼通读。
同时,我把“来源链接”“原文标题”“导入人”“导入时间”这些元信息做成只读字段,放在审核页面顶部。政务内容审计时经常要回答“这篇内容来自哪里”,这些字段保留得越完整,事后追溯就越轻松。
5.3 与政务网站原有CMS的对接方式
如果你要做的不是自研CMS,而是给一个已经运行多年的政务网站增加“微信导入”能力,就绕不开和旧系统的对接问题。不同政务CMS的架构差异很大,但对接方式大致分两类。
第一类是标准API推送:目标CMS提供内容创建接口,导入模块把清洗后的HTML通过API提交,创建一篇文章草稿。这种方式耦合度低、兼容性好,但要求旧CMS的接口权限、字段映射、附件处理都梳理清楚。例如旧CMS里文章的“正文”字段如果是纯文本存储,而微信图文导入的是带格式HTML,那就需要额外处理格式剥离。
第二类是数据库直写:直接向CMS的内容表插入记录。这种方式看似直接,但风险很高。老政务CMS的表结构往往缺少扩展字段,来源链接没地方存;而且绕过系统的表单验证和状态机,容易造成脏数据。除非对目标系统表结构非常熟悉,否则不建议用这种方式。
我参与过的某政务门户系统改造,就是走API推送的方式。由于旧CMS内容表里没有“来源URL”字段,我把来源信息序列化存入摘要字段,并额外维护了一张关联表,保存“CMS内容ID—微信原文ID—导入人—导入时间”的映射关系,保证追溯链路完整。这里提示一点:与旧系统对接前,一定先让现有编辑跑一遍从导入到发布的完整流程,确认哪些字段会丢失、哪些样式会变形,再决定如何适配。
6. 实测中容易翻车的几个细节,以及处理方式
6.1 样式串扰和全局重置
政务CMS站点一般都有固定的页面样式,正文里的标题、引用、代码块都有统一视觉规范。微信图文带进来的内联样式,如果不彻底清理,会出现正文里某个标题字体过大或颜色异常的情况。
我的处理方案是在清洗后的HTML根节点上强制加一个“内容容器”class,并利用该容器的作用域重置字体、字号、行高等关键CSS属性。这种方式相当于给导入内容画了一个“隔离带”,让微信遗留样式无法影响页面其他区域。当然,这个方案的前提是CMS前台模板支持内容容器class,模板不支持的站点需要额外改前台样式文件。
6.2 小程序卡片和视频卡片变成乱码
公众号正文里插入的小程序卡片、视频号卡片,在素材接口返回的HTML里是一大段包含data-cardshowid等属性的复杂结构。如果清洗规则没有覆盖,这段内容会被当作普通HTML原样保存,导致网站前台显示出一串无样式的文本,非常难看。
我的清洗规则里对这类卡片做了单独解析:提取卡片中的标题、封面图、跳转链接,转存封面图后,统一渲染成CMS侧自己定义的“链接卡片”模块。公众号文章里插入的视频,则解析出视频源地址,替换为视频播放器标签。这一步需要针对卡片类型逐一适配,早期版本可以只支持最常见的小程序卡片和视频卡片,其他非常见卡片先做“降级处理”——保留文字描述和原始链接。
6.3 特殊字符和数据库字符集问题
公众号正文里经常出现全角空格、零宽字符、emoji符号。政务CMS的数据库如果还停留在utf8字符集,emoji直接入库会报错或变成乱码。
我排查过的问题中,有一个很隐蔽:文章正文里包含一个看起来正常的空格,但实际上是零宽连字符,导致前台换行出现异常。清洗规则里需要把不可见字符统一替换为空白或删除。如果数据库字符集支持utf8mb4,可以直接保留emoji;如果旧表不支持,则需要配置字符集转换或在清洗时移除emoji。更稳妥的做法是在导入入口统一做一次字符规范化处理,避免内容入库后出现各种奇奇怪怪的显示问题。
6.4 栏目归属与分类映射
公众号文章没有“栏目”概念,但政务网站有严格的栏目结构,比如“通知公告”“政策文件”“工作动态”“媒体报道”。导入时如果不指定栏目,文章就只能停留在站点的“未归档”区域,编辑还得手动分类。
我在导入界面里做了一套“来源公众号—默认栏目”的映射配置:每个公众号可以预设一个默认栏目,同一公众号导入的文章自动归属到该栏目。同时支持编辑在导入时临时修改栏目。这个映射还可以进一步细化:根据文章标题里的关键词(如“通知”“公示”“招标”)自动推荐栏目,命中规则时高亮提示,让编辑确认。上线后,大部分文章的栏目选择都从手动操作变成了看提示点确认,效率提升很明显。
6.5 重复导入和幂等性:防止内容库出现两个副本
同一个编辑或者两个不同编辑,可能把同一篇公众号文章导入两次,导致网站出现两个近乎相同的内容页,影响检索和档案管理。
我在导入模块里增加了一个内容指纹计算:根据“原文链接(或素材ID)+标题标准化文本+正文前200字的哈希值”生成一个指纹,每次导入前先查询指纹表,如果已存在相同指纹且原文链接相同,则直接提示“该文章已存在草稿,草稿箱里已有一条记录”,避免重复创建。
这里还要注意“幂等性”的另一个角度:导入流程的接口设计要支持重复提交不产生副作用。前端提交失败后自动重试,如果后端每次都重新创建一条草稿,就会积累一堆重复内容。我的做法是每次导入请求都生成一个请求ID,后端的导入任务以请求ID作为幂等键,同一个请求ID只会创建一条草稿记录。
6.6 政务CMS的临时域名和HTTPS限制
最后补充一个容易被忽略的问题:很多政务网站部署在专网或受控网络中,外网公众号的内容抓取、图片下载需要经过代理服务器。如果CMS服务器本身没有外网访问权限,那么素材接口调用、链接抓取、图片下载全部都会失败。
我遇到过一个环境,CMS服务器只能通过一个白名单代理访问外网,代理还会在响应内容里插入警示页。处理方式是把“外网内容抓取”从CMS主服务中独立出来,部署在一台有外网权限的采集服务器上,采集完成后将清洗好的内容通过内网API推送到CMS。这个架构也顺带解决了安全隔离问题,采集服务器的访问行为可以单独审计,不会把外网请求暴露在主业务链路上。
最后再说点实在的
整套功能做下来,我最深的感受是:微信图文导入真正难的不是技术本身,而是理清“谁在什么权限下、通过什么入口、把什么内容、贡献到什么栏目、经过什么审核、最终发布成什么样”这一整条链路。清洗规则可以迭代,图片转存也有现成方案,但要让这条链路在真实的政务办公环境里跑顺,需要和运营、审核、技术三方不断磨合。
如果让我给刚接手类似需求的人一个建议,我会说:先做最小可用版本,只支持素材接口导入加一套基础清洗规则,让编辑团队跑一周,把特殊案例记录下来,再逐步增加链接抓取、样式模板和栏目映射。功能不在多,在于每一步都稳定,编辑才会真的愿意用。一个能帮每位编辑每天省下半小时重复劳动的模块,投入一个月的开发时间,是绝对划算的。