Elog+notion持续集成导出MD文件
目录 ▼
前言
截止到现在,已经持续使用了Notion近两年,也基本上将之前在Typora上写的Markdown文章搬运过来了。但是,有个问题,极端一点思考,如果Notion突然不维护了,那么我的这些数据该怎么办?
尽管,Notion 也提供了导出Markdown格式的功能,但是,只能一个一个导出,后期文档数量上去的话,导出都挺折腾时间的。
于是,寻求一种能够批量、快速、自动化导出Notion文章的方法就成了最近关心的事情。好在,在Matrixcore 的帮助下,发现一件神器 —— Elog。
使用 Notion+Elog+Slack+Pipedream 这一套组合拳就解决了持续集成的方式来自动化更新Notion文档。
本地实践开始
因为我的主要目的是能够使用 Elog 定时备份 NotionNext下的文档,并且定期归档,所以实践这块以完成持续集成部署为结果展开流程。
安装依赖
参考快速开始
前置依赖,需要安装好 node
# 使用 npm 安装 CLI
npm install @elog/cli -g
# 使用 yarn 安装 CLI
yarn global add @elog/cli
# 使用 pnpm 安装 CLI
pnpm install @elog/cli -g
# 安装指定版本
npm install @elog/cli@0.9.0 -g
配置Elog
在本地目录执行初始化,我这边是在云服务器上,地址为: /data/server/Myblog_backup
cd /data/server/Myblog_backup
elog init
根据提示初始化成功后,会在根目录生成一份 elog.config.js 配置文件和本地调试用的.elog.env环境变量配置文件。
其中 elog.config.js 是关键的配置文件,而 .elog.env 是用于保存本地关键配置的文件。
关于具体参考 目录结构 | Elog (1874.cool)
主要关注以下三个字段的内容:
-
write 写作平台详细配置
-
deploy 博客平台详细配置
-
image 图床平台详情配置
我本地的配置是:
module.exports = {
write: {
platform: 'notion',
notion: {
token: process.env.NOTION_TOKEN,
databaseId: process.env.NOTION_DATABASE_ID,
filter: {
property: 'type',
select: {
equals: 'Post'
}
},
sorts: true,
catalog: {
enable: true,
property: "category",
}
},
deploy: {
platform: 'local',
local: {
outputDir: './docs',
filename: 'title',
format: 'matter-markdown',
catalog: true,
formatExt: '',
},
}
image: {
enable: true,
platform: 'local',
local: {
outputDir: './docs/images',
prefixKey: '/docs/images',
pathFollowDoc: true,
imagePathExt: '',
},
}
}
我这边就是需要将 notion 数据库中的 type 字段 为 Post 的文章导出到 ./docs目录下,Markdown名称以 title 字段作为名称,按照 catalog 进行文件夹归类。文章的图片下载到本地 ./docs/images 目录下,并使用相对路径替换掉原始的图片。
同步
elog sync -e .elog.env
本地效果【左边为Notion数据库部分截图,右边为生成的MD文档】:
持续集成部署
🎈 说了这么多,一直都是本地在操作,如何实现自动化持续集成呢?
需要借助Notion+Slack+Pipedream+GitHub了
notion ⇒ slack ⇒ pipedream ⇒ github action
slack 设置
1、注册好之后,创建频道(channel)

2、添加应用 Notion


notion 设置
1、创建 automation
在数据库页面点击闪电按钮,可以创建 automation ,增加触发器以及执行器

触发器设置为 状态变为 Published 触发。因为在slack上设置添加了应用Notion,所以可以在执行器中看到 推送消息至频道,选择好在Slack中创建的频道,这里是 notion

pipedream 设置
1、注册
2、创建 project

3、在 project 下创建 workflow

4、设置 workflow
trigger 触发器选择 Slack

选择 New Message In Channels

按照如下设置

增加一个Step Python

按照如下编写即可:
import os
import requests
import json
def handler(pd: "pidedream"):
try:
token = os.environ['GITHUB_TOKEN']
user = "github_username"
repo = "github_repo"
event_type = "deploy"
headers = {
"User-Agent": "@elog/serverless-api",
"Accept": '*/*',
"Authorization": f"token {token}",
}
response = requests.post(
f"https://api.github.com/repos/{user}/{repo}/dispatches",
headers=headers,
data=json.dumps({"event_type": event_type})
)
# response.raise_for_status()
print(response.text, response.json())
return {"message": response.json() or 'Success!'}
except Exception as e:
print(e)
配置环境变量,用于 code 中使用,在环境中通过 os.environ[‘your_token’]来使用

至此,已完成一半的设置。
注意:
✅ 以下三个变量需要在 GitHub 获取 github_username: 你的github账户名称 github_repo:你需要同步的 github 仓库,后续会将生成的markdown推送到这个仓库 token:github token
github设置
在Github上新建一个仓库,将本地与远程仓库链接上。
在 .github/workflows/main.yaml 添加如下
name: Deplo To Github Pages
on:
# 允许手动push触发
push:
branches:
- master
# 允许外部仓库事件触发
repository_dispatch:
types:
# api中的event_type就是这个
- deploy
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检查分支
uses: actions/checkout@master
- name: 安装node环境
uses: actions/setup-node@master
with:
node-version: "16.x"
- name: 安装依赖
run: |
export TZ='Asia/Shanghai'
npm install --prod
- name: 拉取语雀/Notion的文章
env:
# 语雀相关环境变量
YUQUE_TOKEN: ${{ secrets.YUQUE_TOKEN }}
YUQUE_LOGIN: ${{ secrets.YUQUE_LOGIN }}
YUQUE_REPO: ${{ secrets.YUQUE_REPO }}
# Notion相关环境变量
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
NOTION_DATABASE_ID: ${{ secrets.NOTION_DATABASE_ID }}
# 图床相关环境变量,以腾讯云COS为例
COS_SECRET_ID: ${{ secrets.COS_SECRET_ID }}
COS_SECRET_KEY: ${{ secrets.COS_SECRET_KEY }}
COS_IMAGE_BUCKET: ${{ secrets.COS_IMAGE_BUCKET }}
COS_IMAGE_REGION: ${{ secrets.COS_IMAGE_REGION }}
run: |
# 对应package.json中的script.sync
npm run sync
- name: 配置Git用户名邮箱
run: |
git config --global user.name "Eachen"
git config --global user.email "695089605@qq.com"
- name: 提交yuque拉取的文章到GitHub仓库
run: |
echo `date +"%Y-%m-%d %H:%M:%S"` begin > time.txt
git add .
git commit -m "更新文档" -a
- name: 推送文章到仓库
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: 生成静态文件
run: |
# 对应package.json中的script.build
npm run build
添加环境变量:

增加执行权限:
Setting 下 Actions Tab 的 Workflow permissions 需要选中 Read and write permissions,否则会报错,没有权限更新。

执行效果:
当在Notion数据库中,将文章的状态从 Draft 转为 Published ,随即触发执行
Slack:

Pipedream:

Github:


关于Elog
什么是Elog
Elog名为 Easy Blogging,简单、轻松的书写&部署博客 它是一种开放式跨端博客解决方案,随意组合写作平台(语雀/飞书/Notion/FlowUs)和博客平台(Hexo/Vitepress/Confluence/WordPress)等
用我的话来说,就是Elog支持从多个写作平台中导出Markdown文件格式,然后生成不同博客平台的静态博客文件部署。就是方便不懂技术的小伙伴也能在不同的写作平台以及博客平台自由切换,体验一条龙服务。
💡 Elog支持的写作平台与博客平台
注意事项:
❓ 【github】如何将本地仓库与远程仓库建立连接
-
【空仓库】创建完空仓库就将本地项目关联到远程
-
【非空仓库】创建完非空仓库就将本地项目关联到远程
❓ 【github】如何获取 github token
在页面下设置 Personal Access Tokens (Classic) (github.com)

