Twitter APIで遊んでみよう(3)
パッケージJava製品開発担当の大です。こんにちは。
シーオーリポーツ 帳票クリエータには、あらかじめ出力結果をメールする機能が備わっています。これを使って、出力した帳票を添付して関係者に一斉に配信したり、エラー時に管理者に例外内容を送信したりできます。
しかし、たとえば「メールで配信する代わりに出力した帳票をFTPでサーバに送信したい」など、用意されているものとちょっと違った要望を実現するためには、自分で実装する必要があります。
今回はこんな「ちょっと違った要望」の例として、エラー発生時に例外の内容をTwitterにつぶやくスクリプトを書いてみます。
認証
前回に続いて、認証はOAuthを使用します。ほんとは今回のような話で本格的に使うなら、OAuthよりもxAuthのほうが向いていると思いますが、TwitterでxAuthを使うのは申請をメールでしなくてはならなくて面倒らしいので、OAuthを使います。
さて、前回はアクセスの種類は「Read-only」にしてましたが、今回はつぶやきを投稿するので、「Read & Write」に変更しておきます。変更は、Twitterのアプリケーションの詳細画面の「Edit Application Setting」から行えます。
スクリプト
今回は例外処理のお話でマッピング情報やフォームは何でもいいので、帳票クリエータに入っている保険のサンプルを使用します。前回と同様にグローバル領域に認証用のスクリプトをコピーしたら準備はオッケーです。
新たに、エラー発生時用のスクリプトを記述します。
<DocCreator> <Script on="outputFailed"> var tag = '#' + ClassUtils.getShortClassName(error, null); var status = StringUtils.abbreviate(tag + ' ' + error.message, 140); var url = new URL('http://api.twitter.com/1/statuses/update.xml?status=' + URLEncoder.encode(status, 'UTF-8')); var conn = url.openConnection(); conn.requestMethod = 'POST'; consumer.sign(conn); conn.connect(); println(conn.responseCode + ' ' + conn.responseMessage); conn.disconnect(); </Script> ...
スクリプトを記述するのは、DocCreator
タグの下、イベントはoutputFailed
です。
このイベントハンドラ内では、実際に発生した例外を表す変数error
が暗黙に参照できます。03行目、04行目では実際に投稿するつぶやきを作成しています。ClassUtils
とStringUtils
は、Apache Commons Langに入っている便利ユーティリティクラスです。インクルードしときます。(ここではシーオーリポーツの例外名をTwitterのハッシュタグにしていますが、多分こういう使い方は推奨されないので、お試し以外では止めておいたほうがいいと思います)。
前回と違うのは、リクエストメソッドをPOSTにしているところです。これはTwitter APIの仕様で決められています。また、接続を行うためにHttpURLConnectionを使用しています。接続後、確認のためにレスポンスコードとメッセージを表示していますが、別になくてもかまいません。
実行
実行方法も前回と同じです。ただ、今回はエラーが発生しないと意味がないので、適当に不正な値をデータに混ぜておきます。。。
保険サンプルのフィールド「契約番号」に、不正な値「ほげほげ」が設定されたために失敗したことがわかりますね!
xAuthの申請が通ったら、cron等で定時実行すれば、エラー内容を延々つぶやく哀しいbotの完成です。