
Notionのデータベースに保存した記事のURL・タイトル一覧をファイル形式で出力する
2022-08-13
2022-08-13
はじめに
こんにちは、こふです。
Save To Notion を使ってクリップしていた記事を外部にファイル形式(特に Markdown 形式)で出力する方法をお伝えします。
まずは方法を全てお伝えして、最後にこの作業をした個人的な目的、処理の説明などをお話しします。
おことわりです。
多少なりとも PC を操作する経験、ファイルを開いて書き換える経験が必要かと思われます。
関連
Notion のデータベースに保存した記事の URL・タイトル一覧をファイル形式で取得する
動かすと以下ようになります。
Notion の煩雑な画面が・・・

シンプルなテキストファイルになります。

ターミナルで実行したら、こんな感じです。
terminal1> python3 main.py 20 31 4... 51625 61626(自分は1626個登録していたことになります・・・) 7 8> more out.md 9- [ ] [hoge1](https://example.com/1) 10- [ ] [hoge2](https://example.com/2) 11...
手順 1:API Key を取得する
Notion API を使うための API Key を取得します。
My integrations | Notion Developersにアクセスしてください。
DB の読み取りだけ行うため、チェックは以下の画像のようにしてください。
出力したのちの Notion のページは Notion 側でページごとアーカイブするなどで対応で十分です。わざわざ削除する意味はありません。

手順 2:Integration を招待する
記事を保存しているデータベースのページに Share(共有)にその Integration を招待してください。
名前は自分で作成時につけたものを選ぶので、写真の通りとは限りません。

手順 3:プログラムを用意して動かす
基本的にはコピペして動かすだけです。
GitHub Gist に公開しているので、Zip ファイルをダウンロードして環境変数のファイル(.env
ファイル)を書き換えてください。
⚠️ 注意 ⚠️
SaveToNotion
で保存する際に、次のデータベースの形式で保存していました。
Name
というカラムに記事のタイトルを入れるTitle
という名前の、データベース作成時点から存在する消すことのできないカラム
URL
というカラムに URL を入れるURL
の型
これらが異なる場合、単なるコピペでは動きません。適宜カスタマイズする必要があります。
もし、書き換え方がわからない場合は、Twitter やブログのお問い合わせから質問していただければ、お時間いただくかもしれませんが回答します。
GitHub Gist からダウンロードしない方は以下の手順に従ってください。
用意するファイル
.env
- API のキーを入れます
- ネットに公開するため、このようにしています
- 使いたくなければ
main.py
の中に直接文字列を書き込んでください
main.py
- Python を動かします
- Python のインストールとパッケージが必要です。
pip install requests
pip install python-dotenv
コード
.env1DBID=hogehogehoge... 2APISEC=secret_hogehogehogehoge...
main.py1from time import sleep 2from pprint import pprint 3import requests 4from dotenv import load_dotenv 5import os 6 7# 3rd party packages to be installed 8# pip(3) install requests 9# pip(3) install python-dotenv 10 11load_dotenv() 12DBID = os.environ['DBID'] 13APISEC = os.environ['APISEC'] 14# need .env file in same directory 15 16 17# database query: https://developers.notion.com/reference/post-database-query 18dq_endpoint = f"https://api.notion.com/v1/databases/{DBID}/query" 19# page property: https://developers.notion.com/reference/retrieve-a-page-property 20pp_endpoint = "https://api.notion.com/v1/pages/{}/properties/{}" 21 22payload = { 23 "page_size": 100 # 100 is max size 24} 25headers = { 26 "Accept": "application/json", 27 "Notion-Version": "2022-06-28", 28 "Content-Type": "application/json", 29 "Authorization": f"Bearer {APISEC}", 30} 31 32 33def main(): 34 output_text = "" 35 count = 0 # for debugging counts 36 while(1): 37 res = requests.post(dq_endpoint, json=payload, headers=headers).json() 38 results = res["results"] 39 for r in results: 40 print(count) 41 sleep(0.4) # for rate limit 42 prop = r["properties"] 43 try: 44 # any error may occure here, so error handling roughly 45 name = requests.get(pp_endpoint.format( 46 r["id"], prop["Name"]["id"]), headers=headers).json()["results"][0]["title"]["plain_text"] 47 url = requests.get(pp_endpoint.format( 48 r["id"], prop["URL"]["id"]), headers=headers).json()["url"] 49 output_text += f"- [ ] [{name}]({url})\n" 50 count += 1 51 except: 52 print("error") 53 if not res["has_more"]: 54 break 55 payload["start_cursor"] = res["next_cursor"] 56 with open("out.md", "w")as f: 57 f.write(output_text) 58 59 60if __name__ == '__main__': 61 main()
なぜ実践したか
Notion の GUI に疲れているからです。
ショートカットが最小限の操作しか使えないし、マウス操作がほぼ必須になります。
しんどすぎて、最近は Obsidian を使っています。今後、移行の記事や使い方解説をする予定です。
プログラムでの処理の流れ
結局なにを処理したかです。
DB に登録している全ての URL と Name というカラムを取り出して、- [ ] [text](url)
の形に整形すれば良い、ということになります。
- 特定のデータベースを選ぶ
- 最大で 100 件ずつのレコードを取得する
- それぞれのレコードに対して、中身(URL、テキスト)を取得する
- 配列などに追加する
- 次の 100 件があればループする
- 全てが終わったら Markdown ファイルなどに出力する
Python で書いた理由
最初はなんとなく、Shell Script
で頑張ろうとしましたが、データ型を扱うのがだるすぎてやめました。
Go
の方が型を定義するため型が明確なので楽です。
しかし、このプログラムは基本的に一回しか使いません。そのため、動的型付け言語の方が実装量は少ないので Python
にしました。
また、インストールも簡単で、情報がネットに散らばっているのも理由です。PC あればだれでもできるはず。
PC にインストールするには、Python インストール
で検索してください。
最初は、誰でも動かせる言語、つまりオンラインエディタで動く言語が良い、と思いました。
けど、API の Key をそのサーバーに渡すため危険だと思いやめました。
おわりに
これで楽になりました。いつかやろうとしていたことを片付けてハッピーです。