twitterクローンしゃべる

XIRCD Componentを作ってみた

会社で,しゃべるというtwitterクローンが動き始めました.普段XIRCD使ってるし,twitterクローンでAPI同じらしいからXIRCD::Component::Twitterのurlだけ変更すれば動くだろと思ったらはまりました.そのメモです.

はまった点

JSONでtimelineを受け取るんだけど,その中のtextがunicodeエスケープされている.つまりここにあるような"\u306F"といった文字列が書いてあるんだけど,これをJSON::Anyがうまく処理できなかったんです.で,こんな処理を入れてみました

92c93,96
<             $ ret = JSON::Any->jsonToObj($response->content);
---
>             my $tmp = $response->content;
>             $tmp =~ s/\\u(\d+)/pack "U*", $1/eg;
>             Encode::_utf8_off($tmp);
>             $ret = JSON::Any->jsonToObj($tmp);
106c110,113
<         my $ret = JSON::Any->jsonToObj($response->content);
---
>         my $tmp = $response->content;
>         $tmp =~ s/\\u(\d+)/pack "U*", $1/eg;
>         Encode::_utf8_off($tmp);
>         my $ret = JSON::Any->jsonToObj($tmp);

これだけだともしかするとだめかもしれなくて,JSON::Anyが裏で動かすモジュールをJSONに限定しています.

11c11
< use JSON::Any;
---
> use JSON::Any qw(JSON);

unicodeエスケープがしゃべるの標準なのか,うちでインストールされてるしゃべるの設定が単にそうなっているだけなのかがわからなかったので,codereposにアップしたりとかは今のところ考えてないっす.

追加:20080801

unicodeエスケープのところがおかしかったのは,しゃべる0.9.5のバグでした.0.9.6にはまた別のバグがあって,今は0.9.7が(たぶん問題なく)動いています.今動かしてるモジュールとTwitter.pmの違いはこんな感じ.

1c1
< package XIRCD::Component::Shovel;
---
> package XIRCD::Component::Twitter;
16,18c16,18
< has 'apiurl'   => ( isa => 'Str', is => 'rw', default => sub { "http://shovel.foo.co.jp:8080/statuses" } );
< has 'apihost'  => ( isa => 'Str', is => 'rw', default => sub { 'shovel.foo.co.jp:8080' } );
< has 'apirealm' => ( isa => 'Str', is => 'rw', default => sub { 'Shovel API' } );
---
> has 'apiurl'   => ( isa => 'Str', is => 'rw', default => sub { 'http://twitter.com/statuses' } );
> has 'apihost'  => ( isa => 'Str', is => 'rw', default => sub { 'twitter.com:80' } );
> has 'apirealm' => ( isa => 'Str', is => 'rw', default => sub { 'Twitter API' } );
37d36
<         Proxy => "http://proxy.foo.co.jp:10000",
50d48
<     $req->header('Accept-Language', 'ja');
64d61
<     $req->header('Accept-Language', 'ja');

0.9.7にはまだバグがあって,request headerでAccept-Languageをjaと指定しないとエラーになります.将来的にはなおると思いますが,今は上記設定が必要です.proxy設定は,元のモジュールになかったので試しに入れてみてます.