command line interface mixi (3)

最近のマイミクの日記一覧の表示と、日記の表示ができるようになった。

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の自分の日記を有効にしなければ。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください