uitspitss blog

プログラミングと音楽とエッセイ ※記載内容は個人の見解であり、所属する組織とは一切関係がありません。

GCFでWeb APIを作る

Google Cloud Functions (Firebaseに乗っていない方) です。

あるサイト(後述)をスクレイプした結果をWeb APIとして作ったときのシステム周りの日記です。

f:id:uitspitss:20190427232054j:plain

対象サイト、ページ

気象情報番組、ウェザーニュースLiVEの番組表(タイムテーブル)ページです。

weathernews.jp

上記サイトのスクレイプの技術周りは、Qiitaで1つ記事を書いたので、以下の記事をご参照ください。

qiita.com

解決したかった問題

「今日は、誰が何時からの担当なんだろう?」と思って、上記ページを見に行く行動を3日くらい連続したので、 cron的な処理でGCPに置いて、slackに通知するシステムを作っておこうと思い立ちました。

システム構成

スクレイププログラムを書きながら、スクレイプして結果を返す部分はWeb API的に公開にしてみようと考えてました。

ただ、その公開しているWeb API部分にアクセスされる度にスクレイププログラムが走ると、 スクレイプ対象の更新頻度の割にアクセスしすぎですし、セキュリティ的にもやばそうな感じがしました。 そこで、スクレイプ結果はファイルキャッシュとして、GCSに残しておいて、 公開APIからのアクセスにはそのファイルキャッシュからレスポンスを返すようにしました。

ということで、以下のような構成になりました。

f:id:uitspitss:20190427232054j:plain
構成図

成果物

公開Web API。アクセスすると、json形式でレスポンスがあります。

https://asia-northeast1-develop-187803.cloudfunctions.net/wnl_programs_api

URLが長すぎるので、GCFのhttpエンドポイントのカスタムドメイン化を軽く調べましたが、 redirectで飛ばすしかなさそうだったので、以下のURLで上記Web APIのリダイレクトをする設定をしました。

https://wnl-api.uitspitss.dev/

ただ、出力フォーマットを振り分けをクエリパラメータで振り分けしようと作っていたのですが、 リダイレクト時はクエリパラメータが捨てられちゃいます。 なので、クエリパラメータ付けたい場合は、 以下のようにリダイレクト先のURLにパラメータを付けないといけないです…。

slackに通知した感じはこんな感じです。

f:id:uitspitss:20190428001837p:plain
slackフォーマットをslackに通知した結果(2019/04/27 14:29)

ちなみに、この公開Web APIにアクセスして、slack通知する部分もGCFに置いて Cloud Scheduler で叩いています。 実際に使っているコードは以下です。

github.com

編集後記

ここ1ヶ月ほど、音楽を聴く気分ではないときにウェザーニュースLiVEを見ています。 ほとんどの時間がサブモニターにブラウザを置いて、ラジオ感覚で聴いている事の方が多いですが。 前記事で、桜を見に行ったのも、放送を見ていてキーボードのビルドとタイミングが合いそうだなと思っていたからでした。

見るようになったきっかけは、1ヶ月くらい前、Youtubeでおすすめか何かで、 3、4年前のSOLiVE24時代の「今週の名場面・迷場面」というコーナーの動画があって、 ふらっと見たことでした。

それから、「今週の名場面・迷場面」の動画をいくつかを見て(聴いて)、 Wikipediaの記事を読んだりして、いろんな変遷があったんだなと思いました。

WNIの天気予報は、精度が高く、アプリでも高評価がついていたので、サブスクしましたし、 ウェザーニュースLiVEも合わせて、これからも見続けるかなと思います。

ちなみに、キャスターの誰推しとかはなく、キャスター以外も全員応援しています。 気象予報士の気象モデル解説とか面白いですしね。