Created
July 31, 2008 15:14
-
-
Save dann/3455 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package WWW::HatenaKeyword; | |
use MooseX::Method; | |
use Moose; | |
use WWW::HatenaLogin; | |
use Web::Scraper; | |
use Data::Dumper; | |
use JSON::Syck 'Load'; | |
our $VERSION = '0.01'; | |
has 'username' => ( | |
is => 'ro', | |
isa => 'Str', | |
required => 1, | |
); | |
has 'password' => ( | |
is => 'ro', | |
isa => 'Str', | |
required => 1, | |
); | |
has 'toppage_url' => ( | |
is => 'rw', | |
isa => 'Str', | |
); | |
has 'group' => ( | |
is => 'rw', | |
isa => 'Str', | |
); | |
has 'keywordlist_url' => ( | |
is => 'rw', | |
isa => 'Str', | |
); | |
has 'keyword' => ( | |
is => 'rw', | |
isa => 'Str', | |
); | |
has 'base' => ( | |
is => 'rw', | |
isa => 'Str', | |
); | |
has 'mech_opt' => ( | |
is => 'ro', | |
isa => 'HashRef', | |
); | |
has 'session' => ( is => 'rw', ); | |
sub BUILD { | |
my $self = shift; | |
my $base | |
= $self->group | |
? "http://" . $self->group . ".g.hatena.ne.jp/" | |
: 'http://d.hatena.ne.jp/'; | |
$self->base($base); | |
my $keywordlist_url = $self->base . "keywordlist"; | |
$self->keywordlist_url($keywordlist_url); | |
$self->session( | |
WWW::HatenaLogin->new( | |
{ nologin => 1, | |
username => $self->username, | |
password => $self->password, | |
mech_opt => $self->mech_opt, | |
} | |
) | |
); | |
unless ( $self->session->is_loggedin ) { | |
$self->login; | |
} | |
} | |
no Moose; | |
method update => named( | |
keyword => { isa => 'Str', required => 1 }, | |
body => { isa => 'Str', required => 1 }, | |
) => sub { | |
my ( $self, $args ) = @_; | |
die 'Implement me'; | |
}; | |
method list_keywords => named( | |
) => sub { | |
my ($self) = @_; | |
my $mech = $self->session->mech; | |
$mech->get( $self->keywordlist_url ); | |
# TODO: if group isn't specified, this scraper doesn't work well | |
# xpath is incorrect. | |
my $scraper = scraper { | |
process '//div[@class="refererlist"]/ul/li/a', 'keywords[]' => { | |
name => 'TEXT', | |
url => '@href', | |
}; | |
}; | |
my $result = $scraper->scrape( \$mech->content ); | |
return $result->{keywords}; | |
}; | |
method create => named( | |
keyword => { isa => 'Str', required => 1 }, | |
body => { isa => 'Str', }, | |
) => sub { | |
my ( $self, $args ) = @_; | |
die 'Implement me'; | |
}; | |
method delete => named( | |
keyword => { isa => 'Str', required => 1 }, | |
) => sub { | |
my ( $self, $args ) = @_; | |
die 'Implement me'; | |
}; | |
method retrieve => named( | |
keyword => { isa => 'Str', required => 1 }, | |
) => sub { | |
my ( $self, $args ) = @_; | |
my $mech = $self->session->mech; | |
$mech->get( | |
$self->keyword_url( keyword => $args->{keyword} ) . "?mode=edit" ); | |
my $scraper = scraper { | |
process '//textarea', 'body' => 'TEXT'; | |
}; | |
my $result = $scraper->scrape( \$mech->content ); | |
$result->body; | |
}; | |
method keyword_url => named( | |
keyword => { isa => 'Str', required => 1 }, | |
) => sub { | |
my ( $self, $args ) = @_; | |
my $url = $self->base . "keyword/" . $args->{keyword}; | |
$url; | |
}; | |
sub get_rkm { | |
my $self = shift; | |
my $rkm; | |
$self->session->mech->get( $self->toppage_url . "?mode=json" ); | |
eval { $rkm = Load( $self->session->mech->content )->{rkm}; }; | |
$rkm; | |
} | |
sub is_loggedin { | |
my $self = shift; | |
return $self->session->is_loggedin; | |
} | |
sub login { | |
my $self = shift; | |
$self->session->login; | |
} | |
sub logout { | |
my $self = shift; | |
$self->session->logout; | |
} | |
__PACKAGE__->meta->make_immutable; | |
1; | |
__END__ | |
=head1 NAME | |
WWW::HatenaKeyword - | |
=head1 SYNOPSIS | |
use WWW::HatenaKeyword; | |
=head1 DESCRIPTION | |
WWW::HatenaKeyword is | |
=head1 AUTHOR | |
dann E<lt>techmemo@gmail.comE<gt> | |
=head1 SEE ALSO | |
=head1 LICENSE | |
This library is free software; you can redistribute it and/or modify | |
it under the same terms as Perl itself. | |
=cut |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment