※記事のURLの一部は広告を含みます。

Notionのデータベースに保存した記事のURL・タイトル一覧をファイル形式で出力するの絵文字

Notionのデータベースに保存した記事のURL・タイトル一覧をファイル形式で出力する

2022-08-13

2022-08-13

はじめに

こんにちは、こふです。

Save To Notion を使ってクリップしていた記事を外部にファイル形式(特に Markdown 形式)で出力する方法をお伝えします。

まずは方法を全てお伝えして、最後にこの作業をした個人的な目的、処理の説明などをお話しします。


おことわりです。

多少なりとも PC を操作する経験、ファイルを開いて書き換える経験が必要かと思われます。


関連

Notion のデータベースに保存した記事の URL・タイトル一覧をファイル形式で取得する

動かすと以下ようになります。

Notion の煩雑な画面が・・・

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

ターミナルで実行したら、こんな感じです。

terminal
1> 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

コード

.env
1DBID=hogehogehoge... 2APISEC=secret_hogehogehogehoge...
main.py
1from 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 をそのサーバーに渡すため危険だと思いやめました。

おわりに

これで楽になりました。いつかやろうとしていたことを片付けてハッピーです。

参考




共有する