ある日、リスペクトしている、とある偉いperlハッカー先生がツイッターでつぶやいていた。
perl入学式で、無いものはcpanモジュールを駆使して自分で作れば良いと教わっていたので、自分でtwitterbotを作って見ることにした。
・・・何ヶ月か前に勉強会perl鍋に参加した時に作り、ローカル環境で実験してうまく動いてからずっと放置していたので、きちんとスクリプトを仕上げてさくらvpsのサーバーに上げて自動実行させようとしたら色々ハマッてしまったので、その解決策を備忘録として書いておく。
twitterbotのスクリプトは、cpanのNet::Twitter::Lite::WithAPIv1_1モジュールを使った。TwitterAPIの利用登録から実際の使い方は@yusukebeさんのブログ記事「イカ娘でTwitter OAuth認証」を参考にさせていただいた。
作ったtwitterbotは、
@で話しかけられると定型文を返すというbotなので、perlのスクリプトでは、@で話しかけれられているかを取得->話しかけられていれば、@で返す
の部分を作り、その.plファイルをcronという定期的にスクリプトを実行してくれるデーモンで5分毎に実行させるような仕組みにした。
cronの設定は、crontab -eというコマンドで以下の書式で設定ファイルを書く。
PATH=/home/ユーザー/perl5/perlbrew/bin:/home/ユーザー/perl5/perlbrew/perls/perl-5.16.3/bin
*/5 * * * * /home/ユーザー/ディレクトリ/スクリプト.pl
注意点は、PATHで使うperlの位置を設定しておかないと、デフォルトで入っているシステムのperlで実行しようとしてしまうので、perlbrwでインストールした新しいperlを使うには、PATHを設定する。
で、いざcronを実行してみると、5分毎にスクリプトの実行を試みているが、エラーが帰ってきてスクリプトが動いていない。エラーの内容は、
Can't locate JSON.pm in @INC (@INC contains: ・・・
cpanモジュールが然るべき位置に無いと怒られた。
cpanm -reinstallコマンドでインストールしなおしてもエラーは変わらず。
エラーの出てるcpanモジュールのuse宣言の順番を最後に回すと、一番最初にuseしているモジュール名で同様のCan't locate エラーが出た。どうも全てのcpanモジュールが読み込めてない様だ。
色々ググってこちらのブログ記事「PerlによるTwitter bot制作」を参考にさせていただいた。
どうやら、crontabで設定したPATHは、使用するperlのディレクトリ位置情報のみで、インストール済みのcpanモジュールのディレクトリ位置情報は別の模様。cpanモジュールの位置は、フルパスで指定しなければならない様だ。
cpanモジュールの絶対パスをスクリプトの最初に記述、FindBinというcpanモジュールで、現在実行している.plスクリプトのディレクトリ位置を取得し、スクリプト中に出てくる設定ファイル等のディレクトリ位置を読み込めるように設定しなおしたら、twitterbotのスクリプトは見事動いた。
完成したbotはこちら。何かやらかしてしまった時に、@dakarabot にメンションを飛ばすと反応します。