Skip to content

Instantly share code, notes, and snippets.

@nana4gonta
Created November 22, 2011 15:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nana4gonta/1385914 to your computer and use it in GitHub Desktop.
Save nana4gonta/1385914 to your computer and use it in GitHub Desktop.
RubyでTwitter OAuth
require 'openssl'
require 'uri'
require 'net/http'
require 'rubygems'
require 'twitter'
class OAuthAccessToken
def initialize(consumer_key, consumer_secret)
@request_token_uri = 'http://twitter.com/oauth/request_token'
@access_token_uri = 'http://twitter.com/oauth/access_token'
@authorize_uri = 'http://api.twitter.com/oauth/authorize'
@consumer_secret = consumer_secret
@token = ''
@token_secret = ''
# oauthのヘッダ
@header = {
'oauth_consumer_key' => consumer_key,
'oauth_nonce' => 'ABCDEFG',
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => Time.now.to_i.to_s,
'oauth_version' => '1.0'
}
create_signature(@request_token_uri)
get_request_token
get_pincode unless @token == ''
end
def get_access_token
uri = URI.parse(@access_token_uri)
http = Net::HTTP.new(uri.host)
http.start do |h|
create_signature(@access_token_uri, @token_secret)
response = h.get("#{uri.path}?#{concat_header}")
if response.code == '200'
parse_response(response.body)
else
puts response.code
puts response.body
puts "error"
end
end
end
private
def escape (value)
URI.escape(value, /[^a-zA-Z0-9_\-\.]/)
end
# ヘッダの要素を連結
def concat_header
params = ''
@header.each do |key,value|
params += "#{key}=#{value}&"
end
params.chop
end
# シグニチャを作成
def create_signature(token_uri, access_token_secret = '')
# ヘッダのパラメータを連結して、HTTPメソッドとも連結
params = concat_header
value = "GET&#{escape(token_uri)}&#{escape(params)}"
# signature keyの作成
signature_key = "#{@consumer_secret}&#{access_token_secret}"
# hmac_sha1
sha1 = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, signature_key, value)
@header['oauth_signature'] = [sha1].pack('m').gsub(/\n/, '')
end
def get_request_token
uri = URI.parse(@request_token_uri)
http = Net::HTTP.new(uri.host)
http.start do |h|
response = h.get("#{uri.path}?#{concat_header}")
if response.code == '200'
tokens = parse_response(response.body)
@token = tokens['oauth_token']
@token_secret = tokens['oauth_token_secret']
@header['oauth_token'] = @token
else
p response.code
end
end
end
def get_pincode
authorize_uri = "#{@authorize_uri}?oauth_token=#{@token}"
system('open', authorize_uri) || puts("Access here: #{authorize_uri}\nand...")
print 'input PIN Code: '
@header['oauth_verifier'] = $stdin.gets.strip.chomp
end
# レスポンスのボディをパース
def parse_response(body)
params = { }
body.split('&').each do |param|
token = param.split('=')
params[token[0]] = token[1]
end
params
end
end
if ARGV[0] && ARGV[1]
consumer_key = ARGV[0]
consumer_secret = ARGV[1]
else
consumer_key = $stdin.gets.chomp
consumer_secret = $stdin.gets.chomp
end
tokens = OAuthAccessToken.new(consumer_key, consumer_secret).get_access_token
if tokens.class == Hash
Twitter.configure do |config|
config.consumer_key = consumer_key
config.consumer_secret = consumer_secret
config.oauth_token = access_token
config.oauth_token_secret = access_token_secret
end
Twitter.home_timeline.first.text
else
puts "Error: cannot get 'access_token' and 'access_token_secret'"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment