ishiducaの日記 このページをアンテナに追加 RSSフィード

2010-08-20

[][]「ターミナルからツイートする」の追試 16:06 「ターミナルからツイートする」の追試 - ishiducaの日記 を含むブックマーク はてなブックマーク - 「ターミナルからツイートする」の追試 - ishiducaの日記 「ターミナルからツイートする」の追試 - ishiducaの日記 のブックマークコメント

まずは

OAuth::Lite::ConsumerとLWP::UserAgentでTwitterにポストする

なんだけれども。



Twitter用のbotを作るに当たり複数のアカウントでツイートする(あるいはタイムラインを取得する)のに、同じコードをなんども書くのはさすがに効率が悪いので、モジュール化してみた。

ついでにOOPな方向にチャレンジ

My::Twitter.pm

package My::Twitter;
use strict;
use warnings;
use Carp;
use OAuth::Lite::Consumer;
use LWP::UserAgent;
use JSON;

my $ua = LWP::UserAgent->new;

sub new {
    my $class = shift;
    my %args = @_;
    bless(\%args, $class);
}

sub set_oauth_consumer {
    my $self = shift;
    my %hash = @_;
    $self->{consumer} = OAuth::Lite::Consumer->new(
        consumer_key    => $hash{consumer_key},
        consumer_secret => $hash{consumer_secret},
    );
}

sub set_access_token {
    my $self = shift;
    my %hash = @_;
    $self->{access_token} = OAuth::Lite::Token->new(
        token  => $hash{token},
        secret => $hash{secret},
    );
}

sub tweet {
    my $self = shift;
    my $murmur = join " ", @_;
    my $request = $self->{consumer}->gen_oauth_request(
        method => "POST",
        url    => 'http://twitter.com/statuses/update.json',
        token  => $self->{access_token},
        params => { status => $murmur },
    );
    my $response = $ua->request($request);
    die $response->status_line unless $response->is_success;
    $murmur;
}

sub get_timeline {
    my $self = shift;
    my $request = $self->{consumer}->gen_oauth_request(
        method => 'GET',
        url    => 'http://api.twitter.com/1/statuses/home_timeline.json',
        token  => $self->{access_token},
    );
    my  $response = $ua->request($request);
    die $response->status_line unless $response->is_success;
    decode_json($response->{_content});
}

1;

mytweet.pl

#!/usr/bin/env perl
use strict;
use warnings;
use Encode;
use DateTime;
use DateTime::Format::DateParse;
use My::Twitter;

@ARGV or die "not found your tweet", "\n";
my $status = join " ", @ARGV;

my $me = Twitter->new;
$me->set_oauth_consumer(
    consumer_key    => 'YOUR_CONSUMER_KEY',
    consumer_secret => 'YOUR_CONSUMER_SECRET',
);
$me->set_access_token(
    token  => 'YOUR_ACCESS_TOKEN',
    secret => 'YOUR_ACCESS_SECRET',
);

$me->tweet( $status );

my $timeline = $me->get_timeline();

for (@{$timeline}) {
    my $friend = $_->{user}{screen_name};
    my $tweet  = $_->{text};
    my $datetime = DateTime::Format::DateParse->parse_datetime(
        $_->{created_at}
    );
    $datetime->set_time_zone( 'Asia/Tokyo' );
    my $date = $datetime->strftime('%m.%d %H:%M');
    print $date, encode_utf8(" <$friend>\t$tweet\n");
}

exit 0;

やりたいことは実行できてるんだけど。

IceIce2011/06/05 12:36You’re the one with the brains here. I’m wtacihng for your posts.

kbdbutsxykbdbutsxy2011/06/06 22:47nYuvjN , [url=http://btdywumckled.com/]btdywumckled[/url], [link=http://esqtcbemvmwr.com/]esqtcbemvmwr[/link], http://afsjhcrktgtu.com/

sdqjagvyksdqjagvyk2011/06/07 18:26AL4If2 <a href="http://isdiszydngwi.com/">isdiszydngwi</a>

pxmzvpwpxmzvpw2011/06/09 18:57z7t78J , [url=http://voxbdfctfdvo.com/]voxbdfctfdvo[/url], [link=http://mtdaaezmxscf.com/]mtdaaezmxscf[/link], http://qicmpotpztkm.com/

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20100820