Skip to content

Instantly share code, notes, and snippets.

@dann
Created July 31, 2008 15:14
Show Gist options
  • Save dann/3455 to your computer and use it in GitHub Desktop.
Save dann/3455 to your computer and use it in GitHub Desktop.
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