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

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

WWW::Mixiコミュの日記の一括ダウンロード?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして、「湯加減?ぱんだ」と申します。
Perlはなんとか書ける程度の素人ですが、
よろしくお願い致します。
当方環境WindowsXP、ActivePerl5.8.8です。

WWW-Mixiモジュールをインストールして
↓を読みながら色々試しております。

http://digit.que.ne.jp/work/product/module/WWW/Mixi/WWW-Mixi-0.49.htm#name

#!/usr/bin/perl

use WWW::Mixi;

my $mixi_email = 'xxxxx@xxx.xx.jp';
my $mixi_password = 'xxxxxxxxxx';
my $mixi = WWW::Mixi->new($mixi_email, $mixi_password);

print "ログインします。\n";
my $response = $mixi->login;

print "ホームを取得します。\n";
$response = $mixi->get('home.pl');

print $response->content;
#ここまではなんとか…(*^^)v

素人がいきなり高度の技をと思われるで
しょうが、これまで自分が書いた日記
全ての日付時刻、件名、内容を一括テキストに
ダウンロードしたいんですが可能でしょうか?
もし可能であれば操作方法よろしく
ご指導願います。m(__)m

コメント(13)

1.list_diary.plを取得
2.parse_list_diaryで解析、結果を配列に貯める
3.parse_list_diary_nextをし、1から繰り返す
4.2の配列から1件取り出し、$foo->{link}のURLを取得
5.parse_view_diaryで解析。これが日記本体
6.配列分4へ繰り返す

で、できると思います。
日本語がニガテなのでチョー解りづらいとオモイマース
http://mixi.jp/view_bbs.pl?id=4324223&comm_id=43735

ここにもろ書いてありますね。
これ昔私が作ったものです。(前のmixi-IDでw)
ついでに。
日記を連続で読むとアクセス制限にひっかかります。
2:のスクリプトにはsleep(5)が入っていて、それぐらいだとちょうどアクセス制限になりませんでした。
>TaKuBoさん
懇切丁寧なご説明有難う御座いました。
早速、>1,2を参考にやってみます。
>TaKuBoさん
早速トライしたんですが、一番基本的なところが
クリア出来てないようなんです。

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;
}
else{
print "ログイン成功!\n";
}
# 自分の情報取得
$res = $mixi->get( 'show_profile.pl' );
$mixi_id = $mixi->parse_self_id( $res );
print $mixi_id,"\n";
#ここまでは順調に行きます。

# どうも以下の@itemsにparse内容を格納する
  # 部分が作動しないようで?

$url = 'list_friend.pl';
$res = $mixi->get( $url );
@items = $mixi->parse_list_friend( $res );
print "No items!\n" if (@items == 0);

$url = 'list_diary.pl';
$res = $mixi->get( $url );
@items = $mixi->parse_list_diary( $res );
print "No items!\n" if (@items == 0);
}
両方ともNo Itemsと表示されます?
何か原因お気づきでしたらご教示下さい。
塚本です。
おそらく、0.49版ではlist_diaryの解析ができなくなっていたことによると思います。しばらく作業できずにいて、放置状態になってしまい、済みませんでした。
0.50版を公開しましたので、お試し下さい。
>塚本さん
>0.50版を公開しましたので、お試し下さい。

お手数をおかけしました。早速試してみます。
m(__)m
>TaKuboさん、塚本さん
お陰様で「これまで自分が書いた日記
全ての日付時刻、件名、内容を一括テキストに
ダウンロード」するコードを書くことが
出来ました。一応動きます。(*^^)v
コミュのメンバーで同様のことをしたい方の
ご参考に下記のとおり纏めてみました。
ほとんどTaKuBoさんのコードとご注意を流用した
だけですが…(^_^;)
ここはこうした方が?などのご意見あれば
ご指摘願います。m(__)m

#!/usr/bin/perl

use strict;
use WWW::Mixi;
use Encode;
use Time::HiRes qw(gettimeofday);#所要時間計測用

