mruby-oauthでmrubyからtwitterを操作

なんとか年末に追い込みをかけて、mruby-uvmruby-httpベースのmruby-oauthを完成させました。ベースはiij/mrubyの実装を再利用しています。

mruby-uvは名前解決のメソッドが現状用意されていないので実装し、mruby-simplehttpmruby-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されるでしょう。

いいですね!

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を作りましょう!