Qiitaへの連続投稿数を取得する(Qiita Posting Streak)


はじめに

この人はどのくらい連続でQiitaに投稿しているのだろう?ということを気軽に知りたいと思いました。

作ったもの

Qiita API v2のAPIを、Python 3.6.3で呼び出して整形・出力しています。
質素ですみません。

aki-nasu/qiita-streak

使い方

qiita_streak.pyを実行すると、入力を要求されますのでユーザー名を入力してください。
私の場合ですと、aki-nasuです(@は要りません)。

  • 実行例

current streakが、最新の連続投稿数です。
most streakが、今までで一番長かった連続投稿数です(longestのほうがよかったか)。

解説

非常に簡単にですが、一部解説です。

  • 使用したライブラリ

    • requests : HTTPライブラリ
    • datetime : 日付型、時間型のPython標準ライブラリ
  • 年月日が一致してるかどうかを返します(日付型の扱いが調べてもわからなかったので自前で無理やりです)。

def compareYMD(d1, d2):
    return d1.year == d2.year and d1.month == d2.month and d1.day == d2.day
  • Qiita APIの呼び出し部分です。今回使用したAPIのレスポンスは、記事の作成日時降順です。
r = qiita_request.get_user_items(input('username : '))

qiita_request.py

import requests

URL = "https://qiita.com/api/v2/"

def get_user_items(user_id):
    return requests.get(URL + "users/" + user_id + "/items").json()
  • 1つ目のデータ(その人の最新記事)の作成日時(created_at)が、今日もしくは昨日だったらcurrent_streak+=1してます。
  • 2つ目以降のデータは、1つ手前の作成日時と1日違いかどうかでstreakしてるか判断しています。
if compareYMD(pre_date, r_created_at[0]) or compareYMD(pre_date, r_created_at[0] + inc_day): current_streak += 1
most_tmp += 1
most_streak = max(most_streak, most_tmp)

pre_date = r_created_at[0]

for i in range(1,n):
    if compareYMD(pre_date, r_created_at[i]): continue
    if compareYMD(pre_date, r_created_at[i] + inc_day):
        if current_streak > 0: current_streak += 1
        most_tmp += 1
    else:
        if current_streak > 0: current_streak *= -1
        most_streak = max(most_streak, most_tmp)
        most_tmp = 1
    pre_date = r_created_at[i]
most_streak = max(most_streak, most_tmp)

if current_streak < 0: current_streak *= -1

おわりに

datetimeの扱いがよくわからず無理やりになっていると思います。
出来れば、ネイティブアプリにしてもっと手軽にStreakチェックしたかったですね。

ちなみに、最初の実行例は私のではありません。私は下記の通り連続投稿などしたことがありません。

ですが、今日からGW改めステイホームウィークですし、その間だけでも毎日投稿に挑戦してみます(4月25日~5月6日まで)。結果は最終日に追記します。出来ない気しかしません。

参考

2020/05/01 追記

毎日投稿することに価値を感じなくなったので、Qiita連続投稿を引退します。