Skip to content

Instantly share code, notes, and snippets.

@manse
Created November 27, 2014 15:07
Show Gist options
  • Save manse/bd0f119d25cebfd2df53 to your computer and use it in GitHub Desktop.
Save manse/bd0f119d25cebfd2df53 to your computer and use it in GitHub Desktop.
RubyでTwitterにOAuthする割りかし短めのコード
class OAuth
attr_reader :screen_name, :consumer_key, :consumer_secret, :token, :token_secret
def initialize(screen_name, consumer_key, consumer_secret, token, token_secret)
@screen_name = screen_name
@consumer_key = consumer_key
@consumer_secret = consumer_secret
@token = token
@token_secret = token_secret
end
def post(url, param = {})
request(url, :POST, param)
end
def get(url, param = {})
request(url, :GET, param)
end
def request(url, method, param = {})
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
param = generate_param(url, method.to_s.upcase, param)
case method
when :POST
data = http.post(uri.path, build_query(param)).body
when :GET
data = http.get("#{uri.path}?#{build_query(param)}").body
else
return
end
data = JSON.parse(data, symbolize_names: true)
raise data[:errors][0][:message] if data.include?(:errors)
data
end
def default_param
{
oauth_consumer_key: @consumer_key,
oauth_nonce: [*'A'..'Z'].sample(16).join(''),
oauth_signature_method: 'HMAC-SHA1',
oauth_timestamp: Time.now.to_i,
oauth_token: @token,
oauth_version: '1.0'
}
end
def generate_param(url, method, param)
data = default_param.merge(param)
data[:oauth_signature] = generate_signature(url, method, data)
data.sort
end
def generate_signature(url, method, param)
value = param.sort.map{|key, val| "#{key}=#{encode(val.to_s)}"}.join('&')
value = "#{method}&#{encode(url)}&#{encode(value)}"
value = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, "#{@consumer_secret}&#{@token_secret}", value)
[value].pack('m').gsub(/\n/, '')
end
def build_query(data)
data.map{|key, val| "#{key.to_s}=#{CGI.escape(val.to_s)}"}.join('&')
end
def encode(str)
CGI.escape(str).gsub('%7E', '~').gsub('+', '%20')
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment