Qiitaいいね数ランキングAPIの作成

# TL;DR
[QiitaAPI](https://qiita.com/api/v2/docs)、[Google Apps Script](https://www.google.com/script/start/)、[Glitch](https://glitch.com/)、[Firebase](https://firebase.google.com/)を利用して、[Qiitaいいね数ランキングAPI](https://github.com/zonbitamago/qiita-scraiping)を作成しました。
ご活用ください！

```
https://us-central1-qiita-trend-web-scraping.cloudfunctions.net/qiitaScraiping/{type}/{YYYY-MM-DD}
```
### {type}

- daily・・・日別ランキング
- weekly・・・週別ランキング

### {YYYY-MM-DD}
ランキング登録日。
※2018/9/23以降が取得可能。

#####e.g.)
- URL<br>
https://us-central1-qiita-trend-web-scraping.cloudfunctions.net/qiitaScraiping/weekly/2018-09-23
- Response <br>

```json
{
  "data": [
    {
      "updated_at": "2018-09-19T12:29:34+09:00",
      "url": "https://qiita.com/mikan3rd/items/ba4737023f08bb2ca161",
      "user": {
        "items_count": 24,
        "name": "",
        "followees_count": 19,
        "id": "mikan3rd",
        "website_url": "https://www.wantedly.com/users/809162",
        "github_login_name": "mikan3rd",
        "profile_image_url": "https://avatars2.githubusercontent.com/u/27764298?v=3",
        "followers_count": 71,
        "location": "Tokyo",
        "twitter_screen_name": "mikan_the_third",
        "organization": "",
        "permanent_id": 178077,
        "facebook_id": "",
        "linkedin_id": "",
        "description": "文系から転職したエンジニア2年生。\r\nReactとPythonがちょっと書ける"
      },
      "id": "ba4737023f08bb2ca161",
      "tags": [
        {
          "versions": [],
          "name": "Python"
        },
        {
          "name": "Instagram",
          "versions": []
        },
        {
          "name": "GoogleCloudPlatform",
          "versions": []
        }
      ],
      "created_at": "2018-09-17T21:12:27+09:00",
      "title": "[2018] 個人でも使える！おすすめAPI一覧",
      "likes_count": 1209
    },
    {
      "url": "https://qiita.com/tkrkt/items/2fc9a9a59ce679aab728",
      "user": {
        "facebook_id": "",
        "linkedin_id": "",
        "description": "趣味エンジニアです。",
        "items_count": 15,
        "name": "",
        "followees_count": 4,
        "id": "tkrkt",
        "website_url": "",
        "github_login_name": "tkrkt",
        "profile_image_url": "https://qiita-image-store.s3.amazonaws.com/0/60243/profile-images/1473695175",
        "followers_count": 34,
        "location": "",
        "twitter_screen_name": null,
        "organization": "",
        "permanent_id": 60243
      },
      "id": "2fc9a9a59ce679aab728",
      "tags": [
        {
          "versions": [],
          "name": "コメント"
        },
        {
          "name": "VSCode",
          "versions": []
        }
      ],
      "created_at": "2018-09-20T21:19:45+09:00",
      "title": "なぜ我々はいまだに文字列でコメントを書いているのか",
      "likes_count": 909,
      "updated_at": "2018-09-21T18:34:38+09:00"
    },
    {"以下略"}
  ]
}
```

# はじめに
情報収集するにあたっていつもこの記事を読んでいます。お世話になってます！
[【毎日自動更新】Qiitaのデイリーストックランキング！ウィークリーもあるよ
](https://qiita.com/takeharu/items/bb154a4bc198fb102ff3)

記事を読んでいるうちにふと考えました。これはどうやってランキングを作ってるんだ？？
なので、学習も兼ねて車輪の再発明を行うことにしました。
(参考：[「車輪の再発明」を否定するのは間違っているかもしれない](https://qiita.com/BlueEventHorizon/items/20cbfa92b0a1a7c25aea))

# 目標
今回はとりあえず以下を目標とします。

-  無料サービスのみ利用する
-  ランキングが自動更新される
-  (せっかくなので)WebAPI化

# QiitaAPI
何はともあれ、Qiitaのデータを集計し、ランキングを作成しなければいけません。**Qiitaの全てのページを確認するのは現実的ではありませんので**、[QiitaAPI](https://qiita.com/api/v2/docs)をスクレイピングすることとします。
特定の日付で作成された記事の一覧を取得し、いいね数で並べ替え、ランキングデータを構築します。

# GoogleAppsScript
QiitaAPIをスクレイピングしランキングを自動更新する必要があるので、ジョブスケジューラの用に自動で起動する物が必要です。**無料で利用でき、cronのように動かせるもの**を探したところ、[Google Apps Script](https://www.google.com/script/start/)と出会いました。
こちらを活用し、とりあえずランキングデータは2時間置きに更新することとします。

# Firebase
とりあえず無料で何かを作るのであれば[Firebase](https://firebase.google.com/)が楽です。
そのうち、今回は以下が利用しやすそうです。

- [Cloud Functions](https://firebase.google.com/products/functions/)<br>
→WebAPIのエンドポイントとして利用。
- [Cloud Firestore](https://firebase.google.com/products/firestore/)<br>
→自動更新したデータの保存先として利用。

ここまでの情報を組み合わせると、以下のような構成となります。
![scraiping-flow_1.png](https://qiita-image-store.s3.amazonaws.com/0/202800/eba366df-b667-830c-8dee-6d4eea42e278.png)

ただし、ここで**CloudFunconsの無料枠ではGoogle以外のサービスにリクエストを投げることができない**という題点が発生しました。

#Glitch
上記の問題点を解消するために、[Glitch](https://glitch.com/)という無料のNode.jsサーバを活用します。
GlitchからQiitaAPIを呼び出し、データを整形した後にCloudFunctions経由でデータを登録します。

#完成形
ここまでで全て無料サービスでシステムをまとめ上げることができました。
上記を全てまとめると、以下のようになります。
![scraiping-flow.png](https://qiita-image-store.s3.amazonaws.com/0/202800/bfb2733c-16e6-40e8-9e24-146db950aef8.png)
![getAPI-flow.png](https://qiita-image-store.s3.amazonaws.com/0/202800/135a679e-e54a-6a19-cad4-45e01934984b.png)

#終わりに
無料のWebサービスのみの組み合わせでWebAPIが作成できました。
また、これを使って[Qiita-Trend-PWA](https://qiita-trend-pwa.now.sh/)というサイトを作りました。
無料のサービスを組み合わせると割と何でもできます。

みなさんも無料サービスを是非ご活用ください！

#参考
- [【毎日自動更新】Qiitaのデイリーストックランキング！ウィークリーもあるよ
](https://qiita.com/takeharu/items/bb154a4bc198fb102ff3)
- [「車輪の再発明」を否定するのは間違っているかもしれない](https://qiita.com/BlueEventHorizon/items/20cbfa92b0a1a7c25aea)