LANG SELRCT

コードを書く場所についてはこちら

2017年10月21日土曜日

LINE BOTで特定の場所の位置情報を表示する


送信した地名の位置情報を取得して、Google Mapsのリンクを返すLINE BOTを作ってみましょう


公式リファレンスでここに書かれていることを実際にやってみます


以下2つの記事の組み合わせでできます

地名を入力すると、その位置情報とリンクを返すコードの例です


コード.gs
var CHANNEL_ACCESS_TOKEN = "TOKEN";

function doPost(e) {
  var contents = e.postData.contents;
  var obj = JSON.parse(contents);
  var events = obj["events"];
  for (var i = 0; i < events.length; i++) {
    if (events[i].type == "message") {
      reply_message(events[i]);
    }
  }
}

function reply_message(e) {
  if (e.message.type == "text") {
    var text = e.message.text;
    var geo_data = get_geodata(text);
    var result = geo_data["result"];
    if (result == "success") {
      var address = geo_data["address"];
      var latitude = geo_data["latitude"];
      var longitude = geo_data["longitude"];
      var postData = {
        "replyToken": e.replyToken,
        "messages": [{
          "type": "location",
          "title": text,
          "address": address,
          "latitude": latitude,
          "longitude": longitude
        }]
      };
    } else {
      var postData = {
        "replyToken": e.replyToken,
        "messages": [{
          "type": "text",
          "text": text + " は見つかりません:" + result
        }]
      };
    }
  }
  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN
    },
    "payload": JSON.stringify(postData)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", options);
}


function get_geodata(text) {
  try {
    var geocode = Maps.newGeocoder()
      .setLanguage("ja")
      .geocode(text);
    var geo = geocode.results[0];
    var addresstext = geo.formatted_address;
    var geodata = geo.geometry;
    var latitude = geodata.location.lat;
    var longitude = geodata.location.lng;
    var result = "success";
  } catch (e) {
    var result = e.message;
  }
  var data = {
    "address": addresstext,
    "latitude": latitude,
    "longitude": longitude,
    "result": result
  }
  return data;
}
意訳.gs
アクセストークンを設定する

この処理は以下を実行する
送信されたデータの内容を取得し
そのJSONをオブジェクトに変換し
eventsを取得する
eventsの数だけ以下を繰り返す
もしtypeがmessageなら
reply_messageに渡す




この処理は以下を実行する
もし受け取ったmessageのtypeがtextなら
reply_textに入れて
geo_dataを取得し
resultを取得し
もしresultが"success"なら
addressを取得し
latitude(緯度)を取得し
longitude(経度)を取得し
postDataに
replyTokenを設定し
messagesの
typeを設定し
textを設定し
addressを設定し
latitudeを設定し
longitudeを設定し


resultが"success"ではないなら
postDataに
replyTokenを設定し
messagesの
typeを設定し
textを設定し




optionsに
methodを設定し
headersに
Content-Typeを設定し
Authorizationを設定し

payloadにはpostDataをJSONに変換したものを設定する

optionをつけてLINEのmessage reply APIをたたく



この処理は以下を実行する
以下を試す
新しい地理情報を作り
言語を設定する
場所を設定する
地理情報の0番目の
住所を取得し
geometryを取得し
その緯度を取得し
その経度を取得し
resultを設定する
エラーが出たら
resultにエラーメッセージを入れる

dataに
住所を入れ
緯度を入れ
経度を入れ
resultを入れて

dataを返す