AtomAPIで はてなブックマークにエントリーをpostするテスト

はじめに

数日前、blog.bulknews.netの宮川さんが「del.icio.us と はてなブックマークに cross-post」という興味深いエントリーを書かれたのを知りました。ラッキーなことに、そのクロスポストするPerlスクリプトは公開されています。ソースを見てみると案外コード量は少なかった(100行程度)ので、読めそうかな?と思いました。そこで、早速ソースを印刷して読んでみることにしました。

そうして数日が経過しました。。。

これではいけない!と思いました。最近は忙しくてPerlの勉強ができていないので、早起きして頑張ってみました。

XML::Atomのインストール: ちょっとした困難との遭遇

まずは、XML::Atomのインストールをしました。なぜかXML::Atomで必要となるDateTimeモジュールがFedora Core 4の環境ではうまくテストをパスしてくれませんでした。しょうがないなぁと思い、

>cpan force install DateTime

をして強制的にインストールしました。それから、もう一度XML::AtomのインストールをCPANシェルで実行すると、インストールが完了できました。

AtomAPIはてなブックマークにpost: また壁にぶつかる

宮川さんのコードを参考にして、以下のようなコードを実験的に書いてみました。

#!/usr/bin/perl -w
use strict;
use XML::Atom::Entry;
use XML::Atom::Client;

my $entry = XML::Atom::Entry->new;
my $link  = XML::Atom::Link->new;
$link->rel('related');
$link->type('text/html');
$link->href('http://map.hatena.ne.jp');
$entry->add_link($link);
$entry->summary('AtomAPIで はてなブックマークにpostするテスト');

my $client = XML::Atom::Client->new;
$client->username('your hatena account name');
$client->password('your password');
$client->createEntry("http://b.hatena.ne.jp/atom/post", $entry)
    or warn $client->errstr;

残念ながら、このコードは、はじめは私の環境では動作しませんでした。このコードはどこも悪い所はありません。実はこのスクリプトは、大学のようにproxyを越えてネットにアクセスしなければならない環境では動作しないのです。それに気がつくのに、結構時間がかかりました。

ヒントを探す

どうにかしてproxyの問題を解決したいと思いました。以下のようなコードを書いてみると、proxyを突破できることがわかりました。ポイントは「$ua->env_proxy;」です。この行を書くことで、環境変数http_proxyを読み込んでプロキシを突破してくれるようになります。

#!/usr/bin/perl -w
use strict;
use HTTP::Request;
use LWP::UserAgent;

my $ua = new LWP::UserAgent;

# Read the 'http_proxy' environment variable
# to solve the problem I faced.
$ua->env_proxy;

my $uri = 'http://www.google.com';
my $req = HTTP::Request->new(GET => $uri);
my $res = $ua->request($req);

print $res->content;

上記のコードを実行する前に、当然、環境変数の設定をしておく必要があります。

$ export http_proxy=http://your.proxy

XML::AtomをHack: 大したことはありません

私は今日はじめてXML::Atomを使った人間なので、もっと良い解決方法があったかもしれません。私自身、CPANモジュールをrootで触るのが嫌でしたが、それよりも はてなブックマークAtomAPIを試してみたい気持ちの方が強かったので、やむを得ず試してみることにしました。以下のようなhackをしました。

# vi /usr/lib/perl5/site_perl/5.8.6/XML/Atom/Client.pm
[...]
package LWP::UserAgent::AtomClient;
use strict;

use base qw( LWP::UserAgent );

my %ClientOf;
sub new {
    my($class, $client) = @_;
    my $ua = $class->SUPER::new;
    
    # ysano's quick hack code for the proxy problem
    $ua->env_proxy;
    
    $ClientOf{$ua} = $client;
    $ua;
}
[...]

この嫌なhackのおかげで、無事AtomAPIを使って はてなブックマークにpostする実験が成功しました。

おわりに

また時間が空いたときに、はてなブックマークAtomAPIで遊んでみたいと思います。Webサービスって楽しいですね。