訳あってPerlからツイッターにつぶやきをPOSTする必要が生じ、大昔に書いたサンプルコードを引っ張り出して動かしてみたもののエラーでうまく動かない…。
調べてみたところ最近Twitter API v1.1なるものが導入されていてエンドポイントや認証方式が変わった模様。軽く仕様を眺めてみたところ一から実装するのは骨が折れそうだったので、ググッてみたところCPANで公開されている「Net::Twitter::Lite」モジュールに含まれる「Net::Twitter::Lite::WithAPIv1_1」は使えそうだったので試してみるとあっさり動いてくれました。
use strict;
use utf8;
use Encode;
use Net::Twitter::Lite::WithAPIv1_1;
my $nt = Net::Twitter::Lite::WithAPIv1_1->new(
consumer_key => '(consumer_key)',
consumer_secret => '(consumer_secret)',
access_token => '(access_token)',
access_token_secret => '(access_token_secret)',
ssl => 1,
);
# つぶやきだけの場合
eval {
$nt->update('あいうえお');
};
die $@ if $@;
# 画像付きでつぶやく場合
my $file = "test.jpg";
my $content = do {
open my $fh, '<:bytes', $file or die "$!: $file";
local $/;
<$fh>;
};
my $filename = "test.jpg";
eval {
$nt->update_with_media('あいうえお', [ undef, $filename, Content_Type => 'image/jpeg', Content => $content ])
};
die $@ if $@;
exit;
Net::Twitter::LiteはPurePerlなモジュールなので導入も楽チン。レンタルサーバでもuse libで動作します。
ただ内部でLWP::UserAgentを内製してenv_proxyを呼んでいるので、企業などプロキシ経由のアクセスが必要な環境から利用する場合などは若干対応を練る必要がありそうです。Web::ScraperのようにこちらからUAを渡せる作りだと個人的には有難いんですけどね。