ちょっと仕事の待ち時間に CPAN 巡り。DBD::Google なんて面白そうなモジュールに出会ってしまったので思わず hack。
DBD::Google は名前からも想像が付く様に、Google Web API を DBI で操作するという熱いモジュールです。真面目に SOAP::Lite や Net::Google もいいけど、やはりこういう遊び心があるモジュールの方が楽しいです。でも遊び心といいつつも十分実用的だったりします。
hack のお題は何にしよう...と手元に Template-Toolkit 本があったので DBD::Google と TT を使って何かしようということで、ありがちだけど Google 検索を RSS 化。
#!/usr/local/bin/perl
# Generating RSS feed from Google search with DBD::Google
#
# Naoya Ito <naoya@naoya.dyndns.org>
use strict;
use warnings;
use DBD::Google;
use Template;
our $GoogleKey = 'your_goolgle_api_key';
our $Query = shift;
eval {
my $dbh = DBI->connect("dbi:Google:", $GoogleKey);
## calling Google Search via SQL!
my $sth = $dbh->prepare(qq[
select html_strip(title), url, html_strip(summary)
from google where q = '$Query'
]);
$sth->execute;
my @results;
while (my $r = $sth->fetchrow_hashref) {
push @results, $r;
}
my $tt = Template->new or die $Template::ERROR;
my $output;
$tt->process(\*DATA, { results => \@results }, \$output)
or die $tt->Error;
$sth->finish;
$dbh->disconnect;
print $output;
}; if (my $errstr = $@) {
die $errstr;
}
__DATA__
<?xml versoin="1.0" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0">
<channel rdf:about="http://naoya.dyndns.org/googlerss">
<title>DBD::Google to RSS</title>
<link>http://naoya.dyndns.org/googlerss</link>
<description>generating RSS from Google seach with DBD::Google</description>
<items>
<rdf:Seq>
[% FOREACH site IN results -%]
<rdf:li rdf:resource="[% site.url | html %]" />
[% END -%]
</rdf:Seq>
</items>
[% FOREACH site IN results -%]
<item rdf:about="[% site.url | html %]">
<title>[% site.title | html %]</title>
<link>[% site.url | html %]</link>
<description>[% site.summary | html %]...</description>
</item>
[% END -%]
</rdf:RDF>
わざわざ TT 使わずに、XML::RSS あたりで生成したほうが多分コードは短くすむのだろうけどまあいいじゃありませんか。hack ですから!
最初は Template::Plugin::DBI を使って TT から DBD::Google を使いテンプレート内 SQL で Google Search、という PHP ちっくなコードに仕立てあげようと思っていたのですが Template::Plugin::DBI からは DBD::Google でつなげることができませんでした。残念。やり方間違ってるだけかもしれない。