先给结论:不存在「一次写好,到处能发」。同一份 Markdown 源码,八个平台会用八种不同的方式接收它,其中至少三种会静默损坏内容——不报错、不提示,发出去之后你自己看才发现表格没了。
这篇把八个平台的实际行为列出来,包括每一种的判别方法。写给需要一稿多投的人。
「静默」是关键词。报错的问题不可怕,可怕的是提交成功、页面正常、内容坏了。
某平台的写草稿接口会把 <table> 整个剥离,连单元格里的文字都不保留,接口返回 200,一切看起来正常。
隔离实验最能说明问题——写入这段:
<p>前</p><table><thead><tr><th>列A</th></tr></thead>
<tbody><tr><td>甲</td></tr></tbody></table><p>后</p>读回来是:
<p>前</p><p>后</p>表格连同「列A」「甲」这两个词一起消失了。 如果你的文章靠表格承载对比信息,等于内容被删了一块,而你完全不会收到通知。
同一个平台的浏览器路径(走富文本编辑器粘贴)却能完整保留表格。所以这不是平台不支持表格,是那条接口的行为。
→ 判别方法:发完之后把正文读回来,数 <table> 的个数,和原文对比。别只看「提交成功」。
另一个平台的编辑器基于 Tiptap,没开表格扩展。粘进去的表格不会消失,但会变成这样:
现象 先查什么 而不是 脚本403、curl200 客户端User-Agent 换key 403body是纯文本 CDN/WAF 鉴权配置所有单元格首尾相接挤成一行,完全不可读。比直接删掉更糟——内容还在,但传达不了任何信息,而且你从字数统计上看不出异常。
→ 这个平台只能发本来就没有表格的短文,不能复用技术长文。
某平台在提交时会检查所有代码块是否标注了语言,没标就拒绝,提示写着:
文中第12处代码块未设置语言,请补全后再操作两个坑叠在这里:
第一,它把闭合标记也算作「一处」。 我的文章里第 12 个 ``` 标记是第 6 个代码块的闭合行,按它的编号根本找不到问题在哪。实际出问题的是第 12 个开始标记。
第二,它的提示自己写着支持 ```text,但实测不认。 提示原文是「补法:bash /json / http /text」,而我用 ```text 标注的那块正是它报错的那块。换成 ```bash 就过了。
→ 提示信息本身也可能是错的,别把它当规格文档。
平台之间最根本的差异在这里——同样是「把文章内容放进去」,五个内核要求的输入格式互不兼容。
内核 | 典型平台 | 要喂什么 | 喂错了会怎样 |
|---|---|---|---|
Draft.js | 富文本编辑器 | 剪贴板 | 只给 |
ProseMirror / Tiptap | 富文本编辑器 | 剪贴板 | 同上 |
CodeMirror 5 | Markdown 源码编辑器 | md 源码(纯文本) | 喂 HTML 会原样显示标签 |
纯 | Markdown 源码编辑器 | md 源码,可直接 | —— |
自研 md 编辑器 | Markdown 源码编辑器 | md 源码 | —— |
方向是相反的:富文本编辑器要 HTML,Markdown 编辑器要 md 源码。把前者的策略搬到后者上,你会看到满屏 <p> 标签。
CodeMirror 5 有视口虚拟化——它只渲染可见的那几十行。所以:
document.querySelector('.CodeMirror-code').innerText // ❌ 长文会少一大半
document.querySelector('.CodeMirror').CodeMirror.getValue() // ✅ 完整内容如果你用前者做「内容完整性校验」,长文会假报失败,而你会以为是粘贴出了问题。
这一项最容易在最后一步卡住。
平台类型 | 标题上限 | 备注 |
|---|---|---|
内容推荐类 | 2~30 字 | 全表最严 |
技术社区 A | 80 字 | |
技术社区 B | 5~100 字 | 有下限,太短也不让发 |
长文平台 | 64 字 | |
图文笔记 | 长文标题 64 字,笔记标题另算 | 见下 |
一篇 40 字的标题,在多数平台没问题,到 30 字上限那个平台直接卡住。所以一稿多投时,标题需要单独准备一个短版。
有个平台的长文标题限 64 字,但发布时还有一个笔记标题字段,上限严得多。
我原本按流传的说法当它是 20 字,结果实测 23 字完整保留了。
→ 所以我改成了不在本地猜上限,填进去再回读比对:
page.locator(TITLE_SEL).fill(title)
got = page.input_value(TITLE_SEL)
if got.strip() != title.strip():
print(f"🔴 被截断:给了 {len(title)} 字,只留下 {len(got)} 字 → {got!r}")让平台自己告诉你截到哪,比查文档可靠——文档和实现经常对不上(见前面那个 ```text 的例子)。
摘要取自哪里。 有的平台发布面板里没有摘要栏,meta description 直接取正文第一段。所以第一段不能浪费在「本文所有数据均为实测」这类免责声明上——第一段就要给结论。
正文要不要留 H1。 标题栏已经有标题了,正文再来一个 # 标题 是格式冲突,有平台会因此驳回。发之前 tail -n +2 去掉第一行。
必填项各不相同。 有的必填标签、有的必填分类、有的必填封面(可以选「无封面」但必须显式选),还有的三者都要。
标签是不是受控词表。 有的平台只能从下拉选已有的,不能自创;有的低等级账号不允许创建自定义标签,只能点选平台推荐的。
结论是放弃「一份稿子通吃」,改成一份主稿 + 几个按平台特性生成的变体:
主稿(内容最完整)
├── 去表格版 → 表格会被压成纯文本的平台
├── 短标题版 → 标题限 30 字的平台
└── 去外链版 → 对推广元素敏感的平台变体不是手工改,是脚本从主稿生成的——这样主稿改了,变体跟着一致。
然后每个平台发布前跑一遍针对性的机械校验:
# 代码块语言标注(有的平台强制)
marks = re.findall(r'^```(\w*)', text, re.M)
bad = [b for b in marks[0::2] if not b] # 只看开始标记,别数闭合标记
# 标题长度
if not 2 <= len(title) <= LIMIT: ...
# 表格数量(发完回读时对比)
n_tables = html.count('<table')这些检查不到十行,但每一条都对应一次实际踩过的坑。
症状 | 原因 | 判别方法 |
|---|---|---|
表格整个不见了 | 接口剥离了 | 发后回读,数 |
表格变成一长串文字 | 编辑器没开表格扩展 | 看渲染效果,不能只看字数 |
提示「第 N 处代码块未设置语言」 | 它把闭合标记也算一处 | 数开始标记,别数总数 |
标注了语言还是被拒 | 平台不认某些语言标识 | 换成 |
长文校验说内容不完整 | CodeMirror 视口虚拟化 | 用实例 API 读,别读 DOM 文本 |
标题填进去少了一截 | 各平台上限差三倍 | 填完回读比对,别猜上限 |
一句话:「提交成功」和「内容正确」是两件事,中间隔着一次回读。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。