Commentどうも、まさとらん(@0310lan)です!今回は、普段からよく利用しているSlackを使って飛行機の料金(最安値)を手軽にチェックできるツールを作成していきましょう!いちいちブラウザを起動してWebサイトを訪問する必要がなく、Slackから簡単なコマンドを入力するだけで最安値を即座に確認できるようになるので便利です。カスタマイズ性も非常に高く、自分の好きなように情報を制御できるようになります。RapidAPI】から検索してみました。】が提供するAPIになります。世界中の航空券について最安値を検索できる機能をAPIで提供しているので、独自のプログラムに組み込んで好きなようにカスタマイズできるのが大きな魅力となっています。APIで本当に飛行機の料金が調べられるのかをテストしてみましょう。そこで、試しに東京(成田空港)から札幌(新千歳空港)までの最安値を調べてみます。RapidAPIの画面下にはAPIをテストできる機能が提供されています。Quotes】を選択してから、以下のパラメータを入力します。出発日(※空港コードは一般的に利用されている英数字の末尾に「-sky」を付与したものです)パラメータが設定できたら【テスト】ボタンをクリックします。すると、【レスポンスボディ】に取得したJSONデータが表示されます。今回の場合だと、以下のように【Quotes】の中に飛行機の料金が格納されているのが分かります。"Currencies":[...]}【MinPrice】の項目が最安値となり、上記の場合だと5730円で東京→札幌に飛行機で行けるという意味になります。Japan(春秋航空)】になります。Quotes】は、Skyscannerがキャッシュしている料金データを参照しているので非常に高速かつ軽快に動作します。Quotes】を使って解説をしていきたいと思います。APIを組み込んで動作確認をしていきましょう!まずは【コードスニペット】タブから自分の使いたいプログラミング言語を選択するのですが、今回はNode.jsのRequestモジュールを選択してみます。【SDKをインストール】ボタンをクリックすると、選択した言語を使ってどのように実装したらいいのかを紹介するガイドが表示されます。あとは、このガイドの通りにプログラムを組み立てれば良いわけです。最初に、今回利用するRequestモジュールをインストールしておきましょう。requestそして、Node.jsからRequestモジュールを使えるようにrequire()を記述しておけば良いですね。APIを使うにあたり、分かりやすいように簡単な関数を1つ作成しておきましょう。以下のように3つの引数を持つgetMinPrice()という関数を作ります。}【startPlace】が出発する空港、【endPlace】が到着する空港、【startDate】が出発する日付を意味しています。getMinPrice()を実行するだけで最安値の情報が取得できるようにするというわけです。関数の中身ですが、基本的にはRequestモジュールを使った処理を記述していきます。そこで、Requestに使うオプションを以下のように定義しておく必要があります。【ヘッダー情報】}利用するオプションは全部で4つだけです。RapidAPIのガイドに表示されているものをそのまま利用すれば問題ありません。実際にソースコードにすると以下のようになります。}}情報を取得するだけなので【method】はGETになります。【url】についてはSkyscannerのエンドポイントをベースにしながらテンプレートリテラルを使って値を当てはめるようにしています。true】にしておくと、Skyscannerから取得したデータをJSON形式に自動変換してくれるので便利です。RapidAPIのユーザーごとに固有のキーが生成されているので、それを正確に記述しておくようにしましょう。あとはrequest()へオプションを指定すれば完成なのですが、最終的にSlackと連携させることを考慮してPromiseで非同期処理を作っておきましょう。これで、Skyscannerからの結果を取得してから次の処理を確実に実行させることができます。resolve(body));})処理の中身は単純で、Skyscannerから取得したJSONデータをPromiseで返しているだけです。'2019-11-23T00:01:00'}]無事にデータが取得できているのが分かりますね。APIを制御できることが分かったので、次はSlackから飛行機の料金を取得するために独自のSlackアプリを作成していきましょう。イメージとしては、Slackのチャット上で任意のコマンドを入力すると、目的地までの最安値がいつでも確認できるようにしたいと思います。Page】から独自のアプリを作成します。】https://api.slack.com/apps新規作成ボタンをクリックすると、以下のような初期設定画面が表示されます。Name】は好きな名称で構いません。その下にある選択リストには、これから作成するSlackアプリを適用させたいワークスペースを選んでください。Commands】を選択します。Command】ボタンをクリックします。【Command】は実際にSlack上で入力するコマンドを登録します。何でも構いませんが、今回は分かりやすいように「/air-price」としておきました。URL】は、先ほど作成したNode.jsのプログラムが実行されるサーバー側のアドレスになります。末尾の「/command」を起点として、Slackから送信されたコマンドをNode.js側で受け取れるようにします。Hint】は、作成するコマンドの補足説明のようなもので、分かりやすいヒントを記述しておくと良いでしょう。Information】からSlackアプリをインストールしておきましょう。これでSlackアプリの完成です!試しに、PC・スマホどちらでも構わないのでSlackを起動してからコマンドを入力してみてください。2〜3文字ほど入力すると、サジェスト候補として登録したコマンドが表示されるはずです!■Slackアプリをサーバーと連携しよう!ここからは、SlackアプリとNode.jsアプリのそれぞれを連携して、Slackのチャットから飛行機の料金を取得できるようにプログラムを組み立てていきましょう!まず最初にサーバーを準備する必要があります。APIをNode.jsで制御しているので、そのまま同じくNode.jsを利用してサーバーを準備したいと思います。簡単に構築するため、Expressをインストールしておきましょう。expressとりあえずサーバーを準備するだけなら、以下の記述だけでも良いでしょう。express();app.listen(3000);ただし、今回はSlackから送信されるコマンド情報を取得・解析しないといけないので、Body-Parserをインストールするのが基本です。Expressのバージョン4.16.0以降からはBody-Parserが不要になり、以下の記述だけでも解析できるので追記しておきましょう。}));次に、Slackから送信されたコマンド情報を取得できるようにします。Slackのコマンドを設定した時にサーバーアドレスの末尾を「/command」にしましたが、これを起点として以下のようにルーティングを組み立てます。})あとは、冒頭で作成したgetMinPrice()をこのpost()処理内で実行させて、結果をSlackに返してあげれば良いわけです。Slackから送られたコマンド情報を取得・解析しないと、どんなコマンドとオプションが入力されたのか分かりません。そこで、取得したBodyの中にある【text】に入力されたコマンド情報が格納されているので、以下のように取り出します。console.log(input);})このプログラムが正しく機能しているか、ちょっと実験をしてみましょう。NRT-sky,CTS-sky,2019-12-01】というコマンドを入力して送信します。(※カンマ「,」の前後にスペースは不要です)サーバー側のログには、以下のようにコマンドのオプションが配列として取得できているのが分かります。そこで、次のようにプログラムを組み立てます。})Slackから送られたコマンド情報を取得して、getMinPrice()の引数にオプションを当てはめれば飛行機の料金が取得できますよね。今度は結果をSlackに返さないといけません。Slackに返すデータとしては【response_type】【text】の2種類があります。【response_type】はSlackのチャット欄に結果をどのように表示するかを設定するのですが、基本的には【in_channel】を指定すれば一般的な表示形式になります。【text】はその名の通り、結果をどのような文字列で出力するかを指定します。})【text】の部分はテンプレートリテラルを使い、Skyscannerから取得した最安値の結果を当てはめています。最後に【res.json()】で結果をJSON形式で返してあげれば完成です!ちなみにですが、意図したSlackからのコマンド情報なのかを確実にするため、リクエスト情報の認証処理を実装することでセキュリティを向上させることができます。詳細については公式ドキュメントに丁寧なチュートリアルが公開されているのでチェックしておきましょう。GitHub■Slackから飛行機の料金を調べよう!さて、ここまでの作業を完了させると、Slack上から飛行機の料金を確認できるようになっています!そこで、実験として東京から札幌まで飛行機で行くと、最安値はいくらになるのかをチェックしてみましょう。チャットの入力欄から【/air-price】コマンドを利用すると以下のように結果を取得できます。2019年11月24日時点だと、最安値は5730円のようです。res.json(message);})【Carriers】に航空会社情報が格納されているので、その値を当てはめているだけですね。一度、同じようにSlackからコマンドを実行すると以下のようになります!このように、あとは自分の好きなようにカスタマイズをしていけば良いわけです。帰りの料金も同時に調べて往復の合計金額を表示できるようにしたり、航空会社の予約サイトのリンクを合わせて表示するなど、使いやすいようにどんどん改造していくと使いやすくなっていくでしょう。ようなキーワードから関連の高い空港コードを取得できるようになります。これらの機能を組み合わせて、ぜひみなさんも面倒な飛行機の料金チェックを簡略化してみてはいかがでしょうか。■まとめ今回は、飛行機の料金を手軽に取得できるAPIを使ってSlackから制御できるようにしてみました。APIは無料で利用できるうえ、便利な機能をたくさん提供している貴重な存在です。飛行機の料金を調べるのは何かと面倒なものですが、SlackやLINEなど普段から利用しているツールで手軽にチェックできるのは予想以上に便利です。