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

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

2022-08-13

2022-08-13

はじめに

こんにちは、こふです。

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

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


おことわりです。

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


関連

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

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

Notion の煩雑な画面が・・・

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

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

terminal
> python3 main.py 0 1 ... 1625 1626(自分は1626個登録していたことになります・・・) > more out.md - [ ] [hoge1](https://example.com/1) - [ ] [hoge2](https://example.com/2) ...

手順 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
DBID=hogehogehoge... APISEC=secret_hogehogehogehoge...
main.py
from time import sleep from pprint import pprint import requests from dotenv import load_dotenv import os # 3rd party packages to be installed # pip(3) install requests # pip(3) install python-dotenv load_dotenv() DBID = os.environ['DBID'] APISEC = os.environ['APISEC'] # need .env file in same directory # database query: https://developers.notion.com/reference/post-database-query dq_endpoint = f"https://api.notion.com/v1/databases/{DBID}/query" # page property: https://developers.notion.com/reference/retrieve-a-page-property pp_endpoint = "https://api.notion.com/v1/pages/{}/properties/{}" payload = { "page_size": 100 # 100 is max size } headers = { "Accept": "application/json", "Notion-Version": "2022-06-28", "Content-Type": "application/json", "Authorization": f"Bearer {APISEC}", } def main(): output_text = "" count = 0 # for debugging counts while(1): res = requests.post(dq_endpoint, json=payload, headers=headers).json() results = res["results"] for r in results: print(count) sleep(0.4) # for rate limit prop = r["properties"] try: # any error may occure here, so error handling roughly name = requests.get(pp_endpoint.format( r["id"], prop["Name"]["id"]), headers=headers).json()["results"][0]["title"]["plain_text"] url = requests.get(pp_endpoint.format( r["id"], prop["URL"]["id"]), headers=headers).json()["url"] output_text += f"- [ ] [{name}]({url})\n" count += 1 except: print("error") if not res["has_more"]: break payload["start_cursor"] = res["next_cursor"] with open("out.md", "w")as f: f.write(output_text) if __name__ == '__main__': main()

なぜ実践したか

Notion の GUI に疲れているからです。

ショートカットが最小限の操作しか使えないし、マウス操作がほぼ必須になります。

しんどすぎて、最近は Obsidian を使っています。今後、移行の記事や使い方解説をする予定です。

プログラムでの処理の流れ

結局なにを処理したかです。

DB に登録している全ての URL と Name というカラムを取り出して、- [ ] [text](url)の形に整形すれば良い、ということになります。

  • 特定のデータベースを選ぶ
  • 最大で 100 件ずつのレコードを取得する
  • それぞれのレコードに対して、中身(URL、テキスト)を取得する
  • 配列などに追加する
  • 次の 100 件があればループする
  • 全てが終わったら Markdown ファイルなどに出力する

Python で書いた理由

最初はなんとなく、Shell Script で頑張ろうとしましたが、データ型を扱うのがだるすぎてやめました。

Go の方が型を定義するため型が明確なので楽です。

しかし、このプログラムは基本的に一回しか使いません。そのため、動的型付け言語の方が実装量は少ないので Python にしました。

また、インストールも簡単で、情報がネットに散らばっているのも理由です。PC あればだれでもできるはず。

PC にインストールするには、Python インストールで検索してください。

最初は、誰でも動かせる言語、つまりオンラインエディタで動く言語が良い、と思いました。

けど、API の Key をそのサーバーに渡すため危険だと思いやめました。

さいごに

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

参考



アバター

こふ

情報通信を専攻している大学生です。大学・趣味・アルバイトでプログラムを書いています。ITサービス・文章を創作することが好きです。

ぼくについて

共有する