module OauthTwitter::Helper

Constants

HOST

Twitter API root url

Public Instance Methods

send_request(method, path, original_query, oauth=true, options={}) click to toggle source

Package data and send oauth request

oauth = true : true - include oauth token

false - do not include oauth token
[false, {hash}] - include additional params

options = {} : :detailed => fasle - return false if request failed,

otherwise return just data

# File lib/oauth_twitter/helper.rb, line 24
def send_request(method, path, original_query, oauth=true, options={})
  # generate signing key
  signing_key_array = [ Config.consumer_secret ]

  # generate oauth params
  if !!oauth === oauth # boolean
    oauth_params = generate_oauth_params(oauth)
    signing_key_array.push((oauth ? self.oauth_token_secret : '' ))
  else
    oauth_params = generate_oauth_params(oauth[0], oauth[1])
    signing_key_array.push((oauth[0] ? self.oauth_token_secret : '' ))
  end

  # filter out value == nil
  query = original_query.select {|key, value| !value.nil?}

  # generate base string
  base_array = [ method.to_s.upcase, URI.encode_www_form_component(HOST + path), URI.encode_www_form_component(URI.encode_www_form((query ? oauth_params.merge(query) : oauth_params).sort)) ]

  # generate signature
  oauth_params[:oauth_signature] = sign(base_array, signing_key_array)

  # generate HTTP request
  uri = URI.parse(HOST + path)
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  if method.to_s.upcase === 'GET'
    uri.query = URI.encode_www_form(query) if query
    request = Net::HTTP::Get.new(uri.request_uri)
  elsif method.to_s.upcase === 'POST'
    request = Net::HTTP::Post.new(uri.request_uri)
    request.set_form_data(query) if query
  end
  request["Authorization"] = generate_oauth_header(oauth_params)

  # retrive response
  return parse_response(https.request(request), options)
end

Protected Instance Methods

assemble_multi_page_response(full_response, last_response, options={}) click to toggle source

Asseble multi page response


# File lib/oauth_twitter/helper.rb, line 132
def assemble_multi_page_response(full_response, last_response, options={})
  if options[:detailed] === false
    result = last_response[:valid] ? full_response : last_response[:data]
  else
    result = {
      :valid => last_response[:valid],
      :code  => last_response[:code],
      :data  => full_response
    }
    result[:message] = last_response[:data] unless last_response[:valid]
  end

  return result
end
generate_oauth_header(signed_oauth) click to toggle source

Generate header message for HTTP request


# File lib/oauth_twitter/helper.rb, line 98
def generate_oauth_header(signed_oauth)
  return "OAuth " << signed_oauth.map {|key, val| "#{key}=\"#{val}\""}.join(",")
end
generate_oauth_params(include_oauth_token=true, addional_oauth_params={}) click to toggle source

Generate oauth params


# File lib/oauth_twitter/helper.rb, line 72
def generate_oauth_params(include_oauth_token=true, addional_oauth_params={})
  oauth = {
    :oauth_consumer_key     => Config.consumer_key,
    :oauth_nonce            => SecureRandom.hex(21),
    :oauth_signature_method => "HMAC-SHA1",
    :oauth_timestamp        => Time.now.to_i,
    :oauth_version          => "1.0"
  }
  oauth[:oauth_token] = self.oauth_token if include_oauth_token === true
  return oauth.merge(addional_oauth_params)
end
parse_response(response, options={}) click to toggle source

Parse response for cleaner outputs


# File lib/oauth_twitter/helper.rb, line 106
def parse_response(response, options={})
  result = {}
  begin
    result[:data] = MultiJson.load(response.body)
  rescue MultiJson::LoadError
    begin
      result[:data] = Hash[URI.decode_www_form(response.body)]
    rescue ArgumentError
      result[:data] = response.body
    end
  end

  if options[:detailed] === false
    return result[:data] if response.code === '200'
    return nil
  else
    result[:valid] = response.code === '200' ? true : false
    result[:code] = response.code.to_i
    return result
  end
end
sign(base_array, signing_key_array) click to toggle source

Sign oauth params


# File lib/oauth_twitter/helper.rb, line 88
def sign(base_array, signing_key_array)
  hex_str = OpenSSL::HMAC.hexdigest( OpenSSL::Digest::Digest.new('sha1'), signing_key_array.join('&'), base_array.join('&') )
  binary_str = Base64.encode64( [hex_str].pack("H*") ).gsub(/\n/, "")
  return URI.encode_www_form_component(binary_str)
end