command line interface mixi (2)
2007/02/25
ちょっとだけ進めた。
- マイミク一覧の表示をまじめに書いた
- format機能を使ったんですが、便利だけどスコープとかの面であまり使いやすい機能ではないので、代替方法をCPANを探した方がいいかもしれない。下のように表示できるようにした。
- メールアドレスとパスワードは、起動引数で受けるようにした
- とりあえず、です。間違えてここに張っちゃうのが怖いからというのもあった。
- コマンドを定義するsubを配置するパッケージを別にした。
- 競合しないように。
- 文字コード変換
- Encodeを使った。
- エラーメッセージなどの出力先変更
- 標準出力と標準エラー出力との使い分けをした。
名前 状態 --------------------------------+-------------------- xxxxxxさん(16) 1時間以内 xxxxxxさん(3) xxxxxxさん(84) 1日以内 xxxxxxxxxxさん(43) xxxxxxさん(42) 1日以内 xxxxxxxxxxxxxxさん(14) 1日以内
#!c:/Perl/bin/perl package main; use strict; use warnings; use Term::ReadLine; use WWW::Mixi; my $term = new Term::ReadLine 'command line interface mixi'; my $OUT = $term->OUT || \*STDOUT; my $ERR = \*STDERR; my ($mail_address, $password) = @ARGV; if (!$mail_address || !$password) { print $ERR <<EOD; Usage: $0 <mail_address> <password> EOD exit; } #コマンド定義 my %command_of = ( 'q' => \&Commands::quit, 'quit' => \&Commands::quit, 'exit' => \&Commands::quit, 'h' => \&Commands::help, 'help' => \&Commands::help, 'friend_list' => \&Commands::friend_list); my $mixi = new WWW::Mixi( $mail_address, $password, -log => 10, -logcode => 'sjis'); #環境変数(HTTP_PROXY)からproxy情報を読む $mixi->env_proxy(); print $ERR "logging in.... "; my $response = $mixi->login(); print $ERR "$response->{'_rc'} $response->{'_msg'}\n"; if ($response->{'_rc'} ne "200") { print $ERR "ログインに失敗しました。メールアドレスまたは、パスワードを確認してください。\n"; exit; } while ( defined (my $input = $term->readline("mixi> ")) ) { if ($command_of{$input}) { &{$command_of{$input}} ; } else { print $ERR "ERROR: 不明なコマンドです。 [$input]\n"; &{$command_of{'help'}}; } } exit; #==================== # Commands #==================== package Commands; use Encode; sub quit { exit; } sub help { print $ERR <<EOD; q quit exit 終了する。 h help ヘルプを表示する。 friend_list マイミク一覧を表示する。 EOD } sub friend_list { my @friend_list = $mixi->get_list_friend(); my ($name, $state); _convert(@friend_list); format STDOUT = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<< $name, $state . print $OUT "名前 状態 \n"; print $OUT "--------------------------------+--------------------\n"; for (@friend_list) { $name = "$_->{'subject'}($_->{'count'})"; $state = $_->{'status'} ? $_->{'status'} : ""; write(STDOUT); } } sub _convert { foreach my $ref (@_) { while (my ($key, $value) = each(%$ref)) { Encode::from_to($value, 'euc-jp', 'shiftjis'); $ref->{$key} = $value; } } } # vim: ts=4 sw=4 expandtab