Qiitaの記事をランダムに読める API / サービス を4時間ぐらいで作った (Firebase/AWS/Docker) (運用費0円※)

※この記事は[cloud.config Tech Blog](https://tech-blog.cloud-config.jp/2019-06-20-random-qiita-api-story/)にも投稿されています。

**百聞は一見に如かず、以下のようなサービスです。(APIをブックマークレットとして使っている例)**

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/3a253898-d08b-41be-6092-d4e722899305.gif)

# なぜ作ったの

昔、**「本屋に行ってランダムに本を選んで気になった章を読む」**という趣味にハマっていました。
これをすると自分の**バイアスなしに~~謎の~~知識(?)を仕入れることができます。**

そんなようなことをQiitaでもやってみたいなと思って作りました。

# 追記

機能追加版を@okadato623さんがつくってくださいました！
こっちの方が圧倒的に便利です。

Qiitaの記事をランダムに読めるAPI / サービス に機能追加してみた
https://qiita.com/okadato623/items/ee2903c8d1e45f70ab61#_reference-0d88b44afb47051e10ca

# エンドポイント

https://us-central1-random-qiita-api-be836.cloudfunctions.net/get

# ブックマークレット

この記事上部のGIFのように、ブックマークをクリックしたらランダムな記事に飛べます。
ブックマークレットの設定方法の解説は → [ブックマークレットの登録方法 - Qiita](https://qiita.com/aqril_1132/items/b5f9040ccb8cbc705d04)

ブックマークのURLを以下のスクリプトにするだけです。

```js
javascript:r=new XMLHttpRequest();r.open("get","https://us-central1-random-qiita-api-be836.cloudfunctions.net/get",!0);r.onload=()=>location.href=JSON.parse(r.responseText).url;r.send();
```

# ウェブサービス

https://random-qiita-api-be836.firebaseapp.com/

<img width="889" alt="Screen Shot 2019-06-18 at 15.18.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/bdff80f6-0d6c-0f53-eb8f-97cddfe5fcd1.png">

# APIの仕様

Qiitaの最新記事10000件からランダムに1つを取得し、その記事のURLを返します。
24時間ごとに対象の最新記事は更新されます。

ご自由に使っても構いませんが、いつサービスを終了させるかわかりません。
この記事の最後にこのサービスのコードのリポジトリのリンクが貼っているのでご自由にどうぞ。

# アーキテクチャ

以下のようなアーキテクチャになっています。
最新記事をJSONファイルとして書き出して、それをFirebase Functionsにコードとしてデプロイしています。
最新記事が含まれるJSONファイルを`require("***.json")`としてJS上で読み込み、APIが叩かれたらランダムに1件のURLを返します。

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/8d17d189-23ed-7d16-e3ae-26b68b17b391.png)

# 公開まで

1. Qiitaから最新記事を取得するスクリプトを書く
2. 最新記事をjsonに書き出すスクリプトを書く
3. 書き出されたjsonからランダムに1件を返すAPIをFirebase Functionsを用いて実装
4. 最新記事をjsonに書き出し、Firebaseにデプロイするコンテナ(Dockerfile)を作成
5. ECR(コンテナレジスタ)に4のコンテナをプッシュ(登録)
6. ECS(コンテナ動かすマン)にタスクを設定して定期的にコンテナを実行(最新記事を取得してデプロイ)するように設定
7. お茶 :tea: を飲む

作業時間は合計で4時間ぐらい。ECSのタスクケジュールの設定でかなり詰んだ。
~~ちなみにこの記事の執筆に1時間弱~~

# 費用
**月額ほぼ0円!**
AWSのFargate(vCPU:0.25, メモリ:0.5GB)が1日に約10分動きます!=ほぼ無料 (月間稼働時間5時間)
Firebase関係は今の所Freeで運用できています。(数百万件叩かれなければ大丈夫なはず)
ECR(コンテナレジストリ)はおそらく年間で0.**円ぐらいでしょう。(計算してない)

# GitHubレポジトリ

スターをつけられると嬉しいです!
1つ目はすべてのコードもろもろ、2つ目は取得するだけのスクリプトだけが載っているリポジトリです。

- [redshoga/random-qiita-api: Qiitaの最新の10000件の記事からランダムでURLを取得するAPI](https://github.com/redshoga/random-qiita-api)
- [redshoga/random-qiita: Qiitaの最新の10000件からランダムでURLを取得するスクリプト](https://github.com/redshoga/random-qiita)

# 最後に実際に自分つかってみて
わりと知らない記事がでてきて面白いです。
あと最新記事にはスパムが多いですね。

触ってみて見つけた隠れた良記事(一部のみ)

- [ngrok大好きな私がServeoで感動した話 - Qiita](https://qiita.com/sskmy1024y/items/8395c85d09931d7dea27)
- [図で解説するSPAとPWA/AMPの初心者向け資料(SPAとPWA/AMPってなに？) - Qiita](https://qiita.com/namizatop/items/3c8a6efd9054cdf380f9)
- [ブラウザのfaviconキャッシュを消す - Qiita](https://qiita.com/qoAop/items/5b76bb09e4cab83dbc87)
- [FetchAPIの詰まりどころ - Qiita](https://qiita.com/xx2xyyy/items/d1b47477b1eeb1d67a40)
- [JavaScript で配列の shallow copy をする better な方法 - Qiita](https://qiita.com/grasso0210/items/e150ddfad5ab66f0ff86)
- [AlibabaCloud AWS Azure GoogleCloudPlatform サービス早見表 - Qiita](https://qiita.com/tagucchan/items/462a73846d123a5d88c3)
- [AIが「今日の占いカウントダウン」を占ってみた - Qiita](https://qiita.com/pen_era/items/affb7df596b89509b667)
- [【コーヒー】量子コンピュータでコーヒーブレンド最適化 - Qiita](https://qiita.com/YuichiroMinato/items/d3119e6f5b8d5cb6767c)
- [Amazon Personalizeでやらかさないための使い方とLamdbaでの使用方法 - Qiita](https://qiita.com/thimi0412/items/15ef2c22646634804034)

# 参考記事
- [Qiita API v2ドキュメント - Qiita:Developer](https://qiita.com/api/v2/docs#get-apiv2items)
- [GithubやQiitaに載せるgif形式の動画を作成する方法 - Qiita](https://qiita.com/syamaoka/items/4d4054cd75df00460925)

# 宣伝

**以下のイベントは終了しました。参加していただいたみなさんありがとうございました。**

以下のイベント(6/27(木)19:30~)でしゃべります。(Vue,Nuxt,Firebase,Stripeのお話)
~~いまから頑張って資料作ります~~
現状イベント満席になっていますが、当日キャンセル大量発生するものなのでいまから登録ならまだ間に合います！(たぶん)

**1時間でまるわかり！決済Webアプリ開発徹底解説！【Vue.js+Nuxt.js+Firebase】 - connpass**
https://dev-neko.connpass.com/event/135052/

<img width="723" alt="Screen Shot 2019-06-20 at 15.25.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/a320ff2b-1109-cd4e-c970-e34b7cd43b73.png">