ZennのAPIを使って記事数・いいね数を取得する(Publication対応)
職場でZenn Publicationを使ったテックブログを始めました
職場でテックブログを始めました。よろしかったらフォローしてください。
プラットフォームは、ZennのPublicationという機能を使っています。Zennを選んだ理由などはひょっとしたらどこか(テックブログとか)で書くかもしれませんが、本記事では割愛します。
せっかくテックブログはじめたので、やはりデータを集計したいということで、記事数といいね数を取得してみることにしました。
ユーザーごとの集計方法は、検索したらすぐ分かったものの、以下2つが問題になりましたので記録を残しておきます。
- Publicationごとの数の取得方法
- 最大48記事分までしか集計できない
Publicationごとの数の取得方法
途方にくれてつぶやいたら、親切な人が教えてくださいました。
以下のように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記事分までしか集計できない
以下記事に説明がありました。なんでマニュアル無いのにこういった仕様が分かるのでしょうね。フロントエンド詳しくないので尊敬です。
以下のように&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)]
毎日計測してグラフ化とかしてみたいところですね。今後、どういう風に増えていくのか楽しみです。
リポジトリ
手軽に使えるようにリポジトリにまとめておきました。
使い方はREADMEを確認してください。url_list.csv
に取得したいZenn APIのエンドポイントURLを1行ずつ記入するだけです(複数対応)。
GitHub Actionsを使って毎日自動で記録するようにしても良さそうですが、まずは現時点での集計のみにしました。
まとめ
Zennの記事数・いいね数の集計方法をまとめました。個人記事の情報はすぐ見つかりましたが、Publicationに対応した情報がなかったので記事に残しておくことにします。
ZennのPublicationを使ってテックブログをしている方、テックブログに興味ある人は参考にしてみてください。
Discussion