Vibe Coding之Notion To Blog
Created At: Sep 15, 2025别问我为什么几年都不写一个文章
显然 Notion 是一个很好用的笔记软件,毕竟,在上面写东西的体验还行。但是直接把它用作博客的话,就很难绷了,毕竟作为一个博客怎么能接受他™连个主题和域名都没有呢。同时也不是没调研过现在的 NotionNext 什么的项目,毕竟支持的主题有限,而审美又 match 不到。那么不如为啥不直接用 Hugo 来处理 Notion 的 Markdown 文档,再去生成文本捏?虽然网上有各种 Notion 转 markdown 项目,但是支持的 block 类型不够,而且几年也不更新了,那么不如我们来吧这个屎坑给他占过来。
既然是为了造轮子,那么不妨也来尝试下 Vibe Coding ,让 AI 帮我们把 Notion 变为 Blog。
第一关:折腾 notion-to-markdown
的血泪史
Step 1: MVP
以我期待的 AIGC,它能直接帮我把这个项目实现完,我只需要给他我的需求就好。建立在把 Notion 文章转成 Markdown 内容的这个基础上,它认为任务有这么几个,并且搞了个 TODO list:
- 连上 Notion:用
NOTION_TOKEN
读到我的数据库。 - 转换基本内容:先把段落、标题、列表这些最简单的东西变成 Hugo 能用的文本。
- 搞定 Frontmatter:把文章的
Title
,Date
,Tags
这些属性抓出来,拼成静态博客需要的元数据。
graph TD subgraph "MVP 阶段" A[配置 Notion Token] --> B[查询Database]; B --> C[遍历页面Block]; C --> D[基础Block转Markdown]; B --> E[提取Properties转Frontmatter]; D & E --> F[生成带Frontmatter的.md文件]; end
没花多少人力~~(指直接开启了 Auto-Approval ,让它全自动开转了半个小时)~~,第一个版本就跑通了。不过,在我试着把网上找到的另一个很复杂的 doc 直接丢到我的 db 之后,现实就开始教我做人了。
Step 2: 填坑
第一个坑:图片给你个 404
看Markdown文档的时候发现,Notion 给的图片 URL 是 AWS S3 的临时链接,而且 AI 显然也不知道这个事情。。。。
那么,不能惯着它,告诉他缓存!于是 AI 立马改了逻辑,在转换时,把所有图片都下载到本地,再把链接替换成相对路径。
在这个过程中,AI 能实现很多我想到的,但是在我 MVP 过程中绝对不会写的功能,比如它顺便做了个缓存(代码在 internal/renderer/file_cache.go
)(这也是为啥直接想把它改成通用的 notion-to-markdown 的动力,毕竟 AI 的代码完善度还挺好?)
第二个坑:站内链接当场跑路
Database 中的文章可以互相引用,但在 Blog 中的链接是完全不一样的,总不能看着看着博客直接跳回 Notion 吧,于是准备让 AI 自己去把问题解决掉。
默默看着它开始分析 Notion 的链接格式,在正式处理每篇文章内容前,遍历一遍整个 Database,创一个 Page ID (UUID)
到 Slug
的 map
。
看着挺好对吧?然而这个狗东西(Claude 4)不知道 Notion 链接里面的实际上是个去掉了 -
的 UUID,于是又要教他做人,把这个横杠先处理掉,再放到 Map 里面,才能搞得定。
第三个坑:复杂内容
我在文章里用 KaTeX 写了公式,用 Mermaid 画了流程图。结果发现,不同框架对这些东西的语法要求五花八门:
- Hugo 用的是
{\{< shortcode >}}
- Hexo 用的是
{% tag %}
- 还有些用的是通用的
$$...$$
于是开始让 AI 把里面这堆破烂玩意的渲染流程给改掉,我告诉它我不想每次都改代码,于是它帮我写了一个 config.go
文件。。。
于是我告诉它用 yaml
,结果他这次确实是动态加载了,但是把之前设计的用 Template
渲染的逻辑改成了用 Prefix
, Middle
, Suffix
来特么处理,这我哪忍得了,直接开始在让它改成 Template
。
Step 3: 出成果(大厂黑话) - 把它变成一个谁都能用的 GitHub Action
填了这么多坑,这个 Go 程序已经相当靠谱了???我突然觉得,这东西不应该只躺在我的电脑里(有史大家一起吃)。于是我决定把它打包成一个 GitHub Action。
处理工程化过程的 AI 还是很靠谱的(也有可能是 Github 的文档写的好?)。整个需求其实就是从 main
里面找参数,然后按 Github Action 的格式封装一个 yaml
,(顺便再帮我写个文档),结果不知道是不是知识库不够新,它写完了发现还得自己查文档帮它改版本改参数,难绷。。。
到这里,notion-to-markdown
完成了(暂时)。
第二章:lvm.me
本来想的好好的,AI 写完了 notion-to-markdown
这个苦力(3天啊!那可是3天啊!),我的博客 lvm.me
应该就轻松了吧,于是开始了第二次的 AIGC。
Step 1: 改改主题
感谢 AI 教会了我一点都不会的 css,整个这个流程就是复制 css 官方的 Template(不然 AI 一点审美都没用),把 css 加 context,然后开始让 AI 打黑工写主题。
那么流程就变成了,苦逼的我找 Template,手动把代码切分成若干个块,然后开始逐条 AIGC。。。干了多少呢。。
- Equation
- Mermaid
- TOC
- Friend Links
- Archive
- Nav bar
- Giscuz(本来还想给他写个主题,但是发现 AI 完全没有审美,我也懒得教了。。)
- Single Page
- List Page
这样一点一点把东西让它帮我攒出来,终于能看了。。。
Step 2: 自动发布
最后一步,也是最顺利的一步,毕竟没有“代码”了,都是工程化的 yaml
工程,AIGC 的很开心.
这个 GitHub Action 会定时跑,拉最新的文章,用 Wrangler 构建,然后部署到 Cloudflare Workers。(你能看到这个文章说明构建成功了)
graph TD subgraph "lvm.me 自动化发布流程" A[在Notion写作或修改] --> B{Action 定时触发}; B --> C[Invoke ManassehZhou/notion-to-markdown@main]; C --> D[同步最新内容到 content]; D --> E[Wrangler deploy!]; E --> F[网站更新]; end
总结
从一个想法到最终实现,AI 在这个过程中扮演了一个写代码的黑工,但是这个黑工还需要你来指导,而不是可以默认他能全知全能。
AI 的优势:
- Quick MVP:在 AI 的帮助下,整个工程的效率极高,它能够根据你给的输入(连接 Notion、转换基础内容、生成 Frontmatter)迅速从
go mod init
开始一步一步把能工作的代码弄出来,并且自己去解决里面的bug,消灭了鸽子的理由。 - 工程化能力:在处理工程化任务时,AI 依旧效率极高。比如,接着官方文档把 Golang 程序封装成 GitHub Action、写 Github Action 的 Workflow这些简单任务的时候。
- 出乎意料:感谢大数据喂给 AI 的语料,AI 有时会根据全民创作人的经验,把一些你没提需求,明显是优化性质的功能给加上,比如在下载图片的这个功能里面,它自己加了缓存。
为什么我觉得程序员还有的活:
- 缺乏领域知识:AI 不了解 Notion API 的一些“潜规则”,比如链接的 UUID 需要特殊处理(虽然有可能是我没让它写testcase,或者没真给它
database
让它测试导致的)。这些问题都需要人去debug,再教给 AI 解决。 - 设计能力欠佳:AI 的第一反应往往是“naive”的。让它写一个可配置的公式渲染模板时,它直接给了我这个不想改代码的人一份
config.go
。那么人就需要及时指出它不合理的逻辑,让它去改改改,这样才能完成一个Well Architecture。 - 过时知识库:在生成 GitHub Action 的配置文件时,AI 使用了旧的 action 版本,甚至有些已经deprecated 掉的逻辑(毕竟语料截止到 xxxx 时),这个时候就需要人工查文档 + 更正(毕竟现在在写代码的时候不能开web search)。
- 审美Emm & 网上资料很少的场景:在设计博客主题任务上,虽然给了它整个我要用到的
css
框架的文本,但是 AI 并不能理解这种看不见摸不到的前端(coding 这种任务默认是纯语言模型)。那么就导致最终变成了人去寻找模板、拆分模块,然后让 AI 填充代码的活。
但是嘛,自从OpenAI开始把整个互联网的屎坑都喂给了显卡,概率学的暴力美学开始展示它独到的泛化能力之时开始,AI的能力一直在不断提升。谁知道未来还需不需要我们这群写代码的人?抑或是原来需要一群人写的代码变成了一个人去给AI做Code Review?怎么说呢,骑驴找马,边走边看,希望有一天可解释的LLM出现,希望有一天LLM可以开始解决创造性的问题。