rubytwitteroauthtyphoeus

OAuth error in using twitter API v2 for posting a tweet


Now I took a sample code of Twitter v2 API from this link. This sample code shows how OAuth and twitter v2 API work for positng a tweet. It works fine with my consumer key and consumer secret.

And I want to simplify the code like below. It assumes that the access token and access token secret are already known and it skips the process of user's approval, like providing the URL that provides PIN.

require 'typhoeus'
require 'json'

consumer_key = CONSUMER_KEY
consumer_secret = CONSUMER_SECRET
token = ACCESS_TOKEN
token_secret = ACCESS_TOKEN_SECRET

consumer = OAuth::Consumer.new(consumer_key, consumer_secret, :site => 'https://api.twitter.com')

options = {
  :method => :post,
  headers: {
    "User-Agent": "v2CreateTweetRuby",
    "content-type": "application/json"
  },
  body: JSON.dump("Hello, world!")
}
create_tweet_url = "https://api.twitter.com/2/tweets"
request = Typhoeus::Request.new(create_tweet_url, options)

access_token = OAuth::Token.new(token, token_secret)
oauth_params = {:consumer => consumer, :token => access_token}

oauth_helper = OAuth::Client::Helper.new(request, oauth_params.merge(:request_uri => create_tweet_url))

request.options[:headers].merge!({"Authorization" => oauth_helper.header}) # Signs the request
response = request.run
puts response

Then, I see the below error message.

ruby test_tweet.rb
/usr/local/lib/ruby/gems/3.1.0/gems/oauth-0.5.10/lib/oauth/request_proxy.rb:18:in `proxy': Typhoeus::Request (OAuth::RequestProxy::UnknownRequestType)
    from /usr/local/lib/ruby/gems/3.1.0/gems/oauth-0.5.10/lib/oauth/signature.rb:12:in `build'
    from /usr/local/lib/ruby/gems/3.1.0/gems/oauth-0.5.10/lib/oauth/signature.rb:23:in `sign'
    from /usr/local/lib/ruby/gems/3.1.0/gems/oauth-0.5.10/lib/oauth/client/helper.rb:49:in `signature'
    from /usr/local/lib/ruby/gems/3.1.0/gems/oauth-0.5.10/lib/oauth/client/helper.rb:82:in `header'
    from test_tweet.rb:28:in `<main>'

When I used irb and tried step by step, this error happens at oauth_helper.header. As this is the first time to use OAuth API, I may be making some easy mistakes. Does anybody find anything wrong in my code?

I confirmed that my access token and access token secret work at https://web.postman.co/.

Thanks.


Solution

  • You need to insert

    require 'oauth/request_proxy/typhoeus_request'

    and your code may complete task you desire. Other lines looks good to me!


    In oauth/request_proxy.rb, oauth library check class of request object.

    https://github.com/oauth-xx/oauth-ruby/blob/master/lib/oauth/request_proxy.rb

    return request if request.is_a?(OAuth::RequestProxy::Base)
    
    klass = available_proxies[request.class]
    
    # Search for possible superclass matches.
    if klass.nil?
      request_parent = available_proxies.keys.find { |rc| request.is_a?(rc) }
      klass = available_proxies[request_parent]
    end
    
    raise UnknownRequestType, request.class.to_s unless klass
    

    By requiring 'oauth/request_proxy/typhoeus_request', Typhoeus::Request inherits OAuth::RequestProxy::Base and raising UnknownRequestType error can be avoided.

    https://github.com/oauth-xx/oauth-ruby/blob/master/lib/oauth/request_proxy/typhoeus_request.rb