久々にmixiを見たら、数日前に旧友がおもしろい日記を書いていた。
今回は見れたからよかったものの、普段はあまりmixiにログインするわけでもなく、見逃していた可能性が高い。
かといって悔い改めmixiに頻繁にログインするようにするかというとそんな気は起きない。
mixiのなにが悪いってログインしないとなにも見れないことだ。
確かにE-mailで更新通知を受け取れるが、受け取ったところで詳しいことはmixiにログインしないと見れない。
やはり他のBlogと同じようにRSSで概要までは見れるようにしたい。
となると、やはりcrondで自動的にログインして概要を引っ張ってくるスクリプトをぶん回すしかない。
というわけでがんばって書いた。
例によって Web::Mechanize を使ってやるかと思った。(参考記事 : WWW::MechanizeでPerlのインターネットサーフィン)
ただ、mixiについては Web::Mixiというのがあるので、せっかくだからこれを使ってみることに。
HTMLの解析は自分で行わないといけないのだが、現在のmixiのUIはJavaScriptをOFFにしてると更新情報がさっぱり見えない。
それでどこに更新情報があるのか探したらソースコード上のJSONであったので、これを利用することに。
RSSの生成はXML::RSSが便利そうなのでこれを活用した。
それで完成したスクリプトがこれ。
use strict; use warnings; use utf8; use Encode; use WWW::Mixi; use JSON; use XML::RSS; use Web::Scraper; use DateTime::Format::W3CDTF; my $mixi = WWW::Mixi->new('*@*****','*****'); $mixi->login; my $res=$mixi->get('home.pl'); $res->content =~ m/var json = ({.+});\n/ or die; my $json=encode_utf8(decode('euc-jp',$1)); my $dec=decode_json($json); my @status; while(my ($k,$v)=each(%{$dec->{'socialstream_feeds'}->[0]})){ next if $k eq 'activity'; for(@$v){ push @status,{ 'timestamp' => $_->{'timestamp'}, 'name' => $_->{'actor'}->{'display_name'}, 'type' => $_->{'object'}->{'object_type'}, 'url' => $_->{'object'}->{'permalink'}, 'title' => $_->{'object'}->{'title'}, 'body' => $_->{'object'}->{'body'}, 'image' => @{$_->{'object'}->{'images'}}+0 }; } } @status = sort{$b->{'timestamp'}<=>$a->{'timestamp'}}(@status); my $rss= new XML::RSS('version' => '1.0'); $rss->channel('title'=>'mixi RSS',link=>'https://mixi.jp','description'=>''); for(@status){ my $desc =$_->{'body'}; $desc=~s/<img .+? alt="(.+?)".+?>/[$1]/g; $desc=~s/\r\n/ /g; my $title=$_->{'title'} || $desc; my $date=DateTime->from_epoch( time_zone => 'Asia/Tokyo', epoch => $_->{'timestamp'} ); $rss->add_item('title' => '['.$_->{'type'}.'] '.$title.($_->{'image'}?'[img]':'') , 'link' => $_->{'url'} , 'description'=> $desc , 'dc' => { 'creator' => $_->{'name'}, 'date'=>DateTime::Format::W3CDTF->format_datetime($date) }, 'content' => {'encoded' => $_->{'body'} }, ); } $rss->save('mixirss.xml');
長いが、ログインしてJSON取ってきて解析して、JSONから日記とボイスの更新情報だけ抜き出して、これを元にRSSを生成するという構成からなってる。
mixiのログインやRSSの生成といっためんどくさい部分はライブラリに丸投げして、
自分がやってるのはJSONから必要なデータを取り出して再構成するだけのこと。JSONの意味を理解するのに苦労したが。
これをcrondで10分間隔で回すようにして、RSSをThunderbirdに登録しておいた。
これでログインしなくても概要はわかるようになった。
さらにこれに日記の内容をスクレイピングで引っ張ってくる機能を付ければログインしなくても更新のチェックという用は足りることになる。
実は実装したんだけどその部分のソースコードはひどいので割愛している。
これでmixiにログインしなくてもmixiの情報を引いてくることができるようになったが、
難点としては朝から晩まで断続的にログインすることになるので、常に最終ログインが10分以内になってしまう。
別にそれで害があるわけでもないけど、異様かも知れない。
続いてはmixiにログインしなくてもmixiに投稿できる機能を実装したいところ。
本当はこのBlogやTwitterを見てほしいのだが、それをチェックしている人が多いとも思えない。
かといって日記やボイスをBlog・Twitterと連結してしまうと、非常にいかついことになってしまう。
Twitterの投稿にマークを付けてそれをmixiボイスか日記か反映するようなそういうものができれば、
mixiしか使わない旧友への情報発信が進むものだと思う。
相当いやらしい機能になることは目に見えてるが、上手い方法を見いだしたい。