w3m のローカル CGI として動く Twitter ビューアー

Twitter のフレンド・タイムラインを w3m を通して閲覧するだけの機能しか、この Perl スクリプトには、現在のところ、ありません。


このスクリプトの動作確認は、Fedora 10 そして openSUSE 11.1 で、しました。


このスクリプトのファイルは => http://purloinedletter.net/misc/apps/tw3m_cgi.utf8.txt

wassr 版はこちら => http://purloinedletter.net/misc/apps/was3m_cgi.utf8.txt

コードは以下。

#!/usr/bin/perl
# tw3m.cgi: w3m のローカル CGI として動く
# 簡易 Twitter ビューアー。
#
# cp this_script_file ~/cgi-bin/tw3m.cgi
# chmod +x ~/cgi-bin/tw3m.cgi
# w3m file:///cgi-bin/tw3m.cgi
# Enjoy!
#
# Last Update: 2009-07-06 01:42:04 .
# Kim, Yi-Chul 金利哲


use warnings;
use strict;
use utf8;


use LWP::UserAgent;
use JSON;
use Encode;



# Twitter で使用しているメールアドレス、パスワードを設定します。
my $username = 'hoge';
my $password = 'hogehoge';

# 何件のステータスを取得するかを設定します。
# 200 件までが推奨されています。
my $number_of_count = 100;


# Twitter API を通じて タイムラインの JSON 形式の
# データを取得します。
my $friend_timeline_data = &get_content($username, $password, $number_of_count);
# 取得した JSON データを Perl のデータに変換します。
my $status = decode_json $friend_timeline_data;


# HTML を出力します。
# HTML ヘッダー。
&header_html;

# フレンド・タイムラインのデータを基にして
# HTML を作成します。
foreach my $status (@$status) {

  print "<li>";

  # フレンドの画像の URI を取得します。
  my $image_uri = "$status->{user}->{profile_image_url}";
  print "<img src=$image_uri> ";
  # 名前を表示します。
  print "<b> $status->{user}->{screen_name} </b>: ";
  # ステータスを UTF8 でエンコードします。
  my $text = encode('utf8', $status->{text});
  print "$text";
  # ステータス ID も、ついでに、出力します。
  print " ( $status->{id} )";

  print "</li>";

}

# HTML フッター。
&footer_html;



sub get_content
{
  my ($uname, $pass, $count) = @_;

  my $api_uri = 'http://twitter.com/statuses/friends_timeline.json?count=';
  $api_uri = $api_uri . $count;


  my $ua = LWP::UserAgent->new;
  $ua->timeout(60);    # タイムアウトする秒数を設定します。
  require HTTP::Request;
  my $req = HTTP::Request->new(GET => $api_uri);
  # authorization_basic で認証用に
  # ユーザーネーム・パスワードを設定します。
  $req->authorization_basic($uname, $pass);

  # Twitter API からのレスポンスを取得します。
  my $res = $ua->request($req);
  # レスポンスから JSON 形式のデータ内容を抽出します。
  my $content = $res->content;

  return $content;
}


sub header_html {
print <<"HERE";
Content-type: text/html;charset=UTF-8

  <html>\n
    <body>\n
      <ul>\n
HERE
}

sub footer_html {
  print <<"HERE";
      </ul>\n
    </body>\n
  </html>\n
HERE
}