Win32::IEHistory 0.01

先日miyagawaさんが某所で

07:34 Win32のIE5History読むモジュール
07:34 charsbarさんあたりがつくってたりしないだろうか

と言っておられたので、でっちあげました。Win2Kと、おそらくXP、98でも動くかもしれない、(たぶん)IE5.0以上の履歴、キャッシュ、クッキーのインデックスを解析するモジュール。
こんな感じのスクリプトを書くと、

use strict;
use warnings;
use Win32::IEHistory::History;

my $history = Win32::IEHistory::History->new;

foreach my $entry ( $history->urls ) {
  printf "%s (%s)\n", $entry->url, $entry->last_modified;
}

こんな感じの出力が返ってきて、httpだろうとfileだろうとjavascriptだろうとおかまいなしに、とにかくIE(やIE互換ブラウザ、Explorer等)でアクセスした場所がごっそり取れます。

Visited: IshigakiKenichi@http://nntp.x.perl.org/group/perl.cpan.testers/701711 (2007-10-21T10:26:43)
Visited: IshigakiKenichi@mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\1041\vccore.chm::/html/_crt_time_management.htm (2007-10-21T19:42:49)
Visited: IshigakiKenichi@mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\1041\Shellcc.chm::/inet401/help/itt/Shell/Objects/folderitem/FolderItem.htm (2007-10-21T18:57:24)
Visited: IshigakiKenichi@http://bm11.kayac.com/service/jsonrpc (2007-10-22T01:46:09)

このHistoryをCacheにすると、今度は

use strict;
use warnings;
use Win32::IEHistory::Cache;

my $cache = Win32::IEHistory::Cache->new;

foreach my $entry ( $cache->urls ) {
  printf "%s (%s)\n", $entry->url, $entry->last_modified;
}

こんな感じにキャッシュ(インターネット一時ファイル)の中身が取れます(この例は実際にはHeadline-Readerのキャッシュですが)。

http://www.oreilly.co.jp/catalog/soon.xml (2007-10-22T06:49:22)
http://tokyo2007.yapcasia.org/planet/atom.xml (2007-10-22T08:01:50)
http://www.developer0000.jp/feed/ (2007-10-20T17:39:43)
http://cpantesters.perl.org/author/ISHIGAKI.rss (2007-10-22T08:36:37)
http://blogs.yahoo.co.jp/engineer_ryuseigun/rss.xml (1601-01-01T00:00:00)

日時が1601-01-01T00:00:00になっているのは、インデックス内部の日時情報が壊れている(ないし保存されていない)せいですね。

さらに、urlsの部分をredrsにすると

use strict;
use warnings;
use Win32::IEHistory::Cache;

my $cache = Win32::IEHistory::Cache->new;

foreach my $entry ( $cache->redrs ) {
  printf "%s\n", $entry->url;
}

……まあ、この結果はご自分で確認していただく方がよいでしょう。画像、パスワード付きのURL、その他もろもろ、IE/Windowsのヤツ、こんなものまで残していたのかと唖然とするようなものがぞろぞろ出てきます。

Cookiesの場合も、CacheをCookiesに変えると、とりあえず現状クッキーの値を直接取ることはできませんが、どこのクッキーがあるかはしっかりと。

上記の例はWindows用にレジストリの中身を覗いてファイルの位置を決めていましたが、もう少し汎用的に使いたい場合は

use strict;
use warnings;
use Win32::IEHistory;

my $history = Win32::IEHistory->new( '/path/to/index.dat' );

foreach my $entry ( $history->urls ) {
  printf "%s\n", $entry->url;
}

のようにすると、Windows用のモジュールはいっさい使いませんので、Macとか*nix環境でも動作すると思います。

いろいろな意味で、At your own riskでお使いください。

http://search.cpan.org/dist/Win32-IEHistory/