タイムプロキシ

先日、会社でドラえもんの秘密道具か何かの話をしている声が聞こえてきて、ふと「タイムプロキシ」という言葉が浮かびました。浮かんだはいいけどなんなんだそれ、ということで考えると、ウェブページにアクセスすると時空を超えて過去のウェブページにアクセスしてしまうプロキシなのかなー、と思ったので、HTTP::Proxyつかって作ってみました。
作ったプロキシをどこかに立てて、ブラウザで設定をしたら、たとえばはてなのトップにアクセスすると、ずいぶん前の懐かしいデザインで見えてしまいます。

Googleだってこのとおり。

こんなプログラムで動いてます。

#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Proxy;
use HTTP::Proxy::HeaderFilter::simple;
use Getopt::Long;

my $port        = 3128;
my $max_clients = 80;
my $host;

Getopt::Long::GetOptions(
    '--port=i'        => \$port,
    '--host=s'        => \$host,
    '--max_clients=i' => \$max_clients,
);

my $proxy = HTTP::Proxy->new( port => $port, host => $host, max_clients => $max_clients );

$proxy->push_filter(
    request  => HTTP::Proxy::HeaderFilter::simple->new(
        sub {
	    my $uri = $_[2]->uri;
	    return if( $uri->host eq 'web.archive.org' && $uri->path =~ /^\/web\// );
	    my $ua = LWP::UserAgent->new;
	    $ua->timeout(10);
	    my $response = $ua->get('http://web.archive.org/web/*/'.$uri);
	    return unless ($response->is_success);
	    my @urllist = ();
	    my $contents = $response->content;
	    foreach( $contents =~ /href=\"(http:\/\/web\.archive\.org\/web\/\d+\/http:\/\/[^\"]+)\"/g ){
		push @urllist, $_;
	    }
	    my $i = int(rand($#urllist));
	    my $new_uri = $urllist[$i];
	    $_[2]->uri( URI->new( $new_uri ) ) if $new_uri;
	    $_[1]->remove_header(qw( Accept-Language From Referer Cookie ));
	}
    ),
);
$proxy->start;

仕組としてはInternet Archiveにアクセスして、過去のデータから適当なものを選んで返しているだけ。でも、普通にURLを入れると過去のデータが表示される様は結構見ていて面白いです。「俺は今過去をのぞくプロキシを使ってページを見ているんだー」という想像をすることをお勧めします。そういう遊びです。
ただ、Internet Archiveで保存されているデータはHTMLにJavaScriptを仕込んでリンク先を変えてたりするので、いろいろ遊んでいると、いつの間にかInternet ArchiveのURLになっちゃってたりするんですけど、そこは一発ネタということでご愛嬌。