【コラム】

日本語で10行プログラミング

9 WEBサイトの更新チェッカー

    クジラ飛行机  [2005/03/10]

    なでしこ開発日記

    とうとうIPA未踏ユースプロジェクトでの「なでしこ」開発が終了しました。未踏プロジェクトというのは社会に役立つソフトウェア開発のために、国が開発費用を捻出してくれるという素晴らしいプロジェクトです。この開発を通して私が得たものは非常に大きかったと思います。開発のポイントごとに様々なイベントがあり、大勢の方と触れ合うことができました。プログラマーや事務などの職にあると、なかなか外部の人と会う機会が少ないのですが、大勢の人の前でプレゼンをしたり、プロジェクトについてアイデアを出し合ったり意見を交換しあったりと、とても貴重な経験を積むことができました。未踏プロジェクト自体は今年も継続するそうです。時間的に可能なら皆さんも申し込んでみてはどうでしょうか。

    ちなみに、未踏ユースでの開発が終わっても、なでしこは継続して開発していきます。ユーザーの皆さんから、まだまだマニュアルが弱いと突っ込まれていますので、当面はコツコツとマニュアルやサンプルを追加したりしようと思っています。

    WEB更新チェッカー

    さて、今回の10行プログラムは、前回のリンク切れの検出を応用して、WEBの更新チェッカーを作ってみようと思います。インターネット上には膨大な数のWEBサイトがありますが、結局のところ頻繁にチェックするのは、お気に入りのページだけです。そんなお気に入りのページが更新されたかどうかを調べるプログラムを作ってみようと思います。

    まず、WEBサイトが更新されたかどうかをどうやって検出するのかを考えます。前回のリンク切れチェッカーでは、WEBサーバーが返すヘッダ情報を利用してリンク切れかどうかを判断しました。

    今回のWEBサイトが更新されたかどうかの判別方法ですが、実際にページをダウンロードしてみて内容が更新されたかどうかを確認するという単純な方法を試してます。何事も単純な方法が一番安心できます。

    MD5で更新を確認する

    前回ページをチェックしたときと、今回チェックしたときで、ページに更新があったかどうかを調べるには、文章を1文字ずつチェックしていくという方法が考えられます。しかし、この方法だと、チェックするページの全ての文章を覚えておく必要があり、保存データが大きくなってしまいます。

    そこで、MD5というハッシュ値を使って更新を確認することにします。MD5(Message Digest 5)とは、認証やデジタル署名などに使われているハッシュ関数です。通信経路の途中でデータが改ざんされていないかを確認するのに使われます。

    例えば、「10行プログラミング」という文字列をMD5にかけてハッシュ値を算出すると「181d09d7c29746fb274ea9c9c6ad6b9d」となります。次に「10秒プログラミング」という文字列のハッシュ値を算出すると「53d40c702e6f7573a677bb499980c0c6」となります。「10行」と「10秒」でわずか1文字違うだけですが、ぜんぜん違うハッシュ値が得られるのです。

    WEBページの更新チェックの場合では、ページ変更前のハッシュ値と変更後のハッシュ値が違っていれば更新されたということになりますし、全く同じならば更新されてないということになります。

    プログラムの組み立て

    MD5を使えば、ページが更新されているかを手軽に調べられることが分かりましたが、実際にページが更新されているかどうかを確認するには、前回のハッシュ値が分かっている必要があります。そこで、WEBページ更新チェッカーの動作を簡単に書くと以下のようになります。

    (1)前回のハッシュ値を取り出す
    (2)ページをダウンロードしMD5でハッシュ値を取得する
    (3)前回のハッシュ値と比較してハッシュ値に変化があれば更新されている
    (4)今回のハッシュ値を記録して次回の確認に備える

    さて、プログラムを作る上で必要な材料が揃ったので、さっそく実際のプログラムを組んでみようと思います。まずは実際のプログラムの手順を箇条書きにしてみます。

    (1)URLとハッシュ値の一覧情報をファイルから読む
    (2)1で読み込んだURL一覧について以下の3~5の処理を繰り返す
    (3)  URLからHTML本文をダウンロードしてMD5ハッシュ値を計算する
    (4)  もし前回確認したハッシュ値と違っていれば、更新されていることを記録
    (5)  次回確認するときのためにハッシュ値を記録
    (6)更新されたURLを画面に表示する

    今回大変なのは、複数のWEBサイトのハッシュ値をファイルに保存しておく処理でしょうか。URLとハッシュ値の情報をペアにして保存しておく必要があるのです。今回保存するデータ形式は以下のようなTSV(タブ区切りデータ形式)を選びました。

    保存ファイル形式

    10行プログラム

    以下にあるのが実際になでしこで作ったプログラムです。プログラムを実行するには、URLの一覧を箇条書きにしたデータファイルが必要です。テスト用のデータファイルを用意しましたので、以下のプログラムを一度保存して、それと同じフォルダに"list.txt"という名前で保存した後、実行してみてください。

    list.txt

    プログラムを実行すると以下の図のように更新されたサイトがリストボックスに表示されます。リストボックスのURLをダブルクリックするとブラウザでURLを開くことができます。一度終了した後、再度実行した場合は、更新されたサイトだけが表示されます。

    更新されたサイトがリストボックスに表示される。URLをダブルクリックするとブラウザでURLを開くことができる

    保存用は空。結果は空。                                    #1
    「list.txt」を開いてTSV取得して反復                       #2
        URLはそれ\0。  前回値はそれ\1。                       #3
        URLからHTTPデータ取得。それのMD5取得して今回値へ代入。#4
        もし、前回値≠今回値ならば、結果にURLを配列追加。     #5
        保存用は保存用&「{URL}{タブ}{今回値}{改行}」         #6
    「list.txt」へ保存用を保存。                              #7
    結果リストとはリスト。そのレイアウトは「全体」。          #8
    そのアイテムは結果。                                      #9
    これをダブルクリックした時は~結果リストのテキストを起動。#10

    ソース:web-checker.nako

    プログラムを解説します。

    1行目で「保存用」と「結果」の2つの変数を空に初期化します。2行目ではデータファイルの「list.txt」を開きます。開いたらTSV形式と認識させてデータの数だけ繰り返します。

    3行目ではデータからURLと前回のハッシュ値をそれぞれ取得します。『それ\0』というのは日本語として意味不明ですが、配列変数「それ」の0番目の要素を取り出すという意味になります。つまり、データファイルのTSVファイルの各行の0番目の要素を変数「URL」に、1番目の要素を変数「前回値」へと代入しているという意味になります。

    4行目ではURLからHTMLファイルを取得してMD5のハッシュ値を算出して「今回値」という変数に代入しています。

    5行目は、前回のハッシュ値と今回のハッシュ値を比較して、一致しなければ、WEBが更新されているということなので、結果に今回のURLを追加します。6行目では変数「保存用」に今回のハッシュ値を追加しておきます。

    7行目では全ての繰り返しの後に、ファイル「list.txt」へ保存します。その後、8行目から9行目ではリストボックスを画面全体に作り更新された結果を表示させています。最後10行目はリストボックスをダブルクリックしたときにブラウザを起動するように設定しています。

    動かないときは……

    今回のプログラムは、なでしこの1.04で動作確認しています。実行した結果、エラーが表示された場合は最新版にアップデートしてみてください。また、今回のプログラムは、デスクトップなどへ一度保存して、その保存したフォルダに"list.txt"というデータファイルを用意する必要があります。それから、なでしこは、インデント(字下げ)によってプログラムのブロックを判別しているので、改行やインデントまで正確に入力してください。

    改造のポイント

    せっかくのWEB更新チェッカーですので、IEのお気に入りのサイトをデータファイルに加えたいところです。以下のプログラムを実行するとお気に入りフォルダに入っているURL一覧を一気に取得してファイル"list.txt"へ保存することができます。

    お気入りフォルダ&「*.url」の全ファイル列挙して反復
        対象を開く。
        それ@「URL」を表示。
    表示ログを「list.txt」へ保存。
    「完了」と言って終わる。

    ソース:getFavorits.nako

    WEB更新チェックですが、これと連載3回目で作ったRSSリーダーと組み合わせてみると、更新されたサイトのニュースだけ表示できたりと、応用の幅が広がるのではないでしょうか。

    関連サイト

    新着記事

    特設サイトの情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      マイナビニュースマガジン