【Lifehacks】Twitterに投稿する

■タスク
 ファイルに記述したメッセージをTwitterに投稿する。


■背景
マイクロブログサービス「Twitter」では、各種機能をAPIとして公開しています。APIはREST形式WebAPIのため、簡単に利用することができます。そこでごく初歩的な投稿プログラムを作成してみました。
・Net::Twitterモジュールを使えば数行で書けますが、Twitter APIの理解を目的として生APIを使用します。


■仕様
OAuth認証はまだ不安定なので、ベーシック認証を使用。
・入力ファイルの文字コードShift_JISとします。
・メッセージの長さチェックは特にしていません。


■使用方法
> perl SgPostTwitter.pl < Input.txt > Result.txt


■プログラム

#
# SgPostTwitter.pl
# Twitterに投稿する。
#
# Author: Orihika Ikuo
# Create: 2009.06.17
# Update: 2009.XX.XX
#

##### Pragma
use strict;
use warnings;
use Encode;
use LWP::UserAgent;
use URI;
use URI::Escape;
use URI::Escape qw/uri_escape_utf8/;

##### Setting
our $USR                     = "XXXXXXXX";
our $PWD                     = "XXXXXXXX";
our $UA_NAME                 = "SgPostTwitter/1.0 ";
our $KEEP_ALIVE              = 4;
our $URI                     = "http://twitter.com/statuses/update.xml";
our $ENC_SJIS                = ':encoding(shiftjis)';
our $ENC_UTF8                = ':encoding(utf8)';

##### Constant
our $RET_SUCCESS             = "RET: Success.";
our $RET_FAILURE             = "RET: Failure.";

##### Main routine
&main();

sub main {
  my $ua;
  my $req;
  my $res;
  my $line;
  my $msg = "";

  # 入出力文字コードを設定
  binmode STDIN,  $ENC_SJIS;
  binmode STDOUT, $ENC_UTF8;

  # メッセージを標準入力から読み込み
  while ($line = <STDIN>) {
    $msg .= $line;
  }

  # 投稿の準備
  $ua = LWP::UserAgent->new(
    agent      => $UA_NAME,
    keep_alive => $KEEP_ALIVE
  );

  $req = HTTP::Request->new(POST => $URI);
  $req->authorization_basic($USR, $PWD);
  $req->content("status=" . uri_escape_utf8($msg));

  # 投稿の実行
  $res = $ua->request($req);

  # 返信を標準出力に出力
  if ($res->is_success) {
    print $RET_SUCCESS, "\n";
    print $res->content, "\n";
    print "\n";
  } else {
    print $RET_FAILURE, "\n";
    print $res->status_line, "\n";
    print "\n";
  }
}