あまりおおっぴらにはしたくないんだけど、Mixiはじめました。
で、あまりのユーザインターフェイスの使えなさにぶっとびつつ、それでも情報収集には良いので、しばらく使ってみることにします。
しかし、全体的に未読管理や検索が弱く、参加しているコミュニティが増えると未読管理ができないのは致命的に思えます。
そこで、今まで食わず嫌いで避けていたPlaggerに手を出してみることにしました。
インストールは ports から textproc/p5-Plagger を入れるだけ。最初にどんなオプションで入れるか聞かれるので、 CUSFEEDMIXI を選択しておきました。
CustomFeed::Mixiだと、コミュニティに対応していません。調べてみたところ、CustomFeed::Mixiをコミュニティ最新書き込み対応にと言うのを発見。早速入れ替えてみます。
で、以下のような config.yaml を書いて、plagger -c config.yaml で実行します。
そこで、CustomFeed/Mixi.pmを元に戻して、feed_type をMessageとかにしてみると、ちゃんと持ってきてくれました。
で、二つのファイルを見比べながら手で修正してみたら、コミュニティの新着も取ってきてくれるようになりました。
しかし、トピックまでしか取ってきてくれないので私にとってはあまり意味がありません。
あと、元々のCustomFeed::Mixiの話ですが、fetch_icon = 1 にしておくと足跡等でイメージを取ってきてくれるのですが、そのときに相手のプロフィールページにアクセスするので、相手に足跡が残ります。
相手に足跡が残ることを気にする人は注意が必要です。
ここまでやってしばらく呆けていたのですが、ふと思い立ってCustomFeed::Mixiが呼び出しているWWW::Mixiのソースを読んでみました。
すると、WWW::Mixiではちゃんとコメントまで読んでいます。
そこで、CustomFeed::Mixiに手を入れて、コメントもfeedするようにしてみました。この際、WWW::Mixiはコメントの番号を読んでくれていなかったので、こちらにも手を入れて番号も取れるようにしました。
CustomFeed/Mixi.pmのdiff
これで、コミュニティの新着のコメントまでをgmailに送ることができるようになりました。
後は、トピック毎にコメントの番号を覚えておいて、新しいものだけfeedするようにすれば当初の目的は果たせそうです。
コメントの番号を覚えるには、自前でファイルを読み書きすれば実現できますが、ひょっとしたらPlaggerにそう言う作法があるかも知れないので、もう少し調べてみます。
# なんて書いておくと、Plaggerの偉い人がヒントをくれないかしらん。
で、あまりのユーザインターフェイスの使えなさにぶっとびつつ、それでも情報収集には良いので、しばらく使ってみることにします。
しかし、全体的に未読管理や検索が弱く、参加しているコミュニティが増えると未読管理ができないのは致命的に思えます。
そこで、今まで食わず嫌いで避けていたPlaggerに手を出してみることにしました。
インストールは ports から textproc/p5-Plagger を入れるだけ。最初にどんなオプションで入れるか聞かれるので、 CUSFEEDMIXI を選択しておきました。
CustomFeed::Mixiだと、コミュニティに対応していません。調べてみたところ、CustomFeed::Mixiをコミュニティ最新書き込み対応にと言うのを発見。早速入れ替えてみます。
で、以下のような config.yaml を書いて、plagger -c config.yaml で実行します。
global:
timezone: Asia/Tokyo
assets_path: /usr/local/share/Plagger/assets
plugins:
- module: Publish::Gmail
rule:
- module: Rating
rate: '>= 0'
- module: Fresh
mtime:
path: /tmp/foo.tmp
autoupdate: 1
config:
mailto: gmailのアドレス@gmail.com
mailfrom: 差出人のアドレス
mailroute:
via: smtp
host: localhost
- module: CustomFeed::Mixi
config:
email: mixiに登録したメールアドレス
password: パスワード(一回起動すると、base64に置き換わる
fetch_body: 1
fetch_body_interval: 1.5
show_icon: 0
feed_type:
- Bbs
が、何故かうちの環境では何も取ってきてくれません。そこで、CustomFeed/Mixi.pmを元に戻して、feed_type をMessageとかにしてみると、ちゃんと持ってきてくれました。
で、二つのファイルを見比べながら手で修正してみたら、コミュニティの新着も取ってきてくれるようになりました。
しかし、トピックまでしか取ってきてくれないので私にとってはあまり意味がありません。
あと、元々のCustomFeed::Mixiの話ですが、fetch_icon = 1 にしておくと足跡等でイメージを取ってきてくれるのですが、そのときに相手のプロフィールページにアクセスするので、相手に足跡が残ります。
相手に足跡が残ることを気にする人は注意が必要です。
ここまでやってしばらく呆けていたのですが、ふと思い立ってCustomFeed::Mixiが呼び出しているWWW::Mixiのソースを読んでみました。
すると、WWW::Mixiではちゃんとコメントまで読んでいます。
そこで、CustomFeed::Mixiに手を入れて、コメントもfeedするようにしてみました。この際、WWW::Mixiはコメントの番号を読んでくれていなかったので、こちらにも手を入れて番号も取れるようにしました。
CustomFeed/Mixi.pmのdiff
*** Mixi.pm.ORIG Fri Jan 5 23:14:14 2007
--- Mixi.pm Sat Jan 6 22:11:05 2007
***************
*** 48,53 ****
--- 48,62 ----
get_list => 'parse_show_calendar',
get_detail => 'get_view_event',
},
+ Bbs => {
+ start_url => 'http://mixi.jp/new_bbs.pl',
+ title => 'コミュニティ最新書き込み',
+ get_list => 'parse_new_bbs',
+ get_detail => 'dummy',
+ get_detail_bbs => 'get_view_bbs',
+ get_detail_event => 'get_view_event',
+ get_detail_enquete => 'get_view_enquete',
+ },
};
sub plugin_id {
***************
*** 134,139 ****
--- 143,149 ----
my $i = 0;
my $blocked = 0;
+ my $item;
for my $msg (@msgs) {
next if $type eq 'FriendDiary' and not $msg->{image}; # external blog
last if $i++ >= $items;
***************
*** 170,182 ****
}
}
! if ($self->conf->{fetch_body} && !$blocked && $msg->{link} =~ /view_/ && defined $MAP->{$type}->{get_detail}) {
$context->log(info => "Fetch body from $msg->{link}");
! my $item = $self->cache->get_callback(
"item-$msg->{link}",
sub {
Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 1.5 );
! my $meth = $MAP->{$type}->{get_detail};
my($item) = $self->{mixi}->$meth($msg->{link});
if ($meth eq 'get_view_diary') {
--- 180,196 ----
}
}
! $item = 0;
!
! if ($self->conf->{fetch_body} && !$blocked && $msg->{link} !~ /view_enquete/ &&$msg->{link} =~ /view_/ && defined $MAP->{$type}->{get_detail}) {
$context->log(info => "Fetch body from $msg->{link}");
! $item = $self->cache->get_callback(
"item-$msg->{link}",
sub {
Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 1.5 );
! # my $meth = $MAP->{$type}->{get_detail};
! my $meth = get_meth($MAP->{$type}, $msg->{link});
!
my($item) = $self->{mixi}->$meth($msg->{link});
if ($meth eq 'get_view_diary') {
***************
*** 207,212 ****
--- 221,229 ----
}
$feed->add_entry($entry);
+ if ($item) {
+ add_comments($feed, $item);
+ }
}
$context->update->add($feed);
***************
*** 221,226 ****
--- 238,274 ----
}
return \@images;
+ }
+ sub get_meth {
+ my($type, $link) = @_;
+
+ my $meth = "";
+ if ($link =~ /view_bbs/) {
+ $meth = $type->{get_detail_bbs};
+ } elsif ($link =~ /view_event/) {
+ $meth = $type->{get_detail_event};
+ } elsif ($link =~ /view_enquete/) {
+ $meth = $type->{get_detail_enquete};
+ } else {
+ $meth = $type->{get_detail};
+ }
+ return $meth;
+ }
+
+ sub add_comments {
+ my ($feed, $item) = @_;
+ my $format = DateTime::Format::Strptime->new(pattern => '%Y/%m/%d %H:%M');
+ if ($item->{'comments'}) {
+ for my $comment (@{$item->{'comments'}}) {
+ my $entry = Plagger::Entry->new;
+ $entry->title($comment->{'number'});
+ $entry->link($comment->{'link'});
+ $entry->author( decode('euc-jp', $comment->{'name'}) );
+ $entry->date( Plagger::Date->parse($format, $comment->{'time'}) );
+ $entry->body( decode('euc-jp', $comment->{'description'}) );
+ $feed->add_entry($entry);
+ }
+ }
}
1;
WWW/Mixi.pmのdiff
*** Mixi.pm.ORIG Sat Jan 6 21:54:02 2007
--- Mixi.pm Sat Jan 6 22:09:23 2007
***************
*** 1426,1431 ****
--- 1426,1432 ----
my $re_subj = '<td bgcolor="#fff4e0"> (.+?)</td>';
my $re_desc = '</table>(.+?)</td>';
my $re_c_date = '<td rowspan="2" width="110" bgcolor="#f2ddb7" align="center" nowrap>\n(\d{4})年(\d{2})月(\d{2})日<br>\n(\d{1,2}):(\d{2})';
+ my $re_c_no = '<b>(.*?[0-9]+?)</b>';
my $re_c_desc = '<td class="h120">(.+?)\n</td>';
my $re_link = '<a href="?(.+?)"?>(.*?)<\/a>';
if ($content =~ s/<!-- TOPIC: start -->.*?${re_date}.*?${re_subj}.*?${re_link}(.*?)${re_desc}(.*?)$//is) {
***************
*** 1436,1445 ****
next unless ($image =~ /<a [^<>]*'show_picture.pl\?img_src=(.*?)'[^<>]*><img src=([^ ]*) border=0>/);
push(@{$item->{'images'}}, {'link' => $self->absolute_url($1, $base), 'thumb_link' => $self->absolute_url($2, $base)});
}
! while ($comm =~ s/.*?${re_c_date}.*?${re_link}.*?${re_c_desc}.*?<\/table>//is){
! my ($time, $link, $name, $desc) = (sprintf('%04d/%02d/%02d %02d:%02d', $1,$2,$3,$4,$5), $6, $7, $8);
($name, $desc) = map { s/[\r\n]+//g; s/<br>/\n/g; $_ = $self->rewrite($_); } ($name, $desc);
! push(@{$item->{'comments'}}, {'time' => $time, 'link' => $self->absolute_url($link, $base), 'name' => $name, 'description' => $desc});
}
push(@items, $item);
}
--- 1437,1446 ----
next unless ($image =~ /<a [^<>]*'show_picture.pl\?img_src=(.*?)'[^<>]*><img src=([^ ]*) border=0>/);
push(@{$item->{'images'}}, {'link' => $self->absolute_url($1, $base), 'thumb_link' => $self->absolute_url($2, $base)});
}
! while ($comm =~ s/.*?${re_c_date}.*?${re_c_no}.*?${re_link}.*?${re_c_desc}.*?<\/table>//is){
! my ($time, $number, $link, $name, $desc) = (sprintf('%04d/%02d/%02d %02d:%02d', $1,$2,$3,$4,$5), $6, $7, $8, $9);
($name, $desc) = map { s/[\r\n]+//g; s/<br>/\n/g; $_ = $self->rewrite($_); } ($name, $desc);
! push(@{$item->{'comments'}}, {'time' => $time, 'link' => $self->absolute_url($link, $base), 'name' => $name, 'description' => $desc, 'number' => $number});
}
push(@items, $item);
}
これで、コミュニティの新着のコメントまでをgmailに送ることができるようになりました。
後は、トピック毎にコメントの番号を覚えておいて、新しいものだけfeedするようにすれば当初の目的は果たせそうです。
コメントの番号を覚えるには、自前でファイルを読み書きすれば実現できますが、ひょっとしたらPlaggerにそう言う作法があるかも知れないので、もう少し調べてみます。
# なんて書いておくと、Plaggerの偉い人がヒントをくれないかしらん。
