command line interface mixi (3)
2007/03/02
最近のマイミクの日記一覧の表示と、日記の表示ができるようになった。
formatの使い方が間違っているような気がする。前(d:id:smeghead:20070225:1172405451)は、formatがひとつだったから、問題なかったんですが、formatの定義が複数になったので、下を参考にして複数のフォーマットを使用できるようにした。
しかし、これでもまだ妙なselect()があります。FileHandleモジュールを使いましょう。そうすれば、これらの特殊変数の代わりに小文字メソ ッド(lowercase method)を使ってアクセスできるようになります。
use FileHandle;
format_name OUTF “My_Other_Format”;
format_top_name OUTF “My_Top_Format”;
ずいぶん良くなりましたね!
http://www.kt.rim.or.jp/~kbk/perl5.005/perlform.html
あと、メールアドレスとパスワードをコマンドライン引数から(コマンドの履歴にパスワードが残るのは最悪)だけでなく、実行後の入力もできるようにしました。
そのとき、エコーバックしない文字入力のために、Term::ReadPasswd を使いました。
mixi.pl
#!c:/Perl/bin/perl package main; use strict; use warnings; use Term::ReadLine; use Term::ReadPasswd; 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; $mail_address = $term->readline("mail address: ") unless $mail_address; $password = read_passwd("password: ") unless $password; #コマンド定義 my %command_of = ( 'q' => \&Commands::quit, 'quit' => \&Commands::quit, 'exit' => \&Commands::quit, 'h' => \&Commands::help, 'help' => \&Commands::help, 'friend_list' => \&Commands::friend_list, 'new_friend_diary' => \&Commands::new_friend_diary, ); 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"; $response->is_success or die "ログインに失敗しました。メールアドレスまたは、パスワードを確認してください。\n"; while ( defined (my $input_command_with_args = $term->readline("mixi> ")) ) { my @input = split(/\s+/, $input_command_with_args); my $command = shift @input; if ($command_of{$command}) { &{$command_of{$command}}(@input) ; } else { print $ERR "ERROR: 不明なコマンドです。 [$command]\n"; &{$command_of{'help'}}; } } exit; #==================== # Commands #==================== package Commands; use Encode; use Data::Dumper; use FileHandle; sub quit { exit; } sub help { print $ERR <<EOD; q quit exit 終了する。 h help ヘルプを表\示する。 friend_list マイミク一覧を表\示する。 new_friend_diary 最新日記一覧を表\示する。 new_friend_diary <No.> 最新日記一覧の中の指定された番号の日記を読む。 EOD } sub friend_list { my @friend_list = $mixi->get_list_friend(); my ($name, $state); _convert(@friend_list); format STDOUT_FRIEND_LIST = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<< $name, $state . print $OUT "########## マイミク一覧 ##############\n"; print $OUT "名前 状態 \n"; print $OUT "--------------------------------+--------------------\n"; for (@friend_list) { $name = "$_->{'subject'}($_->{'count'})"; $state = $_->{'status'} ? $_->{'status'} : ""; format_name STDOUT "STDOUT_FRIEND_LIST"; write(STDOUT); } } sub new_friend_diary { my $no = shift; my @new_friend_diary = $mixi->get_home_new_friend_diary(); _convert(@new_friend_diary); unless ($no) { my ($n, $time, $title) = (0, "", ""); format STDOUT_DIARY_LIST = @<<< @<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $n, $time, $title . print $OUT "############ 日記一覧 ################\n"; print $OUT "No. 日時 タイトル \n"; print $OUT "----+-------+-------------------------------------------------\n"; for (@new_friend_diary) { next unless $_->{'name'}; ++$n; $time = $_->{'time'}; $title = "$_->{'subject'}($_->{'name'})"; format_name STDOUT "STDOUT_DIARY_LIST"; write(STDOUT); } } else { my ($subject, $time); my @items = $mixi->get_view_diary($new_friend_diary[$no - 1]->{'link'}) or die "ERROR: 日記が取得できませんでした。"; _convert(@items); format STDOUT_DIARY = @<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<< $subject, $time . foreach my $item(@items) { print $OUT "############## 日記 ##################\n"; print $OUT "タイトル 日時 \n"; print $OUT "-----------------------------------+-----------------\n"; $subject = $item->{'subject'}; $time = $item->{'time'}; format_name STDOUT "STDOUT_DIARY"; write(STDOUT); print $OUT "\n"; print $OUT $item->{'description'}; print $OUT "\n"; next if scalar(@{$item->{'comments'}}) == 0; print $OUT "\n"; print $OUT "############ コメント ################\n"; _convert($item->{'comments'}); foreach my $comment($item->{'comments'}) { my ($name, $commenttime); format STDOUT_DIARY_COMMENT = @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<< $name, $commenttime . print $OUT "名前 日時 \n"; print $OUT "---------------------+-----------------\n"; $name = $comment->{'name'} ? $comment->{'name'} : ""; $commenttime = $comment->{'time'} ? $comment->{'time'} : ""; format_name STDOUT "STDOUT_DIARY_COMMENT"; write(STDOUT); print $OUT "\n"; print $OUT $comment->{'description'} ? $comment->{'description'} : ""; } } } } sub _convert { foreach my $ref (@_) { $ref = $ref->[0] if (ref $ref eq 'ARRAY'); if (ref $ref eq 'HASH') { while (my ($key, $value) = each(%$ref)) { my $val_ref = ref($value); if ($val_ref ne 'REF' && $val_ref ne 'ARRAY') { Encode::from_to($value, 'euc-jp', 'shiftjis'); $ref->{$key} = $value; } } } } } # vim: ts=4 sw=4 expandtab
だいぶ長くなってきたから、これからは全部貼れないかな?
次は、コメントの投稿機能かな。でも自分がmixiで日記使ってない。
人の日記のコメント欄でテストしたら、単なる荒らしになってしまう。
mixiの自分の日記を有効にしなければ。