Scrapdiary

DesigningとEngineeringの架け橋

Net::Twitterで作った簡易CGIを携帯向けに改良してみた

表示と実処理を分けた方がいいかなと思って作ったけど、実際その必要ないんじゃないかと思い直す。それにタイムラインとか見れた方が便利かなと思って改造してみた。オブジェクト指向な書き方を考えてたけど、今の自分のレベルじゃ意味がなさそうだったのでこちらは却下。


twitter.pl - まとめ版

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Jcode;
use Net::Twitter;

my $twit = Net::Twitter->new( username=>"kulamochi", password=>"hogehoge" ); #APIでログイン
my ($view, $tweet, $result);
my $cgi = new CGI;
if($cgi->param('tweet')){
        $tweet = Jcode::convert($cgi->param('tweet'), 'utf8');
        $result = $twit->update($tweet);
}

$view = ($cgi->param('v') ? $cgi->param('v') : 5 ); #TL表示件数をパラメータから取得

my $tl_ref = $twit->friends_timeline({count=>$view}); #APIでTLを取得 引数は件数

print   $cgi->header(-charset=>'Shift_JIS'),
        $cgi->start_html('Net::Twitter'),
        $cgi->h1('Net::Twitter'),
        $cgi->h2('What are you doing?'),
        $cgi->start_form( -method=>"post", -action=>$ENV{'SCRIPT_NAME'} ),
        $cgi->textfield( -name=>"tweet", -maxlength=>"140" ),
        $cgi->hidden( -name=>"v", -value=>$view ),
        $cgi->submit( -name=>"submit", -value=>"tweet!" ),
        $cgi->endform;

if($tl_ref){
        print   $cgi->h2('Timeline');
        foreach my $hash_ref (@$tl_ref) { #TLを展開
                my $text = Jcode->new($hash_ref->{'text'})->sjis;
                print   $cgi->hr,
                        $cgi->p($hash_ref->{'user'}{'screen_name'},":<br />", $text),
        }
        print   $cgi->hr;
}
print   $cgi->start_form( -method=>"post", -action=>$ENV{'SCRIPT_NAME'} ),
        "recent posts: ",
        $cgi->textfield( -name=>"v", -size=>"3", -value=>$view ), #TL表示件数設定
        $cgi->submit( -name=>"submit", -value=>"modify" ),
        $cgi->endform,
        $cgi->end_html;
exit;

まぁほとんどHTMLを描画してるだけなんだけどwタイムラインを取得するのに参考にさせていただいたのは前回に引続きこちら。

friends_timelineなどのメソッドにはリファレンスで値を渡さなければいけないということに気づかず小一時間ハマった。newの時は参考サイトどおりパラメータ指定できたのが不思議*1

Please note that any method that takes a hashref as an argument must be called in the form:

    $twit->method({arg => "value"});
    and not
    $twit->method(arg => "value");

If the curly brackets around the arguments are missing, the code which implements the convenience methods allowing you to specify a single argument as a string will interpret "arg" as your argument.


Net::Twitter - Perl interface to twitter.com - search.cpan.org

タイムラインの表示件数を設定できるようにしてみた。さて次の課題はログイン処理でUsernameとPasswordを取得してセッションに保存とかが出来ればいいかな。


簡単なことしかやってないと思うんだけど、なんかプログラミング面白い!

追記

使用携帯端末実機で文字化けしたので、出力部分をShift_JISに変更。(2009/5/26)

*1:試しにnewをリファレンス渡しにしても動いた。このコンストラクタだけ特殊なのかも