Published on

noteの記事の"スキ"を集計するツールを作った

Authors
  • avatar
    Name
    Nomad Dev Life
    Twitter
2025-03-20-img1

noteの記事の"スキ"を集計するツールを作った

最近、noteで日記を書いているのですが、直近のある期間に、誰がどのくらいスキをくれたかを知りたいなーと思うことがあり、noteの非公式APIを使って集計していました。

最初は、自分の分だけ集計できれば良いや、と思っていたのですが、Webアプリケーションにして誰でも使えるようにした方が良いかも、と思い、作ってみました。

note非公式API

noteには、非公式APIというものが存在します。

この中に、"ユーザーの記事一覧"と"記事の詳細"を取得するAPIがあるので、これらを使っています。

最初にnoteIDを指定して"ユーザーの記事一覧"を取得し、そこから記事の詳細を1つ1つ問い合わせ、そこに記録されている"スキ"のユーザー情報を取得しています。

"ユーザーの記事一覧"APIは、最新の記事から順に返されるようになっているので、取得する記事の数(=ページ数)を指定できるようにしました。ページあたりの記事数は常に6に固定されているようで、sizeパラメータ等を付けても変更することはできませんでした。ページ数に"1"を指定すれば最新から6記事、"2"を指定すれば最新から12記事を取得するようになっています。

非公式APIに負荷をかけないよう、APIの発行間隔は5秒と長めに設定しています。その分、情報の取得に時間がかかり、ページ数を増やすとなかなか集計結果が帰ってきません。気長に待ってください。

実装

今回もStreamlitを使いました。最初はstliteを使おうとしたのですが、noteのAPIsに問い合わせる際、Same Origin Policyに阻まれてしまい断念しました。

note非公式APIを使って、指定されたユーザーの記事ごとのスキを取得し、最後に集計して画面に表示しています。

Streamlitで作ったアプリはDocker Containerにして、VPSにdeployしています。Dockerfileは以下のようになっています。

FROM python:3.13-slim

# Install uv.
COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv

# Copy the application into the container.
COPY . /app

# Install the application dependencies.
WORKDIR /app
RUN uv sync --frozen --no-cache

# Run the application.
CMD ["/app/.venv/bin/streamlit", "run", "./app.py", "--server.baseUrlPath", "/note-liker-stats", "--server.port", "8501", "--server.address", "0.0.0.0"]

学び

今まであまり気にしたことは無かったのですが、Streamlit自体はスマフォの画面でもちゃんと表示できました。

あとは、現在どのような処理を行っているかを表示する為に、st.progressで表示されるプログレスバーのテキストフィールドを使っています。Streamlitでは"裏で何かをしている"ことが結構あるので、その状況を説明するのに便利でした。

2025-03-20-img2

おわりに

noteの非公式APIを使用して、直近のある期間に、誰がどのくらいスキをくれたかを集計するツールをStreamlitを使って実装し、deployしました。

このツールを使って、直近、自分の日記に"スキ"してくれたユーザーを把握し、その方々の記事を優先的にチェックしていこうと思います。