nowa のナニシテルを更新してみる - にぽたん研究所

June 25, 2007

このエントリーをはてなブックマークに追加
nowa のナニシテルってのが Twitter っぽく使えていいカンジなんですが (何を今更)、いかんせん API が無いので、携帯メールから更新するとかのネタを nowa に書いたけど、これが皮肉にも nowa に対応していない。
対応している Twitter と wassrフレパは API が互換してるおかげで、コード量が少なくてシンプルに書けるねーなんて話がしたかっただけだったりして。

nowa のナニシテルとかは、見てみると、ただの form の submit じゃなくて、どうも JavaScript で内部 API を叩くようにしているっぽいのでよくわからなかった (追おうとしてなかった) んですが、まぁ、ちゃんと js 読んで、ちゃんと動くようにしてみようと思いました。

ということで、nowa の一言を perl で更新出来るようにしてみますた。




package Nowa::Nanishiteru;

use strict;
use WWW::Mechanize;
use Time::HiRes qw(time);
use Carp;
use URI;
use JSON::Syck;

use constant NOWA_HOME => 'http://my.nowa.jp/home/';

sub new {
    my $class = shift;
    unless (ref($_[0]) eq 'HASH') {
        croak "invalid argument";
    }
    my $self = shift;
    my $mech = WWW::Mechanize->new;
    $mech->agent_alias('Windows IE 6');
    $self->{mech} = $mech;
    bless $self, $class;
    return $self;
}

sub update_nanishiteru {
    my($self, $nanishiteru) = @_;
    $self->_login unless $self->{_logged_in};
    $self->_home;
    my($rkey) =
        $self->{mech}->content =~ m{hitokoto\.init\(\s*"([a-z\d]+)"\s*\)}i;
    croak "Cannot find rkey" unless $rkey;
    my $uri = URI->new_abs('/internal_api/status_message/', NOWA_HOME);
    my($sec, $fsec) = time() =~ /^(\d+)(?:\.(\d+))?$/;
    $fsec = substr($fsec, 0, 3);
    $fsec .= '0' while length $fsec < 3;
    my $uniqid = sprintf('%d%d', $sec, $fsec);
    $uri->query_form(
        rkey   => $rkey,
        uniqid => $uniqid,
        body   => $nanishiteru,
    );
    $self->{mech}->get($uri->as_string);
    my $result = JSON::Syck::Load($self->{mech}->content);
    croak "Cannot update your nanishiteru." if $result->{status} ne 'success';
    return 1;
}

sub _home {
    my $self = shift;
    if ($self->{mech}->uri ne NOWA_HOME) {
        $self->{mech}->get(NOWA_HOME);
    }
    $self->_login unless $self->{mech}->uri ne NOWA_HOME;
}

sub _login {
    my $self = shift;
    $self->{mech}->get(NOWA_HOME);
    $self->{_logged_in} = 1 if $self->{mech}->uri eq NOWA_HOME;
    return if $self->{_logged_in};
    my $uri = $self->{mech}->uri;
    $self->{mech}->submit_form(
        form_number => 1,
        fields      => +{
            nowa_id  => $self->{nowa_id},
            password => $self->{password},
        },
    );
    croak("login failed.") if $self->{mech}->uri eq $uri;
    $self->{_logged_in} = 1;
}

1;
これをこんな風に使う。
#!/usr/local/bin/perl

use strict;
use Nowa::Nanishiteru;

my $nowa = Nowa::Nanishiteru->new({
    nowa_id  => 'nipotan',
    password => 'password',
});
$nowa->update_nanishiteru('何もしてねえよ。');
これを、いいあんばいに携帯メールから更新するやつに組込めば、一気に 4 サイト同時に更新出来る!!というカンジ。
しかし、スクレイピングで更新って、ウェブなんてんいくつなんでしょうか。
まぁ、ぶっちゃけ、そんなに今自分が何しているかアピールしたいもんかね?とか、アピールしたがればしたがるほど中二っぽいから、最近はアピールしまくったら負けかなと思ってたり。


あ、それを言ったらおしまいだった。


いや、自分、中二なんで、個人的にはよく使ってます。

nipotan at 19:52 | Comments(0) | TrackBack(0) | 技術 
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star