Rurikoの更新時刻取得の仕組み

Web更新時刻取得エージェントRurikoは httpプロトコルにより取得される情報より、 特定のURLの更新時刻を検出します。

検出しようとするページのタイプ、 サーバの種類などによって、 いくつかの検出方法が考えられます。

Rurikoでは次のような方法を順番に試みます。

Last-Modifiedヘッダ

サーバへのhttpリクエストがLast-Modifiedヘッダを返した場合、 その時刻をそのままそのURLの更新時刻として解釈します。 これは最も検出コストが低く、精度の高い方法です。

しかし、取得先のHTMLがSSIを使っていたり、 CGIに生成されたHTMLであった場合、 Last-Modifiedヘッダは返されません。 サーバの設定によっては通常のHTMLに対しても Last-Modifiedヘッダが返されない事があります。

あるURLがLast-Modifiedヘッダー返すかどうかを確かめるために、 簡単なCGIを用意しました。

Last-ModifiedヘッダチェックCGI

本文に書かれた最終更新時刻

Last-Modifiedヘッダからの時刻の取得に失敗すると、 Rurikoは取得したHTMLの本文に、HTMLの更新時刻が 記述されていないかを解析します。

RurikoはHTMLの本文を取得した後、 まず以下のどれかのパターンが本文中に 存在しないか検索します。

パターンを発見すると、 その前後1行ずつ、 合計3行の間のどこかに次のような形式の 時刻表記が無いかを検索します。

時刻表記を発見すると、それをそのURLの更新時刻として解釈します。 実際にはこれらを組み合わせた

Sun, Jan 21 2001 12:56:11
といった形式の時刻表記を解析できます。

SSIが使える場合は、

<meta http-equiv="Last-Modified" content="<!--#echo var='LAST_MODIFIED'-->">
というタグをヘッダ内に埋め込んでおけば、 確実にこの方法で更新を取得できます。

ファイルの内容

本文を解析しても更新時刻が見つけられなかった場合、 Rurikoは本文が前回の取得時からどれだけ変更されているかを 判定します。そして、内容が前回からじゅうぶん変更されていると 判断したら、前回内容を取得した時間と、現在時の間の時間を、 そのURLの更新時刻として解釈します。

Rurikoは、次の手順に従ってHTMLの内容を前回と比較します。

  1. HTMLを改行(\rか\nか<br>)単位で分割する。
  2. 行毎にチェックサムを取る。
  3. 行毎のチェックサムを前回のチェックサムとそれぞれ比較する。
  4. 変更のあった行が全体の5%を越えたら変更があったとみなす。

軽微な変更は無かったものとみなすので、 SSIによるカウンタなどは無視されます。

反面、Rurikoに判別できない形式で最終更新時刻が記述されており、 HTMLのその部分しか変更されてない場合などは変更を検出できないので、 注意が必要です。


ゆん