使用 Notion 随时随地写博客

· Tech

IMAGE

Notion 简介

Notion 是一个跨平台笔记工具,类似印象笔记。它支持在笔记中使用 Markdown 语法,并且可以通过非官方的 API 将笔记批量导出。这篇文章将介绍如何通过脚本将 Notion 中的文章导出成 Markdown,并部署到自己已有的静态博客上。

这篇文章就是通过这个方法完成并发布的。

自建博客的痛点

自己搭建博客的好处无须赘述。我从 2015 年开始用 Hugo 搭建自己的博客,也写了不少文章。但是近两年来发文显著减少,究其原因,是工作以后主要使用工作电脑,不常用个人电脑,而后者是我在 Hugo 上发表文章的唯一途径。每次想写点什么,只能记在手机或者工作电脑上。就算写完了一篇文章,还需要在个人电脑上手动格式化成 Markdown,再部署到 Hugo 上,很是繁琐。如果能有一个 Markdown 编辑器可以跨平台同步,写完后还无需额外操作就能发布到博客上,无疑会大大降低写作的门槛。接触到 Notion 以后,我发现这是可行的。

在写这篇文章之前,我搜索了其他使用 Notion 驱动博客的文章。大部分文章是直接把 Notion 笔记分享出去,小部分是用 Netlify 和 Gatsby来解决。似乎没有文章提到如果把 Notion 整合到自己已有的博客中,所以希望这篇文章能弥补这一块的空白。

需要用到的东西

  • 一个 Notion 账户(免费账户即可)
  • 一个使用 Markdown 的静态博客(如 Hugo,Hexo,Jekyll)
  • 一个能运行 Python 脚本,并且能访问 Notion 的服务器。

在 Notion 中写作

首先,需要在 Notion 中新建一个数据库形式的页面(笔记本),用于放置所有要发表文章。给此数据库中的文章添加属性,比如发布日期、类别、标签、摘要等。凡是你在博客中使用到的属性都可以添加进来。另外,添加一个叫作「已发表」的 checkbox 用于区分草稿和已发表的文章。这样,当一篇文章可以发表时,只需要勾选 checkbox 即可,其余工作全部交给脚本自动化完成。

关于撰写文章,Notion 支持 Markdown 语法,并且所见即所得。比如在新一行中输入 # H1,会自动转换成大号加粗的 H1。副标题、列表、粗体、斜体、代码块也是同理。如果在手机端不方便输入 Markdown 中的各种符号,也可以用 Notion 自己的 UI 来进行设置标题、加粗等操作,效果是一样的。

文章提取及转化

这一段介绍如何通过代码,把写好的文章变成博客需要的 Markdown 文件。这里用到了 notion-py 这个非官方的 Python API,它支持对一个用户的 Notion 笔记进行增删查改,但我们只需要其中的「查」,所以步骤相对简单。具体的使用教程请各位参考 API 官方文档,不赘述了。

文章存储在 Notion 自定义的类型中,由一个个 block 组成。通过一些简单的遍历和分支语句,就能够将大部分的 block 转换成 markdown 文本。博客的元数据保存在文章属性中,可以提取出来,用于生成 markdown 的 header。

输出和部署

将每篇文章的 markdown 文本输出到静态博客生成器的文章目录下。通过 diff 命令比较生成的文章,可以避免重复部署。如果博客在 Git 仓库中,也可以用 Git 比较文章的前后差异。有差异的话,运行相应的部署命令即可。

我将我的脚本设置成一个 Linux 服务,每小时运行一次,这样就能够自动将 Notion 里的新文章部署到博客上了,还可以使用 Linux 的 journalctl 命令可以查看服务日志。

缺点和风险

  • 据说 Notion 无法从中国大陆访问,所以对脚本所在服务器有要求。
  • 无法预览文章在博客上的显示效果。
  • 脚本需要主动查询文章改动,所以时效性和节省带宽只能二者择一。目前还没有研究 API 如何监听 Notion 改动。
  • 在 Notion 中直接插入的图片可以在博客显示,但会压缩,并且 URL 只有一天内有效。每次生成 markdown 都会更新图片的 URL,导致 diff 命令失去意义。
  • API 不受官方支持,况且不知道 Notion 自己能存活多久。
  • 不支持 Vim 模式。