Changeset 6214

Show
Ignore:
Timestamp:
02/05/08 13:02:02 (7 years ago)
Author:
woremacx
Message:

lang/perl/WebService-Nowa: switch to nowa API (recent, update_nanishiteru)

Location:
lang/perl/WebService-Nowa/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/WebService-Nowa/trunk/config.yaml-dist

    r5295 r6214  
    22nowa_id: yourid 
    33password: yourpass 
     4api_pass: apipass 
     5# make your api_pass at http://my.nowa.jp/config/account/api_auth 
  • lang/perl/WebService-Nowa/trunk/lib/WebService/Nowa.pm

    r5393 r6214  
    77our $VERSION = '0.01'; 
    88 
    9 use base qw( Nowa::Nanishiteru ); 
    10  
    119use Data::Dumper; 
    1210use Encode (); 
     
    1412use List::Util qw(first); 
    1513use Web::Scraper; 
     14use Time::HiRes qw(time); 
     15use Carp; 
     16use URI; 
     17use JSON::Syck; 
     18use WWW::Mechanize; 
     19 
     20use constant NOWA_HOME => 'http://my.nowa.jp/home/'; 
     21use constant NOWA_API_HOME => 'https://api.nowa.jp/'; 
    1622 
    1723sub new { 
    1824    my $class = shift; 
    19     my $self  = $class->SUPER::new(@_); 
     25    croak "invalid argument" unless (ref($_[0]) eq 'HASH'); 
     26    my $self = shift; 
     27    bless $self, $class; 
     28 
     29    my $mech = WWW::Mechanize->new; 
     30    $mech->credentials('api.nowa.jp:443', "nowa API", $self->{nowa_id}, $self->{api_pass}); 
     31    $mech->agent_alias('Windows IE 6'); 
     32    $self->{mech} = $mech; 
    2033    $self->{mech}->stack_depth(1); 
    2134 
    2235    $self; 
     36} 
     37 
     38# copyed from Nowa::Nanishiteru 
     39sub _login { 
     40    my $self = shift; 
     41    $self->{mech}->get(NOWA_HOME); 
     42    $self->{_logged_in} = 1 if $self->{mech}->uri eq NOWA_HOME; 
     43    return if $self->{_logged_in}; 
     44    my $uri = $self->{mech}->uri; 
     45    $self->{mech}->submit_form( 
     46        form_number => 1, 
     47        fields      => +{ 
     48            nowa_id  => $self->{nowa_id}, 
     49            password => $self->{password}, 
     50        }, 
     51    ); 
     52    croak("login failed.") if $self->{mech}->uri eq $uri; 
     53    $self->{_logged_in} = 1; 
    2354} 
    2455 
     
    70101} 
    71102 
     103sub _api { 
     104    my $self = shift; 
     105    my $method = shift; 
     106 
     107    my $uri = URI->new_abs($method, NOWA_API_HOME); 
     108    $self->{mech}->get($uri->as_string); 
     109    my $res = JSON::Syck::Load($self->{mech}->content); 
     110    croak "fetch recent failed." if ref($res) eq 'HASH' and $res->{result} eq 'fail'; 
     111    $res; 
     112} 
     113 
    72114sub recent { 
    73115    my $self = shift; 
    74     $self->_login unless $self->{_logged_in}; 
    75116 
    76     my $s = scraper { 
    77         process '//div[@class="friendentry-box clearfix"]', 'entries[]' => scraper { 
    78             process '//div[@class="friendentrybody"]/a', 'userlink', '@href'; 
    79             process 'span.time > a', 'permalink', '@href'; 
    80  
    81             # message 
    82             process 'h2.statustitle', 'body', 'TEXT'; 
    83  
    84             # entry 
    85             process '//h2[@class!="statustitle"]/a', 
    86                 'entry', 'TEXT', 
    87                 'entrylink', '@href'; 
    88         }; 
    89     }; 
    90     my $res = $self->scrape($s, URI->new('http://my.nowa.jp/friend/')); 
    91  
     117    my $res = $self->_api('/status_message/friends_timeline.json'); 
    92118    my @data; 
    93     for my $entry (@{ $res->{entries} }) { 
    94         my $user = ($entry->{userlink} =~ m!^http://([^\.]+)\.nowa\.jp/!)[0]; 
    95         my $body; 
    96         if ($entry->{entry}) { 
    97             $body = $entry->{entry} . " " . $entry->{entrylink}; 
    98             $entry->{permalink} = $entry->{entrylink}; 
    99         } else { 
    100             $body = $entry->{body}; 
    101         } 
    102  
     119    for my $entry (@$res) { 
     120        my $who = $entry->{user}->{nowa_id}; 
     121        my $permalink = sprintf("http://%s.nowa.jp/status/%d", $who, (split(/_/, $entry->{id}))[1]); 
    103122        push(@data, +{ 
    104             user      => $user, 
    105             permalink => $entry->{permalink}, 
    106             body      => $body, 
     123            id        => $entry->{id}, 
     124            user      => $entry->{user}->{nowa_id}, 
     125            permalink => $permalink, 
     126            body      => $entry->{text}, 
    107127        }); 
    108128    } 
    109129 
    110130    return wantarray ? @data : \@data; 
     131} 
     132 
     133sub update_nanishiteru { 
     134    my($self, $status) = @_; 
     135 
     136    my $uri = URI->new_abs('/status_message/update.json', NOWA_API_HOME); 
     137    $self->{mech}->post($uri->as_string, { status => $status }); 
     138    my $res = JSON::Syck::Load($self->{mech}->content); 
     139    croak "fetch recent failed." unless $res->{id} =~ /^\d+_\d+$/; 
     140    $res; 
    111141} 
    112142 
  • lang/perl/WebService-Nowa/trunk/test.pl

    r5360 r6214  
    88my $config = YAML::LoadFile(shift(@ARGV) || "config.yaml"); 
    99my $nowa = WebService::Nowa->new($config); 
    10 # $nowa->update_nanishiteru('何もしてねえよ。'); 
    11  
     10$nowa->update_nanishiteru('何もしてねえよ。'); 
    1211my $msgs = $nowa->recent; 
    1312my $chans = $nowa->channels;