読者です 読者をやめる 読者になる 読者になる

RubyからTwitterStreamingAPIを使うgem作ったよ!

Ruby

追記:少し仕様変えました。コードも多少変わってるので注意





Twitter Streaming API が面白かったので色々調べてみると、

Twitter Streaming APIをRubyで試してみるに詳しいRubyでの使い方が乗っていました。
で、便利そうだったのでgemにしてみました。

名前

Ruby Twitter Stream

インストール

>sudo gem install twitterstream

使い方

require "twitterstream"

TwitterStream.new("username", "password").sample do |status|
  next unless status['text']
  user = status['user']
  puts "#{user['screen_name']}: #{status['text']}"
end

public_timelineをランダムサンプリングしたtweetがだらだら流れてくるよ!


require "twitterstream"

TwitterStream.new("username", "password").track("bit,ly") do |status|
  next unless status['text']
  user = status['user']
  puts "#{user['screen_name']}: #{status['text']}"
end 

キーワード "bit" か "ly" を含むtweetがだらだら流れてくるよ!

備考

  • pure-rubyです!
  • Twitter Streaming APIを操作するもっと高機能なライブラリtweetstreamがあるよ。でもこれはインストールにCコンパイラが必要など面倒。
  • ライセンスは MIT License です。
  • gem作ったの初めてです。バグ・突っ込みどころ満載かも

ライブラリのソースコード(古いやつ)

最新のコードはgithubで確認してね
すごいシンプル!

require 'net/http'
require 'uri'
require 'rubygems'
require 'json'

module Net
  class HTTPResponse
    def each_line(rs = "\n")
      stream_check
      while line = @socket.readuntil(rs)
        yield line
      end
      self
    end
  end
end

module TwitterStream
  VERSION = '0.0.3'
  
  class Client
    def initialize(username, password)
      @username = username
      @password = password
      self
    end

    def start_stream(uri, params=nil)
      Net::HTTP.start(uri.host, uri.port) do |http|
        request = Net::HTTP::Post.new(uri.request_uri)
        request.set_form_data(params) if params
        request.basic_auth(@username, @password)
        http.request(request) do |response|
          response.each_line("\r\n") do |line|
            status = JSON.parse(line) rescue next
            yield status
          end
        end
      end
    end
    
    def sample(params=nil)
      uri = URI.parse("http://stream.twitter.com/1/statuses/sample.json")
      start_stream(uri, params) do |status|
        yield status
      end
    end

    def filter(params=nil)
      uri = URI.parse("http://stream.twitter.com/1/statuses/filter.json")
      start_stream(uri, params) do |status|
        yield status
      end
    end

    def track(track, params=nil)
      uri = URI.parse("http://stream.twitter.com/1/statuses/filter.json")
      p = {'track'=>track}
      p.merge!(params) if params
      start_stream(uri, p) do |status|
        yield status
      end
    end
    
    def follow(follow, params=nil)
      uri = URI.parse("http://stream.twitter.com/1/statuses/filter.json")
      p = {'track'=>track}
      p.merge!(params) if params
      start_stream(uri, p) do |status|
        yield status
      end
    end
  end
end


github

http://github.com/yayugu/Ruby-Twitter-Stream