QiitaAPI + MessagingAPI + GAS でLINEにQiitaの集計結果を送信してみた

# はじめに
私は日々学んだことをQiitaにまとめるようにしています。
初めてQiitaで記事を書いたのが1年半ほど前。そこからちょこちょこ書くようになりました。

そんな中、「自分が今までに投稿した記事の総viewsってどのくらいなんだろう？」とふと思いました。
そこで今回MessagingAPI + QiitaAPI + GASでQiitaの投稿に関する情報をLINEにプッシュ送信したいと思います。


# 開発したもの
![QiitaBot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381376/74b3a021-7173-85a4-11ca-ab435787fd5f.jpeg)


以下の情報を取得しています。

 - 全記事数
 - 全記事の合計views
 - 全記事のLGTM数
 - 直近の3記事のタイトル・view・LGTM・記事リンク

全記事の集計結果に関してはプッシュメッセージ、直近の3記事に関してはカルーセルテンプレートを用いてLINEにメッセージを送信するようにしています。※限定公開記事も含まれています。
カルーセルテンプレートのアクションにはURIアクションを設定しているので、そこから記事ページに遷移できるようになっています。

GASで実装したので、トリガーを設定して毎週定期実行しています。


# やること（ざっくり）
## チャンネルの作成
MessagingAPIを使うために、チャンネルを用意します。

https://developers.line.biz/ja/docs/messaging-api/getting-started/

## QiitaAPIのアクセストークンの発行をする
こちらからアクセストークンを発行することができます。

https://qiita.com/settings/tokens/new


アクセストークンを発行する際に、`スコープ`というものを指定します。

>個々のアクセストークンには、幾つかのスコープを紐付けられます。スコープはアクセストークン発行時にアプリケーションが指定でき、アプリケーションを利用するユーザはどのスコープが要求されているかを認可画面で確認できます。アクセストークンが適切なスコープを持っているときのみ、APIを介したデータ操作が許可されます。なお、認証が不要なAPIについては、どのスコープも必要としません。本APIでは以下の4つのスコープを提供しています。例えば、read_qiita_teamスコープを持っていないアクセストークンでは、Qiita Teamからデータを読み出すことはできません。また、write_qiitaスコープを持っていないアクセストークンでは、Qiitaに投稿することはできません。
引用元:[QiitaAPI v2 documentation - Qiita:Developer#スコープ](https://qiita.com/api/v2/docs#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)

今回は、Qiitaからアクセストークンに紐づいたユーザに関連したデータを取得したいため`read_qiita`をチェックします。

## コードを書く
今回はタイトルにある通り、GASで実装していきます。


## WebhookURLに登録
GASで実装後ウェブアプリケーションURLを取得し、LINEDevelopersのWebhookURLに登録します。

## GAS トリガー設定
定期実行したい処理の実装が完了したら、トリガーを登録します。
トリガー登録方法については後ほど画像付きで記載します。


# 実装
先程記載した通り、全投稿記事の投稿数・タイトル・view数・LGTMあたりの情報を取得したいと思います。

QiitaAPIv2のドキュメントを見つつ実装していきます。

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

## 認証中のユーザーの記事一覧を取得
`GET /api/v2/authenticated_user/items`
→認証中のユーザーの記事一覧を作成日時の降順で返してくれます。

降順で返してくれるため、特にソートしないで直近の3記事を取得することができます。

ドキュメントを見ると記事タイトルがtitle、LGTMがlikes_count、view数がpage_views_countです。

https://qiita.com/api/v2/docs#get-apiv2authenticated_useritems


投稿記事数は、`GET /api/v2/users/:user_id`のitems_countで取得できそうですが今回記事一覧取得後ループさせるのでその際にカウントしようと思います。

実際にやってみるとなぜかpage_views_countの取得結果がnullとなってしまいます。
記事一覧取得の際に記事のidもわかるので、view数に関してはここで取得したidを用いて、各記事情報から取得したいと思います。


## 各記事情報を取得
`GET /api/v2/items/:item_id`
→記事IDを指定することで、その記事情報を取得します。

先程の認証中ユーザーの記事一覧取得で各記事のidが取得できたので、そちらをitem_id部分に当てはめて再度リクエストを送ります。

https://qiita.com/api/v2/docs#get-apiv2itemsitem_id


## 取得したデータをLINEに送信する
MessagingAPIを用いて、送信します。送信はテキストメッセージとカルーセルテンプレートの2つを送信します。
メッセージの改行は`\n`でできます！

今回のメッセージ送信は特に変わったことをしているわけではないので、こちらの記事を参考にしていただければすぐにできると思います。

https://qiita.com/sasao3/items/2c9594a0e5d120f8e354

https://qiita.com/sasao3/items/c849c7c53be6ab1560f9

## トリガーの設定
実際に実行したい処理をトリガー登録します。
左メニューにある「トリガー」を選択し、右下の「トリガーを追加する」から実行する関数や時間等を設定し保存すればOKです。

![スクリーンショット 2022-03-13 11.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381376/6f8ee393-e221-1b99-5084-b07377d771ec.png)


今回は毎週金曜日の午後8~9時くらいに送信したいと考えているのでこのように設定します。

時間ベースのトリガーのタイプを選択：週ベース
曜日を選択：毎週金曜日
時刻を選択：午後8~9時


# まとめ
今回はQiitaの投稿情報を取得し、毎週結果を伝えてくれるbotを作成してみました。
作ってみたいと思ってから、すぐに形にできた点が良かったと思います。

 - GASを使用したためサーバー周りを自分で準備する必要がなかった
 - MessagingAPIは直近で触っていたため実装イメージがあった
 - フロントはLINEアプリであるためデザインを考える必要がなかった

ここらへんを自分で用意していたらかなり時間がかかっていたと思います。
個人利用する分にはこれで十分なので、もし個人用で何か作りたいという人は、GASやMessagingAPIを検討してみてはいかがでしょうか？


今後は、

 - スプレッドシートに毎週の集計結果を記録する
 - 先週からの増減数の表示

あたりをやってみたいと思っています。

以上です。