@nqounetです。
最近、IdobataというツールをPerl入学式のサポーターたちで使い始めました。
Idobataはチャットツールなのですが、webhookを経由して色々と通知を受け取れるのでなかなか快適です。
しかもなかなか充実しています。
折角なので、Perl入学式についての発言があったら通知するようなbotを作ってみました。
だいたいこんな感じ
メインスクリプトの全体像は大体こんな感じです。
|
|
まずはアプリケーションを登録
TwitterはAPIが充実していますが、使う場合は登録が必要です。
登録は英語ですが、日本語の解説を読みながらだと簡単です。
アクセストークンが必要なのでアクセストークンも発行しておきます。
発行後、しばらく待っていると発行されてページに情報が表示されるようになります。
OAuthしましょう
各種トークンの読み込みはConfig::Pit
を使っていますが、パスワードを書かないようにしているだけですので、ハッシュで指定してもかまいません。
OAuthを使用するので、Net::OAuth
もインストールが必要です。
Payload URL
Idobataで任意のwebhookを受信するためには、Generic
を選択します。
設定にあるEndpoint URL
に対してデータを送信することになります。
通信にはFurl
を使用することにします。
慣れているならばLWP::UserAgent
などでも全く問題ありません。
httpsでの通信になるのでIO::Socket::SSL
やLWP::Protocol::https
もインストールが必要な場合があります。
ツイートをフィルタリング
ここではAnyEvent::Twitter::Stream
を使うことにします。
インスタンスを生成する時にmethod
にfilter
を指定し、フィルタリングする内容をtrack
に指定すると、該当するツイートが流れてきた時に、on_tweet
が実行されます。
また、Twitterでは、HTTPSでの接続を推奨しているため、AnyEvent::Twitter::Stream
のドキュメントにあるとおりNet::SSLeay
もcpanfileに書いてインストールするようにしておきましょう。
サーバーに常駐させる
このまま実行するとターミナルを開けたままにしておかないといけないので、デーモン化してサーバーに常駐させます。
デーモン化するのはApp::Daemon
がとてもお手軽です。
|
|
これが書いてあるスクリプトでstart
,stop
,status
などのコマンドが使えるようになります。
また、デーモン化しないためには-X
というオプションをつけるとデーモン化しないので動作確認ができます。
また、不意のエラーから復活させるためProcletで監視させることにしたので、デーモン化するのはProcletの方です。
つまり、デーモン化したProcletによってロボットを監視する構成です。
また、Procletでloggerを指定することで、プログラム本体はログの出力を意識する必要がなくなりますので、非常に便利です。
サーバーに常駐させるスクリプトを作るときには、この構成が手軽で良さそうな気がします。
|
|
このファイルも加えた結果、cpanfileはこうなりました。
なお、デバッグ用にData::Printer
も追加しています。
|
|
carton install
でインストールされたモジュールは98個になっていました。
…多いですね。
しばらくはこの構成で様子を見てみようと思います。
参考になる資料
- perl - The Perl 5 language interpreter - metacpan.org
- AnyEvent::Twitter::Stream - Receive Twitter streaming API in an event loop - metacpan.org
- App::Daemon - Start an Application as a Daemon - metacpan.org
- Config::Pit - Manage settings - metacpan.org
- Data::Printer - colored pretty-print of Perl data structures and objects - metacpan.org
- Furl - Lightning-fast URL fetcher - metacpan.org
- IO::Socket::SSL - metacpan.org
- Net::OAuth - OAuth 1.0 for Perl - metacpan.org
- Net::SSLeay - metacpan.org
- Proclet - minimalistic Supervisor - metacpan.org