Twitterのupdate - コマンドラインから

タイトルの通り。twitterSNS的な使い方よりもミニブログというか、本当に独り言を書くだけのツールとして非常に重宝してます。ブログだと、一言だけ書きたいってのがなかなかやりにくくて・・・。
ただ、今の使い方としては、はてなのサイドバーに表示してあるので、

  1. はてなダイアリーにアクセス
  2. Twitterのリンクをクリック
  3. トップページをクリック
  4. テキスト打ち込み

と、手順がめんどくさい!まあ、トップページのリンクを張っておけという話ではあるのですが・・・。Twitterのサイトはいつも遅いしなあ。RoRだからだよ!とか無駄に煽ってみるがよく分からない。
そんなわけで、とりあえずコマンドラインからお気軽にupdateしたいと思って作りました。世の中には色々クライアントがあるけど、俺にとってはどれもオーバースペックだな。updateできるだけでいいんだもん。

use strict;
use warnings;
use Net::Twitter;
use Data::Dumper;
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;

my $term_encoding = 'shiftjis';
my $username      = 'kkobayashi';
my $password      = '**********';
my $update_text   = shift;

my $twit = Net::Twitter->new(username=>$username, password=>$password);
my $result = $twit->update(convert_to('utf8', $update_text));

if($result){
  print "update finished!\n";
  print Dumper($result);
}
else{
  print "update failed!";
}

sub convert_to{
  my ($enc_to, $str) = @_;
  my $encoding = guess_encoding($str);
  my $enc_from = ref($encoding) ? $encoding->name : $term_encoding;
  return encode($enc_to, decode($enc_from, $str));
}

CPANのおかげでWeb APIとか知らない俺でも簡単に作れるのはすごいなあ。
Net::Twitterのソースによると、updateの結果はJSONオブジェクトが返ってくるらしい。(追記:jsonToObjだからPerlのデータ型だった!てへり。)

sub update {
    my ( $self, $status ) = @_;

    my $req = $self->{ua}->post($self->{apiurl} . "/statuses/update.json", [ status => $status ]);
    return ($req->is_success) ?  JSON::Any->jsonToObj($req->content) : undef;
}

実行結果。

$ perl twitter.pl テストです
update finished!
$VAR1 = {
          'source' => 'web',
          'truncated' => bless( do{\(my $o = 0)}, 'JSON::XS::Boolean' ),
          'created_at' => 'Mon Oct 29 06:00:32 +0000 2007',
          'text' => "\x{30c6}\x{30b9}\x{30c8}\x{3067}\x{3059}",
          'user' => {
                      'location' => '',
                      'protected' => $VAR1->{'truncated'},
                      'profile_image_url' => 'http://static.twitter.com/images/default_profile_normal.png',
                      'name' => 'kkobayashi',
                      'description' => '',
                      'url' => 'http://d.hatena.ne.jp/kkobayashi/',
                      'id' => 4511391,
                      'screen_name' => 'kkobayashi'
                    },
          'id' => 371882712
        };