twitterのbot@さくらのVPS

さくらのVPSを借りた。 何がしたかったって、Net::Twitterをいれたかった。このためだけに借りたといっても過言ではない。 だが、多少の困難があった。インストールがすっといかなかった。

perl -MCPAN -e shell


とやると cpanのプロンプトになるので、

install Net::Twitter


とやればいいのだが、やたら長い上に最後にエラーになる。 ダラダラと出ているログは読んでられないのでまずサーチする。 失敗している人が散見され、いろいろ回避策が公開されていたがどれを試してもダメ。 結局、ログを見て、can't locate といわれているmoduleを片っ端から入れていった。 Math::Round とか。 あと、opensslのライブラリ(?)がないみたいなことを言われるので

yum install -y openssl-devel


をやった。

cpanのモジュールは依存関係にあるものを勝手にいれるんじゃなかったっけ? そんな親切なのはppm installだけなのか?

bot

use strict;
use warnings;
use utf8;
use Encode;
use Net::Twitter;

binmode STDOUT, ':utf8';

my $twit = Net::Twitter->new(
    traits => [qw/API::REST OAuth WrapError/],
    consumer_key    => 'YOUR_CONSUMER_KEY',
    consumer_secret => 'YOUR_CONSUMER_SECRET',
    ssl => 1,
);

$twit->access_token       ('YOUR_ACCESS_TOKEN');
$twit->access_token_secret('YOUR_ACCESS_TOKEN_SECRET');

while (1){
    my $line;
    open(my $file, "<tweets.txt");
    rand($.)<1 and $line = $_ while <$file>;
    close $file;
    my $decoded = Encode::decode('utf8', $line);
    $twit->update($decoded);

    sleep 3600;
}

exit;
テキストファイルからランダムに1行ずつ選んでツイートする、簡単なボット。 ちょっと手間取ったのは日本語の扱い。 tweets.txt は utf8で保存してあるのだが、なぜかそのまま Net::Twitterに渡すと文字化けする。 リテラルは化けない。 いろいろ調べて、utf8をいったんデコードして渡すという、ちょっと釈然としないやり方で解決。