📚

【Python × Notion API】Notionデータベースにブックマークを登録・管理できるようにする

2024/06/07に公開

こんにちは。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にリクエストを投げるコードを作成しました。

main.py
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を使って、問題の解決や効率化できそうなことは色々あると思います。

業務で活用できそうな使い方があれば、使っていきたいなと思います。

dotDTechBlog

Discussion