mixi de RSS
mixiの自分のページの「マイミクシィ最新日記」をRSSにして吐きだすプログラムです。
自分の友達リストの中で、「mixi日記」を使っている人の更新された日記を抽出しています。
(外部のブログのは取ってきません、それはBloglinesなりを使った方がいいべ)
WWW::Mechanize、Jcode、XML::RSS、Time::Pieceが必要です。
WWW::Mechanizeをはじめて使ってみたのですが、とても便利ですね。
クッキーとかその辺の処理をさっくりやってくれます。
さて、表題のスクリプトは↓にあります。
$usernameと$passwordは自分のを入れてください。
cronに
0 * * * * /path/to/md-lite.pl > mixi.rdfとか設定して1時間に1回RSSを吐き出して、それをRSSリーダーで読めばよいでしょう。
ちなみにmd-lite.plのmdはmixi discoveryの略ということで…意味なし…。
てかWWW::Mixiを使えというのはまぁ…。WWW::Mechanize使いたかったんですもの…。
#!/usr/local/bin/perl
use strict;
use WWW::Mechanize;
use Jcode;
use XML::RSS;
use Time::Piece;
use Data::Dumper;
my $username = 'foo@example.com'; # email for mixi.jp
my $password = 'yourpassword'; # password for mixi.jp
my $mech = WWW::Mechanize->new;
$mech->get('http://mixi.jp/');
# do login
my $r = $mech->submit_form(
form_number => 1,
fields => {
next_url => '/home.pl',
email => $username,
password => $password,
},
);
(my $uri = $r->content) =~ s/^.*url=([^"]+)".*$/$1/;
$mech->get("http://mixi.jp$uri");
# get new friend diary
$mech->get('http://mixi.jp/new_friend_diary.pl');
my $rss = XML::RSS->new({ version => '1.0' });
my $t = localtime;
$rss->channel(
title => "mixi.jp",
link => "http://mixi.jp/",
description => "mixi",
dc => {
date => $t->datetime,
subject => "mixi friends diary",
creator => "clouder",
language => "ja"
},
);
# parse diary list
parse_diary($rss, $mech->content);
print $rss->as_string;
sub friends_lists {
$mech->get('http://mixi.jp/list_friend.pl');
return $mech->find_all_links(url_regex => qr/show_friend\.pl/);
}
sub parse_diary {
my($rss, $html) = @_;
my $re = _diary_pattern();
while ($html =~ m#$re#g) {
# name date time title content
my $datetime = jcode($1)->h2z->euc;
my $link = sprintf('http://mixi.jp/%s', $2);
my $title = jcode($3)->h2z->euc;
my $name = jcode($4)->h2z->euc;
$datetime =~ s/^(\d+)?[^\d]+(\d+)?[^\d]+(\d+)?[^\s]+ (\d+):(\d+)$/$1-$2-$3 $4:$5:00/;
$rss->add_item(
title => sprintf('%s (%s)', encode_xml_valid_entities(jcode(remove_tag($title))->utf8), jcode($name)->utf8),
link => $link,
dc => {
date => $datetime,
subject => jcode($title)->utf8,
creator => jcode($name)->utf8,
},
);
}
}
sub _diary_pattern {
return <<'RE';
<td WIDTH=180><img src=http://img.mixi.jp/img/pen.gif ALIGN=left WIDTH=14 HEIGHT=16>([^<]+)</td>
<td WIDTH=450><a href=(.*\?id=[^>]+)>([^<]+)</a> \((.+)\)
RE
}
sub remove_tag {
my $str = shift;
$str =~ s/<.*?>//g;
return $str;
}
sub encode_xml_valid_entities {
my $input = shift;
return HTML::Entities::encode_entities($input, '<>&"');
}