どうも、まさとらん(@0310lan)です!
今回は、普段からよく利用しているSlackを使って飛行機の料金(最安値)を手軽にチェックできるツールを作成していきましょう!
いちいちブラウザを起動してWebサイトを訪問する必要がなく、Slackから簡単なコマンドを入力するだけで最安値を即座に確認できるようになるので便利です。カスタマイズ性も非常に高く、自分の好きなように情報を制御できるようになります。
飛行機の料金を調べるのが面倒だと感じている人は特にオススメなので、ぜひ参考にしてみてください!
Table of Contents
■どうやって飛行機のチケット料金を調べるのか?
今回の重要なポイントは、飛行機の料金をどのように取得するか? ということになります。
また、個人的にはできるだけ以下の要素も含めたい…
- さまざまな航空会社から比較・検討したい
- 調べたときの最安値を知りたい
- 国内だけでなく海外便の料金も調べたい
- 簡単にプログラムへ組み込みたい
これらの要求ができるだけカバーされたAPIがないか、いつのものように【Rakuten RapidAPI】から検索してみました。
いくつか候補があるなかで、もっとも条件に合致していたのがこちら!
【 Skyscanner Flight Search 】https://api.rakuten.net/skyscanner/api/skyscanner-flight-search
すでにご存知の方もいると思いますが、1000を超える航空会社やLCCなどの料金を横断検索できるサービス【 Skyscanner 】が提供するAPIになります。世界中の航空券について最安値を検索できる機能をAPIで提供しているので、独自のプログラムに組み込んで好きなようにカスタマイズできるのが大きな魅力となっています。
最終的にこのAPIを利用して、Slack上から飛行機の料金をコマンド一発で表示できるようにしてみたいと思います!
■Skyscanner APIの使い方!
それでは、まず最初にSkyscanner APIで本当に飛行機の料金が調べられるのかをテストしてみましょう。そこで、試しに東京(成田空港)から札幌(新千歳空港)までの最安値を調べてみます。
Rakuten RapidAPIの画面下にはAPIをテストできる機能が提供されています。最安値を検索できるエンドポイント【Browse Quotes】を選択してから、以下のパラメータを入力します。(パラメータの詳細はこちらを参照)
<入力項目>
パラメータ | 入力例 | 備考 |
country | JP | 国名コード |
currency | JPY | 利用する通貨の単位 |
locale | ja-JP | 利用する言語コード(ISO) |
originplace | NRT-sky | 出発する空港コード |
destinationplace | CTS-sky | 到着する空港コード |
outboundpartialdate | 2019-12-01 | 出発日 |
(※空港コードは一般的に利用されている英数字の末尾に「-sky」を付与したものです)
パラメータが設定できたら【テスト】ボタンをクリックします。
すると、【レスポンスボディ】に取得したJSONデータが表示されます。
今回の場合だと、以下のように【Quotes】の中に飛行機の料金が格納されているのが分かります。
{ "Quotes":[ 0:{ "QuoteId":1, "MinPrice":5730, "Direct":true, "OutboundLeg":{...} } ], "Places":[...] "Carriers":[...] "Currencies":[...] }
【MinPrice】の項目が最安値となり、上記の場合だと5730円で東京→札幌に飛行機で行けるという意味になります。また、【Carriers】の配列に格納されている0番目の【Name】が航空会社となっており、今回のケースだと【Spring Airlines Japan(春秋航空)】になります。
ちなみにですが、今回利用したエンドポイントの【Browse Quotes】は、Skyscannerがキャッシュしている料金データを参照しているので非常に高速かつ軽快に動作します。(キャッシュデータは随時アップデートされます)
リアルタイムな現在の価格を参照できる【Live Flight Search】というAPIも提供されているのですが、今回は速度重視でなおかつ簡単に扱える【Browse Quotes】を使って解説をしていきたいと思います。
■Node.jsからAPIを制御してみよう!
ここからは、実際のプログラムにSkyscanner APIを組み込んで動作確認をしていきましょう!
まずは【コードスニペット】タブから自分の使いたいプログラミング言語を選択するのですが、今回はNode.jsのRequestモジュールを選択してみます。
【SDKをインストール】ボタンをクリックすると、選択した言語を使ってどのように実装したらいいのかを紹介するガイドが表示されます。
あとは、このガイドの通りにプログラムを組み立てれば良いわけです。
まず最初に、今回利用するRequestモジュールをインストールしておきましょう。
$ npm install request
そして、Node.jsからRequestモジュールを使えるようにrequire()を記述しておけば良いですね。
const request = require("request");
ひとまず、これで前準備はOKです!
Skyscanner APIを使うにあたり、分かりやすいように簡単な関数を1つ作成しておきましょう。以下のように3つの引数を持つgetMinPrice()という関数を作ります。
function getMinPrice(startPlace, endPlace, startDate) { }
【startPlace】が出発する空港、【endPlace】が到着する空港、【startDate】が出発する日付を意味しています。つまり、getMinPrice()を実行するだけで最安値の情報が取得できるようにするというわけです。
関数の中身ですが、基本的にはRequestモジュールを使った処理を記述していきます。そこで、Requestに使うオプションを以下のように定義しておく必要があります。
const options = { method: 【通信の種類】, url: 【エンドポイント】, json: 【JSONで取得するかどうか】, headers: 【ヘッダー情報】 }
利用するオプションは全部で4つだけです。
エンドポイントやヘッダー情報については、Rakuten RapidAPIのガイドに表示されているものをそのまま利用すれば問題ありません。
実際にソースコードにすると以下のようになります。
const endpoint = 'https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/browsequotes/v1.0/'; function getMinPrice(startPlace, endPlace, startDate) { const options = { method: 'GET', url: `${endpoint}JP/JPY/ja-JP/${startPlace}/${endPlace}/${startDate}`, json: true, headers: { 'x-rapidapi-host': 'skyscanner-skyscanner-flight-search-v1.p.rapidapi.com', 'x-rapidapi-key': '534ke90**************************', } } }
情報を取得するだけなので【method】はGETになります。また、【url】についてはSkyscannerのエンドポイントをベースにしながらテンプレートリテラルを使って値を当てはめるようにしています。
【json: true】にしておくと、Skyscannerから取得したデータをJSON形式に自動変換してくれるので便利です。ヘッダー情報の【x-rapidapi-key】については、Rakuten RapidAPIのユーザーごとに固有のキーが生成されているので、それを正確に記述しておくようにしましょう。
あとはrequest()へオプションを指定すれば完成なのですが、最終的にSlackと連携させることを考慮してPromiseで非同期処理を作っておきましょう。これで、Skyscannerからの結果を取得してから次の処理を確実に実行させることができます。
return new Promise(resolve => { request(options, (error, response, body) => resolve(body)); })
処理の中身は単純で、Skyscannerから取得したJSONデータをPromiseで返しているだけです。
それでは、実際にgetMinPrice()を実行してみましょう!
getMinPrice('NRT-sky', 'CTS-sky', '2019-12-01') .then(data => { console.log(data.Quotes); });
コンソールログの出力結果は以下の通りです!
[{ QuoteId: 1, MinPrice: 5730, Direct: true, OutboundLeg: { CarrierIds: [Array], OriginId: 70788, DestinationId: 45539, DepartureDate: '2019-12-01T00:00:00' }, QuoteDateTime: '2019-11-23T00:01:00' }]
無事にデータが取得できているのが分かりますね。
ここまでのサンプルコードは以下のリンクからすべて閲覧できますので、ぜひ参考にしてみてください!
<参考リンク>
・Skyscanner APIサンプルコード – GitHub
■Slackアプリを作るための準備をしよう!
プログラムからSkyscanner APIを制御できることが分かったので、次はSlackから飛行機の料金を取得するために独自のSlackアプリを作成していきましょう。
イメージとしては、Slackのチャット上で任意のコマンドを入力すると、目的地までの最安値がいつでも確認できるようにしたいと思います。そこで、まずは【Slack App Config Page】から独自のアプリを作成します。
【 Slack App Config Page 】https://api.slack.com/apps
新規作成ボタンをクリックすると、以下のような初期設定画面が表示されます。
【App Name】は好きな名称で構いません。その下にある選択リストには、これから作成するSlackアプリを適用させたいワークスペースを選んでください。
次に、作成するアプリの種類を選択できるので【Slash Commands】を選択します。
新規にコマンドを作成したいので【Create New Command】ボタンをクリックします。
コマンドの初期設定画面が表示されます!
主な設定項目としては以下の通りです!
項目 | 入力例 | 備考 |
Command | /air-price | 実行するコマンド |
Request URL | https://sample.com/command | サーバーアドレス |
Short Description | 飛行機の最安値を取得します | コマンドの説明 |
Usage Hint | [空港(出発),空港(到着),出発日] | コマンドオプションの説明 |
【Command】は実際にSlack上で入力するコマンドを登録します。何でも構いませんが、今回は分かりやすいように「/air-price」としておきました。
【Request URL】は、先ほど作成したNode.jsのプログラムが実行されるサーバー側のアドレスになります。末尾の「/command」を起点として、Slackから送信されたコマンドをNode.js側で受け取れるようにします。(※受け取り方については後述します)
【Short Description】と【Usage Hint】は、作成するコマンドの補足説明のようなもので、分かりやすいヒントを記述しておくと良いでしょう。
最後に【Settings】→【Basic Information】からSlackアプリをインストールしておきましょう。
これでSlackアプリの完成です!
試しに、PC・スマホどちらでも構わないのでSlackを起動してからコマンドを入力してみてください。2〜3文字ほど入力すると、サジェスト候補として登録したコマンドが表示されるはずです!
■Slackアプリをサーバーと連携しよう!
ここからは、SlackアプリとNode.jsアプリのそれぞれを連携して、Slackのチャットから飛行機の料金を取得できるようにプログラムを組み立てていきましょう!
まず最初にサーバーを準備する必要があります。
今回はSkyscanner APIをNode.jsで制御しているので、そのまま同じくNode.jsを利用してサーバーを準備したいと思います。簡単に構築するため、Expressをインストールしておきましょう。
$ npm install express
とりあえずサーバーを準備するだけなら、以下の記述だけでも良いでしょう。
const express = require("express"); const app = express(); app.listen(3000);
ただし、今回はSlackから送信されるコマンド情報を取得・解析しないといけないので、Body-Parserをインストールするのが基本です。しかし、Expressのバージョン4.16.0以降からはBody-Parserが不要になり、以下の記述だけでも解析できるので追記しておきましょう。
app.use(express.json()) app.use(express.urlencoded({ extended: true }));
次に、Slackから送信されたコマンド情報を取得できるようにします。
Slackのコマンドを設定した時にサーバーアドレスの末尾を「/command」にしましたが、これを起点として以下のようにルーティングを組み立てます。
app.post('/command', (req, res) => { })
あとは、冒頭で作成したgetMinPrice()をこのpost()処理内で実行させて、結果をSlackに返してあげれば良いわけです。
ただし、Slackから送られたコマンド情報を取得・解析しないと、どんなコマンドとオプションが入力されたのか分かりません。そこで、取得したBodyの中にある【text】に入力されたコマンド情報が格納されているので、以下のように取り出します。
app.post('/command', (req, res) => { const input = req.body.text.split(','); console.log(input); })
このプログラムが正しく機能しているか、ちょっと実験をしてみましょう。
Slackを起動して【/air-price NRT-sky,CTS-sky,2019-12-01】というコマンドを入力して送信します。
(※カンマ「,」の前後にスペースは不要です)
サーバー側のログには、以下のようにコマンドのオプションが配列として取得できているのが分かります。
['NRT-sky', 'CTS-sky', '2019-12-01']
この仕組みを利用すれば、冒頭で作成したgetMinPrice()を実行することができそうですね! そこで、次のようにプログラムを組み立てます。
app.post('/command', (req, res) => { const input = req.body.text.split(','); //Slackで入力されたオプションを引数に当てはめる getMinPrice(input[0], input[1], input[2]) .then(data => { //ここに処理を記述する }) .catch(error => res.json('もう一度入力してください')); })
Slackから送られたコマンド情報を取得して、getMinPrice()の引数にオプションを当てはめれば飛行機の料金が取得できますよね。ただし、今度は結果をSlackに返さないといけません。
Slackに返すデータとしては【response_type】【text】の2種類があります。
【response_type】はSlackのチャット欄に結果をどのように表示するかを設定するのですが、基本的には【in_channel】を指定すれば一般的な表示形式になります。
【text】はその名の通り、結果をどのような文字列で出力するかを指定します。
これらを踏まえて、実際のコードにすると次のようになります!
getMinPrice(input[0], input[1], input[2]) .then(data => { const message = { response_type: 'in_channel', text: `最安値は${data.Quotes[0].MinPrice}円です!` } res.json(message); })
【text】の部分はテンプレートリテラルを使い、Skyscannerから取得した最安値の結果を当てはめています。最後に【res.json()】で結果をJSON形式で返してあげれば完成です!
ちなみにですが、意図したSlackからのコマンド情報なのかを確実にするため、リクエスト情報の認証処理を実装することでセキュリティを向上させることができます。詳細については公式ドキュメントに丁寧なチュートリアルが公開されているのでチェックしておきましょう。
今回作成したサンプルの最終的なソースコードは、以下のリンクからすべて閲覧できますので合わせて確認してみてください!
<参考リンク>
■Slackから飛行機の料金を調べよう!
さて、ここまでの作業を完了させると、Slack上から飛行機の料金を確認できるようになっています!
そこで、実験として東京から札幌まで飛行機で行くと、最安値はいくらになるのかをチェックしてみましょう。チャットの入力欄から【/air-price】コマンドを利用すると以下のように結果を取得できます。
2019年11月24日時点だと、最安値は5730円のようです。
さらに、航空会社も一緒に取得したければSlackに返すメッセージを以下のようカスタマイズすれば簡単に実現できます!
getMinPrice(input[0], input[1], input[2]) .then(data => { const message = { response_type: 'in_channel', text: `最安値は${data.Quotes[0].MinPrice}円です!航空会社は${data.Carriers[0].Name}です` } res.json(message); })
【Carriers】に航空会社情報が格納されているので、その値を当てはめているだけですね。
もう一度、同じようにSlackからコマンドを実行すると以下のようになります!
このように、あとは自分の好きなようにカスタマイズをしていけば良いわけです。
例えば、帰りの料金も同時に調べて往復の合計金額を表示できるようにしたり、航空会社の予約サイトのリンクを合わせて表示するなど、使いやすいようにどんどん改造していくと使いやすくなっていくでしょう。
また、【List Places】というエンドポイントもSkyscanner APIから提供されており、これを使うと【NRT-sky】のような空港コードではなく、【成田】【成田空港】【東京】のようなキーワードから関連の高い空港コードを取得できるようになります。
これらの機能を組み合わせて、ぜひみなさんも面倒な飛行機の料金チェックを簡略化してみてはいかがでしょうか。
■まとめ
今回は、飛行機の料金を手軽に取得できるAPIを使ってSlackから制御できるようにしてみました。
Skyscanner APIは無料で利用できるうえ、便利な機能をたくさん提供している貴重な存在です。飛行機の料金を調べるのは何かと面倒なものですが、SlackやLINEなど普段から利用しているツールで手軽にチェックできるのは予想以上に便利です。
アイデア次第で活用範囲も広がると思いますので、ぜひみなさんもオリジナルのツールを作って遊んでみてください!
<参考リンク>
・「Skyscanner Flight Search」Rakuten RapidAPIページ
コメントを残す