Qiita APIを使って記事の「タイトル」「いいね数」「ストック数」を取得してCSVに書き出す


# 必要な準備：Qiitaのアクセストークンを取得する

## Step1. 下記にアクセス

https://qiita.com/settings/applications

## Step2. `個人用アクセストークン`からトークンを発行

必要な権限（この記事では`read_qiita`を使用します）を選択し、トークンを発行します。

## Step3. トークンを環境変数に埋め込む

**コマンド例：**

```bash
export QIITA_ACCESS_TOKEN="your_access_token"
```


:::note warn
- APIキーは、流出厳禁です。ソースコードに直接トークンを入力することは避けて、環境変数に埋め込みましょう。
- 流出した恐れがある場合は、先ほどトークンを発行したページから削除できます。
:::

# 実装: Qiita APIを使って記事の「タイトル」「いいね数」「ストック数」を取得してCSVに書き出す

以下のコードは、Qiita APIを利用してユーザーの記事データを取得し、「タイトル」「いいね数」「ストック数」をCSVファイルに書き出します。

```python
import csv
import os

import requests


def get_qiita_access_token() -> str:
    """
    環境変数からQiitaのアクセストークンを取得します。

    Returns:
        str: Qiitaのアクセストークン
    """
    token = os.getenv("QIITA_ACCESS_TOKEN")
    if not token:
        raise ValueError("環境変数 'QIITA_ACCESS_TOKEN' が設定されていません。")
    return token


def fetch_recent_articles(user_id: str, count: int = 10) -> list[dict]:
    """
    指定したユーザーの直近の記事を取得します。

    Parameters:
        user_id (str): ユーザーID
        count (int): 取得する記事の数（デフォルトは10）

    Returns:
        list[dict]: 記事情報のリスト
    """
    url = f"https://qiita.com/api/v2/users/{user_id}/items"
    headers = {"Authorization": f"Bearer {get_qiita_access_token()}"}
    params = {"page": 1, "per_page": count}
    response = requests.get(url, headers=headers, params=params)
    response.raise_for_status()
    return response.json()


def fetch_stock_count(item_id: str) -> int:
    """
    指定した記事のストック数を取得します。

    Parameters:
        item_id (str): 記事のID

    Returns:
        int: ストック数
    """
    url = f"https://qiita.com/api/v2/items/{item_id}/stockers"
    headers = {"Authorization": f"Bearer {get_qiita_access_token()}"}
    response = requests.get(url, headers=headers, params={"page": 1, "per_page": 100})
    response.raise_for_status()
    return len(response.json())


def write_to_csv(articles: list[dict], output_file: str):
    """
    記事情報をCSVファイルに書き出します。

    Parameters:
        articles (list[dict]): 記事情報のリスト
        output_file (str): 書き出すCSVファイル名
    """
    with open(output_file, mode="w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        # ヘッダー行の書き出し
        writer.writerow(["タイトル", "いいね数", "ストック数"])

        # 各記事の情報を行として書き出し
        for article in articles:
            title = article["title"]
            likes_count = article["likes_count"]
            stocks_count = fetch_stock_count(article["id"])
            writer.writerow([title, likes_count, stocks_count])


def main():
    user_id = "your_id_here"  # QiitaのユーザーID
    output_file = "qiita_articles.csv"

    # 記事データを取得
    articles = fetch_recent_articles(user_id)

    # CSVファイルに書き出し
    write_to_csv(articles, output_file)
    print(f"データが {output_file} に書き出されました。")


if __name__ == "__main__":
    main()
```

```bash
$ python src/main.py 
データが qiita_articles.csv に書き出されました。
```

実行後、カレントディレクトリに `qiita_articles.csv` というCSVファイルが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/09e4ae75-c0b2-5b15-70ec-c7f7a387ca13.png)


より多くの記事を対象にする場合は、下記のように取得する記事数を明示的に指定してください。
※デフォルトでは10件取得します。

```python
# 記事データを取得
articles = fetch_recent_articles(user_id, 20)
```


# 参考にしたもの

https://qiita.com/api/v2/docs

https://qiita.com/fkooo/items/250f42a0b641fb96b5ff

https://qiita.com/r1e/items/94902fc0e686e59cb8c5

https://qiita.com/skup/items/5a1ae01b4ae4ab854a4e

https://qiita.com/yasushi-jp/items/5f10d5dcf21af07085a4

https://qiita.com/nishikyon/items/bf27c4e6ce7170931ec3

https://qiita.com/Ki2neudon/items/49f91a59b218b6a95478

https://qiita.com/jyunji_watanabe/items/c06c09b1fd539ab36b38

https://harinez2.hateblo.jp/entry/qiita_api_by_python