Notionのページ更新をGitHub ActionsとNotion APIを組み合わせて自動化してみる

Notionページの更新をGitHub ActionsにてNotion APIを使って自動で行ってみました。
2022.11.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Notion APIによるページ更新を検討していたものの実際の手続きには未着手でした。見当たった実例がDataBase更新のみだったためです。

NotionAPIが更新できるのはDataBaseに限りません。ただ、ページもDataBaseもID上は全て等しく扱われるために実装が読み解き辛いのも否めません。今回、GASでNotionAPIを通してNotionページ更新をしたコードを参考に、ターミナルベースでNotionAPIを呼び出してみました。上手くいくならGitHub Actionsに乗せる狙いです。

今回はramnes/notion-sdk-py を使ってみました。公式のNotion SDKをPythonで書き直したクライアントです。呼び出すAPIは公開されているエンドポイントを利用していますが、呼び出し実装は非公式というものです。

セットアップ

環境変数にNOTION_TOKENを入れておきます。developerサイトにてインテグレーションを追加して、今回利用するページにコネクトしましょう。

export NOTION_TOKEN=XXXXXXXXX

あとはnotion-sdk-pyをインストールするだけです。

pip install notion-client

呼び出してみる

ページのブロック更新を行ってみます。

import os
from notion_client import Client
from pprint import pprint

notion = Client(auth=os.environ["NOTION_TOKEN"])
result = notion.blocks.children.append('XXXXXXXXXXXXXXXXXXXXX', 
   children=[
    {
      "object": "block",
      "type": "paragraph",
      "paragraph": {
        "rich_text": [{ "type": "text", "text": { "content": "Test", "link": { "type": "url", "url": "https://twitter.com/NotionAPI" } } }]
      },
    }]
  )
pprint(result)
% python notion-test.py
{'block': {},
 'has_more': False,
 'next_cursor': None,
 'object': 'list',
 'results': [{'archived': False,
              'created_by': {'id': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
                             'object': 'user'},
              'created_time': '2022-11-17T03:40:00.000Z',
              'has_children': False,
              'id': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
              'last_edited_by': {'id': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
                                 'object': 'user'},
              'last_edited_time': '2022-11-17T03:40:00.000Z',
              'object': 'block',
              'paragraph': {'color': 'default',
                            'rich_text': [{'annotations': {'bold': False,
                                                           'code': False,
                                                           'color': 'default',
                                                           'italic': False,
                                                           'strikethrough': False,
                                                           'underline': False},
                                           'href': 'https://twitter.com/NotionAPI',
                                           'plain_text': 'Test',
                                           'text': {'content': 'Test',
                                                    'link': {'url': 'https://twitter.com/NotionAPI'}},
                                           'type': 'text'}]},
              'parent': {'page_id': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
                         'type': 'page_id'},
              'type': 'paragraph'}],
 'type': 'block'}

結果はこちら。

更新されていることを確認できました。ページ末行にTestの1文があります。

GitHub Action Workflowとして書き起こす

上のファイルを単純実行させてみます。

# This is a basic workflow to help you get started with Actions

name: notion-py
defaults:
  run:
    shell: bash
# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "master" branch
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      - name: Run notion-py
        run: |
          sudo -H pip install -U pipenv
          PYTHON_BIN_PATH="$(python3 -m site --user-base)/bin"
          PATH="$PATH:$PYTHON_BIN_PATH"
          pipenv sync
          pipenv run python notion-test.py
        working-directory: ./notion
        env:
          NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}

Notion側もブラウザ上にて非同期でブロックが追加されることを確認できます。

あとがき

GitHub ActionsにもNotionを利用できるActionがありますが、ブラウザログインで発行されるCookie内のtoken_v2の値を手動コピーにて利用するものも多く、インテグレーションベースで行いたい場合は今回紹介したクライアントの利用をおすすめします。