通貨換算サーバ 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
結果の正確さは一切保証しませんが、どうぞ使ってみて下さい。
Currayon の中身
Currayon は ruby-xurrency と XMPP4R を利用して作りました。最初に触れたように ruby-xurrency を使ってレートを取得し、適当なタイミングで更新しています。xmpp4rは言うまでもなく有名なRuby用のXMPPライブラリです。今回初めて使ってみたのですが、これはとてもよく出来ていて、簡単にjabberクライアントを書けて素晴らしいと思いました。TwitterボットはダイレクトメッセージをJabberに転送し、これを同様に処理しています。だからjabberクライアントをしっかり作れば自動的にtwitterにも対応できるわけですね。とっても簡単。
twitterボットのコツ
とは言え、今回一番ハマったのは、実はtwitterボットの作成でした。基本的にtwitterボットは、メッセージをjabberクライアントに転送し、あとはそれなりに処理すれば良い、ということで本来とても簡単です。ただし私が最初に試してみた時には、そもそもtwitter/jabber間でメッセージが流れてこないという問題に遭遇しました(jabber → twitter投稿は出来るのに、twitter → jabberのメッセージが一切届かない)。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
みたいな。これを忘れるととっても悲しい。