本日はてなよりアナウンスがあった、
Twitter のつぶやきからブクマできる連携機能
(http://hatena.g.hatena.ne.jp/hatenabookmark/20091022)
に触発されて、mixiボイスからブクマするのを勢いで適当に作ってみました。
以下コード
#!/usr/bin/perl use strict; use warnings; use AnyEvent::Impl::Perl; use AnyEvent; use WWW::Mixi::Scraper; use WebService::Hatena::Bookmark::Lite; use Config::Pit; use Date::Calc; my $hatena_conf = Config::Pit::pit_get('http://www.hatena.ne.jp'); my $mixi_conf = Config::Pit::pit_get('http://mixi.jp'); my $mixi = WWW::Mixi::Scraper->new( email => $mixi_conf->{email} , password => $mixi_conf->{password} , mode => 'TEXT' ); my $org_post_time = $ARGV[0] || join('', map{ sprintf( "%02d", $_); } Date::Calc::Today_and_Now() ); my $cv_timer = AnyEvent->condvar; my $timer; $timer = AnyEvent->timer( after => 0, interval => 60, cb => sub { my @echo_list = $mixi->list_echo->parse(); if( _is_bookmark_post( $echo_list[0]->{comment} ) && _is_new_post( $echo_list[0]->{'time'} ) ){ # post to hatena bookmark _post2hatena( $echo_list[0]->{comment} ); } }, ); $cv_timer->recv; sub _is_new_post{ my $post_time = shift; $post_time ||= 0; if( $post_time > $org_post_time ){ $org_post_time = $post_time; return 1; } else{ return 0; } } sub _is_bookmark_post{ my $comment = shift; $comment ||= ''; return $comment =~ /B\!/; } sub _post2hatena{ my $comment = shift; my( $str , $url ) = split( /B!/, $comment); my $hatena = WebService::Hatena::Bookmark::Lite->new( username => $hatena_conf->{username} , password => $hatena_conf->{password} ); return $hatena->add( url => $url, comment => $str ); }
以下が実験結果。
mixiで発言する
[
はてブで確認する
[
なんか出来ているように見えます。
とりあえず勢いすぎた反省ポイント。
・AnyEvent意味ない。
はい、、使ってみたかっただけです。
ここのところの流れに追いつきたいと思いつつ、触る機会を作れてなかったので、無理矢理です。
gihyo.jpで連載されている内容(http://gihyo.jp/dev/serial/01/modern-perl/0013)を参考にさせていただき、書いてみました。
別にこれならwhileでループすればいいと言われたら何も言えません。
・毎回スクレイピングしている
はい、、RSSフィードでも吐く形式にすれば良かったんですが、ちゃんと勉強します><
これのせいで、posttimeをずっと保持しておいて、それより最新だったら、なんて比較もしてます。お恥ずかしい限り。
もしくはmixiボイスにAPIでもあれば、一番ラクだったのに(多分、今はないハズ)
※ちなみに
$mixi->list_echo->parse();
を
$mixi->recent_echo->parse();
に変えると、マイミク全員のボイスをブクマできます。(だから何だ!)
今回も勢い余って痛さだけが残る形に終わってしまいました・・・