はじめに
- Line bot勉強会の資料です。
- テンプレートってボタン操作を行う
- 外部APIと連携して、幅を広げる
LINE bot勉強会の流れ
| 流れ | step1 | step2 | step3 | 
|---|---|---|---|
| 機能 | おみくじbot | カウントbot | 最寄駅検索bot | 
| 学ぶこと | LINE botの作り方 | DB・リッチニュー | ボタンアクション・URIスキーマ・外部API | 
その他TIPS
- 可愛くするために
- スタンプの使い方
- 絵文字の使い方
今回学ぶこと
- URIスキームを使う
- APIを使う
ボタンの実装
ボタンについて
- ボタンはいくつかのアクションを起こすことができます。アクションの動作は次の一覧の通りです。
| action | type | 動作 | 
|---|---|---|
| ポストバック | postback | dataを返す | 
| メッセージ | message | ユーザーからメッセージを返す | 
| URI | uri | 指定したURIへ飛ばす | 
| 日時選択 | datetimepicker | postbackに日付のデータを加える | 
ドキュメントのボタンテンプレートをコピーします。
- ボタンテンプレートをコピーし関数の中に入れます。
app.rb
def template
  {
    "type": "template",
    ...
  }
end
templateメソッドを呼びだす。
- 駅と打つとtemplateが返ってくるようにします。
app.rb
55 elsif event.message['text'] =~ /駅/
56   client.reply_message(event['replyToken'], template)
実行結果
- ボタンがついたテンプレートが返ってくる
 
位置情報を送る
uriスキーム
- uriアクションの中にはuriスキームという、カメラを立ち上げたり、マップを立ち上げたりする機能があります。
- 今回はその中からGPSを送信する。line://nv/locationを利用します。
templateを編集する
- templateの中を必要最低限の要素だけにします。
app.rb
def template
  {
    "type": "template",
    "altText": "位置検索中",
    "template": {
        "type": "buttons",
        "title": "最寄駅探索探索",
        "text": "現在の位置を送信しますか?",
        "actions": [
            {
              "type": "uri",
              "label": "位置を送る",
              "uri": "line://nv/location"
            }
        ]
    }
  }
end
eventを取得する
GPSのデータを送れるようになったので、次に受け取る処理を書きます。
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を利用して、最寄駅を検索します。
- リクエストの送り方。
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に返します。
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完成
