5.0
打个分吧:

Notion到博客的自动化更新

在notion写文章,自动化更新到git 代码仓库,再自动化部署到网站

我在上周的文章程序员一定要有自己的博客中写了我博客工具链的5步:

  1. 在趁手的工具写笔记(Notion PC端、移动端)
  2. 工具将笔记转化为md文档
  3. 自动推送md文档到我的博客git仓库
  4. git仓库更新,触发部署工具(netlify、vercel、jenkins)自动部署
  5. 更新博客

当时只实现了其中1245步,经过两天的探索我完成了第3步,让这个工具链实现了完整的自动化,这篇文章大致介绍一下。

从Notion到Git仓库

我的博客代码仓库使用Github托管,Github提供了一个十分有用的自动化工作流的工具:Github Actions

Github Actions 可以定时执行我提供的脚本,通过脚本,实现了从Notion到代码仓库的更新。大致逻辑是这样的:

  1. Github Actions 负责每天凌晨00:00执行脚本
  2. 在脚本中,使用Notion API接口获取Notion特定数据库的数据,筛选出前一天更新的文章
  3. 为每一篇文章,在代码仓库创建一个md文件
  4. 将文章的attributes,转化为博客md文件的frontmatter
  5. 将文章正文的md字符串,转化为md文件的正文内容
  6. 将所有md文件通过git命令提交到github仓库中
  7. 如果脚本执行失败,github会发邮件通知我

通过以上脚本,实现了 notion文章数据库到git仓库的更新。

脚本执行的频率是可以自由更改的,我偏向于损失一些时效性,保证环境稳定性,所以选择了一天一更新。

以上脚本可以在我的博客开源仓库中看到,链接在这里这里

由于我们的notion数据库字段、md文件的frontmatter配置很可能不同,我的脚本无法直接被你复用,有几个需要考虑变更的点:

  • 在你的git仓库中,需要配置几个脚本中需要使用的secrets。配置的地方在你的github仓库首页 - settings - secrests and variables - actions,参数名是NOTION_DATABASE_IDNOTION_KEY,前者是你在Notion中文章所在数据库的id(可以通过copy link获得),后者是你开通的notion api的key(notion api的开通详见这个文档)。
  • 从notion page attributes到md frontmatter的映射,可以在这个脚本postToMDFile中找到,逻辑比较简单,按照你的需求修改即可。
  • 脚本中的git信息,例如name、email、branch 可以按照你的需求修改。
  • 按照你的需求筛选notion数据,filter写在这个脚本getPosts中。
  • 有一个可能踩坑的点在于,必须要将workflow读写仓库的权限开启,否则脚本会因为缺少git push权限而报错,开启权限的地方在:github仓库首页-settings-actions-general-workflow permission - 开启read and write permissions
  • 脚本的执行周期,可以在上述yml脚本的cron字段中配置,注意脚本中的时间使用的是UTC时间,要考虑当地时区的时间差,例如UTC=北京时间-8,我希望在凌晨0点执行,所以写的小时是16。

从Git仓库到博客网站

这一步我使用的是Vercel工具,监听Git仓库的push事件,自动拉取代码更新,打包部署到网站。

这一步Vercel的配置很简单,推荐查看官方文档,不做赘述。


本篇文章使用Notion创作,由我的自动化工具从Notion同步。

上次更新:

评论区

5 评论
MrakCw Chrome 121.0.0.0 Windows 10/11
2024-02-02回复

I’m glad I found you and your resource) I’ll study it in more detail, I haven’t surfed the site much and I really like it)
Keep it up))

ejsoon Chrome 95.0.0.0 Android 10
2024-01-10回复

博主好像很久沒更新了。如果一直在成長,進步,那應該會有挺多東西可以寫的。

scarsu Chrome 133.0.0.0 Windows 10/11
2025-03-14回复

你说得对

皇家元林 Firefox 117.0 Windows 10/11
2023-09-04回复

能把写博客这么简单的事做的如此好玩~~~~

mantyke Chrome 115.0.0.0 Windows 10/11
2023-08-02回复

请问一下,我使用您的脚本,但是在运行github action时,报错
“notion/notion_news.ts(13,44): error TS5097: An import path can only end with a ‘.ts’ extension when ‘allowImportingTsExtensions’ is enabled.“

我自己实在没看出来,请问您知道问题在哪儿吗?我的博客仓库是:https://github.com/Mantyke/magazine-blog
您可以看到所有报错,非常感谢!

scarsu Chrome 114.0.0.0 Android 10
2023-08-02回复
mantyke Chrome 115.0.0.0 Windows 10/11
2023-08-02回复

谢谢,现在走到构建md阶段了,报错:Could not find database with ID”数据库id(但是比我添加的NOTION_DATABASE_ID增加了连接符)”Make sure the relevant pages and databases are shared with your integration
您知道这可能是什么原因导致的吗?我确定我的数据库ID是对的,毕竟database的url里只有这一串字符……

scarsu Chrome 104.0.0.0 Windows 10/11
2023-08-03回复

在你的notion 数据库页面-右上角…下拉菜单-add integration -添加你的notion api对应的integration

mantyke Safari 16.5 iOS 16.5
2023-08-03回复

十分感谢,印象里notion之前不用专门连接一下api,没想到这里

ejsoon Opera 63.3.3216.58675 Android 5.1.1
2023-07-31回复

感覺這一切都是免費的。同時我的疑問是,直接用notion是否也可以?

scarsu Chrome 114.0.0.0 Android 10
2023-08-01回复

确实都是免费的。我不直接用notion的原因有两个:1是我把notion当我的私人数据库,乱七八糟啥都有,不是所有内容都要分享出来,所以把博客作为目前唯一的输出平台。2是notion不具有rss的功能,也没有自己写代码自由度高

Powered By Valine
v1.5.2