Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

電車の運行情報をチェックしてメール送信をするシェルスクリプト@bash

      2013/07/15

電車の遅延や事故などの運行情報を公開しているサイトがありますが、使用している路線に何か変化があった場合に携帯にメールを送るサービスは有料ばかりなので、ちょこっとシェルを書いてみました。

24時間起動しているサーバ環境があることが前提です。また、lynxがインストールされている必要がありますし、もちろんサーバからメールを送信できる環境でないと動きません。

train.sh

#!/bin/bash
# written by mazn [ http://www.mazn.net/ ]

# 関東の鉄道情報を使用します
urls=(http://transit.goo.ne.jp/unkou/kantou.html)
# 送信先 (複数指定可能)
mailto=("@docomo.ne.jp" "@docomo.ne.jp")
# 差出人
mailfrom="train info <train_info@dummy>"

filename=/tmp/train.txt
sendflg=0
d=`LANG=C date`
contents=""

function sendMail {
        for to in ${mailto[@]}; do
                header=""
                header="${header}Subject: Train info\\n"
                header="${header}From: ${mailfrom}\\n"
                header="${header}To: ${to}\\n"
                echo -e "${header}\\n${contents}" | nkf -j | sendmail -t -i
        done
}

for i in ${urls[@]}; do
        # データ取得
        echo $d > $filename
        lynx -dump $i -useragent="" -assume_charset=euc-jp -display_charset=euc-jp -width=1000 | nkf -w80 >> $filename

        for j in ${lines[@]}; do
                tmp=`egrep "   ../.. ..:.. .{0,10}$j.{0,10} " $filename | sed "s/[[:blank:]]*//"`

                if [ "x$tmp" = "x" ]; then
                        continue
                fi
                if [ -f /tmp/$j ];then
                        oldinfo=`cat /tmp/$j`
                else
                        oldinfo=""
                fi

                if [ "x$tmp" != "x$oldinfo" ]; then
                        contents="${contents}${tmp}\\n"
                        sendflg=1
                fi
                echo "$tmp" > /tmp/$j
        done
done

if [ "$sendflg" == "1" ]; then
        contents="${contents}\\nhttp://gw.mobile.goo.ne.jp/gw/http://transit.goo.ne.jp/mobile/unkou/kantou/index.html\\n$d"
        sendMail
fi

情報はgooから取得しています。ここでは関東の鉄道情報を対象にしていますが、関東以外を知りたい場合は、変数urlsにgooの対象の地域のURLを追加するか、書き換えます。前回チェック時の情報を/tmpに保存していて、変化があったらメールを送信します。

変数linesには、チェックしたい路線名を入れます。単なるegrep用文字列なので、gooのサイトに掲載される路線名をそのまま記述します。

mailtoには自分のアドレスを入れます。mailfromは適当に送信者情報を入れてください。

あとはこれをcronに登録して、定期的に起動すればOK

/etc/crontab

*/30 * * * * root /root/train.sh

 - IT技術, プログラミング , ,

336px

Message

メールアドレスが公開されることはありません。

  関連記事

no image
iモーションのエクスポート属性と着信音について@SH906i

iモーションを自作の着うたにする場合に、エクスポート属性をつけた場合とつけない場 …

no image
プログラミングコンテストの模擬練習(ババ抜き)を解いてみた

以下で紹介されていたプログラミングコンテストの模擬練習問題(ババ抜き)をpyth …

no image
pptpサーバの構築@CentOS 5.8

pptpサーバ構築時のメモ書き。 # yum install ppp pptp …

no image
Webベースでマニュアルや仕様書などのドキュメント書き

マニュアルや仕様書などのドキュメントを書くとき、どのようなツールを皆さん使ってい …

no image
名前ベースのVirtualHost

今までapacheを名前ベース(NameVirtualHost)をエラーが出たま …

no image
光学メディアの書き込み速度

DVDドライブやBlu-rayドライブを買うとき、CD-R 4倍速書き込み、DV …

ISOイメージをUSBメモリに入れてLinuxインストール

以前、grubを手動で入れて、USBメモリからOSをインストールするようなことを …

no image
KVMのコンソールに接続する@RHEL6 on Fedora14 KVM

KVM上で仮想OSを動かしている場合、コンソールに接続するには、少し設定を変更す …

no image
Firefox検索フォームに検索履歴ボタンを追加する@Firefox 3.0

Firefox の検索欄は、検索履歴を覚えてくれ、↓を押すと履歴が出てきます。し …

no image
OpenStack LibertyをRDOを使ってインストール on CentOS7(KVM)

ホストOS(CentOS7)に直接OpenStackを入れると、失敗した時が面倒 …