【コピペで出来る】Qiitaの閲覧数・いいね数、手動で確認していませんか...？

# 目次
* はじめに
* この記事をおすすめする人
* Google App ScriptとQiita API Keyの取得の仕方
* システム構成
* 実装編
* 最後に


# 1. はじめに
### 閲覧数・いいね数を手動で確認していませんか...?
自分が書いたqiitaの記事をログインして..記事押して..いいね閲覧数を確認して..
ってめんどくさいですよね...

**でも昨日の書いた記事の反響が気になる！！人へ朗報です！！Qiita APIで手軽に自動化できるんです！**





ゴールは以下のように、
毎朝10時に総閲覧数といいね合計数、ランキング形式で閲覧数順に10位の記事をLINEbotで提供してくれるシステムになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/09bf5dc7-b2db-7eff-b3f1-ace2ecbca743.jpeg" width=50%>



:::note info
**こちらの記事内容の通りにすれば簡単に実現できます**
:::



# 2. この記事をおすすめする人
- 記事の反響の確認を自動化したい人
- Qiita APIを使いたい人
- Google App Scriptを始めて使う人


# 3. Google App ScriptとQiita API Keyの取得の仕方

### Google App Scriotの使い方
※Google App Scriptの使い方を熟知している方は飛ばしてください。


Google App Scriptのはじめ方は[こちら](https://www.astina.co/media/1137/)

定刻通りに設定するトリガーの設定方法は[こちら](https://blog.synnex.co.jp/google/gas-trigger/)



### Qiita API keyの取得方法

まず、ログインしてください。

その後、アイコンボタンから、設定を押してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/da818f5c-ff85-2f0c-64c7-64bc0b19b714.png" width=30%>

その後、アプリケーションを押し、個人用アクセストークンを発行します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/3c368933-7da1-3207-8381-0b186d1031c5.png" width=90%>

その後、トークンの説明を記述し、read_qiitaで発行しましょう。
write_qiitaは自動で記事を投稿できるそうです...(ユースケースが想像つきません。)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/eaeb5596-2adf-7690-02ca-ddb415132486.png" width=80%>



その後API keyが発行されるのでメモしておきましょう。
※API Keyは以後見れなくなるので、必ず控えておきましょう

LINE NotifyのAPI keyを取得するのは[こちら](https://firestorage.jp/business/line-notify/)を参照してください。


これで準備が整いました。



# 4. システム構成


(Gasの機能で定刻時刻をトリガーにします。)
① Qiita APIを用いて、Qiitaの記事を取得
② 各記事を配列に格納
③ 集計した内容を、閲覧数といいね順にソート
④ 処理結果をLINEnotifyに投げ、完了






# 5. 実装編
以下コピペで動きます。
※Qiita API トークンとLINE Notifyのトークンは各自入れてください。

```javascript
function sendViewCount() {
  try {
    // Qiita API のエンドポイント
    const apiEndpoint = "https://qiita.com/api/v2/authenticated_user/items";
    // Qiita API のトークン
    const token = "";
    // LINE Notify のトークン
    const lineToken = "";
    // 今週の月曜日の日付を取得
    const today = new Date();
    const monday = new Date(today.setDate(today.getDate() - today.getDay() + 1));
    const mondayStr = Utilities.formatDate(monday, "JST", "yyyy/MM/dd");
    // Qiita API から自分が投稿した記事の情報を取得
    const options = {
      headers: {
        Authorization: `Bearer ${token}`,
      },
    };
    const response = UrlFetchApp.fetch(apiEndpoint, options);
    const items = JSON.parse(response.getContentText());
    // 総いいね数と総閲覧数
    let totalLikes = 0;
    let totalViews = 0;
    // 集計結果を格納する配列
    const viewCounts = [];
    const likeCounts = [];
    // 各記事の閲覧数といいね数を集計し、配列に格納
    items.forEach((item) => {
      const viewCount = item.page_views_count || 0;
      const likeCount = item.likes_count || 0;
      const title = item.title;
      totalViews += viewCount;
      totalLikes += likeCount;
      viewCounts.push({ title, viewCount, likeCount });
      likeCounts.push({ title, viewCount, likeCount });
    });
    // 集計結果を閲覧数といいね数の降順でソート
    viewCounts.sort((a, b) => b.viewCount - a.viewCount);
    likeCounts.sort((a, b) => b.likeCount - a.likeCount);
    // LINE Notify に送信するメッセージを作成
    var message = `【${mondayStr}】\n`;
    message += `総いいね数: ${totalLikes}\n`;
    message += `総閲覧数: ${totalViews}\n\n`;
    message += "【閲覧数ランキング】\n";
    viewCounts.slice(0, 10).forEach((count, index) => {
      message += `${index + 1}. ${count.title}: ${count.viewCount} views\n\n`;
    });
    message += "【いいね数ランキング】\n";
    likeCounts.slice(0, 5).forEach((count, index) => {
      message += `${index + 1}. ${count.title}: ${count.likeCount} likes\n\n`;
    });
    // LINE Notify にメッセージを送信
    const lineEndpoint = "https://notify-api.line.me/api/notify";
    const lineOptions = {
      method: "post",
      headers: {
        Authorization: `Bearer ${lineToken}`,
      },
      payload: {
        message: message,
      },
    };
    UrlFetchApp.fetch(lineEndpoint, lineOptions);
      } catch (error) {
    Logger.log(`エラーが発生しました: ${error.message}`);
  }
}


```


# 6. 最後に

是非自分なりにカスタマイズしてください！
読んでいただき、ありがとうございました！いいなと思えばいいねお願いいたします！