概要
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データを加工するならコマンドラインを利用するのが良いですよね^^curl
とjq
を利用して取得して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作りたいなぁとか、実装やデプロイ方法もそのうちにまとめたいと思います。