通貨換算サーバ Currayon を作成しました

先日作った ruby-xurrency を利用して、通貨換算サーバ Currayon を作成しました。現在のところ換算リクエストは Jabber(XMPP), Twitter を通して受け付けます。

興味のある方は直接レポジトリをご覧下さい。いずれgem化しておくかも知れません。サーバの起動方法は、

% ruby -I lib bin/currancy

のようにします。jabberのアカウントさえあればどなたでもサーバを立ち上げることが出来ると思います。

使い方: Jabber

GTalk などの Jabber クライアントから currayon@jabber.jp 宛に次のようなメッセージを送って下さい。

100 cny jpy

これは100人民元を円に換算します。この結果は次のようになります。

100 cny = 1485.88 jpy

結果の正確さは一切保証しませんが、どうぞ使ってみて下さい。

使い方: Twitter

ボットな currayon 君にダイレクトメッセージを送って下さい。

d currayon 100 cny jpy

ダイレクトメッセージで換算結果を教えてくれます。

Currayon の中身

Currayon は ruby-xurrency と XMPP4R を利用して作りました。最初に触れたように ruby-xurrency を使ってレートを取得し、適当なタイミングで更新しています。xmpp4rは言うまでもなく有名なRuby用のXMPPライブラリです。今回初めて使ってみたのですが、これはとてもよく出来ていて、簡単にjabberクライアントを書けて素晴らしいと思いました。TwitterボットはダイレクトメッセージをJabberに転送し、これを同様に処理しています。だからjabberクライアントをしっかり作れば自動的にtwitterにも対応できるわけですね。とっても簡単。

twitterボットのコツ

とは言え、今回一番ハマったのは、実はtwitterボットの作成でした。基本的にtwitterボットは、メッセージをjabberクライアントに転送し、あとはそれなりに処理すれば良い、ということで本来とても簡単です。ただし私が最初に試してみた時には、そもそもtwitter/jabber間でメッセージが流れてこないという問題に遭遇しました(jabbertwitter投稿は出来るのに、twitterjabberのメッセージが一切届かない)。twitterの設定の問題かと思って色々と試してみたのですが、結局原因は、どうにも jabber.org の jabber サーバはうまく twitter と通信できていないらしい、ということでした。そこで現在は jabber.jp を利用させて頂いておりますが、こちらはjabber.orgと違って非常に快調です(jabber.jpさん、ありがとう!)。twitterボットを作成しようと思っている人は少し気を付けておいて下さい。

XMPP4R でtwitterユーザ名を取得する方法

twitterから投稿されるメッセージから投稿者のユーザ名を取得するには次のようにしましょう。

@twname = msg.elements["screen_name"].text

XMPP4RにおけるメッセージはREXMLの拡張になっているのでこうしたことが簡単に出来るわけですね。素晴らしいと思います。こうした方法がせっかく用意されているのですから、ユーザ名取得にスクレイピングなんてしちゃダメですよね。

subscription request の対処

Jabberクライアントが誰かをbuddyリストに追加しようとした時、subscription request というものが発生します。これを適切に処理しないとbuddyリストに「承認されていません」とかつれない事を言ってしまうので、きちんと返事をしておきましょう。これは次のようにします。

roster = Roster::Helper.new(jabber_client)

# accept subscription
roster.add_subscription_request_callback do |item, pres|
  roster.accept_subscription(pres.from)
end

みたいな。これを忘れるととっても悲しい。

感想

XMPP4Rは偉大です、こんなに簡単に作れるとは思いませんでした。なお、今回は開発にあたってPidginデバッグウィンドウが大活躍してくれました。とっても便利だと思います。今後の予定は次のようになります。

  • 一応 $SAFE = 2 に。
  • 他のIMやmailにも対応したいなあ。
  • メモリ使用量を減らす。

てな感じ。メモリ使用量(RSS)が30Mb越えと、とんでもないことに。こんなに使う必要性なんてあるわけないから、なんとかしたいものです。