用 Python + AI 将 758 篇 WordPress 博客批量迁移到 CSDN:wp_to_md 开源工具
用 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、#include、def等关键词来补全) - 中文括号编号列表(
(1)、(2))转成标准1.格式 - 标题层级,H1 不应该出现在正文里
- 注意/警告类段落加
>blockquote
AI 辅助优化
规则能处理的自动处理,处理不了的(摘要、分类、最终校对)交给 AI。
具体来说,AI 需要对每篇文章做:
- 读
index.md的 frontmatter,拿到标题、日期、标签、分类 - 编辑
index_optimize.md,主要是修正代码块语言标注和错别字 - 写
abstract.md(2-3 句纯文本摘要) - 写
category.md(单一分类名) - 写
cover_keywords.md(5-8 个关键词,每行一个) - 更新进度文件
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。
更多推荐

所有评论(0)