🐡

Zennで「いいねした投稿」と「読んでいる本」をNotionで管理する

2024/02/10に公開

何を作ったか

Zennで自分が「いいねした投稿」と「読んでいる本」をNotionのデータベースに保存するスクリプトを作りました。Notionのアカウントとpythonの実行環境があれば誰でも使えるようになっています。

すぐに試したい方は、こちらのREADMEを読んで試してみてください

こんなもの↓ができます!(これは私がいいねした投稿の一覧です)

https://zealous-rosehip-7a8.notion.site/a3c1dd8fa96a42fbb6e162e91354a68d?v=324c9e7e593746838d64ee2123d175e6&pvs=4

前書き

皆様はZennでいいねした記事読んでいる本を、どうやって管理していますか?
全部覚えとるわ😤という方はこの記事を読む必要はありません!

私のように読んだ記事を片っ端からいいねして保存した気になっている人は、

  • はぇ〜勉強になるなあ(いいねポチッ) → どこいった...🤔
  • これ、後で読んどこ〜(いいねポチッ) → どこいった...🤔

となることがよくあります

そんなわけで、

  • タイトルとかで検索やソートができて
  • 後で読むとかタグを追加できて
  • APIが公開されてて

そんなデータベースみたいなもので管理できたら楽なんだけどな〜
そんな都合のいいものあるわけ...

アルヨ( ´・ω・)_ ~ Notion

あるんですねこんな便利なものが
じゃあ、早速実装でい

実装

Zennでいいねした投稿を取得(postman)

ZennはAPIを公開してはいませんが内部的に利用しているようなので、今回はそれを使わせてもらいます

ブラウザでZennにログインした状態で、ここです
自分がいいねした投稿がjsonで表示されましたね?

postmanなどでブラウザを介さずにこの情報を取得するには、ブラウザに保存されている認証情報が必要になります(認証情報がないと「ログインしてください」と返されます)

色々試して、Cookieに入っているremember_user_tokenの値が必要ということがわかりました
Zennにログインした状態でChromeの検証画面を開き、Application → Cookiesの順に選択すると出てきます

わかんない人向け

認証情報

ヘッダーに以下のようにクッキーをセットして、https://zenn.dev/api/me/library/likesにpostmanでAPIリクエストしてみましょう

Key Value
Cookie remember_user_token=トークンの値

いいねした投稿が取得できるハズです
読んだ本についても同様に取得できます

ここからはpythonで実装していきます

Zennでいいねした投稿を取得(python)

コードの解説

  • リクエストの間隔は1秒開けます(ここは変更しないようにしてください
  • fetch_likes:いいねした投稿のリストを取得します(Notionのデータベースに入っている記事のURLを引数にとり、重複しないように記事を取得します)
  • fetch_article_topics:いいねした各投稿の詳細情報を取得します
  • fetch_reading_books:読んでいる本のリストを取得します
  • fetch_book_details:読んでいる本の詳細情報を取得します

https://github.com/Taichiro-S/Zenn2Notion/blob/2d833c7aec19cd8a5ffb5c80de747e58f94f7e0d/zenn_api.py

取得したデータをNotionに保存

コードの解説

  • Zennで使われている絵文字で、notionが対応していないものがあるので、DEFAULT_EMOJI(😅)で置き換えるようにしています(好きなものに変えてください!)
  • fetch_urls:Notionnデータベースにすでに保存されている記事や本のURLを取得します
  • insert_article:いいねした投稿をデータベースに保存します(ここで保存するプロパティを指定しています)
  • insert_book:読んでいる本をデータベースに保存します

(注)いいねを取り消したものについてはデータベースからの削除は行わないため、手動での削除が必要になります。

https://github.com/Taichiro-S/Zenn2Notion/blob/2d833c7aec19cd8a5ffb5c80de747e58f94f7e0d/notion_api.py

できなかったこと

記事の本文をNotionのページに保存しようとしましたが、Notionではblockという独自の仕組みを使っており、またZennでもマークダウンに加えて独自の記法があるので、変換がメンドイです

以下2つのライブラリを試してみましたがダメでした(Zenn独自の記法のため?)

参考記事
https://zenn.dev/cizneeh/articles/markdown-to-notion-db

本文が保存できればNotion AIとか使えそうなのにな〜
何かいい方法があればコメントで教えてください!

使い方

事前準備

Notionのアカウントを作成しておいてください
pyenvなどでpython3.11または3.12をインストールしてください(これ以外での動作確認はしていません)

実行環境の作成

こちらのリポジトリをクローンしたら、以下のコマンドでvenvを使用して実行環境を作成します
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Notionの準備

ここからNotion Integrationを作成し、発行されるSecretを控えておきます

以下のURLで公開されている2つのNotionのデータベースをそれぞれ自分のワークスペースに複製し、IDを控えておきます( IDはデータベースのURLにhttps://www.notion.so/[DATABASE ID]?v=[VIEW ID]という形で入っています)

複製したデータベースのコネクトに作成したIntegrationを追加します

複製したデータベースのプロパティの名前や種類は基本的には変更しないでください
変更したい場合は、ソースコードのinsert_articleで対応する部分を書き換える必要があります

環境変数の設定

.env.example.envという名前に変えて以下の4つの値を設定します。
tokenやsecret等の認証情報の取り扱いには注意してください

NOTION_SECRET='Notion Integration の Secret'
NOTION_DATABASE_ID_FOR_LIKES='いいねした投稿保存用のデータベースID'
NOTION_DATABASE_ID_FOR_BOOKS='読んでいる本保存用のデータベースID'
REMEMBER_USER_TOKEN='Cookieに保存されている remember_user_token の値'

実行

python save_zenn_likes.pyでいざ実行!

こんな感じ↓で動くはずです!
https://youtu.be/aaC8-syNSeM

最後に

Notionデータベースでは検索、ソート、フィルターが可能です
また、Notion AIや他のツールと連携すればもっと活用法はありそうです

この方法で記事の管理が少しでも楽になれば幸いです!

Discussion