Notion 同步到 Jekyll 博客的实现方式

简要步骤

1. 获取 Notion API Token 和页面 ID

  1. 登录 Notion,访问 Notion Developers。

image

  1. 创建一个新的 Integration,获取 API Token。

  2. 在 Notion 页面中,点击右上角的「Share」按钮,将 Integration 添加到页面。

  3. 获取 Notion 页面 ID:

2. 配置环境变量

  1. 在项目根目录创建 .env 文件。

  2. 添加以下内容:

NOTION_API_TOKEN=your_notion_integration_token

3. 配置 GitHub Actions 自动化工作流

  1. 在 .github/workflows/ 目录下创建 sync_notion.yml 文件。

  2. 添加以下内容:

name: Sync Notion to Jekyll
on:
  schedule:
    - cron: '0 0 * * *' # 每天 UTC 时间 00:00(北京时间 08:00)运行
  workflow_dispatch: # 支持手动触发
jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
      - name: Run sync script
        env:
          NOTION_API_TOKEN: $
        run: python scripts/sync_notion_to_jekyll.py
      - name: Commit and push changes
        run: |
          git config --global user.name "GitHub Actions"
          git config --global user.email "actions@github.com"
          git add .
          git commit -m "Sync Notion content"
          git push

4. 实现同步

  1. 运行脚本:python3 scripts/sync_notion_to_jekyll.py。

  2. 脚本会自动将 Notion 内容同步到 Jekyll 博客的 _posts 目录。

  3. GitHub Actions 会按照设定的时间自动运行同步任务。

功能概述

本脚本用于将 Notion 中的内容同步到 Jekyll 博客。它通过 Notion API 获取页面内容,将其转换为 Markdown 格式,并保存到 Jekyll 的 _posts 目录中。支持处理多种 Notion 块类型,如段落、标题、列表、代码块、图片等。

详细实现过程

1. 环境配置

  • 使用 dotenv 加载环境变量,包括 Notion API Token。

  • 初始化 Notion 客户端。

2. 获取 Notion 页面内容

  • 通过 get_page_content 函数获取指定页面的内容。

  • 递归处理子页面。

  • 使用 process_block_content 函数处理不同类型的 Notion 块。

3. 内容处理

  • 将 Notion 块转换为 Markdown 格式。

  • 支持处理以下块类型:

4. 保存为 Markdown 文件

  • 使用 save_to_markdown 函数将处理后的内容保存到 _posts 目录。

  • 文件名格式为 YYYY-MM-DD-title.md。

  • 自动生成文章元数据,包括标题、日期和布局。

5. 图片处理

  • 通过 Unsplash API 获取与文章标题相关的图片作为横幅。

  • 支持处理 Notion 中的图片块,直接使用图片 URL。

关键代码

初始化 Notion 客户端

NOTION_API_TOKEN = os.getenv("NOTION_API_TOKEN")
notion = Client(auth=NOTION_API_TOKEN)

获取页面内容

def get_page_content(page_id):
    page = notion.pages.retrieve(page_id=page_id)
    title = page['properties']['title']['title'][0]['plain_text']
    blocks = notion.blocks.children.list(block_id=page_id)
    # 处理块内容

处理块内容

def process_block_content(block):
    block_type = block['type']
    if block_type == 'paragraph':
        text = block[block_type]['rich_text']
        return ''.join([t['plain_text'] for t in text])
    # 处理其他块类型

保存为 Markdown

def save_to_markdown(title, content):
    date = datetime.now().strftime("%Y-%m-%d")
    filename = f"_posts/{date}-{title.replace(' ', '-').lower()}.md"
    with open(filename, "w", encoding="utf-8") as f:
        f.write("---\n")
        f.write(f"title: {title}\n")
        f.write(f"date: {date}\n")
        f.write("layout: post\n")
        f.write("---\n\n")
        f.write("\n\n".join(content))

使用说明

  1. 配置 Notion API Token 和环境变量。

  2. 运行脚本:python3 scripts/sync_notion_to_jekyll.py。

  3. 脚本会自动将 Notion 内容同步到 Jekyll 博客的 _posts 目录。

注意事项

  • 确保 Notion 页面已与集成共享。

  • 根据需要调整 Markdown 文件的元数据和格式。