初めてのガンホー

初めてのgungho

twitterで遊びたい

twitterを使っていて,入出力を別のアプリケーションに繋げたいって考えるようになりました.Net::Twitterを使えばアクセスできるし,POEを使えばircでもGTalkでも入出力可能です.でもNet::Twitterは中でLWP::UserAgentを使ってます.ブロックしてしまう可能性があるから,POEの中ではあんまり使いたくありません.で,POEから使えるLWP::UserAgent相当を探してみました.でもざっとみたところTwitterにアクセスするために必要なベーシック認証をサポートしているモジュールはありませんでした.訂正(Apr 16 2007)ここ間違ってます.宮川さんのブックマークで指摘されて気がつきました.例えば,POE::Component::Client::Twitter - POE chat component for twitter.com - metacpan.orgでは,

    my $req = HTTP::Request::Common::POST(
        $heap->{args}->{apiurl} . '/update.json',
        [ status => $status ],
    );
    $req->authorization_basic($heap->{args}->{username}, $heap->{args}->{password});

という実装を行っています.ちょっと自分のバカさ加減にがっくりだったけど,Gungho見つけたからそれでいいのだ!

これってクローラーじゃね?

しばらく考えていてふと思いついたのは,今探してるのはクローラなんじゃないかってことでした.クローラは検索エンジンが情報収集するために使っていて,見つけたページを手当たり次第にGETしては,そこに記載されてるurlからまた新しいページを探すという機能を持っています.ちょっと手を加えれば,指定したurlにある一定の時間間隔でアクセスするようにできるんじゃないかと思ったわけです.Perlでクローラと言えばXango,でその後継がGuhghoということで,id:lestrratさんにベーシック認証できる?って聞いてみたところ,Plugin vs Components In Gunghoと快く作っていただけました.

サンプルがない(血の叫び

Gunghoインストールしてもサンプルconfigがないんですよね.loadテストぐらいの試験項目しかないし.最初から質問しまくるのもなんなんで,とりあえず何か簡単に書いてみる事にしました.configを読んでGunghoをrunするスクリプトhttp://gungho-crawler.googlecode.com/svn/trunk/から持ってきました.こんな感じ.

#!/usr/local/bin/perl
use strict;
use warnings;
use FindBin;
use Getopt::Long;

use Gungho;

{
    my ( $config, $version );

    # Default config file is expected to be at the current directory
    $config = do {
        my $file;
        foreach my $suffix qw(yml yaml) {
            my $test = "config.$suffix";
            if ( -f $test ) {
                $file = $test;
                last;
            }
        }
        $file;
    };

    if ( !GetOptions( '--config=s', \$config, '--version', \$version ) ) {
        exit 1;
    }

    Gungho->new($config)->run;
}

このスクリプトが読み込むconfig.ymlは以下のようになります.

engine:
    module: POE
    config:
        client:
            agent:
                - MyAgent_v1
            max_size: 16384
            proxy: http://localhost:10080
        keepalive:
            keep_alive: 10
            max_open: 200
            max_per_host: 20
            timeout: 10
provider:
    module: File::Simple
    config:
        filename: /Users/kdaiba/scratch/gungho/test

ソースを読むとデフォルト値が設定されてるものがあるので,ほんとはもっと少なくていいんだけど,とりあえず初めて動いたのがこれだから,このままでいきます.
さらに,testというファイルに書いたurlを読むようにしているので,それも指定します.ここではperlサイトにアクセスするようにしてみました.

http://www.perl.com

localhostに常駐するプロキシーも簡単に作ってみました.poeのサイトに載っているPOE: Cookbook - Web Proxyです.これのデバックモードをONにしてから10080番で待ち受けているように設定して,gunghoを実行すると,

[info] http://www.perl.com responded with code 200

と表示して終了しました.動いたようです.POEなのになんで止まるのかは不思議なんですが,それは後のお楽しみにとっておきました.proxyの出力も

,------------------------------------------------------------------------------
| GET http://www.perl.com/ HTTP/1.1
| Connection: close
| Host: www.perl.com
| User-Agent: MyAgent_v1
| Proxy-Connection: close
| 
`------------------------------------------------------------------------------
,------------------------------------------------------------------------------
| HTTP/1.0 200 OK
| Connection: close
| Date: Wed, 11 Apr 2007 10:18:19 GMT
| Via: 1.0 olive.bp:3128 (squid/2.6.STABLE12)
| Server: Apache
| Content-Type: text/html; charset=ISO-8859-1
| ...

となっていて,ちゃんと動いていることが確認できました.とりあえず,今日はここまでです.ちなみにここで試しているGunghoのバージョンは0.02でベーシック認証をサポートしている版ではありません.使い方理解できたら試してみようと思っています.っていうか,使い方理解する前に0.03とかでてきそうです(w