AnyEvent + OAuth で Twitter API を叩く

最近ようやく CPAN Author になりました。

ふとAnyEvent::Twitter::StreamをOAuthに対応させたいなぁ、と思ったので(ついでにChirpUserStreamsにも) - taiyoh独言が目にとまったので、モジュールの紹介もかねて書いておきます。

AnyEvent::Twitter の _make_oauth_request() という undocumented なメソッドを使えば ChirpUserStream も OAuth 対応させることができます。

config.jsoneg/gen_token.plで生成できます。

ただ、 want_body_handle やら on_header やらオプションが必要なので、根本的にはリンク先とは変わらない感じになっています。

こんなかんじ

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Encode;
use Data::Dumper;
use AnyEvent;
use AnyEvent::HTTP;
use AnyEvent::Twitter;

use JSON;
use Perl6::Slurp;

my $json_text = slurp 'config.json';
my $config = decode_json($json_text);
my $ua = AnyEvent::Twitter->new(%$config);

my $req = $ua->_make_oauth_request(
    request_url    => 'http://chirpstream.twitter.com/2b/user.json',
    request_method => 'GET',
    extra_params   => {}
);

my $cv = AE::cv;

http_request('GET' => $req->to_url,
    want_body_handle => 1,
    on_header => sub {
        my $hdr = shift;
        warn "$hdr->{Status}: $hdr->{Reason}";
    },
    sub {
        my $hdl = shift;

        my $r = sub {
            my (undef, $json) = @_;
            if (my $text = $json->{text}) {
                print encode_utf8 "$json->{user}{screen_name}: $text\n";
            } else {
                print encode_utf8 Dumper($json);
            }
        };
        $hdl->on_read(sub { $hdl->push_read( json => $r ); });
    }
);

$cv->recv;

exit;

__END__

余談

GitHub - punytan/AnyEvent-Twitter-Chirp: DEPRECATED をちょっと弄れば多少マシなものはできるのかな。ただ、AnyEvent::Twitter::Chirp を書いた - punitan (a.k.a. punytan) のメモにある通りなのでメンテする予定は特にありません。