Qiita APIを用いて投稿マラソン中の自分の記事ランキングをまとめる

## 経緯

投稿マラソンで、これまで期間中は毎日1つ記事を公開してきましたが、「いいね」がつく記事とそうでない記事は、自分自身の熱量や予測通りにならないことのほうが多いです。

これまで投稿マラソン期間中に公開した記事を「いいね」数の降順で確認して振り返りたいなと思いました。
この目的のためにQiita APIを初めて利用してみました。

## 実装

```python
import requests
from datetime import datetime, timezone, timedelta

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

# https://qiita.com/maiamea/items/680cca06f7825595cba0
# などを参考にしてアクセストークンを発行し、下記を差し替え
ACCESS_TOKEN = "PLEASE_INPUT_ACCESS_TOKEN"

headers = {
    "Authorization": f"Bearer {ACCESS_TOKEN}"
}

# 対象のユーザIDを指定
USER_ID = "koji-yamauchi"

PER_PAGE = 100

def get_articles(user_id, page):
    url = f"{QIITA_API_ENDPOINT}/users/{user_id}/items"
    params = {
        "page": page,
        "per_page": PER_PAGE
    }
    response = requests.get(url, headers=headers, params=params)
    response.raise_for_status()
    return response.json()

def filter_articles(articles, start_date, end_date):
    filtered_articles = []
    for article in articles:
        created_at = datetime.strptime(article['created_at'], "%Y-%m-%dT%H:%M:%S%z")
        if start_date <= created_at <= end_date:
            filtered_articles.append(article)
    return filtered_articles

JST = timezone(timedelta(hours=9))
start_date = datetime(2024, 6, 10, tzinfo=JST)
end_date = datetime(2024, 7, 17, tzinfo=JST)

page = 1
all_articles = []

while True:
    articles = get_articles(USER_ID, page)
    if not articles:
        break
    all_articles.extend(articles)
    page += 1

filtered_articles = filter_articles(all_articles, start_date, end_date)

sorted_articles = sorted(filtered_articles, key=lambda x: x['likes_count'], reverse=True)[:50]

for article in sorted_articles:
    print(f"Title: {article['title']}, Likes: {article['likes_count']}")
```

## 結果

2024-07-15 09:13時点

```
Title: なんだか助かる便利なおっちゃんになりたい, Likes: 194
Title: やる気という不安定なものに頼らないテクニック, Likes: 54
Title: 既存チームにジョインするときに気をつけていること, Likes: 43
Title: 業務知識を得るために読んだ本, Likes: 9
Title: ChatGPTと一緒にWebサイト制作① 調査編, Likes: 8
Title: プロジェクトを推進する力とは何か, Likes: 7
Title: 無限に増え続ける仕事、忙殺を回避するには, Likes: 6
Title: エンジニア思考の生活改善・育児や家庭との両立, Likes: 6
Title: Shifterの強みとハマりどころ, Likes: 5
Title: 子供と生成AIによるお絵かき共同作業, Likes: 5
Title: 複数ページをまとめてLighthouseで検証する, Likes: 5
Title: ChatGPTと一緒にWebサイト制作③ UML編, Likes: 5
Title: コンフォートゾーンの外に立つ、立たせる, Likes: 4
Title: 投稿マラソン19/38記事目 折り返し地点, Likes: 4
Title: 複数ページをまとめてHTML Validationチェックする, Likes: 4
Title: JavaScriptで子供用のひらがな学習ゲームを作った話, Likes: 4
Title: ChatGPTと一緒にWebサイト制作④ サイトマップ作成編, Likes: 4
Title: @wordpress/envでのDB確認はwp db queryが便利, Likes: 4
Title: WordPress標準制作フロー2024, Likes: 4
Title: 「では、それで。」と言ってもらえたら勝ちゲーム, Likes: 4
Title: ロボットと生活する, Likes: 3
Title: いかにして相手の想像を掻き立てるか, Likes: 3
Title: インターンシップを受け入れる意図と意義, Likes: 3
Title: マーフィーの法則とトンビに襲われた思い出, Likes: 3
Title: メンバーシップ型採用は馬鹿に出来ない, Likes: 3
Title: 記事の挿絵をつくる技術, Likes: 3
Title: Gitはコマンドから慣れよう, Likes: 3
Title: ChatGPTと一緒にWebサイト制作② ヒアリング編, Likes: 3
Title: 書評「エンジニアのためのマネジメント入門」, Likes: 3
Title: XPathや正規表現を用いてGoogle SpreadSheetに情報をまとめる, Likes: 3
Title: なるべく苦労しない工数管理, Likes: 2
Title: プロジェクト進行のヒントを得るために読んだ本, Likes: 2
Title: 18年の時を経て卒業制作アーカイブDiskを開く, Likes: 2
Title: 情報設計や整理のヒントを得るために読んだオライリー本7冊, Likes: 0
Title: 己の欲求と向き合う, Likes: 0
```

「業務知識を得るために読んだ本」はどちらかというと、箸休め程度の温度感で、労力もさほどかかっていない記事だったので上位になったのは意外でした。

一方で結構、記事作成に時間がかかったものでも全然だめだったり、いまいち傾向と対策がつかめない結果です。

あまり周りからの反応を意識しすぎても良くないと思いますので、思考のアウトプットの場として引き続き利用できればと思います。