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