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