【LINE bot】最寄駅検索bot


## はじめに
- Line bot勉強会の資料です。
- テンプレートってボタン操作を行う
- 外部APIと連携して、幅を広げる

---
## LINE bot勉強会の流れ
|流れ|step1|step2|<font color="red">step3</font>|
|:--:|:--:|:--:|:--:|
|機能|[おみくじbot](https://qiita.com/4geru/items/438a2dfcaf9eea4bdbb5)|[カウントbot](https://qiita.com/4geru/items/ef59098cec4708a6b7a3)|<strong>[最寄駅検索bot](https://qiita.com/4geru/items/30fa69c65e9fcdd12108)</strong>|
|学ぶこと|LINE botの作り方|DB・リッチニュー|ボタンアクション・URIスキーマ・外部API|

その他TIPS

- [可愛くするために](https://qiita.com/4geru/items/398a38c89cf01bb8f151)
 - スタンプの使い方
 - 絵文字の使い方

---
## 今回学ぶこと
- URIスキームを使う
- APIを使う

---
## ボタンの実装
---
### ボタンについて
- ボタンはいくつかの[アクション](https://developers.line.me/ja/docs/messaging-api/reference/#anchor-e16a6c579c9cd26fd07d804d4278ed4f4ee19a95)を起こすことができます。アクションの動作は次の一覧の通りです。

|action|type|動作|
|:--:|:--:|:--:|
|ポストバック|postback|dataを返す|
|メッセージ|message|ユーザーからメッセージを返す|
|URI|uri|指定したURIへ飛ばす|
|日時選択|datetimepicker|postbackに日付のデータを加える|


---
### ドキュメントのボタンテンプレートをコピーします。

- [ボタンテンプレート](https://developers.line.me/ja/docs/messaging-api/reference/#anchor-2663744478b176f1e8a65676cedcbdee3f551c9c)をコピーし関数の中に入れます。

```ruby:app.rb
def template
  {
    "type": "template",
    ...
  }
end
```

---
### templateメソッドを呼びだす。
- 駅と打つとtemplateが返ってくるようにします。

```ruby:app.rb
55 elsif event.message['text'] =~ /駅/
56   client.reply_message(event['replyToken'], template)
```


---
### 実行結果
- ボタンがついたテンプレートが返ってくる

<img width="200px" src="https://qiita-image-store.s3.amazonaws.com/0/64677/93d29e4a-eba4-5dad-97ca-54f62ad261fe.jpeg">

---
## 位置情報を送る

---
###　uriスキーム

- uriアクションの中には[uriスキーム](https://developers.line.me/ja/docs/line-login/using-line-url-scheme/)という、カメラを立ち上げたり、マップを立ち上げたりする機能があります。
- 今回はその中からGPSを送信する。`line://nv/location`を利用します。

---
### templateを編集する
- templateの中を必要最低限の要素だけにします。

```ruby:app.rb
def template
  {
    "type": "template",
    "altText": "位置検索中",
    "template": {
        "type": "buttons",
        "title": "最寄駅探索探索",
        "text": "現在の位置を送信しますか？",
        "actions": [
            {
              "type": "uri",
              "label": "位置を送る",
              "uri": "line://nv/location"
            }
        ]
    }
  }
end
```

---
## eventを取得する
GPSのデータを送れるようになったので、次に受け取る処理を書きます。

```ruby:app.rb
62 when Line::Bot::Event::MessageType::Location
63   p event["message"]["latitude"]
64   p event["message"]["longitude"]
# 65 APIを呼び出す関数です
65   p stations(event["message"]["longitude"], event["message"]["latitude"])
66 end
```

---

## APIへのリクエストを投げる
- 今回は[HeartRails Geo API](http://geoapi.heartrails.com/api.html)を利用して、最寄駅を検索します。
- [リクエスト](https://qiita.com/4geru/items/026a3393416cb8239c83)の送り方。

```ruby:app.rb
def stations(longitude, latitude)
  uri = URI("http://express.heartrails.com/api/json")
  uri.query = URI.encode_www_form({
  method: "getStations",
    x: longitude,
    y: latitude
  })
  res = Net::HTTP.get_response(uri)
  JSON.parse(res.body)["response"]["station"]
end
```

---

## APIの結果をメッセージで表示する
- APIから返された値を駅名と路線の配列に変更し、改行文字で連結しメッセージとしてbotに返します。

```ruby:app.rb
66 stations = stations(event["message"]["longitude"], event["message"]["latitude"])
67 message = stations.map{|station|
68   "#{station["name"]}駅 >> #{station["line"]}"
69 }.join("\n")
70 client.reply_message(event['replyToken'],{ type: 'text', text: message })
```

---
## 結果
- 最寄駅の情報を検索するbot完成

<img width="200px" src="https://qiita-image-store.s3.amazonaws.com/0/64677/1c54b0fe-5fad-1bbf-a327-dcd159434514.jpeg">

---
## まとめ
- テンプレートを使った[アクション](https://developers.line.me/ja/docs/messaging-api/reference/#anchor-e16a6c579c9cd26fd07d804d4278ed4f4ee19a95)は便利
- [uriスキーム](https://developers.line.me/ja/docs/line-login/using-line-url-scheme/)を使うとマップや写真を送りやすくなる。
- 外部APIを用いると幅が広がる。