Notionデータベースに作成されたページタイトルをMarkdownのリスト形式で取得するやつをCloudflare Workersで作ってみました。

認証の都合で自分専用の設定にしているため、試したい場合はローカル開発環境の起動、またはご自身のCloudflareアカウントにデプロイしてお試しいただければと思います。

GitHub: https://github.com/yomashishi/get-titles-from-notion-database

振る舞い

デプロイしたWorkersに認証ヘッダークエリパラメーターを渡すことで、ページタイトルをMarkdownのリスト形式で取得するようにしています。何かしらのHTTPクライアントを挟む前提で作っています。

Important

100件を超える取得には現状対応しておりません。

認証ヘッダー

どこからでもアクセスする前提で作成しているので、認証系の情報はWorkersに持たせず、都度渡すようにしています。Notionのシークレットの有効性はNotion APIを呼び出すまでわからないので、無駄なAPI呼び出しを減らすためにWorkersの呼び出し自体に簡易的な認証を挟めるようにしています。

  • 必須
    • Authorization: Notionインテグレーションのシークレット(読み取り権限)1を設定
      • Authorization: Bearer {シークレット}
  • 任意
    • x-secret: Workersのシークレットに WORKER_SECRET を登録している場合に設定
      • x-secret: {WORKER_SECRETの値}

クエリパラメーター

  • 必須
    • database_id: 読み込みたいNotionデータベースのID
      • NotionデータベースのIDはデータベースURLに含まれています。確認方法は開発者ドキュメント2に記載されています。
  • 任意
    • indent: 複数行で構成されたページタイトルの2行目以降をインデントさせるためのパラメーター
    • date: YYYY-MM-DD 形式の取得したい日付
      • 渡さない場合は当日分のデータを取得します。
    • to_date: YYYY-MM-DD 形式の検索期間の末日
      • date と組み合わせます。

curlコマンド例

全部盛りのcurlコマンドは以下のようになります。

curl -H "Authorization: Bearer $NOTION_SECRET" \
  -H "x-secret: $WORKER_SECRET" \
  "https://{Workersのドメイン}?database_id={NotionデータベースのID}&indent=&date={取得したい日付}&to_date={検索期間の末日}"

実行時のスクリーンショット

任意パラメーターのうち dateindent を渡した場合のスクリーンショットは以下です。

date と indent を渡した場合のスクリーンショット

作成した経緯

筆者は日々の記録をObsidianのデイリーノートで行っています。PCとスマートフォン間でデータを同期しているので、外出時にスマートフォンから記録することもできます。 しかしながら、電車内などの周囲に人がいる環境ではノートを開くことに抵抗があるため、一時的に別の場所へ記録するようにしています。

一時的な記録場所として、現在はこにゃ様の記事「Notionで運用するSNSライクな「つぶやき帳」|こにゃ」の影響で、Notionデータベースのタイトルに諸々を記録するようにしています。AndroidアプリであるHTTP Shortcutsを使用してNotion APIを叩いて記録しているので、これまでのデータを表示させずに記録できます。 以前は個人用DiscordサーバーのWebhookに対してテキストを投げることもしていました。

別の場所に記録したデータは最終的にObsidianのデイリーノートへ持ってくるのですが、Notionの画面でページタイトルをコピーするためには、ページを一度開く必要があります。それを各ページに対して行うのは面倒であるため、Notion API経由で一気に持ってくるものをCloudflare Workersで作ってみました。

最後までご覧いただきありがとうございました。