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

コンピュータに任せられる作業はコンピュータに任せてしまえ! 今回は、RSSフィードなどを提供していないサイトを巡回する手間を省くシェルスクリプトを作ることにする。

» 2007年06月20日 00時22分 公開
[Leslie-P.-Polzer,Open Tech Press]
SourceForge.JP Magazine

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

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

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

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

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

 必要なものがそろったら、以下に示すシェルスクリプトを使って本題のトラッキング(追跡)タスクを実行することができる。このスクリプトは、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" < 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は、日々の作業をコンピュータに任せることに関して豊富な経験を持つフリーソフトウェア・コンサルタント兼ライター。


Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