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の値を手動コピーにて利用するものも多く、インテグレーションベースで行いたい場合は今回紹介したクライアントの利用をおすすめします。