はちゅにっき

こっちのブログはまったり更新

面白そうなので作ってみる

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__
&lt;!--///// 一覧ここから /////--&gt;
&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=650 BGCOLOR=#DFB479&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=http://img.mixi.jp/img/q_brown1.gif WIDTH=7 HEIGHT=7&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=http://img.mixi.jp/img/dot0.gif WIDTH=636 HEIGHT=1&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=http://img.mixi.jp/img/q_brown2.gif WIDTH=7 HEIGHT=7&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td ALIGN=center COLSPAN=3&gt;

&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=1 BGCOLOR=#D3B16D&gt;
&lt;tr&gt;&lt;td&gt;
&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=630 BGCOLOR=#FFFFFF&gt;
&lt;tr&gt;
&lt;td WIDTH=35 background=http://img.mixi.jp/img/bg_w.gif&gt;&lt;img src=http://img.mixi.jp/img/arw_bw.gif WIDTH=25 HEIGHT=20&gt;&lt;/td&gt;
&lt;td WIDTH=595 background=http://img.mixi.jp/img/bg_w.gif&gt;&lt;b&gt;コミュニティ一覧&lt;/b&gt;&amp;nbsp;&amp;nbsp;***&amp;nbsp;&lt;b&gt;[% hits %]件&lt;/b&gt;&amp;nbsp;が該当しました。&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;


&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#DFB479&gt;
&lt;tr&gt;&lt;td&gt;
&lt;table BORDER=0 CELLSPACING=1 CELLPADDING=1 WIDTH=630&gt;
&lt;tr&gt;
&lt;td ALIGN=center BGCOLOR=#EED6B5&gt;
[ [% ... %] ]
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;



&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#D3B16D&gt;
&lt;tr&gt;&lt;td&gt;
&lt;table BORDER=0 CELLSPACING=1 CELLPADDING=1 WIDTH=630&gt;
&lt;tr&gt;
&lt;td ALIGN=right BGCOLOR=#EED6B5&gt;[% ... %][% start %]件〜[% end %]件を表示[% ... %]&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;


&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#CC9933&gt;
&lt;tr&gt;&lt;td&gt;
&lt;table BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=630&gt;
&lt;tr&gt;&lt;td ALIGN=center BGCOLOR=#FFF4E0&gt;


&lt;!---------------------------------adwords-------------------------------&gt;
[% ... %]
&lt;!---------------------------------adwords-------------------------------&gt;


[% FOREACH items %]
&lt;!--コミュニティ 1つ分 ここから--&gt;
&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#BB7C3E&gt;
&lt;tr&gt;
&lt;td COLSPAN=2 BGCOLOR=#FFFFFF&gt;&lt;img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=1&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;table BORDER=0 CELLSPACING=1 CELLPADDING=6&gt;
&lt;tr&gt;&lt;td ALIGN=center BGCOLOR=#F2DDB7 background=http://img.mixi.jp/img/bg_dotbr.gif&gt;

&lt;table BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#F2DDB7&gt;
&lt;tr&gt;&lt;td&gt;
&lt;table BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=550&gt;

&lt;tr&gt;
&lt;td WIDTH=90 VALIGN=top ROWSPAN=4 ALIGN=center background=http://img.mixi.jp/img/bg_line.gif&gt;&lt;a href="view_community.pl?id=[% id %]"&gt;&lt;img SRC="[% logo %]" VSPACE=3 border=0&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td NOWRAP WIDTH=90 BGCOLOR=#FDF9F2&gt;&lt;font COLOR=#996600&gt;コミュニティ名&lt;/font&gt;&lt;/td&gt;
&lt;td COLSPAN=2 WIDTH=370 BGCOLOR=#FFFFFF&gt;[% name %]&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;
&lt;td BGCOLOR=#FDF9F2&gt;&lt;font COLOR=#996600&gt;メンバー数&lt;/font&gt;&lt;/td&gt;
&lt;td COLSPAN=2 BGCOLOR=#FFFFFF&gt;[% members %]人&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;
&lt;td BGCOLOR=#FDF9F2&gt;&lt;font COLOR=#996600&gt;説明文&lt;/font&gt;&lt;/td&gt;
&lt;td COLSPAN=2 BGCOLOR=#FFFFFF&gt;[% comment %]&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;
&lt;td NOWRAP BGCOLOR=#FDF9F2 WIDTH=80&gt;&lt;font COLOR=#996600&gt;カテゴリ&lt;/font&gt;&lt;/td&gt;
&lt;td BGCOLOR=#FFFFFF WIDTH=220&gt;[% category %]&lt;/td&gt;
&lt;td ALIGN=center BGCOLOR=#FDF9F2 width=250&gt;&lt;a href="view_community.pl?id=[% id %]"&gt;&lt;img src=http://img.mixi.jp/img/shbtn.gif ALT=詳細を見る BORDER=0 WIDTH=104 HEIGHT=19&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td BGCOLOR=#CCCCCC&gt;&lt;img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=1&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td COLSPAN=2 BGCOLOR=#CCCCCC&gt;&lt;img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=1&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;
&lt;img src=http://img.mixi.jp/img/dot0.gif WIDTH=1 HEIGHT=3&gt;&lt;br&gt;
&lt;!--1つ分ここまで--&gt;
[% END%]