#エンコード変換とファイルへの出力用サブルーチン
sub pfsjis{
my ($file,$str)=@_;
Encode::from_to($str,"euc-jp","shift-jis");
print $file $str."\n";
}
my $t0 = gettimeofday();
my $mixi_email='xxxxxx@xxx.xx.xx'; # ユーザ名
my $mixi_password='xxxxxxxx'; # パスワード

if(( $mixi_email ne '' )&&( $mixi_password ne '' ) ){
my $mixi = WWW::Mixi->new( $mixi_email, $mixi_password );
# ログイン
my $res = $mixi->login;
if( !$res->is_success ){
print $res->status_line;
exit;
};
# 日記一覧取得
my $url = 'list_diary.pl';
my $page = 1;#ページカウンター
my @diaries =();
my @items =();
my $item;
while($url ne ''){
last if ($page > 1);#取りあえず最新1ページ分ダウンロード
$res = $mixi->get( $url );
@items = $mixi->parse_list_diary( $res );
push( @diaries, @items );
$item = $mixi->parse_list_diary_next( $res );
$url = $item->{link};
$page++;
}
my $num = @diaries;
print $num."件分の日記を準備。\n";
#@diaries = reverse( @diaries ); 古い順に取り出したいとき
my $outfile = 'mixiNikkiDL.txt'; #ダウンロードするテキストファイル
open (my $FOUT,'>',$outfile)|| die "can't open file:$!";

# 日記を処理
my $diary;
my $str;#encoding変換用文字列変数
my $ken = 1;#日記件数カウンター
foreach $item ( @diaries ){
last if ( $ken > 3);#取りあえず3件の日記ダウンロード
sleep(5);#画面遷移アクセス制限の関係
$res = $mixi->get( $item->{link} ); # 日記取得
($diary) = $mixi->parse_view_diary( $res ); # 日記解析
pfsjis($FOUT,$diary->{subject});#日記題名取得
pfsjis($FOUT,$diary->{time});#日記投稿日時取得
pfsjis($FOUT,$diary->{description});#日記本文取得
$ken++;
}
$ken--;
print $ken."件分の日記をダウンロードしました。\n";
close $FOUT;
}
my $t1 = gettimeofday();
my $elapsed = $t1 - $t0;
my $min = int($elapsed/60);
my $sec = $elapsed%60;
$sec = $elapsed if ($min == 0 and $sec == 0);
print "$min min. $sec sec. passed!\n";


すみません、度々お邪魔します。
日記にコメントが付いたものは同時に
ダウンロードしたいと考え、上記コードに
下記の通りコードを追加したんですが、
コメントを書き出しません?
どこが不具合なのか、お気づきの方は
ご指摘頂けないでしょうか。

pfsjis($FOUT,$diary->{description});#日記本文取得
#追加コード
foreach my $com ( @{$diary->{comments}} ){
pfsjis($FOUT,$com->{name});#コメント名前取得
pfsjis($FOUT,$com->{time});#コメント時間取得
pfsjis($FOUT,$com->{description});#コメント本文取得
}
#追加コード終了
$ken++;

http://mixi.jp/view_bbs.pl?id=21376237&comment_count=1&comm_id=43735

ここのむねぞーさんの修正を適用すればコメントも取得できるのではないでしょうか?
>11
お陰様で上記コードで動作しました。
有難う御座いました。
皆さんのお陰で日記一括ダウンロードのコード↑を
作ることが出来ました。
そこで前回のサンプルコードを修正し、追加で
未取込み分だけダウンロード出来ないか?
と思い、下記コード(新規・追加書き込み兼用)
を作ってみました。一応作動します。
何か問題点あればご指摘願います。m(__)m

#!/usr/bin/perl

use strict;
use WWW::Mixi;
use Encode;
use Time::HiRes qw(gettimeofday);#所要時間計測用
#エンコード変換とファイルへの出力用サブルーチン
sub pfsjis{
my ($file,$str)=@_;
Encode::from_to($str,"euc-jp","shift-jis");
print $file $str."\n";
}

