【Python × Notion API】Notionデータベースにブックマークを登録・管理できるようにする
こんにちは。dotDのサーバーサイドエンジニアの前田です。
弊社ではNotionでドキュメントを作成・管理しており、僕は業務中だけではなくプライベートでもよくNotionを利用しています。
もっとNotionを使いこなせるようになりたいので、「Notion APIを使って何かできないかなー」と考えたところ、僕が普段感じていた下記の問題を解決できるぞ!と思い、PythonでNotion APIを使った簡単なプログラムを作成しました。
再度読みたい・後で読みたい記事をブックマークするが、数が多くなると、
ブックマークした記事のステータス(未読か既読か)がわからなくなる、、
また、記事をカテゴリー毎にまとめたり、お気に入りの記事にいいねマークをつけたりして、
あるカテゴリーの記事やお気に入りの記事のみ表示されるようにしたい!
ブラウザのアドレスバーのURLを選択した状態で、今回のプログラムを実行すると(ショートカットキーで実行できるようにします)、Notionのデータベースに記事のタイトルとURLを保存できるようになります。データベースなので、ステータス管理やフィルター適用もできるようになります。
僕と同じような問題を感じている方や、Notion APIの使い方を知りたい方など、ぜひご覧ください!
Notion APIでできること
外部のアプリケーションやサービスから、Notion APIを使って、Notion内のデータを読み取ったり、書き込んだり、更新したりすることができます。
今回は、PythonでNotion APIを使うプログラムを作成して、選択した記事のタイトルとURLをNotionのデータベースに登録できるようにします。
Notion APIを使えるようにするための手順
前提
- Notionのアカウントを持っていること
- ワークスペースのオーナーであること
1. Notion APIのアクセス先を作成する
まずは、Notion APIを使ってアクセスしたいページやデータベースを作成します。
今回はデータベースにアクセスしたいので、データベースを作成したいページに/database
と入力して、インラインデータベースかフルページデータベースのどちらかを選択します。(僕はインラインデータベースを選択しました)
データベースを作成したら、APIを使ってどのデータベースにアクセスするのかを識別するために、データベースIDを取得します。
データベースの右上の「・・・」の「ビューのリンクをコピー」から、データベースのURLを取得します。
取得したデータベースのURLの以下のxxx
の部分がデータベースIDなので、これを保存します。
https://www.notion.so/xxx?v=yyy
2. インテグレーションを作成する
インテグレーションとは、Notion内のページやデータベースを他のアプリケーションやサービスと連携させる仕組みのことです。(Notion APIを使って特定のNotion内のページやデータベースにアクセスするための鍵のようなもの)
インテグレーションは以下のページから作成できます。
・https://www.notion.so/my-integrations
※デスクトップアプリでNotionを利用されている方は、webでもNotionにログインする必要があります!そうしないと、上記ページでご自身のアカウントとワークスペースが表示されません。
作成手順は以下です。
①新しいインテグレーション
ボタンを押下
②インテグレーションを使用したいワークスペースとインテグレーションの名前を入力(任意でロゴも設定可能)して、送信
ボタンを押下
③シークレット欄にAPIキーが表示されるので、保存する
3. Notion APIのアクセス先にインテグレーションを紐づける
手順1[Notion APIのアクセス先を作成する]で作成したページの右上の「・・・」の接続先から、作成したインテグレーションを選択して紐づけます。(作成したインテグレーションが表示されない場合は、ページをリロードしてみてください)
コネクト、に作成したインテグレーションが表示されたら、紐づけ完了です。
Notion APIを使ったプログラムを作成する
これでNotion APIを使えるようになりました。
今回は、記事のタイトルとURLをデータベースに登録したいので、POST /v1/pages
を使います。
このAPIの公式リファレンス↓
・https://developers.notion.com/reference/post-page
僕は、PythonでNotion APIにリクエストを投げるコードを作成しました。
import sys
import requests
from bs4 import BeautifulSoup
'''
コードを外部に公開する場合は、APIキーとデータベースIDをコード内に直接書いたら、
Notion内のデータの改ざん等APIを不正利用されるリスクがあるため、
環境変数に設定するなどしてください。
'''
DATABASE_ID = "XXX" # 手順1[Notion APIのアクセス先を作成する]で取得したデータベースID
NOTION_API_KEY = "XXX" # 手順2[インテグレーションを作成する]で取得したAPIキー
'''
記事のURLから記事のタイトルを取得。
URLだけデータベースに登録しても、何の記事かわからないので、
URLから記事のタイトルを取得して、記事のタイトルとURLをデータベースに登録するようにしています。
'''
article_url = sys.argv[1]
contents = requests.get(article_url)
raw_data = BeautifulSoup(contents.text, "html.parser")
title = raw_data.title.text
url = "https://api.notion.com/v1/pages"
headers = {
"Notion-Version": "2022-06-28",
"Authorization": "Bearer " + NOTION_API_KEY,
"Content-Type": "application/json",
}
'''
"parent"にアクセス先のデータベースのIDを設定。
"properties"のキーに、データベースのテーブルのプロパティを設定し、
登録したい値を設定。
'''
json_data = {
"parent": {"database_id": DATABASE_ID},
"properties": {
"タイトル": {"title": [{"text": {"content": title}}]},
"URL": {"url": article_url},
},
}
response = requests.post(url, headers=headers, json=json_data)
print(response.text)
リクエストボディで、データベースのテーブルのプロパティと登録したい値を設定するのですが、
プロパティの種類(テキスト、セレクト、日付、URLなど)によって設定方法が異なります。
プロパティの種類ごとのリクエストボディの設定方法については、以下の公式リファレンスを参照してください。
・https://developers.notion.com/reference/property-object
Automatorで、プログラム実行を効率化
記事URLを取得して、python maiy.py 記事URL
を入力してプログラムを実行するのは面倒なので、Macの標準アプリのAutomator
を使って、すぐにプログラムを実行できるようにしました。
以下、AutomatorでPythonファイル実行のコマンドを登録する手順です。
①Automatorを起動して、クイックアクション
を選択
②検索欄に「シェル」と入力して、「シェルスクリプトを実行」を選択して右のスペースにドラッグ
③以下画像のように入力して、名前を付けて保存する
僕は、仮想環境にライブラリを入れているので、仮想環境に入ってからプログラムを実行していますが、そこはお好みです。
pythonの実行ファイルのパスはwhich python
で取得できるので、
pythonの実行ファイルのパス 実行したいpythonファイル
の形式でコマンドを登録します。
続いて、Automatorで登録したコマンドをショートカットキーで実行できるようにします。
①システム設定の「キーボード」からキーボードショートカット...
を押下
②「サービス」を選択し、先ほど保存したAutomatorのクイックアクションを見つけて、ショートカットキーを登録する(僕は、command+Bで登録しました)
これで、以下のように、記事のURLを選択して「command+B」を入力したら、Notionのデータベースに記事が保存できるようになります。
さいごに
最後までご覧いただきありがとうございます。
今回は、データベース操作(登録)のNotion APIを使いましたが、データ取得やデータ更新もあります。
データベースだけではなく、ページやブロックの操作もできます。
色々できます。
なので、Notion APIを使って、問題の解決や効率化できそうなことは色々あると思います。
業務で活用できそうな使い方があれば、使っていきたいなと思います。
Discussion