Elog+notion持续集成导出MD文件
技术分享

Elog+notion持续集成导出MD文件

· 约 5,769 字 · 阅读约 29 分钟
目录

前言

截止到现在,已经持续使用了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)

image

2、添加应用 Notion

image

image

notion 设置

1、创建 automation

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

image

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

image

pipedream 设置

1、注册

2、创建 project

image

3、在 project 下创建 workflow

image

4、设置 workflow

trigger 触发器选择 Slack

image

选择 New Message In Channels

image

按照如下设置

image

增加一个Step Python

image

按照如下编写即可:

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’]来使用

image

至此,已完成一半的设置。

注意:

✅ 以下三个变量需要在 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

添加环境变量:

image

增加执行权限:

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

image

执行效果:

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

Slack:

image

Pipedream:

image

Github:

image

image

关于Elog

什么是Elog

Elog名为 Easy Blogging,简单、轻松的书写&部署博客 它是一种开放式跨端博客解决方案,随意组合写作平台(语雀/飞书/Notion/FlowUs)和博客平台(Hexo/Vitepress/Confluence/WordPress)等

用我的话来说,就是Elog支持从多个写作平台中导出Markdown文件格式,然后生成不同博客平台的静态博客文件部署。就是方便不懂技术的小伙伴也能在不同的写作平台以及博客平台自由切换,体验一条龙服务。

💡 Elog支持的写作平台与博客平台

注意事项:

❓ 【github】如何将本地仓库与远程仓库建立连接

  • 【空仓库】创建完空仓库就将本地项目关联到远程

  • 【非空仓库】创建完非空仓库就将本地项目关联到远程

❓ 【github】如何获取 github token

在页面下设置 Personal Access Tokens (Classic) (github.com)

image

image

相关文章