class RTwitter::OAuth

Attributes

access_token[RW]
access_token_secret[RW]
consumer_key[RW]
consumer_key_secret[RW]
screen_name[RW]
userAgent[RW]
user_id[RW]

Public Class Methods

new(ck ,cks ,at = nil ,ats = nil) click to toggle source
# File lib/RTwitter.rb, line 13
def initialize(ck ,cks ,at = nil ,ats = nil)
        @consumer_key = ck
        @consumer_key_secret = cks
        @access_token = at
        @access_token_secret = ats
        @userAgent = 'RTwitter'
end

Public Instance Methods

get(endpoint,additional_params = Hash.new) click to toggle source
# File lib/RTwitter.rb, line 83
def get(endpoint,additional_params = Hash.new)

        url = url(endpoint)
        header = signature('GET',url,additional_params)
        body = build_body(additional_params)
        response = get_request(url,body,header)
        return decode(response)

end
post(endpoint,additional_params = Hash.new) click to toggle source
# File lib/RTwitter.rb, line 73
def post(endpoint,additional_params = Hash.new)

        url = url(endpoint)
        header = signature('POST',url,additional_params)
        body = build_body(additional_params)
        response = post_request(url,body,header)
        return decode(response)

end
request_token(callback) click to toggle source
# File lib/RTwitter.rb, line 20
def request_token(callback)

        oauth_params = oauth
        oauth_params.delete('oauth_token')
        oauth_params['oauth_callback'] = callback
        base_params = Hash[oauth_params.sort]
        query = build_query(base_params)
        url = 'https://api.twitter.com/oauth/request_token'
        base = 'POST&' + escape(url) + '&' + escape(query)
        key = @consumer_key_secret + '&'
        oauth_params['oauth_signature'] = Base64.encode64(OpenSSL::HMAC.digest("sha1",key, base)).chomp
        header = {'Authorization' => 'OAuth ' + build_header(oauth_params),'User-Agent' => @userAgent}
        response = post_request(url,'',header)
        begin
                items = response.body.split('&')
                @request_token = items[0].split('=')[1]
                @request_token_secret = items[1].split('=')[1]
                return [@request_token,@request_token_secret]
        rescue
                raise RTwitterException,response.body
        end

end
streaming(endpoint,additional_params = Hash.new) { |status| ... } click to toggle source
# File lib/RTwitter.rb, line 93
def streaming(endpoint,additional_params = Hash.new)

        url = url(endpoint)
        header = signature('GET',url,additional_params)
        body = build_body(additional_params)
        buffer = ''
        streaming_request(url,body,header){|chunk|
                if buffer != ''
                        chunk = buffer + chunk
                        buffer = ''
                end
                begin
                        status = JSON.parse(chunk)
                rescue
                        buffer << chunk
                        next
                end

                yield status
        }

end

Private Instance Methods

build_body(params) click to toggle source
# File lib/RTwitter.rb, line 260
def build_body(params)

        body = params.map{|key,value|
                "#{escape(key)}=#{escape(value)}"
        }.join('&')
        return body

end
build_header(params) click to toggle source
# File lib/RTwitter.rb, line 251
def build_header(params)

        header = params.map{|key,value|
                "#{escape(key)}=\"#{escape(value)}\""
        }.join(',')
        return header

end
build_query(params) click to toggle source
# File lib/RTwitter.rb, line 242
def build_query(params)

        query = params.map{|key,value|
                "#{escape(key)}=#{escape(value)}"
        }.join('&')
        return query

end
decode(response) click to toggle source
# File lib/RTwitter.rb, line 140
def decode(response)
        if response.body == nil
                raise RTwitterException,'Failed to receive response.'
        end
        if response.body == ''
                raise RTwitterException,'Empty response.'
        end
        begin
                obj = JSON.parse(response.body)
        rescue
                return response.body
        end
        if obj.include?('error')
                raise RTwitterException,obj['error']
        end
        if obj.include?('errors')
                if obj['errors'].kind_of?(String)
                        raise RTwitterException,obj['errors']
                else
                        messages = []
                        obj['errors'].each{|errors|
                                messages << errors['message']
                        }
                        raise RTwitterException,messages.join("\n")
                end
        end
        return obj
end
escape(value) click to toggle source
# File lib/RTwitter.rb, line 170
def escape(value)

        URI.escape(value.to_s,/[^a-zA-Z0-9\-\.\_\~]/)

end
get_request(url,body,header) click to toggle source
# File lib/RTwitter.rb, line 191
def get_request(url,body,header)

        uri = URI.parse(url)
        https = Net::HTTP.new(uri.host, uri.port)
        if uri.port == 443
                https.use_ssl = true
                https.verify_mode = OpenSSL::SSL::VERIFY_NONE
        end
        response = https.start{|https|
                https.get(uri.request_uri + '?' + body, header)
        }
        return response

end
oauth() click to toggle source
# File lib/RTwitter.rb, line 129
def oauth
        {
                'oauth_consumer_key'     => @consumer_key,
                'oauth_signature_method' => 'HMAC-SHA1',
                'oauth_timestamp'        => Time.now.to_i.to_s,
                'oauth_version'          => '1.0',
                'oauth_nonce'            => Random.new_seed.to_s,
                'oauth_token'            => @access_token
        }
end
post_request(url,body,header) click to toggle source
# File lib/RTwitter.rb, line 176
def post_request(url,body,header)

        uri = URI.parse(url)
        https = Net::HTTP.new(uri.host, uri.port)
        if uri.port == 443
                https.use_ssl = true
                https.verify_mode = OpenSSL::SSL::VERIFY_NONE
        end
        response = https.start{|https|
                https.post(uri.request_uri,body,header)
        }
        return response

end
signature(method,url,additional_params) click to toggle source
# File lib/RTwitter.rb, line 117
def signature(method,url,additional_params)
        oauth_params = oauth
        base_params = oauth_params.merge(additional_params)
        base_params = Hash[base_params.sort]
        query = build_query(base_params)
        base = method + '&' + escape(url) + '&' + escape(query)
        key = @consumer_key_secret + '&' +  @access_token_secret
        oauth_params['oauth_signature'] = Base64.encode64(OpenSSL::HMAC.digest("sha1",key, base)).chomp
        header = {'Authorization' => 'OAuth ' + build_header(oauth_params),'User-Agent' => @userAgent}
        return header
end
streaming_request(url,body,header) { |chunk| ... } click to toggle source
# File lib/RTwitter.rb, line 206
def streaming_request(url,body,header)

        uri = URI.parse(url)
        https = Net::HTTP.new(uri.host, uri.port)
        if uri.port == 443
                https.use_ssl = true
                https.verify_mode = OpenSSL::SSL::VERIFY_NONE
        end
        request = Net::HTTP::Get.new(uri.request_uri + '?' + body,header)
        https.request(request){|response|
                response.read_body{|chunk|
                        yield chunk
                }
        }

end
url(endpoint) click to toggle source
# File lib/RTwitter.rb, line 223
def url(endpoint)
        if /^https:/ =~ endpoint 
                return endpoint 
        end
        list = {
                'media/upload'    => 'https://upload.twitter.com/1.1/media/upload.json',
                'statuses/filter' => 'https://stream.twitter.com/1.1/statuses/filter.json',
                'statuses/sample' => 'https://stream.twitter.com/1.1/statuses/sample.json',
                'user'            => 'https://userstream.twitter.com/1.1/user.json',
                'site'            => 'https://sitestream.twitter.com/1.1/site.json'
        }
        if list.include?(endpoint)
                return list[endpoint]
        else
                return "https://api.twitter.com/1.1/#{endpoint}.json"
        end

end