WWW::Shorten::HatenaBookmark
はてなブックマークのentryページにeidでアクセスしてTinyURLとして使う(e.g. http://b.hatena.ne.jp/entry/4638347)。そんなに短いわけでもないし、誰かがブックマークしてないと使えない。割と短めのurlで有用な情報を得られるかもしれない、くらい。
短くするためにはてなブックマークエントリー情報取得APIに入ってるeid情報を使ってます。eidから元のurl取得はapiで解決できなさそうなので正規表現で。
package WWW::Shorten::HatenaBookmark; use strict; use warnings; use WWW::Shorten::generic; use JSON::Any; use base qw( WWW::Shorten::generic Exporter ); our @EXPORT = qw( makeashorterlink makealongerlink ); =head1 NAME WWW::Shorten::HatenaBookmark - Perl interface to b.hatena.ne.jp/entry/# =head1 VERSION Version 0.0.1 =cut our $VERSION = '0.0.1'; =head1 SYNOPSIS This is a perl interface for Hatena Bookmark entry page. use WWW::Shorten 'HatenaBookmark'; my $short_url = makeashorterlink($original_url); # http://b.hatena.ne.jp/entry/... my $long_url = makealongerlink($short_url); # $original_url =cut =head2 makeshorterlink Takes a url to shorten, return hatena bookmark entry id url. =cut sub makeashorterlink { my $url = shift; my $ua = __PACKAGE__->ua(); my $response = $ua->get('http://b.hatena.ne.jp/entry/json/' . $url); my $content = $response->content; $content =~ s!^\((.*?)\)$!$1!; if ($content =~ m!^null$!) { return; } my $json = JSON::Any->jsonToObj($content); return 'http://b.hatena.ne.jp/entry/' . $json->{eid}; } =head2 makelongerlink This function C<makealongerlink> does the reverse. C<makealongerlink> will accept as argument either the full Hatena Bookmark eid URL or just the eid. =cut sub makealongerlink { my $tinyurl_url = shift; my $ua = __PACKAGE__->ua(); $tinyurl_url = 'http://b.hatena.ne.jp/entry/' . tinyurl_url if $tinyurl_url =~ m!^\d+$!; return undef unless $tinyurl_url =~ m!^http://b.hatena.ne.jp/entry/\d+!i; my $response = $ua->get($tinyurl_url); my $content = $response->content; if ($content =~ m!<ul class="footnote">\s*<li>.*?<a href="(.*?)" target="_blank">.*?</a></li>!m) { my $longer_url = $1; return $longer_url; } return undef; } 1; __END__ =head2 EXPORT makeashorterlink, makealongerlink =head1 SEE ALSO L<WWW::Shorten> =head1 AUTHOR Tsutomu Koyachi <rtk2106@gmail.com> =cut