Qiitaの自分の全ての投稿情報をダウンロードするPythonスクリプト

### はじめに
Qiitaに投稿した自分の記事を見直し、どんな記事がよく見られているのか分析したくなる時があります。マイページを見れば済む話ではありますが、それでは芸がありません。エンジニアらしく、QiitaAPIを利用することで、投稿情報をまとめて取得することを目指します。

### 環境
Windows10 home
python 3.7.9

### 前準備：アクセストークンの発行
アクセストークンの発行はこちらから → [アクセストークンの発行 - Qiita](https://qiita.com/settings/tokens/new)

アクセストークンの説明を適当に付けて、スコープが 「read_qiita」になっていることを確認して、「発行する」ボタンを押します。アクセストークンの文字列はコピーして、メモ帳などに貼っておきます。後で使います。

![アクセストークン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/009b8d5d-1eef-1328-40af-980a1d01bc81.png)

### サンプルコード

```get_qiita_item.py
from time import sleep
import requests

access_token = "先ほどメモ帳に貼っておいたアクセストークン"

item_list_base_url = "https://qiita.com/api/v2/authenticated_user/items"
headers = { "Authorization": f"Bearer {access_token}" }

page = 1
per_page = 100

sleep_time = 0.1

page_views = []

while True:
    item_list_url = f"{item_list_base_url}?page={page}&per_page={per_page}"

    items = requests.get(item_list_url, headers = headers)
    items_body = items.json()

    if not len(items_body):
        break

    for entry in items_body:
        item_id = entry["id"]

        item_url = f"https://qiita.com/api/v2/items/{item_id}"

        item = requests.get(item_url, headers = headers)
        item_body = item.json()

        print(f"Get infos: {item_body['title']}")

        title = item_body["title"]
        url = item_body["url"]
        tags = item_body["tags"]
        created_at = item_body["created_at"]
        page_views_count = item_body["page_views_count"]
        lgtm = item_body["likes_count"]

        page_views.append({
            "title": title,
            "url": url,
            "tags": [ tag["name"] for tag in tags ],
            "created_at": created_at,
            "page_views_count": page_views_count,
            "lgtm": lgtm
        })

        sleep(sleep_time)

    page += 1

    sleep(sleep_time)

page_views.sort(key = lambda e: e["page_views_count"], reverse = True)
print()

for page_view in page_views:
    print(f"""page_view: {page_view['page_views_count']}
LGTM: {page_view['lgtm']}
title: {page_view['title']}
url: {page_view['url']}
tags: {page_view['tags']}
created_at: {page_view['created_at']}""")
    print()
```

### 仮想環境作成&モジュールのインストール

```
python -m venv venv
.\venv\Scripts\activate
pip install requests
```

### 実行例

```
python get_qiita_item.py
```

```
Get infos: 異常検知手法でサイゼリヤの間違い探しを攻略したい
Get infos: [VS Code] Pythonの venv 環境をデフォルトで読み込む
Get infos: VS CodeでMarkdownをHTMLに変換する(Github Style)

...
...

page_view: 862
LGTM: 3
title: Javascriptによるキーイベント受け取りのテストコード
url: https://qiita.com/youichi_io/items/bf7ad918ec81ba5d9588
tags: ['HTML', 'JavaScript']
created_at: 2021-06-19T17:46:38+09:00

page_view: 818
LGTM: 2
title: matplotlibでxticklabelsの色を個別に設定する
url: https://qiita.com/youichi_io/items/8e43d606824526444d2d
tags: ['Python', 'bar', 'matplotlib', 'xticklabels']
created_at: 2020-07-05T23:18:07+09:00

page_view: 724
LGTM: 12
title: 異常検知手法でサイゼリヤの間違い探しを攻略したい
url: https://qiita.com/youichi_io/items/83a230d1a9de73e63dac
tags: ['Python', '異常検知', 'AnomalyDetection']
created_at: 2021-12-05T16:09:48+09:00

...
...
```

page_viewが多い順に並び変えて表示しています。LGTM、タイトル名、タグ、公開時間などの情報を見ながら、どうすれば多くの人に参考にしてもらえるか考えてみるのも面白いですね。

投稿記事のストック数も取得したかったですが、方法がよくわかりませんでした。ちなみに、このエンドポイント( GET /api/v2/authenticated_user/items )をたたいて取得できる情報を示します。長いので折りたたみます。


<details><summary>取得情報一覧</summary><div>

- rendered_body
 - HTML形式の本文
 - Example: "\<h1>Example\</h1>"
 - Type: string
- body
 - Markdown形式の本文
 - Example: "# Example"
 - Type: string
- coediting
 - この記事が共同更新状態かどうか (Qiita Teamでのみ有効)
 - Example: false
 - Type: boolean
- comments_count
 - この記事へのコメントの数
 - Example: 100
 - Type: integer
- created_at
 - データが作成された日時
 - Example: "2000-01-01T00:00:00+00:00"
 - Type: string
 - Format: date-time
- group
 - Qiita Teamのグループを表します。
- id
 - 記事の一意なID
 - Example: "c686397e4a0f4f11683d"
 - Type: string
 - Pattern: /^[0-9a-f]{20}$/
- likes_count
 - この記事への「LGTM！」の数（Qiitaでのみ有効）
 - Example: 100
 - Type: integer
- private
 - 限定共有状態かどうかを表すフラグ (Qiita Teamでは無効)
 - Example: false
 - Type: boolean
- reactions_count
 - 絵文字リアクションの数（Qiita Teamでのみ有効）
 - Example: 100
 - Type: integer
- tags
 - 記事に付いたタグ一覧
 - Example: [{"name"=>"Ruby", "versions"=>["0.0.1"]}]
 - Type: array
- title
 - 記事のタイトル
 - Example: "Example title"
 - Type: string
- updated_at
 - データが最後に更新された日時
 - Example: "2000-01-01T00:00:00+00:00"
 - Type: string
 - Format: date-time
- url
 - 記事のURL
 - Example: "https://qiita.com/Qiita/items/c686397e4a0f4f11683d"
 - Type: string
- user
 - Qiita上のユーザーを表します。
- page_views_count
 - 閲覧数
 - Example: 100
 - Type: null, integer
- team_membership
 - Qiita Team のチームメンバー情報を表します。

</div></details>


### おわりに
QiitaAPIを利用して投稿情報を取得しました。私は今までこういう視点で自分の投稿記事を分析したことがなかったので、ビュー数・LGTM数ともに散々です。精進します。

### 参考記事

https://qiita.com/charon/items/1d27a0dde1eeafe38910

https://qiita.com/kumarstack55/items/73119fe8b6e43fd4b21f

https://qiita.com/koki_develop/items/853c97829eca51ac6564

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