電車の運行情報をチェックしてメール送信をするシェルスクリプト@bash
Posted on 12 月 13th, 2008 by mazn
電車の遅延や事故などの運行情報を公開しているサイトがありますが、使用している路線に何か変化があった場合に携帯にメールを送るサービスは有料ばかりなので、ちょこっとシェルを書いてみました。
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
Discussion Area - Leave a Comment