〽️

ZennのAPIを使って記事数・いいね数を取得する(Publication対応)

2024/02/28に公開

職場でZenn Publicationを使ったテックブログを始めました

職場でテックブログを始めました。よろしかったらフォローしてください。

https://zenn.dev/p/mkj

プラットフォームは、ZennのPublicationという機能を使っています。Zennを選んだ理由などはひょっとしたらどこか(テックブログとか)で書くかもしれませんが、本記事では割愛します。

せっかくテックブログはじめたので、やはりデータを集計したいということで、記事数といいね数を取得してみることにしました。

ユーザーごとの集計方法は、検索したらすぐ分かったものの、以下2つが問題になりましたので記録を残しておきます。

  • Publicationごとの数の取得方法
  • 最大48記事分までしか集計できない

Publicationごとの数の取得方法

途方にくれてつぶやいたら、親切な人が教えてくださいました。

https://twitter.com/1027kg/status/1762295546252071234

https://twitter.com/ayousanz/status/1762352558281294083

以下のようにpublication_nameを使えばよいそうです。

松尾研究所の場合は、具体的には以下のようになります。

https://zenn.dev/api/articles?publication_name=mkj&order=latest

自分のZennの記事の場合は、以下のようにusernameを使います。

https://zenn.dev/api/articles?username=karaage0703&order=latest

ZennのAPIってマニュアル無いのにどうやって調べたのだろう…気になって聞いてみたのですが、本人にも記憶がないとのこと。

最大48記事分までしか集計できない

以下記事に説明がありました。なんでマニュアル無いのにこういった仕様が分かるのでしょうね。フロントエンド詳しくないので尊敬です。

https://zenn.dev/aiq_dev/articles/2d0c83a26edca1#zenn-apiの記事取得apiは、ページネーションを実装している🌟

以下のように&page=1といったようにページ数をつけてやれば取得できます(1ページの最大の記事数が48)。

https://zenn.dev/api/articles?username=karaage0703&order=latest&page=1

実装

お昼休みにサクッとつくろうとしたら全然作れなかったので、結局夜中に作りました。

サンプルプログラム

Zenn Publication上の松尾研究所テックブログ自分のZennの記事を取得するサンプルプログラムを書いてみました。

もっといい実装ありそうですが、思いつかなかった…

import requests

# URLリストの定義
url_list = [
    'https://zenn.dev/api/articles?publication_name=mkj&order=latest',
    'https://zenn.dev/api/articles?username=karaage0703&order=latest',
]


def parse_json_and_calculate(url):
    """
    指定されたURLからJSONデータを取得し、記事数とliked_countの合計を計算する。

    Args:
        url (str): Zenn APIのエンドポイントURL。

    Returns:
        tuple: (パブリケーション名/ユーザー名, 記事数, liked_countの合計)
    """
    page = 1
    article_count = 0
    total_liked_count = 0

    while True:
        response = requests.get(f'{url}&page={page}')
        if response.ok:
            json_data = response.json()

            articles = json_data['articles']
            article_count += len(articles)
            total_liked_count += sum(article['liked_count'] for article in articles)

            if json_data['next_page'] is None:
                try:
                    user_name = articles[0]['publication']['display_name']
                except Exception as e:
                    user_name = articles[0]['user']['username']
                    print(e)

                return user_name, article_count, total_liked_count
            else:
                page = json_data['next_page']


# データ収集
user_names = []
article_counts = []
total_liked_counts = []

for url in url_list:
    user_name, article_count, total_liked_count = parse_json_and_calculate(url)
    user_names.append(user_name)
    article_counts.append(article_count)
    total_liked_counts.append(total_liked_count)

# 結果の表示
print(list(zip(user_names, article_counts, total_liked_counts)))

実行結果

シンプルにブログ名(ユーザー名)、投稿記事数合計、いいね数が表示されます。

[('松尾研究所テックブログ', 1, 128), ('karaage0703', 152, 4043)]

毎日計測してグラフ化とかしてみたいところですね。今後、どういう風に増えていくのか楽しみです。

リポジトリ

手軽に使えるようにリポジトリにまとめておきました。

https://github.com/karaage0703/zenn-analyzer

使い方はREADMEを確認してください。url_list.csvに取得したいZenn APIのエンドポイントURLを1行ずつ記入するだけです(複数対応)。

GitHub Actionsを使って毎日自動で記録するようにしても良さそうですが、まずは現時点での集計のみにしました。

まとめ

Zennの記事数・いいね数の集計方法をまとめました。個人記事の情報はすぐ見つかりましたが、Publicationに対応した情報がなかったので記事に残しておくことにします。

ZennのPublicationを使ってテックブログをしている方、テックブログに興味ある人は参考にしてみてください。

Discussion