June 25, 2007
nowa のナニシテルってのが Twitter っぽく使えていいカンジなんですが (何を今更)、いかんせん API が無いので、携帯メールから更新するとかのネタを nowa に書いたけど、これが皮肉にも nowa に対応していない。
対応している Twitter と wassr とフレパは API が互換してるおかげで、コード量が少なくてシンプルに書けるねーなんて話がしたかっただけだったりして。
nowa のナニシテルとかは、見てみると、ただの form の submit じゃなくて、どうも JavaScript で内部 API を叩くようにしているっぽいのでよくわからなかった (追おうとしてなかった) んですが、まぁ、ちゃんと js 読んで、ちゃんと動くようにしてみようと思いました。
ということで、nowa の一言を perl で更新出来るようにしてみますた。
対応している 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 サイト同時に更新出来る!!というカンジ。しかし、スクレイピングで更新って、ウェブなんてんいくつなんでしょうか。
まぁ、ぶっちゃけ、そんなに今自分が何しているかアピールしたいもんかね?とか、アピールしたがればしたがるほど中二っぽいから、最近はアピールしまくったら負けかなと思ってたり。
あ、それを言ったらおしまいだった。
いや、自分、中二なんで、個人的にはよく使ってます。