Chat on Pusher
Pusher を使ってチャットアプリを作った。コレ → http://chatto.heroku.com/。バックエンドは相変わらず Sinatra。Twitter のアカウントを使ってチャットができる。チャットの内容をツイートしたりする機能はなし。
Pusher 周りは Pusher のサイトに Demo として掲載されている Pusher Chat を、Twitter 周りは jugyo さんの Twiwt:Chat を参考にさせていただいた。ってかまねた。
作っていて一番困ったのが、Twitter の screen name の取得方法が分らなかったこと。Twitter 関連のライブラリは gem の Twitter を使用している。OAuth の認証はできても、そこから自分の screen name がとれなかった。
参考にさせていただいた Twiwt:Chat (Python) では screen name は取得できているので、Twitter の API からとれないということはなさそうだった。どうやって取得しているのだろうとソースを覗くと、どうも この辺り が該当箇所のようだ。
gem の Twitter でそれに対応してるのが ここ 。ここの access_token をダンプしてみると
#<OAuth::AccessToken:0x2b8fda1a4e48 ... @params= {:oauth_token=>"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", :user_id=>"0000000000", "oauth_token_secret"=>"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", :screen_name=>"yamamucho", "user_id"=>"0000000000", :oauth_token_secret=>"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "oauth_token"=>"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "screen_name"=>"yamamucho"}, ...
@params に screen name が に入っているということがわかった。
ので、次のようにして get_access_token の戻り値をメンバに保存しておくようにした。これで @access_token.params[:screen_name] とかで、screen name を取得できる。
class Twitter::OAuth def authorize_from_request(rtoken, rsecret, verifier_or_pin) request_token = ::OAuth::RequestToken.new(signing_consumer, rtoken, rsecret) @access_token = request_token.get_access_token(:oauth_verifier => verifier_or_pin) @atoken, @asecret = @access_token.token, @access_token.secret end end
こんな対応でよいのかしら。他の部分に影響はでないのか?とりあえず自分が使う機能だけであれば問題は出ていないけど。
11/23 追記
githubにソースをupした。https://github.com/ymmtmsys/chatto