Gungho::Inline 0.08002対応版

hinetmania改

http://twitter.com/hinetmaniaで使ってるスクリプトNIED Hi-net β Ver. [High Sensitivity Seismograph Network Japan]にアクセスするときにはGunghoを使っているんですが,twitterにアクセスする際にはNet::Twitterを使っていました.GET/POSTの区別はあるにせよ,Gunghoでできることを違うモジュールで実行しているのは変な話です.ってことで,Gunghoだけで実現してみました.現在は別アカウントで動作試験を行っています.もうちょっと動かしてみて異常動作しなければhinetmaniaで使っているスクリプトと置き換えます.Gunghoがバージョンアップの際に挙動が変わったので,スクリプトに問題があったら,Gunghoのバージョンから戻さないといけないという,このどきどき(違

スクリプト

#!/usr/local/bin/perl

use strict;
use warnings;
no warnings qw(redefine);
use FileHandle;    # <- Needs for darwin os
use URI;
use Gungho::Inline;
use Web::Scraper;
use Encode qw(_utf8_off);
use utf8;

my $scraper = scraper {
    process 'td.bgltsub+td.bgwhite', 'descr[]' => 'text';
    result 'descr';
};

Gungho::Inline->run(
    {
        throttle    => { simple => { max_items => 10, interval => 300 } },
        credentials => {
            basic => [
                [
                    'http://twitter.com:80', 'Twitter API', 'userid', 'passwd'
                ]
            ]
        },
        components => [ 'Throttle::Simple', 'Authentication::Basic' ],
        quake => { outbreak => 0, shake => undef },
    },
    {
        provider => \&provider,
        handler  => \&handler,
    }
);

sub provider {
    my ( $p, $c ) = @_;
    my $url = 'http://www.hinet.bosai.go.jp';
    $p->add_request(
        $c->prepare_request( Gungho::Request->new( GET => $url ) ) );

    if ( $c->config->{quake}->{outbreak} ) {
        my $shake = $c->config->{quake}->{shake};
        my $text =
          sprintf "%sにM%sの地震が%sで発生しました %sq=%s%%20%s",
          $$shake[1], $$shake[5], $$shake[0],
          'http://maps.google.co.jp/maps?f=q&hl=ja&t=k&om=0&z=7&', $$shake[2],
          $$shake[3];
        _utf8_off($text);

        my $uri = URI->new('http:');
        $uri->query_form( status => $text );
        $p->add_request(
            $c->prepare_request(
                Gungho::Request->new(
                    POST => 'http://twitter.com/statuses/update.json',
                    [ 'Content-Type', 'application/x-www-form-urlencoded' ],
                    $uri->query,
                )
            )
        );
    }
    1;
}

sub handler {
    my ( $h, $c, $req, $res ) = @_;

    return 1 if ( !$res->is_success );

    my $case = URI->new( $req->uri )->host;

    my $code = {
        'www.hinet.bosai.go.jp' => sub {
            my $content_type = $res->headers->header('Content-Type');
            my $enc          = Encode::find_encoding($1)
              if ( $content_type =~ /charset=([A-Za-z0-9_\-]+)/io );

            my $html = $enc->decode( $res->content );
            my $old  = $c->config->{quake}->{shake};
            my $new  = $scraper->scrape($html);

            if ( ( !$old ) or ( $$old[1] ne $$new[1] ) ) {
                $$new[2] =~ s/N//;
                $$new[3] =~ s/E//;
                $c->config->{quake}->{shake}    = $new;
                $c->config->{quake}->{outbreak} = 1;
            }
        },
        'twitter.com' => sub {
            $c->config->{quake}->{outbreak} = 0;
        },
    }->{$case};
    $code->();
    1;
}