自分の投稿したQiita記事のPV数をAPIで取得する

# TL;DR

* 自分の投稿した記事のPV数を知りたい
* 個々のページを見れば確認できるが、できれば一括で取りたい
* Qiita APIを使おう


# 投稿したエントリのPV数について

自分が投稿した記事を見ると、PV数が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/aa9cfc11-156c-25fc-c967-8a40b55faf96.png)

見れるのは、自分が投稿した記事だけみたいですよね。

それはそうとして、これをなんとかして一括で取れないものだろうか、と。


# Qiita API v2

これを実現するには、Qiita APIを使えばよいみたいです。

[Qiita API v2 ドキュメント](https://qiita.com/api/v2/docs)

"投稿"に関するAPIを使えば、page_views_count（閲覧数）として取得することが可能なようです。

[投稿](https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF)

調べてみると、いくつか同じようなことをしている記事もあったのですが、ここは勉強を兼ねて自分で書いてみたいと思います。

お題は、Pythonで。

利用するQiita APIは、以下の2つです。

* [認証中のユーザの記事の一覧を作成日時の降順で返すAPI](https://qiita.com/api/v2/docs#get-apiv2authenticated_useritems)
* [記事を取得するAPI](https://qiita.com/api/v2/docs#get-apiv2itemsitem_id)

# アクセストークンの取得

最初に、アクセストークンを取得します。

「設定」 → 「アプリケーション」から、アクセストークンを発行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/79660208-76ec-6b95-ff0b-0359ecd54b96.png)

スコープは、今回は`read_qiita`があれば良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/2f603446-9409-263f-c1ff-a72d58df6e97.png)

ここで取得したトークンの値を覚えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/acec1b6e-8e51-6380-c309-be7428cbe7b7.png)

作成したアクセストークンは、一覧としては確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/52cde947-2606-6f8c-43b4-a43331ca2e74.png)


# 環境

今回の環境は、こちらです。

```shell
$ python3 -V
Python 3.6.8
```

HTTPのリクエストには、[Requests](https://requests.readthedocs.io/en/master/)を使うことにします。

```shell
$ pip3 install requests
```

使用したRequestsのバージョンは、こちらです。

```shell
$ pip3 freeze
...
requests==2.22.0
...
```

# ソースコード

では、PV数を取得するソースコードを作成します。

こんな感じで作りました。

* 自分が投稿した記事のPV数を取得し、結果を表示する
    * PV数、タイトル、URL、タグ、作成日時を表示
* 表示は、PV数の降順に行う
* Qiita APIの呼び出し時には、`Authorization`ヘッダーでアクセストークンを付与する
* APIの呼び出し後には、スリープを入れる

get_qiita_item_pv.py

```shell
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()

        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"]

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

        sleep(sleep_time)

    page += 1

    sleep(sleep_time)

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

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

PV数は、記事一覧のAPIでは取得できなくて（APIドキュメントを見ると取れそうな雰囲気はあるのですが…）、実際には記事個別のAPIを呼び出す必要があります。この時に、認証情報（要はアクセストークン）が必要になります。

# 実行

では、自分のアカウントでこのスクリプトを動作させてみます。

こんな結果になりました。

```shell
$ python3 get_qiita_item_pv.py 
page_view: 6154
  title: Ubuntu Linux 18.04 LTS / 18.10でOpenJDK 11を使いたい
  url: https://qiita.com/charon/items/af0f0de2ae9adbc03bfe
  tags: ['Java', 'Linux', 'Ubuntu']
  created_at: 2018-11-19T13:03:18+09:00

page_view: 3846
  title: プロキシ環境下でdocker buildしたい
  url: https://qiita.com/charon/items/d8365d610343d64d598e
  tags: ['Docker']
  created_at: 2019-01-04T11:29:29+09:00

page_view: 1826
  title: 初めてのZeroMQ（Python）でREQ-REPパターン
  url: https://qiita.com/charon/items/bdbef40fca6fa89edb24
  tags: ['Python', 'ZeroMQ']
  created_at: 2019-04-09T16:32:42+09:00

page_view: 1735
  title: Apacheのアクセスログを、FluentdでtailしてElasticsearchに放り込む
  url: https://qiita.com/charon/items/86d12ac7ca2d7cf6c580
  tags: ['Apache', 'Fluentd', 'Elasticsearch', 'Kibana']
  created_at: 2018-12-12T09:09:26+09:00

page_view: 1613
  title: Stack Overflowクローン、Scooldを使ったQAサイト
  url: https://qiita.com/charon/items/cacc2cfac380d8ad46b9
  tags: ['Java', 'AdventCalendar']
  created_at: 2018-12-11T14:34:57+09:00

page_view: 1385
  title: Docker Composeで起動したコンテナのログを、Amazon CloudWatch Logsに送る
  url: https://qiita.com/charon/items/7e2328e5abf7340d32b6
  tags: ['Docker', 'CloudWatch-Logs']
  created_at: 2019-05-07T12:49:04+09:00

〜省略〜
```

自分の書いた記事で、どのようなものが見られているのか、時々見てみると面白いのかもな？と思います。