LINE BOT で電車遅延検索お知らせ

## 概要
電車の路線名（山手線、中央線、丸ノ内線など）を送ると、遅延発生しているかどうかを知らせてくれるBOT「電車遅延お知らせBOT」を作りました。

### 2017/1/28追記
http://qiita.com/k1_style/items/5068a6b2c2aea0f91105
新たに当Botを作り直しました。
当記事はBOT API Trial Accountを利用したものとなっておりますので、
上記URLの記事を改めてご参照ください。

### 2016/10/27追記
> なお、ただ今ご提供させていただいている「BOT API Trial Account」につきましては、
> 11月16日にアカウントの完全削除を予定しております。

と、LINEDeveloperの中の人から警告メールを先日もらいました。
現在正式に公開されているMessaging APIを利用したBOTに作り替えないといけないみたいですね。。
https://linecorp.com/ja/pr/news/ja/2016/1516

そのうち、やります。。
作成次第、新しくQiita記事を書いて公開しようかと。


## BotのQR Code
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/100077/f9789b41-3041-2a9b-74d9-05543cd127af.jpeg)
LINE利用しているみなさま、おともだちになってください！

## 使い方
<img width="375" alt="電車遅延お知らせBOT使い方" src="https://qiita-image-store.s3.amazonaws.com/0/100077/3708ca8f-98b8-78e7-ffca-1880b25d87bb.jpeg">

↑こんな感じで電車の路線名を送ると、遅延発生しているかしてないかを知らせてくれます。
今のところ、路線名じゃない言葉を送っても「ご安心ください、～」と返ります。

## 使った技術
- [LINE BOT API](https://developers.line.me/bot-api/api-reference)
- [Google Apps Script](https://developers.google.com/apps-script/)
- [鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/)

## 実装
```javascript:trainbot.gs
// プロパティ取得(CHANNEL_IDとかSECRETとかは、GASのスクリプトプロパティで定義)
var PROPERTIES = PropertiesService.getScriptProperties();

// 鉄道遅延情報のjson
var URL = PROPERTIES.getProperty('JSON_URL');

// LINE情報
var LINE_CHANNEL_ID = PROPERTIES.getProperty('LINE_CHANNEL_ID');
var LINE_CHANNEL_SECRET = PROPERTIES.getProperty('LINE_CHANNEL_SECRET');
var LINE_MID = PROPERTIES.getProperty('LINE_MID');
var LINE_API_POST_URL = PROPERTIES.getProperty('LINE_API_POST_URL');

/**
 * そのままアクセスした場合、IPアドレスを表示
 */
function doGet(e) {
  return ContentService.createTextOutput(UrlFetchApp.fetch("http://ip-api.com/json"));
}

/**
 * LINEからPOSTされた場合
 */
function doPost(request){
  try{
    var requestJson = JSON.parse(request.postData.contents);
    var requestResult = requestJson.result;
    for(var i = 0; i < requestResult.length; i++) {
      // リクエスト投げたユーザー取得
      var requestContent = requestResult[i].content;
      var requestUserId = requestContent.from;
      var requestText = requestContent.text;
      
      // LINE送信のパラメータ
      var payload =
      {
        "to" : [requestUserId],
        "toChannel" : 1383378250,
        "eventType" : "138311608800106203",
        "content" : {
          "contentType" : 1,
          "toType" : 1,
          "text" : getData(requestText)
        }
      };
      
      // LINE送信のヘッダ情報
      var headers = {
        "Content-Type" : "application/json; charser=UTF-8",
        "X-Line-ChannelID": LINE_CHANNEL_ID,
        "X-Line-ChannelSecret": LINE_CHANNEL_SECRET,
        "X-Line-Trusted-User-With-ACL": LINE_MID
      }

      
      // 
      var options =
      {
        "method" : "post",
        "payload" : JSON.stringify(payload),
        "headers" : headers
      };

      UrlFetchApp.fetch(LINE_API_POST_URL, options);
    }
  } catch(e) {
    Logger.log(e);
  }
}

/**
 * 鉄道遅延情報取得
 */
function getJsonList() {
  var response = UrlFetchApp.fetch(URL);
  var json=JSON.parse(response.getContentText());
  Logger.log(json);
  
  return json;
  
}

/**
 * 鉄道遅延情報を返すメッセージを生成し、返す
 */
function getData(searchText){
  // 返す文字
  var returnText = 'ご安心ください、' + searchText + 'は遅延なく運転しております';
  
  //遅延情報を取得
  var result = getJsonList();
  
  //遅延情報を１つずつチェック
  for(var i = 0; i < result.length; i++) {
    var company = result[i].company; //会社
    var name = result[i].name; //路線
    var date = new Date(Number(result[i].lastupdate_gmt) * 1000); // 最終更新日時
    
    var rg = new RegExp(searchText);
    
    //調査対象路線に合致した場合、通知する
    if (rg.test(name)) {
      returnText = '申し訳ありません、' + name + '(' + company + ')' + '遅延しております（最終更新日時：' + [date.getFullYear(),date.getMonth() + 1,date.getDate()].join( '/' ) + ' ' + date.toLocaleTimeString() + '）';
    }
  }
  
  Logger.log(returnText);
  return returnText;
}

```

## 劇的に参考になった情報
### GASでLINE BOT
http://qiita.com/osamu1203/items/0de2909821a1b3cbb350
Herokuを用意することすら面倒だったので、もともと持っているGoogleAppsの情報で絶対できるだろうと思ってました。
GoogleAppsScriptで独学で実装してみましたがうまくいかなくて飽き始めた頃に上記記事が上がり、とてもとても参考にさせていただきました。
上記で書いた実装コードをウェブアプリケーションで導入、その後のやり方は上記を参考にしていただければ。

### GASで電車遅延JSONを取得する
http://marketing-pandora.com/2016/01/train_delay_chatwork.php?utm_source=dlvr.it&utm_medium=twitter
https://rti-giken.jp/fhc/api/train_tetsudo/delay.json
上記はチャットワークに遅延情報を送るやり方として載せてます。
このBOTを作ろうと思ったきっかけとなる記事です。

### LINE BOTの公式ドキュメント
https://developers.line.me/bot-api/api-reference
英語が苦手で当初あまり見なかったんですが、
こうして動くBOTが出来たころに読み返すと、やはり公式なだけあり、かなり分かりやすいなぁと実感しました。

### アイコン（いらすとやさん）
http://www.irasutoya.com/2014/06/blog-post_9691.html
今回のBOTアイコンとして採用させていただきました。

## 今後の改良予定
とりあえず動くものを第一目標として作っただけなので、今後は以下の機能追加をもくろんでます。

- エラーログ保存
    - Logger.logだと本番運用時のログまでは拾ってくれない、ぽいので、スプレッドシートなどどこかに保存せねば。
- アクセス制限
    - 今のコールバックURLがもしバレたら直叩きされ放題になってしまう。ので、GoogleAppsScriptでも何かいい対策がないか模索中。
- その他問題点
    - もし何かお気づきの点あればコメントいただけるとウレシイです！
    - [GitHubGist](https://gist.github.com/K1-Style/b128f72928209d6b38941fdb0ae84b64)に実装ソース公開してます