めずらしく、mixiのネタです。

mixiの自分のページの「マイミクシィ最新日記」をRSSにして吐きだすプログラムです。
自分の友達リストの中で、「mixi日記」を使っている人の更新された日記を抽出しています。
(外部のブログのは取ってきません、それはBloglinesなりを使った方がいいべ)
WWW::MechanizeJcodeXML::RSSTime::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, '<>&"');
}