パッケージ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行目では実際に投稿するつぶやきを作成しています。ClassUtilsStringUtilsは、Apache Commons Langに入っている便利ユーティリティクラスです。インクルードしときます。(ここではシーオーリポーツの例外名をTwitterのハッシュタグにしていますが、多分こういう使い方は推奨されないので、お試し以外では止めておいたほうがいいと思います)。

前回と違うのは、リクエストメソッドをPOSTにしているところです。これはTwitter APIの仕様で決められています。また、接続を行うためにHttpURLConnectionを使用しています。接続後、確認のためにレスポンスコードとメッセージを表示していますが、別になくてもかまいません。

実行

実行方法も前回と同じです。ただ、今回はエラーが発生しないと意味がないので、適当に不正な値をデータに混ぜておきます。。。

Twitterに投稿されたエラーログ

Twitterに投稿されたエラーログ(クリックで拡大)

保険サンプルのフィールド「契約番号」に、不正な値「ほげほげ」が設定されたために失敗したことがわかりますね!
xAuthの申請が通ったら、cron等で定時実行すれば、エラー内容を延々つぶやく哀しいbotの完成です。