ODCからQiita APIを使って自分の記事の閲覧数を取得する

ODCのConsume REST APIを使ってQiita APIを呼び、自分の記事の閲覧数を取得してみる。

# 実現イメージ
操作としては、以下の機能を実現する。
1. 画面を開くと、Qiita APIで直近100件分の記事データを取得して表示
1. 取得済みの記事数＜総記事数のとき「次のページを取得」ボタンを表示。クリックすると次の100件を取得してテーブルの最後に追加
1. 必要なだけデータを取得し終わったら「Excelダウンロード」をクリックしてExcelファイルとして取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3d4ae049-5255-5542-c345-6645accf4bca.png)

# Qiita APIの検討
以下のドキュメントを参照する。

https://qiita.com/api/v2/docs

## アクセストークン
APIの種類によって認証・認可が必要なものと不要なものがある。
また、同じAPIでも認証・認可されているか否かでレートリミットが異なってくる。

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

## 使用するAPI
このAPIが良さそう。アクセストークンで認証したユーザーが書いた記事の一覧を取得できる。
> GET /api/v2/authenticated_user/items
認証中のユーザーの記事の一覧を作成日時の降順で返します。

（「GET /api/v2/users/:user_id/items」という似たようなAPIもあるが、「"page_views_count"」項目の値がnullで返ってきたので断念した）

このAPIはページングをするため、以下のようにpage（ページ番号）とper_page（ページサイズ）をクエリストリングとして渡す。
> /api/v2/authenticated_user/items?page=1&per_page=20 

## APIの性質を検討
以下の通り、OutSystemsのConsume REST APIで問題なくアクセスできそう。
- Content-Type: application/json
- ステータスコードは「GETまたはPATCHリクエストに対しては200を」返す
- エラー時は他のステータスコードを取りうる、またエラー時は違うレスポンスフォーマット。今回はテストなのでこの部分は無視しておく

# アクセストークンを取得する
以下の手順で自分のユーザー用のアクセストークンを取得する。同じトークンを再確認できないので発行したら確実に保管しておく。
Qiitaにログインし、以下のページにアクセス。

https://qiita.com/settings/applications

「新しくトークンを発行する」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3b0d659a-f6e3-5d3a-1e70-b91cab5a9add.png)

スコープでは今回必要な「read_qiita」のみをチェックして「発行する」ボタンをクリック。次の画面で表示されるトークンを保存しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5b1be187-3f7e-6397-f613-d5b6b3bfbe62.png)

# Consume REST API
今回は単独のAPIが対象で、swagger.jsonも見当たらなかったので、RESTを右クリック　→　Consume REST API..を選択し、Add single methodのオプションを選択して作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/188f0706-fd92-2c9e-67e8-2a9d096c06bb.png)

## URL
まず、使うAPIのI/Fが「GET /api/v2/authenticated_user/items」であるから、メソッドはGETを選択する。
ドメイン名はqiita.comを使う。またAPIのパラメータとしてpageとper_pageが必要なので、URLは

　https://qiita.com/api/v2/authenticated_user/items?page={Page}&per_page={Per_Page}

となる。{}で囲んでいる部分は、REST API MethodのInput Parameterにするべき部分を指定する書き方。この書き方だと、Input Parameterとして「Page」と「Per_Page」が作成される。

## Headersタブ
このAPIには認証されたユーザーを特定するため、リクエストヘッダーに「Authorization」を渡さないといけない。
また、ページングのために、認証されたユーザーの総記事数が欲しいので、レスポンスヘッダーにある「Total-Count」を取得する。

上記の設定を行うには、ダイアログ中でHeadersタブを選択し、以下のように入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f77dc6ed-7079-0f4f-c80d-9a145844213a.png)

なお、レスポンスヘッダーには、ページング用のリンクが含まれているので、これを使ってページングする方法もありうるが、OutSystemsのロジックからは若干使いにくかったので自前でページングすることにした。

## テスト実行してレスポンスフォーマットを取得
Testタブを開き、各パラメータに以下のテスト値を入力してTestボタンをクリック
- Page: 1 (1ページ目）
- Per_Page: 30（1ページあたり30件）
- Authorization: Bearer <アクセストークン>
 (<アクセストークン>部分は実際の値に置き換える）

APIのレスポンスがResponse test resultに表示されるのでボディ（JSONの部分）をBodyタブにコピーする（一番下にCopy to response bodyボタンがあるのでそれをクリックすればよい）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/121c42bf-27b4-1c88-47ec-95ae5d15796c.png)

ここまでできたらFinishボタンをクリック。

# APIのレスポンスを画面表示用に詰め替えるStructure
どの記事かを示す属性と、目的の記事の閲覧数を示す属性を抜き出すStructure QiitaArticleを定義する。
（左がAPIのResponse、右が定義するStructure。赤枠で囲った属性をそのままStructureにコピーするが、TagItemsだけはListであるため、いったんStructureにコピーした後ロジックで結合し、結果をTagsJoined属性に設定することにする）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6a696059-20d7-eb6e-e690-46706ca954e0.png)

# 画面とロジック
画面イメージは「実現イメージ」のセクション参照。
## アクセストークンはSettingで保持
アクセストークンはセキュアに保つべき情報なので、Is secret=Yesに設定する。この場合、必ずODC Portalで値を設定しないといけない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2fc8186b-9c57-73c2-0477-bd5a8ca0c689.png)

## Data Action
Data ActionでAPIを呼び出す（Bearerの後にスペースが入っている点に注意）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/56be3d74-77c9-085a-7957-3e395ea761ce.png)

ページサイズは固定で100とし、ScreenのLocal Variableで現在のページ数をCurrentPageとして保持している。

CurrentPageは初期値1とする（画面初期表示時に最初の1ページを取得する）。

### On After Fetch
やることは2つ。
1. APIのOutput Parameter TotalCountで最大の記事数がわかるので、記事数から最大のページ数を計算する (今回の例だと218件の記事があったので最大のページ数は3）
1. Data ActionのOutput Parameterを、StructureのList（画面のLocal Variable）に詰め替える。同時にTagItemsをTagsJoinedに設定

## 次のページボタン
クリックすると、Data ActionをRefresh Dataする。
現在のページ < 最大のページ数のときのみクリック可能にする。

## Excelエクスポートボタン
StructureのList（画面のLocal Variable）をRecordListToExcelでExcelファイルに変換し、ダウンロードさせる。

# ちなみに
こんな感じのExcelが取れた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/11e8ae48-2d37-87dc-22c0-5e99fc5af956.png)

自分でQiitaに書いた記事は、2024/8/15時点で
- 218記事
- 一番古い記事は2019/1/1
- 総ページビューは707222
- 最もページビューが多かった記事は、2019/10/8に書いた「(OutSystems)Reactive Web AppとTraditional Webの違い」で19536

意外とページビューがあった。Qiitaの集客力の影響？