Posted at

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のアクセストークン] を取得したアクセストークンに置き換えてください。

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でブラウザからアクセスしてみます。



はい。

JSON形式で結果が返ってくるので、見やすくするにのGoogle Chromeの拡張機能「JSON Viewer」を利用しています。それでも、記事本文が含まれているので、見えにくいですね^^

tulios/json-viewer

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

拡張機能のインストールはこちら

https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh


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

取得したJSONデータを加工するならコマンドラインを利用するのが良いですよね^^

curljq を利用して取得してAPIから情報を取得して加工してみます。

トークンはQiita APIと同じくリクエストヘッダーAuthorization で設定することができます。[Qiitaのアクセストークン] はご自身のアクセストークンに置き換えてください。

> 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作りたいなぁとか、実装やデプロイ方法もそのうちにまとめたいと思います。