Qiita APIを利用して記事のViewsとストック数がまとめて取得できるAPIを作ってみた

# 概要

Qiita APIを利用すると簡単に記事情報が取得できるのですが、記事のViewsやストック数は個別で取得する必要があり不便だったので、それらを含めて取得できるAPIを作ってみました。

Qiita APIについては公式ドキュメントを参考にしました。
https://qiita.com/api/v2/docs

ついでに以下の環境でデプロイ・利用ができるようにしました。
言語はPythonになります。

- ローカル(コマンドライン実行)
- AWS Lambda
- Google Cloud Functions

ソースはGitHubに置いていますので、よければご参考ください。
デプロイ・利用方法も簡単にですが、READMEにまとめています。

kai-kou/extend-qiita-items-api
https://github.com/kai-kou/extend-qiita-items-api

## 利用方法

今回はAWS LambdaとAPI Gatewayには無料枠が設定されているので、それを利用して、関数をデプロイして、APIのエンドポイントを作成しました。

無料枠を超えたら消しますが、それまではご自由にお試しください^^

AWS Lambda 料金
https://aws.amazon.com/jp/lambda/pricing/

Amazon API Gateway の料金
https://aws.amazon.com/jp/api-gateway/pricing/

## 注意点

本記事で紹介しているAWS Lambdaのエンドポイントを利用する場合、アクセストークンを含める必要があるため、アクセスログなどにアクセストークンが含まれてしまいます。**下手に権限がついていると悪用される恐れがありますので、**不安に思われる方は、ご自身で環境構築されることをおすすめします。または試用後、すぐにアクセストークンを削除ください。

#### Qiitaでアクセストークンを取得する

Qiita APIから記事のViewsを取得するには認証されている必要があります。
そのため、ご自身のQiitaアカウントでアクセストークンを発行してください。

**スコープは「read_qiita」が必要になります。他の権限はつけないでください。**

Qiita アクセストークンの発行
https://qiita.com/settings/tokens/new

#### URLの設定

下記URLの```[Qiitaのアクセストークン]``` を取得したアクセストークンに置き換えてください。

```sh
https://l0lnp1f6p2.execute-api.ap-northeast-1.amazonaws.com/default/extend_qiita_api?token=[Qiitaのアクセストークン]&page=1&per_page=20
```

利用できるパラメータは以下となります。

- Token(必須): Qiitaのアクセストークン
- page: 取得するページ数(1から100、初期値: 1)
- per_page: 1度に取得する記事数(1から100、初期値: 20)


#### ブラウザからアクセスする

設定したURLでブラウザからアクセスしてみます。
<img width="1277" alt="スクリーンショット_2018-10-06_11_47_23.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/9648ced9-6953-ef5e-ae69-69426c0a8840.png">
はい。
JSON形式で結果が返ってくるので、見やすくするにのGoogle Chromeの拡張機能「JSON Viewer」を利用しています。それでも、記事本文が含まれているので、見えにくいですね^^

tulios/json-viewer
https://github.com/tulios/json-viewer

拡張機能のインストールはこちら
https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh


#### コマンドラインから取得する

取得したJSONデータを加工するならコマンドラインを利用するのが良いですよね^^
```curl``` と```jq``` を利用して取得してAPIから情報を取得して加工してみます。
トークンはQiita APIと同じくリクエストヘッダー```Authorization``` で設定することができます。```[Qiitaのアクセストークン]``` はご自身のアクセストークンに置き換えてください。

```sh
> curl -sSLH "Authorization: Bearer [Qiitaのアクセストークン]" \
  "https://l0lnp1f6p2.execute-api.ap-northeast-1.amazonaws.com/default/extend_qiita_api?page=1&per_page=20" \
　　| jq -r ".[] | [.title, .comments_count, .likes_count, .page_views_count, .stockers_count] | @csv"

"Google Cloud Buildを利用してUnity ML-AgentsのDockerイメージを作成する(v0.5.0対応)",0,2,248,2
"PythonのPyYAMLでJSON形式の文字列が読み込めたのが不思議で調べてみた",0,1,162,0
"iPhoneでMarkdown書きたい欲求に答えてくれそうなアプリを見つけた",0,7,268,4
"Google Cloud Functions(Python)からCloud Buildでビルド実行してみる",0,4,227,2
"Vue.js+TypeScriptのコンポーネントのクラス定義ミスでハマった話",0,0,481,2
"別docker-compose同士のネットワークを繋げる方法",0,1,334,4
"Google Cloud Functions(Python)からGoogle Kubernetes Engine(GKE)のジョブを登録する",0,1,219,0
"api blueprint関連記事まとめ",0,1,241,0
"Google Kubernetes EngineでUnity ML-Agentsを動かしてみる(V0.5.0対応)",0,4,432,6
"Vue.js+TypeScriptでElement-ui利用時に単体テストが完了しなくて悩んだ話",0,2,1640,2
"Unity ML-Agents関連の記事まとめ",0,4,279,5
"Cloud FunctionsでPython利用記事まとめ",0,2,277,2
"Vue.jsのerrorHandlerがいまいちつかめない",5,1,299,3
"api blueprintでData Structuresを利用する際の注意点",0,2,136,1
"Dockerとapi blueprint+aglio+drakovを使ってAPI開発を楽にする",0,0,362,0
"Vue.jsでVuex+axiosを利用してAPIを叩く",0,10,2274,9
"api blueprintとdrakovを利用してAPIモックサーバを立ち上げる",0,3,226,0
"Vue.js+TypeScriptで開発するときの参考記事まとめ",0,108,5884,144
"api blueprintとaglioを利用してAPI仕様書を作成する",0,1,194,1
"Vue.js+TypeScriptのテストでRouterLinkがないって怒られたときの対応",0,3,1656,3
```

はい。
```jq``` コマンドを利用するとJSONから値を抜き出したり、集計・整形ができて便利です。詳しくは下記が参考になります。

jq コマンドを使う日常のご紹介
https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af

## 利用制限

Qiita APIをアクセストークンを用いて認証された状態で利用していますので、API利用が「1時間に1000回」という制限があります。
本APIではViews、ストック数取得のために、下記のようにAPIを利用していますので、20記事を取得する場合、トータルで41回APIを利用することになります。

- 認証ユーザーの記事リストを取得: ```GET /api/v2/authenticated_user/items``` (1回)
- Views取得のため記事情報を再取得: ```GET /api/v2/items/:item_id``` (20回)
- 記事ごとのストックユーザー情報を取得: ```GET /api/v2/items/:item_id/stockers``` (20回)

https://qiita.com/api/v2/docs#%E5%88%A9%E7%94%A8%E5%88%B6%E9%99%90

> 認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。

## 参考

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

AWS Lambda 料金
https://aws.amazon.com/jp/lambda/pricing/

Amazon API Gateway の料金
https://aws.amazon.com/jp/api-gateway/pricing/

jq コマンドを使う日常のご紹介
https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af


## まとめ

Qiita APIでViews、ストック数が取得できない！ｷｰ！っとなって勢いで作ってみましたが、実装2時間、デプロイ環境構築3時間と、比較的簡単に作成することができました。各環境にデプロイするのにハンドラーを実装が地味に手間でした。

ざくっと作成したので、Qiita APIから返されるヘッダー情報を含んでいないことに今更気がついたり、Web UI作りたいなぁとか、実装やデプロイ方法もそのうちにまとめたいと思います。