【Python】Qiita投稿記事の総閲覧数をAPI使って自動集計


自分のQiita記事の総閲覧数を知りたい!!

Qiitaの投稿記事の閲覧数は投稿者のみ記事ごとに確認できます。
なので、自分の投稿の総閲覧数を知るには全ての記事に移動して、電卓で計算すればOKです!

  
  
  
以上です。


  
  
  
  
  
と1年前の私ならその通りに計算したことでしょう。

しかし、エンジニアになってもう1年も経ってしまったので
そんな原始人みたいなやり方は許されません。

APIを使えば取得できるというのは知っていたので調べてやってみました。

たくさんの記事が出てきましたが、
総閲覧数に関する記事は1つも見つけられませんでした。

最終的には、下記リンクのように
GASを使って定期的に自動集計し、オレオレアナリティクスを完成させたいです。

【Qiita API】いいね!閲覧数の自動集計 ←すごい記事

コード


20190208 追記
ちょうど100記事だとexcept通らずに抜けるので
追記しました。


import requests
import json
import math
from msvcrt import getch

USER_ID = 'あなたのQiitaID'
PER_PAGE = 20
allViews = 0

headers = {"content-type": "application/json",
           'Authorization': 'Bearer あなたのアクセストークン'}

# リクエスト送って総投稿数が含まれたjsonをぶち込む
url = 'https://qiita.com/api/v2/users/' + USER_ID
res = requests.get(url, headers=headers)
json_qiita_info = res.json()

# 投稿数をjsonから引っ張り出す
items_count = json_qiita_info['items_count']

# ページ数を計算
page = math.ceil(items_count / PER_PAGE)

print('|記事タイトル|View数|いいねカウント|')

# 投稿記事を全て取得
for i in range(page):

    # リクエスト送ってそれぞれの記事の情報が含まれたjsonをぶち込む
    url = 'https://qiita.com/api/v2/authenticated_user/items' + \
        '?page=' + str(i + 1)
    res = requests.get(url, headers=headers)
    json_qiita_info = res.json()

    for j in range(PER_PAGE):
        try:
            # IDをjsonから引っ張り出す
            item_id = json_qiita_info[j]['id']

            # リクエスト送って指定したIDの記事のView数が含まれたjsonをぶち込む
            url = 'https://qiita.com/api/v2/items/' + str(item_id)
            res = requests.get(url, headers=headers)
            json_view = res.json()

            # View数をjsonから引っ張り出す
            page_view = json_view['page_views_count']

            # 加算代入して総View数とする
            allViews += page_view

            # タイトル、いいね数、View数の順に表示
            print('| ' + json_qiita_info[j]['title'] + ' | ' +
                  str(json_qiita_info[j]['likes_count']) + ' |' +
                  str(page_view) + ' |')

        except IndexError:
            print('View総計:' + str(allViews))
            print('出力完了')
            getch()
            break

#ちょうど100記事だとexcept通らずに終わる
print('View総計:' + str(allViews))
print('出力完了')
getch()

実行結果

それぞれの記事のタイトル、いいね数、View数が表示され、最後に総閲覧数がドン!です。

つまった箇所

View数はGETリクエストだけでは取得できない

調べていると、「アクセストークンなしのGETリクエストだけで記事の情報が取得できました!」
という情報がチラホラあったので、
「閲覧数もアクセストークン使わないGETリクエストだけで完結するんだろな~」と思ってました。

また、Qiita API v2の公式ドキュメント(GET /api/v2/items)にもフィールドに存在している値に
"page_views_count"というのがあったのでそれを取得して終了。。。
と思ってましたがダメでした。

画像のようにNoneが返ってきます。

よく考えたら各記事のView数ってその記事を書いた本人でしか確認できないので
ただのGETリクエストでは取得不可なのは当たり前と言えば当たり前でした。

正しいView数の取得方法は
GETリクエストにアクセストークンを含めたリクエストボディを利用する
だという認識で理解しました。
(※この辺の認識は曖昧なので間違いあればご指摘ください)


以下、Qiita API v2の公式ドキュメントより引用

パラメータ
API v2へのリクエストには、GET、POST、PUT、PATCH、DELETEの5種類のHTTPメソッドを利用します。多くのAPIへのリクエストにはパラメータを含められますが、GETリクエストにパラメータを含める場合にはURIクエリを利用し、それ以外の場合にはリクエストボディを利用します。パラメータには、ページネーション用途など任意で渡すものと、投稿時の本文など必須のものが存在します。APIドキュメントには、各APIごとに送信可能なパラメータが記載されています。

ページング

APIを使うまでは「ページングって何?」って状態だったので
そこそこ時間使いました。

ページングという言葉の通り、
本をめくってそのページの情報を調べる
という工程の本をめくる...の実装が必要ということです。

   # リクエスト送ってそれぞれの記事の情報が含まれたjsonをぶち込む
    url = 'https://qiita.com/api/v2/authenticated_user/items' + '?page=' + str(i + 1)
    res = requests.get(url, headers=headers)
    json_qiita_info = res.json()

ページング対応の箇所がわかり易いように分けて表記してます。
'?page=' + str(i + 1)の箇所です。
指定したインデックスのページに対してリクエストを送信しているだけです。

文字列での指定

これに一番時間を使ってしまいました。
半角の空白スペースが含まれていることに気付かなかったり、
文字列の末尾に\が不足していたり。。。などでエラーが返ってきてしんどかったです。
さらに、文字列はオートインデント機能の修正範囲外なので
最初にそのミスに気付くまでが非常に長かったです。。。

参考にさせて頂いたリンク集

Qiita APIをPythonから使ってみる
Qiita API v2 を使って投稿一覧を取得する
[Python] Qiita APIを使って投稿一覧を取得する + 2018年の振り返り