TwitterAPI認証をOAuthに変えたら関係ないbotにつぶやいていた。しにたい

先週botをOAuth対応したんですが、
今日ふと気づいたらとあるbotのツイートに
全然関係ないbotのツイートが流れてた!

認証モジュール

こんなのをbotごとに作ってる。
面倒なのでこれコピペしてキーだけ変えてる。

package Auth;

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

my %CONSUMER_TOKENS = (
  consumer_key    => 'aaaaaaaaaaa',
  consumer_secret => 'bbbbbbbbbbb',
);
my $ACCESS_TOKEN        = 'ccccccccccccccc';
my $ACCESS_TOKEN_SECRET = 'ddddddddddddddd';

sub ntl {
    my $twit = Net::Twitter::Lite->new(%CONSUMER_TOKENS);
    $twit->access_token($ACCESS_TOKEN);
    $twit->access_token_secret($ACCESS_TOKEN_SECRET);
    return $twit;
}

1;

何故別botのツイートに流れたのか

bot_a:まじめbot
bot_b:ふまじめbot
としよう。

原因その1:いろんなbotでAuthモジュールを使っていた。

モジュール名は一緒。
ディレクトリがbot毎に異なるのでそこに同じ構成でAuthモジュールを配置してた。

原因その2:bot_bは手抜きなので今までは1スクリプトで書いてた

それを今回はAuthモジュールを使うように変更している。
つまり元々はlib指定が存在していなかった。

原因その3:ローカル実行ではエラーもなく普通にツイートしてた

もちろん単体テストはしていたが、その時は問題なくツイートされてた。
カレントディレクトリにモジュールが存在するからである。

原因その4:cronの中でPERL5LIBのbot_aへのライブラリが指定してあった。

最大の原因がこれ。
bot_aはそこそこがんばって作っててモジュールも使ってあるので
ライブラリ指定をしていた。*1


もちろんbot_aはそのまま実行されるのだが、
bot_bはカレントディレクトリにAuthが存在していない!
そしてperlはPERL5LIBの中身を探し、
bot_aのAuthモジュールを見つけ出し、
bot_aのAuthを利用してbot_bのツイートをつぶやくのであった…


しかもbot_bは下ネタbotだった。しにたい

*1:なぜuse libではなくPERL5LIBで指定していたかは謎