読者です 読者をやめる 読者になる 読者になる

コマンドラインでTwitterのログを眺める

Twitter Perl

一日の結構な時間をEmacs上で過ごし、一日Twitterのログを眺めているような気がするので、コマンドライン上で動くTwitterクライアントを探していました。そんな中yanbeさんが作ったクライアントを発見しました。

これはよいと使っていたのですが、チルダとかを含む文字があるとエラーを吐いて止まってしまうという事態になっていました。現在はそれが解消されたと書いてあるのですが、僕の環境(Vine Linux)で新しいコートがなぜか動かないw。で、自分でいじればいいのかと思ったりもしたもののpythonしばらく触ってないから分からないorz。

というわけでPerlで作ることにしました。

そのままだと日本語通らないとかいろいろあったのですが、こっちはperlだったので何とか。元のやつはYAMLとか*1使ってあったりしたんですけど、とりあえずそういう高級そうなのは排除w。

「読み書きをどうやって同時にやればいいんじゃい」とか思って、python側のコードを眺めてみるとrunとか書いてあったので「ああ、スレッドね」と理解。しかし、Javaでもスレッドほとんど知らなくてPerlではやったこともないw。とまあ、そんな状況で書いてみました。とりあえず実現したい環境はできたからいいっちゃいいのか。

#!/usr/bin/perl

use strict;
use warnings;

use Net::Twitter;
use threads;
use Jcode;

my $twitter   =  Net::Twitter->new(
    username  => "username",
    password  => "password",
);

my $thread_read = threads->new(\&friends_timeline);
my $thread_write = threads->new(\&update);

$thread_read->join;
$thread_write->join;

sub friends_timeline {
    my $twitt_id = 0;
    while(1){
        my $res = $twitter->can("friends_timeline")->($twitter);
        @{$res} = reverse @{$res};
        my $counter=0;
        for(@{$res}) {
            if($_->{id} > $twitt_id){
                print(Jcode::convert($_->{user}{screen_name}, 'euc-jp'),": ",Jcode::convert($_->{text}, 'euc-jp'),"\n");
            }
            $counter++;
            if($counter == 20){
                $twitt_id = $_->{id};
            }
        }
        sleep(52);
    }
}

sub update {
    while(my $text = <STDIN>){
        my $res = $twitter->can("update")->($twitter, Jcode::convert(\$text, 'utf8'));
        print "Updated:",Jcode::convert(\$text, 'euc-jp');
    }
}

送り出す側の文字コードと読む側の文字コードをいちいち変更しないといけないのが、ちょっと嫌な感じ。

*1:これって何て読むの?