用 Python + AI 将 758 篇 WordPress 博客批量迁移到 CSDN:wp_to_md 开源工具

[AI 生成声明] 本文内容全部由 AI(Claude)生成,包括行文措辞、代码说明、流程描述等,作者仅做审阅确认,未作人工改写。


之前的个人博客 cstriker1407.info 用的 WordPress,运营了七八年,写了 758 篇文章,记录了 2013-2020 年的各种折腾过程。域名和服务器懒得续费,就把它关掉了,但内容还想留着,于是决定迁到 CSDN 上。

直接手工搬是不现实的,搬 758 篇要搬到什么时候。于是花了一段时间写了套工具,加上 AI 辅助,把整个流程自动化了。工具已经开源:https://github.com/cstriker1407/wp_to_md

这里把整个思路和用法记录一下。

备份格式:.wpress

WordPress 用 All-in-One WP Migration 插件导出的备份是 .wpress 格式。这个格式其实是个二进制流,结构是这样的:

[4377字节 header][文件数据][4377字节 header][文件数据]...

每个 header 里记录了文件名、路径、大小等信息。里面主要有两类东西是我们需要的:

  • database.sql —— 所有文章的 HTML 内容、标题、标签、分类都在这里
  • uploads/ —— 文章里引用的图片

PHP 文件、主题、插件这些都不需要,跳过就行。

解析 SQL 的时候要注意一点:All-in-One WP Migration 在导出 SQL 时会把表名加上前缀 SERVMASK_PREFIX_,比如正常的 wp_posts 表在 SQL 里叫 SERVMASK_PREFIX_wp_posts,需要替换回来再解析。

流程概览

整个迁移分四个阶段:

.wpress 文件
    │
    ▼  阶段 1+2:wp_to_posts.py
index.md  (HTML 转 Markdown,带 YAML frontmatter)
    │
    ▼  阶段 3:wp_to_posts.py(规则清洗,不需要 AI)
index_optimize.md  (代码块补全标注、列表规范、标题层级修正)
    │
    ▼  阶段 4:AI 逐篇处理
abstract.md / category.md / cover_keywords.md(AI 来填)
    │
    ▼  阶段 5:gen_covers.py
cover.png  (词云风格封面图)

最终每篇文章一个目录:

wp_posts/
  2019/
    07/
      dlopen-dlsym-dlclose/
        index.md              原始 Markdown
        index_optimize.md     清洗后的正文(发布用)
        abstract.md           2-3 句摘要
        category.md           分类
        cover_keywords.md     封面关键词
        cover.png             封面图

wp_to_posts.py 使用

安装依赖:

pip install markdownify Pillow

一键跑完前三个阶段:

python wp_to_posts.py my-site.wpress ./wp_posts --site-name "我的博客"

脚本会自动从 SQL 里读取博客名称,如果自动识别不对可以用 --site-name 手动指定。

几个常用参数:

--skip-extract       已经解压过了,跳过第一阶段
--only-optimize      只重新生成 index_optimize.md,不重新解压和转换
--force-optimize     覆盖已有的 index_optimize.md
-v                   显示 DEBUG 日志

HTML 转 Markdown 用的是 markdownify 库,转出来的格式基本可用,但有些细节需要规则修正,比如:

  • 代码块没有语言标注(自动检测 import#includedef 等关键词来补全)
  • 中文括号编号列表((1)(2))转成标准 1. 格式
  • 标题层级,H1 不应该出现在正文里
  • 注意/警告类段落加 > blockquote

AI 辅助优化

规则能处理的自动处理,处理不了的(摘要、分类、最终校对)交给 AI。

具体来说,AI 需要对每篇文章做:

  1. index.md 的 frontmatter,拿到标题、日期、标签、分类
  2. 编辑 index_optimize.md,主要是修正代码块语言标注和错别字
  3. abstract.md(2-3 句纯文本摘要)
  4. category.md(单一分类名)
  5. cover_keywords.md(5-8 个关键词,每行一个)
  6. 更新进度文件 scripts/ai_progress.json

进度文件格式很简单:

{ "done": ["2019/07/dlopen-dlsym-dlclose", "2019/08/some-other-post"] }

每次启动 AI 前读这个文件,跳过已处理的文章,断点续传。758 篇我分了大概二十几个会话跑完,每次 20-30 篇,避免上下文太长影响质量。

详细的 AI 任务说明在项目的 WORKFLOW.md 里,可以直接复制给 AI 用。

gen_covers.py 生成封面

AI 处理完后,cover_keywords.md 里有关键词了,跑一下封面生成脚本:

python gen_covers.py ./wp_posts --site "我的博客"

封面效果是词云风格,深色背景,关键词散布在图上,颜色用 HSV 生成确保在深色背景上可读。背景色和关键词颜色都用文章内容做种子,所以同一篇文章每次生成结果一样。

默认跳过已有封面,关键词改了之后加 --force 强制重新生成:

python gen_covers.py ./wp_posts --site "我的博客" --force

默认尺寸 1200×628,适合大多数平台的封面比例,可以用 --size 调整。

总结

整套流程下来,758 篇文章的迁移工作量大部分都自动化了。纯机械的解压、转换、规则清洗,脚本跑一遍搞定;需要理解内容才能写的摘要和分类,交给 AI 批量处理;封面图也自动生成,不用一张一张设计。

工具已开源,有类似需求的可以直接拿去用:

https://github.com/cstriker1407/wp_to_md

如果有问题欢迎提 Issue。

更多推荐