« ぱどタウンで天気予報表示開始 | メイン | はてなブックマークがブログの代わり »

StrableとBase64で通信する

本日、ぱどタウンで犬のサイトがオープンしたわけだが、その中の「ショップ&スポット情報」のページでちょっとした荒技をつかった。
そもそも「ショップ&スポット情報」のページは、「ぱどタウン まち探検ナビ」の検索結果のヘッダーとフッターを入れ替えたページ。
データベースを覗いたりというのは多少面倒なのでLWPでページのHTML持ってきて、前後を入れ替えようと思ったり、XML-RPCとかカッコいい手段を使ってみるとか考えていたんだけど、ふと元のCGIを見ていて思いついたアイディアがApache::Session::Serialize::Base64でと同じStorableでシリアライズしてbase64でエンコードする方法。もちろん両方ともPerlだからできるんだけど。

元CGIは

#!/usr/bin/perl
use strict;
use CGI;
use HTML::Template;
my $q=CGI->new();
〜いろいろ処理〜
$q->param('data',$data);などと表示するデータは全て$q->paramで
〜いろいろ処理〜
my $tmpl = HTML::Template->new(
	filename =>"shop_spot.tmpl.html",
	loop_context_vars=>1,die_on_bad_params=>0,associate=>$q
);
print $q->header();
print $tmpl->output;

と、テンプレートへのデータ受け渡しは全てassociateオプションで行っている。
表示に必要なデータはCGIオブジェクトに集まっているというわけです。

なので、これを奪ってきて、同じようなテンプレートを書けば(コピーすれば)簡単に再現が可能と。
CGIの普通の出力の前に

use MIME::Base64;
use Storable;
if($q->param('mode') eq "raw"){
	my $qfreeze=Storable::freeze($q);
	my $encodefreeze=encode_base64($qfreeze);
	print $q->header(-type=>'text/plain',-charset=>'EUC-JP',-expires=>'now',-pragma=>'no-cache',-cache_control=>'no-cache');
	print $encodefreeze;
	exit();
}

と書いて、Storableでシリアライズしてbase64でエンコードしたテキストを出力する。
受け側は、簡単に書くと

use LWP::Simple;
use MIME::Base64;
use Storable;
my $raw = get ここにURL;
my $q;
eval{
	my $decoded = decode_base64($raw);
	$q = Storable::thaw($decoded);
};

こんなもんでできる。
結構簡単でしかも確実な通信方法。でも、荒技。