さくらのVPSを使ってslackに電車の運行情報を喋らせてみよう

More than 1 year has passed since last update.

毎朝目が覚めたときに、寝ぼけ眼を擦りつつ電車遅延の情報を見るのが最近の日課となっております。
とはいえ、毎朝電車遅延のアプリを開くのは面倒くさい…でも情報はしりたい…なんなら会社のslackにBOTで遅延情報を発言して遅れますね的な雰囲気作りをしたい…という怠惰な思いつきで作ってみました。

用意するもの

この3つを用意します。
さくらのVPSはクレジットカード払いに設定すると2週間無料のお試し期間が付いてくるので、それを利用してひとまず無料でゲットしてみました!

やること

  • 鉄道遅延情報のjsonをcurlコマンドを利用して取得
  • jqコマンドを利用して、取得したjsonの中に、遅延しているかどうか調べたい路線が入っているかどうかを調べる
    • 入っていたら(遅延していたら)
      • 遅延情報をslack の WebHookURL を使ってBOT に喋らせる
    • 入ってなかったら(遅延したなかったら)
      • 遅延していないことを喋らせたり
      • 無言を貫かせたりする

curlとjqのインストール

# パッケージの情報を見る
$ apt-cache show curl
$ apt-cache show jq

# インストールされているかどうかの確認
$ dpkg -l | grep "curl"
$ dpkg -l | grep "jq"

# インストール
$ apt-get install curl
$ apt-get install jq

コード

準備が整ったのでコードを書きます。
今回はお手軽に書けるシェルスクリプトで実装してみました。
ファイル名は slack-train-status.sh にしてみましょう。
また、スクリプトは /usr/local/bin に設置するものとします。

/usr/local/bin/slack-train-status.sh
#!/bin/bash

# -r option: 路線名
# -s option: サイレントモード.遅延していない場合は発言しなくなる
while getopts r:s opts; do
  case $opts in
  "r" ) readonly FLG_R=true; readonly ROUTE="${OPTARG}";;
  "s" ) readonly FLG_S=true;;
  \? ) exit 1;;
  esac
done

# -r は必須オプションなのでチェックする
if [ ! -v FLG_R ]; then
  exit 1
fi

# slack の情報
readonly SLACK_CHANNEL="#general"
readonly SLACK_BOT_NAME="運行状況BOT"
readonly SLACK_BOT_ICON=":train:"
readonly SLACK_REPLY_ID="@h-ito"
readonly SLACK_WEB_HOOK_URL="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"

# Yahoo!路線情報のURL
readonly YAHOO_TRAIN_URL="http://transit.yahoo.co.jp/traininfo/search?q=${ROUTE}"

# must jq(>=1.4)
curl -s https://rti-giken.jp/fhc/api/train_tetsudo/delay.json | jq -e ".[] | select(.name == \"$ROUTE\")" > /dev/null

if [ $? -ne 0 ]; then
  # 通常運行の場合
  if [ -v FLG_S ]; then
    # -s オプション有り
    :
  else
    curl -X POST --data-urlencode "payload={\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${SLACK_BOT_NAME}\", \"text\": \"${ROUTE}いい感じ\", \"icon_emoji\": \"${SLACK_BOT_ICON}\", \"attachments\":[{\"color\":\"#00D068\",\"fields\":[{\"title\":\"運行状況\",\"value\":\"運行状況: <${YAHOO_TRAIN_URL}|Yahoo!路線情報>\",\"short\":false}]}]}" "$SLACK_WEB_HOOK_URL"
  fi
else
  # 遅延の場合
  curl -X POST --data-urlencode "payload={\"link_names\": 1, \"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${SLACK_BOT_NAME}\", \"text\": \"${SLACK_REPLY_ID} ${ROUTE}遅延してるよ\", \"icon_emoji\": \"${SLACK_BOT_ICON}\", \"attachments\":[{\"color\":\"#D00000\",\"fields\":[{\"title\":\"運行状況\",\"value\":\"運行状況: <${YAHOO_TRAIN_URL}|Yahoo!路線情報>\",\"short\":false}]}]}" "$SLACK_WEB_HOOK_URL"
fi

exit 0

curlの引数がエスケープ文字祭りでごめんなさい:astonished:

動作テスト

作ったスクリプトの動作テストをしてみます。
bashで動作するシェルスクリプトなので、-x オプションを付けてデバッグモードで実行してみます。

$ bash -x /usr/local/bin/slack-train-status.sh -r "山手線"

通常運行の場合

nomal.png

遅延の場合

delay.png

上手くお知らせできましたか?
スクリーンショットのように発言できたら成功です!

毎朝自動でお知らせしてみる

最後は作成したスクリプトをcronに登録して決まった時間に自動実行してみましょう。
今回は毎週月~金曜日のAM7:00に自動実行してみます。

$ ls -l /usr/local/bin/slack-train-status.sh
-rw-r--r-- 1 root root 1815 Oct 12 00:26 /usr/local/bin/slack-train-status.sh

# 実行権限を付与
$ chmod +x /usr/local/bin/slack-train-status.sh

# cron のエディットモードに入る
$ crontab -e
    # 以下行を追加
    00 7 * * 1-5 /usr/local/bin/slack-train-status.sh -r "山手線"

これで準備は完了。
指定時間に時間に自動で発言されたら立派なslack BOTの完成です。

ちょとしたBOTを簡単に作れるのがslackは楽しくていいですね。
皆さんも是非試してみてください!