blog.syfm

徒然なるままに考えていることなどを書いていくブログ

LINE BOT APIを使ってグルコスのある最短距離のゲーセンを特定する

動機

最近、botが急激に流行ってきているなぁと感じます。LINEやFacebookSkypeなどでもAPIを提供し始めています。そこで今回、1万名限定でLINEのBOT API Trialが無料で利用できたのでつられてみました。
とはいえ、botを具体的に何に使うかを全く考えていなかったのでとりあえず好きなものに関するbotを作ろう!ということでグルコスを対象に選びました。

グルコスとは

グルコスは正式名称はGroove Coaster(グルーヴコースター)、海外ではRHYTHMVADERSという名前のタイトー音楽ゲームです。
最近バージョン3になり、オンライン対戦が追加されたので楽しいです。

実際の動作

LINE上で位置情報を送信すると、その位置を原点として最も近くに位置しているゲーセンかつグルコスが設置してあるゲーセンをリストしてくれます。

f:id:ktr_0731:20160421003934p:plain

botを作り始めるまで

LINE BOT APIを利用するには開発者登録をする必要があります。ただ、現時点で1万名を超えてしまったようで新規でTrialを利用することはできないのでこの辺りは割愛します。

botを登録すると、以下の様なAPIアクセスに関する情報が表示されます。botアマデウス紅莉栖である理由は特にありません。
あとはこれらを使って開発するのみです。

f:id:ktr_0731:20160421005950j:plain

ハマった点

callback URL

メッセージが送信されてきた時などに利用されるcallback URLはSSL通信でないといけません。また、callback URLは「https://example.com:443/callback」と明示的にSSL通信であることを指定しなければいけません。
最初は自宅サーバで色々やろう!と考えていたのですが、少し厳しそうだったので、今回はHerokuを使っています。
その辺りはこちらの記事が参考になりました。

qiita.com

開発

今回は練習も兼ねてJavaScriptとNode.js、Expressで開発しています。 また、APIは - LINE BOT API Trial - Yahoo! ジオコーダAPI を利用しています。

かなりでたらめに書いているので相当汚いですが、リポジトリは以下にあります。

github.com

どんな動作をしているかを簡単に解説すると、まず、位置情報が送られてきたら、その住所から都道府県を切り出しています。
その都道府県を使ってNESiCAのURLを叩き、スクレイピングすることでその都道府県のグルコスが設置してあるゲーセンとその住所をすべて取得します。
次に、住所を基にYahoo! ジオコーダAPIを叩いて緯度・経度を取得します。
最後に原点の緯度・経度とゲーセンの緯度・経度を用いて2点間の距離を算出します。
それらを距離が短い順に並べ替えています。

ただ、いざ開発していくと謎のバグに悩まされました。

f:id:ktr_0731:20160421012509p:plain

最短距離でも地球1周にかかる距離を超えています。
いくらグルコスがBEMANIに知名度で負けているからといって地球外にしかグルコスがないというのはありえないので原因を探っていたのですが、これがなかなか難敵…

結果をいうと自身のコードのバグではなく、LINE BOT APIのバグでした。
位置情報が送られてきた時、latitudeプロパティとlongitudeプロパティが含まれているのですが、これらの値が逆になっていました。
これらを直すことで無事正常に動作しました。

完成

こうして思ったよりかなりの時間をかけてbotを作りました。 自分の住んでいる場所付近のゲーセンを見てみると、

f:id:ktr_0731:20160421013819p:plain

バッチリです。見てみると近くのゲーセンはスーパーノバしかないことがはっきり分かります。
これでどこでもグルコスができる!
本当は位置情報以外が送られた時はdocomoの雑談対話APIを使って会話させようとしていたのですが、最近時間が取れにくいのでひとまず後回しにしましたが、いずれやってみたいと思っています。

問題

ただ、このbotには問題があります。それは負荷の問題です。
bot自体に負荷はほとんどかからないのですが、位置情報を送るたびにゲーセンの数だけYahoo! ジオコーダAPIを叩くので、そちらの方に結構な負荷がかかると思われます。(このbotを使う人が自分以外いるとは思えないけど…)
なのでこのbotはあくまで個人用として作成しましたので公開はしません。