ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

WWW::Mixiコミュの【ソース】足あと取得

  • mixiチェック
  • このエントリーをはてなブックマークに追加
足あと取得を定期的に行うのを作ってみました。

ソースは
1. 定期的に動作するデーモンプログラム
2. 表示用CGI
となります。

※perlでdaemonを作成してみたかっただけなんですw
※ソース中の全角スペースをタブに変更すると使用することができます。

コメント(3)

1. 定期的に動作するデーモンプログラム

#!/usr/bin/perl

use Proc::Daemon;
use WWW::Mixi;

our $DAEMON = 1;
our $SLEEP_INTERVAL = 240; # 4min

our $G_DATADIR = '/home/ichi/mixi_log';

if( @ARGV < 2 ){
 die "USAGE: log_daemon.pl mixi_email mixi_password\n";
}
our $mixi_email = $ARGV[0];
our $mixi_password = $ARGV[1];
&login_test;

&init;
&run;

sub login_test {
 my $mixi = WWW::Mixi->new( $mixi_email, $mixi_password );
 $res = $mixi->login;
 if( !$res->is_success ){
  die "Cant login\n";
 }
}

sub action {
 my $res, $url, $mixi_id;
 my $items, $item;

 # login
 my $mixi = WWW::Mixi->new( $mixi_email, $mixi_password );
 $res = $mixi->login;
 if( $res->is_success ){
  $res = $mixi->get( 'show_profile.pl' );
  $mixi_id = $mixi->parse_self_id( $res );

  $log_fname = "${G_DATADIR}/${mixi_id}.log";

  # get old log
  $last = '0';
  if( open( FILE, $log_fname ) ){
   while( <FILE> ){
    push( @logs, $_ );
   }
   close( FILE );
   # get last log date
   $last = (split( "\t", @logs[0] ))[0];
  }

  # get log
  $res = $mixi->get( 'show_log.pl' );
  $log_count = $mixi->parse_show_log_count( $res );
  @items = $mixi->parse_show_log( $res );

  foreach $item ( @items ){
   $link = $item->{link};
   $name = $item->{name};
   $time = $item->{time};
   $timeval = '';
   if( $time=~m/^(\d\d\d\d)\/(\d\d)\/(\d\d) (\d\d):(\d\d)$/ ){
    $timeval = "${1}${2}${3}${4}${5}";
   }
   $data = "${timeval}\t${time}\t${name}\t${link}\n";
   if( $timeval > $last ){
    push( @new_logs, $data );
   }
  }

  # save log
  open( FILE, "> ${log_fname}" ) || die $!;
  print FILE @new_logs;
  print FILE @logs;
  close( FILE );
 }

 return 1;
}

sub interrupt {
 my $sig = shift;
 setpgrp;
 $SIG{$sig} = 'IGNORE';
 kill $sig, 0;
 die "killed by $sig";

 exit(0);
}

sub init {
 $SIG{INT} = 'interrupt';
 $SIG{HUP} = 'interrupt';
 $SIG{QUIT} = 'interrupt';
 $SIG{KILL} = 'interrupt';
 $SIG{TERM} = 'interrupt';

 Proc::Daemon::Init if $DAEMON;
}

sub run {
 while(1) {
  &action;
  sleep( $SLEEP_INTERVAL );
 }
}

1;
2. 表示用CGI

#!/usr/bin/perl

use WWW::Mixi;
use CGI;

our $G_DATADIR = '/home/ichi/mixi_log';

$query = new CGI;
$mixi_email = $query->param( 'mixi_email' );
$mixi_password = $query->param( 'mixi_password' );

print "Content-type: text/html; charset=euc-jp\n\n";

print qq!<html>
<link REL=STYLESHEET HREF="http://mixi.jp/mixi.css" TYPE="TEXT/CSS">
<form method="post" action="log.cgi">
USER:<input type="text" name="mixi_email" size="20" maxlength="80"><br>
PASS:<input type="password" name="mixi_password" size="20" maxlength="80"><br>
<input type="submit" value="ログイン">
<hr>
!;

if(( $mixi_email ne '' )&&( $mixi_password ne '' ) ){
 my $mixi = WWW::Mixi->new( $mixi_email, $mixi_password );

 $res = $mixi->login;
 if( !$res->is_success ){
  print $res->status_line;
  exit;
 };

 $res = $mixi->get( 'show_profile.pl' );
 $mixi_id = $mixi->parse_self_id( $res );

 # マイミク
 $url = 'list_friend.pl';
 while( $url ne '' ){
  $res = $mixi->get( $url );
  @items = $mixi->parse_list_friend( $res );
  push( @friends, @items );
  $item = $mixi->parse_list_friend_next( $res );
  $url = $item->{link};
 }

 $log_fname = "${G_DATADIR}/${mixi_id}.log";

 # ログ読み込み
 $last = '0';
 if( open( FILE, $log_fname ) ){
  while( <FILE> ){
   push( @logs, $_ );
  }
  close( FILE );
  # 最終ログ日付取得
  $last = (split( "\t", @logs[0] ))[0];
 }

 foreach $item ( @logs ){
  chop( $item );
  ( $timeval, $time, $name, $link ) = split( "\t", $item );
  $mymix = 0;
  foreach $item ( @friends ){
#   print "${link}:". $item->{link}. "<br>\n";
   if( $link eq $item->{link} ){
    $mymix = 1;
    last;
   }
  }
  print qq!${time} <a href="${link}">${name}</a>!;
  if( $mymix ){
   print qq! <font size="-4" color=red><b>マイミク</b></font>!;
  }
  print qq!<br>\n!;
 }
}

print "</html>";
これにはログが肥大化するバグがあります。
1の方の
  # save log
  open( FILE, "> ${log_fname}" ) || die $!;
  print FILE @new_logs;
  print FILE @logs;
  close( FILE );
の下に
  @new_logs = ();
  @logs = ();
を入れる事で回避できます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

WWW::Mixi 更新情報

WWW::Mixiのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング