なんとか年末に追い込みをかけて、mruby-uvとmruby-httpベースのmruby-oauthを完成させました。ベースはiij/mrubyの実装を再利用しています。
mruby-uvは名前解決のメソッドが現状用意されていないので実装し、mruby-simplehttpとmruby-httprequestを書き直して、それらを継承しmruby-oauthを作成しました。
インストール
build_my_mrubyというレポジトリにインストールスクリプトを容易しているので、そのスクリプトを実行します。
[program lang=’bash’ escaped=’true’]
git clone git@github.com:matsumoto-r/build_my_mruby.git cd build_my_mruby sh mymruby_with_mrbgems.sh
[/program]
上記のスクリプトを実行するとカレントディレクトリにmrubyをダウンロードしてきて、必要なmrbgemsを自動で組み込んでくれます。そして、mrubyディレクトリ以下のbinディレクトリ内にmrubyバイナリが生成されます。このバイナリを使うことによって、容易にmruby-oauthを試すことができます。
[program lang=’bash’ escaped=’true’]
cd mruby ./bin/mruby --version
[/program]
mruby-oauthの依存mrbgemsは以下の通りです。
[program lang=’text’ escaped=’true’]
mruby-uv mruby-http mruby-digest mruby-pack mruby-simplehttp mruby-httprequest mruby-json
[/program]
mrubyでtwitterをポストしてみる
例えば、tweetをpostする場合は以下のようなコードを書きます。
[program lang=’ruby’ escaped=’true’]
CONSUMER_KEY = '' CONSUMER_SECRET = '' ACCESS_TOKEN = '' ACCESS_TOKEN_SECRET = '' API_URL = 'http://api.twitter.com/1.1/statuses/update.json' tweet = "happy new year from mruby-oauth" ex_headers = {'Content-Type' => 'application/x-www-form-urlencoded'} twitter = OAuth.new(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) response = twitter.post(API_URL, {:status => tweet}, ex_headers) if response.code.to_i == 200 puts "tweet success: #{tweet}" else puts "tweet failed: #{tweet}: bellow response" p response end
[/program]
このスクリプトを以下のように実行します。
[program lang=’ruby’ escaped=’true’]
./bin/mruby tweet_post.rb
[/program]
すると以下のようにtwitterにtweetされるでしょう。
happy new year from mruby-oauth
— MATSUMOTO, Ryosukeさん (@matsumotory) 12月 31, 2012
いいですね!
mrubyでtimelineを取得してみる
以下のようにコードを書きます。
[program lang=’ruby’ escaped=’true’]
CONSUMER_KEY = '' CONSUMER_SECRET = '' ACCESS_TOKEN = '' ACCESS_TOKEN_SECRET = '' GET_API_URL = 'http://api.twitter.com/1.1/statuses/user_timeline.json?count=' tweet_num = 5 twitter = OAuth.new(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) response = twitter.get(GET_API_URL + tweet_num.to_s) if response.code.to_i == 200 data = JSON::parse(response.body) data.each do ¦d¦ puts "#{d["user"]["screen_name"]}'s tweet: #{d["text"]}" end else puts response.body raise "Request failed: " + response.code.to_s end
[/program]
tweet_numに取得したい最新tweetからのtweetの数を設定します。このスクリプトを実行すると以下のように出力されます。
[program lang=’text’ escaped=’true’]
matsumotory's tweet: 眠い matsumotory's tweet: “[December 2012] mruby news - mruby.sh” http://t.co/fPAekF0t matsumotory's tweet: happy new year from mruby-oauth matsumotory's tweet: happy new year from mruby-oauht matsumotory's tweet: mrubyist達が年明けに向けてラストスパートしている。僕はmruby-oauthができたので見守るだけである。
[/program]
自分のtweetを5個表示することができました。
いいですね!
自分のタイムラインを流し続ける
以下のようなスクリプトを書けば、ストリーミングのように自分のタイムラインをコンソールに流し続けられます。
[program lang=’ruby’ escaped=’true’]
CONSUMER_KEY = '' CONSUMER_SECRET = '' ACCESS_TOKEN = '' ACCESS_TOKEN_SECRET = '' GET_API_URL = 'http://api.twitter.com/1/statuses/home_timeline.json?count=' tweet_num = 10 interval = 60 twitter = OAuth.new(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET) new_id = 0 old_id = 0 while response = twitter.get(GET_API_URL + tweet_num.to_s) if response.code.to_i == 200 data = JSON::parse(response.body) if old_id == 0 ¦¦ old_id != data[0]["id"].to_i new_id = data[0]["id"].to_i data.reverse.each do ¦d¦ if old_id < d["id"].to_i puts "#{d["user"]["screen_name"]}'s tweet: #{d["text"]}" end end old_id = new_id end else puts response.body raise "Request failed: " + response.code.to_s end Random.sleep interval end
[/program]
いいですね!
mrubyを開発しつつ、mrubyでツイートのタイムラインを眺めるのは粋ですね!
最後に
このようにmruby-oauthを使って、mrubyで簡単にOAuthを使ってtwitterを操る事ができました。OAuthを使ったWebサービスであれば、これで自由に操作することができるでしょう。
mrubyはとても面白いので、みんなでmrbgemを作りましょう!