LoginSignup
10
7

More than 5 years have passed since last update.

GoogleAppsScriptで路線ごとに電車の遅延情報をSlackに送信

Posted at

通学前に電車の遅延情報が知りたい

でも毎回調べるのはだるい->予め決められた時間にSlackに通知がくるBotが欲しい
->Yahoo路線情報から引っ張ってきてGASで時間を決めて送信

便利なところ

  • 開発時に毎回エラーログを見るのが面倒->ドキュメントファイルでログが見れます
  • 路線ごとの遅延情報が欲しい!->通知したい路線のURLを配列に入れればOK
slack.train.gs
var DEV_MODE = false; //開発時はtrueにすることで下で指定したドキュメントファイルでエラーログが見れます
var LOG_FILE_ID = 'デバッグ用に事前にGoogleドキュメントファイルを作ってファイルIDを記載'; 
var RECIPIENT = 'gmailのアドレス';
var HOOK_POINT = 'SlackのIncoming URLを作成して貼り付けてください';

function SlackPost() {
  try {
    // ログをクリア
    if (DEV_MODE) getLogFile().getBody().clear();

    //日付取得とフォーマット整形
    var currentDate = new Date();
    var date = Utilities.formatDate(currentDate, "Asia/Tokyo", 'M月d日 HH時mm分');

    // 通知したい路線のURL
    var area_list = ["https://transit.yahoo.co.jp/traininfo/detail/267/0/",
      "上みたいな感じでyahoo路線図のURLを貼り付けてください"];
    var line = "";
    for (var i = 0, len = area_list.length; i < len; ++i) {
      var response = UrlFetchApp.fetch(area_list[i]);
      var myRegexp = /<div class="mainWrp">([\s\S]*)<!--\/#mdServiceStatus-->/i;
      var line_html = myRegexp.exec(response.getContentText())[1];
      var reg_route = /<h1 class="title">([\s\S]*?)<\/h1>/
      var reg_status = /\W\]<\/span>([\s\S]*?)<\/dt>/;
      var reg_content = /<p>([\s\S]*?)<span>/;
      var route = line_html.match(reg_route)[1];
      var status = line_html.match(reg_status)[1];
      if (line_html.match(reg_content)) {
        var content = line_html.match(reg_content)[1];
      } else {
        var content = "路線のURLがありません";
      };
      line += ('━─━─━─━─━─━─━─━' + "\n" + route + "\n" + status + "\n" + content + "\n");
    };

    // slackに投稿
    function postMessage(message, hookPoint) {
      var payload = {
        "text": message,
        "channelId": '#slack_study',
        "userName": 'train-info',
        "icon_emoji": ':train:'
      }
      var options = {
        "method": "POST",
        "payload": JSON.stringify(payload),
        "headers": {
          "Content-type": "application/json",
        }
      }
      var response = UrlFetchApp.fetch(hookPoint, options);

      if (response.getResponseCode() == 200) {
        return response;
      }
      return false;
    }
    postMessage("\n" + "◆○○遅延情報 " + "\n" + date + "\n" + line, HOOK_POINT);//ooには路線名や地域名を入れてください

  } catch (e) {
    Logger.log('\n' + JSON.stringify(e, null, '  '));
  } finally {
    // ログを書き込む
    if (DEV_MODE) getLogFile().getBody().appendParagraph(Logger.getLog());
  }
}
function getLogFile() {
  if (this.logFile === undefined) {
    this.logFile = DocumentApp.openById(this.LOG_FILE_ID);
  }
  return this.logFile;
}

プロジェクトトリガーの設定

image.png

参考にさせていただいたサイト

ありがとうございました。

次に向けて

欲しい値だけが得られるよう正規表現を工夫しましたが、もっといい方法がある場合は教えてください!

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7