HubotでHotpepperグルメサーチAPIを使ってお店を紹介してくれるやつを作った


勉強のため、HubotでAPIを叩けるようにした。
twitterとかやりたかったけど、トークンがややこしかったのでHotpepperグルメサーチAPIを使ってお店をランダムでおすすめしてくれるものを作りました。

APIキーの取得

まずはAPIキーを取得します。
ホットペッパーAPIリファレンスページに行って、左メニューの「新規登録」からメールアドレスを入力 → 「送信」で、メールが届くのでメールの内容に従って登録を完了させる。

登録が完了したらWebサイトのAPIキー発行ボタンを押すとAPIキーが書かれたメールで送られてくるので、それを控えておく。

ちなみに登録を取り消したい時はメールアドレスを入力して送信するだけで、簡単にできる。

スクリプトを書いていく

APIキーを取得したらそれを使ってスクリプトを書いていきます。なお、Hubotのセットアップは他のサイトを参考にしてください。

いきなり完成形

まずは完成形をお見せします。

# Description:
#   説明を書く
#

module.exports = (robot) ->
  robot.hear /ご飯行こう/i, (msg) ->
    request = msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=json")
    .get()
    request (err, res, body) ->
        json = JSON.parse body
        num = Math.floor( Math.random() * 11 );
        shopName = json["results"]["shop"][num]["name"]
        shopUrl = json["results"]["shop"][num]["urls"]["pc"]
        msg.send "#{shopName} \n #{shopUrl}"

説明

module.exports = (robot) ->
  robot.hear /ご飯行こう/i, (msg) ->

「ご飯行こう」というフレーズに反応して処理を実行します。

request = msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=json")
    .get()

http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=jsonここでAPIを叩いてます。ここでは練習で&large_area=Z011として東京のお店を返すようにしています。
&format=jsonとすることで結果がJSONで返ってきます。

request (err, res, body) ->
        json = JSON.parse body
        num = Math.floor( Math.random() * 11 );

json = JSON.parse body 帰ってきたJSONをjsonという変数にいれます。
num = Math.floor( Math.random() * 100 ); お店をランダムで取得したいので、変数numに乱数を入れておきます。

        shopName = json["results"]["shop"][num]["name"]
        shopUrl = json["results"]["shop"][num]["urls"]["pc"]

お店の名前とURLを変数shopName、
shopUrlにいれます。["shop"][num]とすることで返ってきたお店の中からランダムで一店舗抽出します。
jsonの構造はこのページで確認するとわかりやすいと思います。

msg.send "#{shopName} \n #{shopUrl}"

あとはそれをコメントで返すようにしてやればOK。

こんな感じで返ってきます。

mybot> ご飯行こう
mybot> はなの舞 新宿東南口店 http://www.hotpepper.jp/strJ000712881/

うん。いいね。

ちょっと改良

このままだと東京のお店しか返さないので、指定した場所のお店を返すようにします。

robot.hear /ご飯行こう/i, (msg) ->
                 ↓
robot.hear /ご飯行こう (.+)/i, (msg) ->
    query = encodeURIComponent msg.match[1]

「ご飯行こう ◯◯」の「◯◯」の部分を正規表現で抜き出します。
query = encodeURIComponent msg.match[1]としてマッチした文字列をエンコードします。

msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=json")
                 ↓
msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&address=#{query}&format=json")

&address=#{query}でさきほど抜き出した文字列をセットします。

mybot> ご飯行こう 那覇
mybot> 鉄板×BAR×炭焼 Stand スタンド 
http://www.hotpepper.jp/strJ000804975/?vos=nhppalsa000016

いい感じ。

あとは、Slackと連携してやれば面白いと思います。
もうちょっと応用して食べたい料理(ラーメンとか)も指定できるようにしたいです。