面白そうなので作ってみる
mixi で参加しているコミュニティで
mixi 内のコミュニティを検索してコマンドラインに表示する
とゆーのがあり面白そうなので作ってみました。
出力される結果は、規則性のある構造をしているので
Template::Extract を使うことに。
正規表現でムリヤリやってもいいのですが、大変だしネ。
あと Mixi ということで当然 WWW::Mixi のモジュールを利用しました。
初めて WWW::Mixi を使いましたが、なかなか使いやすい。。。カモ?
かなり奥深くまで対応しているので、結構遊べそうな感じですネ。
#!/usr/bin/perl -w use WWW::Mixi; use HTTP::Request::Common; use Template::Extract; use Jcode; use strict; use warnings; #use Getopt::Long; #use Data::Dumper; if( $ARGV[0] ){ main( ) } else{ usage( ) } sub main { my $template = Jcode->new( join('', <DATA>) )->euc; my $keyword = $ARGV[0]; my $mail_addr = 'mail'; # メールアドレス my $password = 'pass'; # パスワード my $mixi = WWW::Mixi->new($mail_addr, $password); $template =~ s/\n//g; # login my $res = $mixi->login unless $mixi->is_logined; $res->is_success or die $res->status_line; url_encode( \$keyword ); search_community($mixi, \$template, \$keyword, 1); } # URL エンコードする sub url_encode { my $str = shift; $$str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $$str =~ tr/ /+/; } # 検索してみる sub search_community { my $mixi = shift; my $template = shift; my $keyword = shift; my $page = shift; my $uri = 'search_community.pl?submit=main&keyword='.$$keyword.'&page='.$page; my $response = $mixi->get( $uri )->content; $response =~ s/\n//g; # Extract my $ext = Template::Extract->new( )->extract($$template, $response); # 結果表示 # print Data::Dumper::Dumper( $ext ); put_search_result($ext, $page); # 再帰的にどーぞ if(int(1 + $ext->{hits} / 30) > $page){ search_community($mixi, $template, $keyword, ++$page) } } # 結果表示 sub put_search_result { my $result = shift; my $page = shift; # Extract 失敗 unless ( $result ){ if($page == 1){ print "該当するコミュニティが見つかりませんでした。\n" } else{ print "よくわかんないけどエラー。\n" } exit(0); } print $result->{hits}, "件が該当しました。\n" if $page == 1; # 表示開始 foreach my $item ( @{$result->{items}} ){ my $str; $item->{comment} =~ s/<br>//gi; $str .= '[Name] '.$item->{name}."\n"; $str .= '[Address] http://mixi.jp/view_community.pl?id='.$item->{id}."\n"; $str .= '[Members] '.$item->{members}."人\n"; $str .= '[Comment] '.$item->{comment}."\n"; print Jcode->new( $str )->h2z->sjis, "\n"; } } # usagi = miffy sub usage { print "usage: mixi.pl <検索ワード>\n" } ## -- Template __END__ <!--///// 一覧ここから /////--> <table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=650 BGCOLOR=#DFB479> <tr> <td><img src=http://img.mixi.jp/img/q_brown1.gif WIDTH=7 HEIGHT=7></td> <td><img src=http://img.mixi.jp/img/dot0.gif WIDTH=636 HEIGHT=1></td> <td><img src=http://img.mixi.jp/img/q_brown2.gif WIDTH=7 HEIGHT=7></td></tr> <tr> <td ALIGN=center COLSPAN=3> <table BORDER=0 CELLSPACING=0 CELLPADDING=1 BGCOLOR=#D3B16D> <tr><td> <table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=630 BGCOLOR=#FFFFFF> <tr> <td WIDTH=35 background=http://img.mixi.jp/img/bg_w.gif><img src=http://img.mixi.jp/img/arw_bw.gif WIDTH=25 HEIGHT=20></td> <td WIDTH=595 background=http://img.mixi.jp/img/bg_w.gif><b>コミュニティ一覧</b>&nbsp;&nbsp;***&nbsp;<b>[% hits %]件</b>&nbsp;が該当しました。</td></tr> </table> </td></tr></table> <table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#DFB479> <tr><td> <table BORDER=0 CELLSPACING=1 CELLPADDING=1 WIDTH=630> <tr> <td ALIGN=center BGCOLOR=#EED6B5> [ [% ... %] ] </td></tr> </table> </td></tr></table> <table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#D3B16D> <tr><td> <table BORDER=0 CELLSPACING=1 CELLPADDING=1 WIDTH=630> <tr> <td ALIGN=right BGCOLOR=#EED6B5>[% ... %][% start %]件〜[% end %]件を表示[% ... %]</td></tr> </table> </td></tr></table> <table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#CC9933> <tr><td> <table BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=630> <tr><td ALIGN=center BGCOLOR=#FFF4E0> <!---------------------------------adwords-------------------------------> [% ... %] <!---------------------------------adwords-------------------------------> [% FOREACH items %] <!--コミュニティ 1つ分 ここから--> <table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#BB7C3E> <tr> <td COLSPAN=2 BGCOLOR=#FFFFFF><img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=1></td></tr> <tr><td> <table BORDER=0 CELLSPACING=1 CELLPADDING=6> <tr><td ALIGN=center BGCOLOR=#F2DDB7 background=http://img.mixi.jp/img/bg_dotbr.gif> <table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#F2DDB7> <tr><td> <table BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=550> <tr> <td WIDTH=90 VALIGN=top ROWSPAN=4 ALIGN=center background=http://img.mixi.jp/img/bg_line.gif><a href="view_community.pl?id=[% id %]"><img SRC="[% logo %]" VSPACE=3 border=0></a></td> <td NOWRAP WIDTH=90 BGCOLOR=#FDF9F2><font COLOR=#996600>コミュニティ名</font></td> <td COLSPAN=2 WIDTH=370 BGCOLOR=#FFFFFF>[% name %]</td></tr> <tr> <td BGCOLOR=#FDF9F2><font COLOR=#996600>メンバー数</font></td> <td COLSPAN=2 BGCOLOR=#FFFFFF>[% members %]人</td></tr> <tr> <td BGCOLOR=#FDF9F2><font COLOR=#996600>説明文</font></td> <td COLSPAN=2 BGCOLOR=#FFFFFF>[% comment %]</td></tr> <tr> <td NOWRAP BGCOLOR=#FDF9F2 WIDTH=80><font COLOR=#996600>カテゴリ</font></td> <td BGCOLOR=#FFFFFF WIDTH=220>[% category %]</td> <td ALIGN=center BGCOLOR=#FDF9F2 width=250><a href="view_community.pl?id=[% id %]"><img src=http://img.mixi.jp/img/shbtn.gif ALT=詳細を見る BORDER=0 WIDTH=104 HEIGHT=19></a></td></tr> </table> </td></tr></table> </td></tr></table> </td> <td BGCOLOR=#CCCCCC><img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=1></td></tr> <tr> <td COLSPAN=2 BGCOLOR=#CCCCCC><img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=1></td></tr> </table> <img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=3><br> <!--1つ分ここまで--> [% END%]