Webサイトをトラッキングする簡単なスクリプト

 多くのWebサイトにはコンテンツが更新されたことを知らせてくれるRSSフィードやニュースレターの購読機能があるが、残念ながら、依然としてこの機能を持たないWebサイトも相当な数にのぼる。そうしたWebサイトの更新は、どのようにして知ればよいのだろうか。そこで今回は、このタスクを自動化してくれるシェルスクリプトを作ることにする。

 とかく問題解決というのは他人任せにしたくなるもので、まずは、この問題にすでに取り組んだ人がいないかどうか探してみよう。Google検索で調べたところ、入手できる数少ないツールはすべてMicrosoft Windows用であり、大半のWindows用プログラムと同様、無償ではなく自由に利用できるものでもないことがわかった。

 Linux用としてはGPLライセンスのWebMonXがあるが、これは大量のクリックが必要でポップアップやサウンドで通知が行われるGUIツールである。そうしたGUIツールが好みなら、何の問題もない。自分のニーズに合った既製のソリューションが見つかったわけだ。だがそうでない人のために、次のようなKISS(Keep It Simple, Stupid)基準を満たす簡潔なスクリプトを書いてみよう。

  • 慎み深さ:更新のたびにポップアップメッセージを表示するなどはもってのほか。更新通知は丁寧に電子メールで行う。
  • コンパクトさ:わずか数行のコードで実現。
  • モジュール方式:広く入手できて十分にテストされたコンポーネントを利用。
  • スマートさ:更新が検知されたときに欲しいのは更新差分だけ。

 ここでは、ページをレンダリングした形で表示するのにテキストブラウザ(例えば、w3m)を使用する。もちろん、HTMLやHTTP要求の応答をそのまま表示しても構わないのだが、それではやはり見づらいだろう。また、ページのスナップショットを保存するファイル名を生成するために、md5sumsha1sumのようなハッシュプログラム(どちらもGNUのCoreutilsパッケージに入っている)を使用する。さらに、正しく機能するdiffと、mailコマンドの実装が必要になる。後者については、ローカルのMTAに用意されているはずである。その他、wctouchなど、どんなシステムにもインストールされているはずの基本的なユーティリティも使用する。

 必要なものが揃ったら、以下に示すシェルスクリプトを使って本題のトラッキング(追跡)タスクを実行することができる。このスクリプトは、list.txtファイルをスキャンして1行ずつURLを読み取っていく。各URLの現在のコンテンツを取得し、前に保存しておいたものと比較して、変更があればその内容をRECIP変数で指定されているメールアドレスに送信する、というものだ。

#!/bin/sh
# webtrack.sh

RECIP=user@host      # where notifications get sent
DUMPCMD="w3m -dump"  # text browser invocation


for url in $(cat list.txt); do

    md5=$(echo "$url" | md5sum | cut -d\  -f 1)

    touch $md5.txt

    $DUMPCMD "$url" > tmp.txt

    if diff $md5.txt tmp.txt >/dev/null; then
        : #echo no changes
    else
        : #echo "changes: "
        diff -Napu $md5.txt tmp.txt > diff.txt
        mv tmp.txt $md5.txt
        mail -s "Changes in $url found." "$RECIP" <<eof
The diff has $(wc -l diff.txt | cut -d\  -f 1) lines.

Changes are below.

$(cat diff.txt)
eof

    fi

done

 あとは、list.txtにURLを1件1行の形式で記述し、スクリプトを実行形式にして(chmod 755 webtrack.shを実行)、cronjobを設定(crontabファイルに0 8 * * * /path/to/webtrack.shのような行を追加)するだけである。このようにcronjobを設定しておけば、list.txtに記したWebサイトを毎朝8時にチェックしてくれる。この行の意味がわからなければ、crontab(1)のmanページを参照してほしい。

 list.txtに新しいURLを追加してくれるスクリプトがあってもよいだろう。ローカルのリストであれば、echoを直接使うだけでURLの追加ができる。リモートのリストの場合は、ssh経由でechoをリモートで実行すればよい。

#!/bin/sh
# ww-add.sh

# if the list is local
echo '$1' >> /path/to/list.txt

# if the list is remote
ssh user@host "echo '$1' >> /path/to/list.txt"

ハッピー・トラッキング!

 今回のちょっとした経験から、シェルスクリプトを利用すれば、同じことを何度も手作業で繰り返すよりも作業がずっと楽になって時間の節約にもなることが、容易におわかりいただけただろう。

Leslie P. Plozerは、日々の作業をコンピュータに任せることに関して豊富な経験を持つフリーソフトウェア・コンサルタント兼ライター。

NewsForge.com 原文