Webサービス即日開発の実践3(Perl)〜Twitter API 1.1対応とhttps対応
しばらく更新が滞ってしまいました。
投稿する時間も惜しんでコーディングしていて、なんとか無事に動くコードが完成しました。
詰まった箇所は、主に以下の2つです。
①Twitter APIの仕様変更
②4バイト文字(絵文字や非常用漢字)の取り扱い
①は、サンプルコードが2010年のものでTwitter API 1.0を利用していたため、Twitter API 1.1に対応させる必要がありました。また開発中の1/14にhttpsも必須(http://news.mynavi.jp/news/2014/01/16/459/)になったため、その対応も実施し、以下のように書きました。
package Umakatter::CLI::FeedReader;
use Moose;
use Carp;
use URI;
use XML::Feed;
use Umakatter::CLI::FeedReader::Tweet;
use strict;
use Net::Twitter;
use utf8;
has 'consumer_key' => (
is => 'ro',
isa => 'Str',
default => 'xxxx'
);
has 'consumer_secret' => (
is => 'ro',
isa => 'Str',
default => 'xxxx'
);
has 'access_token' => (
is => 'ro',
isa => 'Str',
default => 'xxxx'
);
has 'access_token_secret' => (
is => 'ro',
isa => 'Str',
default => 'xxxx'
);
no Moose;
sub entries {
my $self = shift;
my $nt = Net::Twitter->new({
traits => [qw/API::RESTv1_1/],
ssl => 1,
consumer_key => $self->consumer_key,
consumer_secret => $self->consumer_secret,
access_token => $self->access_token,
access_token_secret => $self->access_token_secret,
});
my $r = $nt->search({q=>'美味い店', lang=>"ja", count=>100});
return @{$r->{statuses}};
}
sub tweets {
my $self = shift;
my @tweets;
my @entries = $self->entries;
for my $entry (@entries) {
push( @tweets,
Umakatter::CLI::FeedReader::Tweet->new($entry)
);
}
return \@tweets;
}
初期はssl => 1ではなく、api_urlにhttpsのURLを指定して実装していたのですが、https接続でエラーになったため、http://za.toypark.in/html/2009/10-21.htmlを参照して、IO::Socket::SSL と Mozilla::CAを導入しています。
②は、また次の記事にします。