昨日から急に始まった「Rubyでいろいろするシリーズ」、第2弾は「twitter」をお届けする。

ご存知の方はご存知の通り、twitterはほぼすべての機能をAPIとして公開している。自分のプロフィールやアイコンの変更もできるので、時間や状況によって動的に変化させる、なんてのも楽しそうだ。

まずは自分のタイムラインを取得してみよう。

準備

rubygems

gemのup to dateなtwitterライブラリは「twitter4r」。「twitter」ではないようなので気をつけよう。

データはJSONで返ってくるので(オプションでXMLも指定できるが)、JSONライブラリも準備しておこう。

% sudo gem install twitter4r
% sudo gem install json
twitterアカウント

アカウントがないと始まらないので、持ってない場合は取得しておこう。

なお、twitter APIは1時間に150回の利用制限がある。負荷が高いとさらに厳しくなる場合もあるので、利用する際は無茶な回数リクエストしないよう注意すること。利用回数を取得するAPIもあるので、念入りに作るなら確認も必要だろう。

タイムラインの取得

まずは、自分のフレンドタイムライン(フォローしてるユーザのtweet)を取得してみよう。

twitter_api.rb
# -*- coding: utf-8 -*-
require 'rubygems'
require 'twitter'
require 'pp'
class TwitterApi
# twitterのID / PASSWORD
USERNAME = 'kwappa'
PASSWORD = '********'
# コンストラクタ : Twiter::Clientオブジェクトを準備する
def initialize
@client = Twitter::Client.new(:login => USERNAME, :password => PASSWORD)
end
# friends_timelineを取得
def friends_timeline
@timeline = @client.timeline_for(:friend, :count => 10)
end
# データ構造をチェック
def dump
@timeline.each do |status|
pp status.to_hash
end
end
# データを1行 = 1発言で保存
def save(file_name)
File.open(file_name, 'w') { |file|
@timeline.each do |status|
file.puts status.to_hash.to_json
end
}
end
end
twapi = TwitterApi.new
twapi.friends_timeline
twapi.dump
twapi.save './result.json'

@timelineにタイムラインが取れるので、eachでstatus(個々の発言)をほげほげする。

% ruby twitter_api.rb

データがどんな構成になってるか確認してみよう。発言は私の朝っぱらのご挨拶。くだらないのは勘弁な。

{:user=>
{:utc_offset=>32400,
:friends_count=>332,
:profile_text_color=>"666666",
:time_zone=>"Tokyo",
:statuses_count=>6349,
:profile_link_color=>"2FC2EF",
:url=>"http://www.kwappa.net/",
:location=>"Tokyo Junk",
:created_at=>"Fri May 25 05:33:43 +0000 2007",
:profile_sidebar_fill_color=>"252429",
:screen_name=>"kwappa",
:profile_sidebar_border_color=>"181A1E",
:favourites_count=>112,
:profile_image_url=>
"http://a1.twimg.com/profile_images/53072266/kwappa_twitter_normal.gif",
:description=>"プログラマ / 東京Basic Technology勉強会主宰",
:name=>"kwappa",
:profile_background_image_url=>
"http://s.twimg.com/a/1253830975/images/themes/theme9/bg.gif",
:id=>6304032,
:followers_count=>368,
:profile_background_color=>"1A1B1F"},
:created_at=>Sun Sep 27 08:39:52 +0900 2009,
:source=>
"<a href=\"http://simplytweet.com\" rel=\"nofollow\">SimplyTweet</a>",
:text=>
"おはよった。寝坊リューション(ノートに書き留めた言葉的な意味で)。",
:id=>4404774512}
  • user

    …発言者のデータいろいろ

  • created_at

    …発言日時

  • text

    …本文

  • id

    …発言ID

再利用するために

発言を永続化したいけど、DB用意するのもめんどくさいし…などの場合、ファイルに1行 = 1発言で保存できると何かと便利。JSONライブラリを使うとそれも簡単に実現できる。TwitterApi#saveで保存してあるので…

json.status.rb
# -*- coding: utf-8 -*-
require 'rubygems'
require 'json'
File.open('./result.json') { |file|
while line = file.gets
status = JSON.parse(line)
puts status["text"]
end
}

まとめ

これでtwitterの発言が取得できるようになった。これをYahoo! web APIで解析して、結果をほげほげして、タイムラインに投稿するようにしてやれば、twitter botのいっちょあがり、というわけ。

twitter4rではAPIの利用残り回数を取得できないようなので、ちゃんとしたbotを作るならこの辺をなんとかするのが課題だろう。

Twitter / ホーム

http://twitter.com/

twitter API – twitterまとめWiki

http://usy.jp/twitter/index.php?twitter%20API

twitter API Wiki / twitter API Documentation

http://apiwiki.twitter.com/twitter-API-Documentation

[観] twitter API 仕様書 (勝手に日本語訳シリーズ)

http://watcher.moe-nifty.com/memo/2007/04/twitter_api.html

twitter4R – Open Source Ruby Project for twitter REST API [Rubyforge]

http://twitter4r.rubyforge.org/

twitter4R v0.3.0: Open Source Ruby Client Library for the Twitter REST API

http://twitter4r.rubyforge.org/rdoc/

JavaScript Object Notation – Wikipedia

http://ja.wikipedia.org/wiki/JavaScript_Object_Notation

JSON implementation for Ruby

http://flori.github.com/json/