my $t0 = gettimeofday();

my $mixi_email='xxxxxxx@xxx.xx.xx'; # ユーザ名
my $mixi_password='xxxxxxxx'; # パスワード
my $nikkifile = 'mixiNikkiDL.txt'; #前回ダウンロードしたファイル(又は新規)

open (my $FIN,'<',$nikkifile)|| die "can't open file:$!";
my @lines = <$FIN>;
close $FIN;
@lines = reverse (@lines);
my $date = '';
my $nikkino = 0;
for my $line (@lines){
if ($line =~ m/^(\d{4}\/\d{2}\/\d{2} \d{2}:\d{2})$/){
$date = $1;
print "前回最終日付時刻:$date\n";
}
if ($line =~ m/^NikkiNo\.(\d+)$/){
$nikkino = $1;
print "前回最終日記NO:$nikkino\n";
last;
}
}
if ($date eq '' && $nikkino == 0){
print "指定ファイルに日記がありません。\n";
print "日記をこのファイルに書き込みしますか?\n";
print "宜しければ 「Y」を中止は「N」を入力下さい。\n";
my $ret = <STDIN>;
if ($ret ne 'y' || $ret ne 'Y' || $ret ne 'Y' || $ret ne 'y'){
exit(1);
}
}

if(( $mixi_email ne '' )&&( $mixi_password ne '' ) ){
my $mixi = WWW::Mixi->new( $mixi_email, $mixi_password );
# ログイン
my $res = $mixi->login;
if( !$res->is_success ){
print $res->status_line;
exit;
};
# 日記一覧取得
my $url = 'list_diary.pl';
my @diaries =();
my @items =();
my $item;
while($url ne ''){
$res = $mixi->get( $url );
@items = $mixi->parse_list_diary( $res );
my @newitems;
my $find = 0;
for my $nikki (@items){
if ($nikki->{time} eq $date){
$find = 1;
last;
}
else {
push @newitems,$nikki;
}
}
push( @diaries, @newitems );
last if ($find == 1);
$item = $mixi->parse_list_diary_next( $res );
$url = $item->{link};

}
my $num = @diaries;
print $num."件分の日記をダウンロードします。\n";
@diaries = reverse( @diaries );

# 日記を処理
my $diary;
my $ken = $nikkino;#日記件数カウンター
open (my $FOUT,'>>',$nikkifile)|| die "can't open file:$!";
foreach my $item ( @diaries ){

$ken++;
sleep(5);#画面遷移アクセス制限回避する
$res = $mixi->get( $item->{link} ); # 日記取得
($diary) = $mixi->parse_view_diary( $res ); # 日記解析
print $FOUT "NikkiNo.$ken\n";#日記No取得
pfsjis($FOUT,$diary->{subject});#日記題名取得
pfsjis($FOUT,$diary->{time});#日記投稿日時取得
pfsjis($FOUT,$diary->{description});#日記本文取得
my $comno = 1;#コメント数カウンター

foreach my $com ( @{$diary->{comments}} ){
print $FOUT "CommentNo.$comno($ken)\n";#コメントNO取得
pfsjis($FOUT,$com->{name});#コメント名前取得
pfsjis($FOUT,$com->{time});#コメント時間取得
pfsjis($FOUT,$com->{description});#コメント本文取得

$comno++;
}
}
print $ken."件分の日記をダウンロードしました。\n";
close $FOUT;
}
my $t1 = gettimeofday();
my $elapsed = $t1 - $t0;
my $min = int($elapsed/60);
my $sec = $elapsed%60;
$sec = $elapsed if ($min == 0 and $sec == 0);
print "実行時間:$min 分 $sec 秒 \n";

#日記を取り込んだ後にコメントが付いたりすると
#対応出来ません。あまり古い日記にコメントが
#付くことはないと思われるので、コメントが
#付いた日記までを全て削除して(手動で…)
#再取り込みして下さい。(^_^;)

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

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

WWW::Mixi 更新情報

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

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