API Twitter через OmniAuth на Rails 3, Net :: HTTPUnauthorized ад - PullRequest
5 голосов
/ 04 января 2011

Я следовал учебному пособию Simple OmniAuth (http://asciicasts.com/episodes/241-simple-omniauth),) и могу войти в систему с помощью своей учетной записи Twitter в службе. Теперь я хочу получить доступ к Twitter API и твитнуть из приложения. Мой код выглядит следующим образом:

class TwitterController < ApplicationController

def prepare_access_token(oauth_token, oauth_token_secret)
consumer = OAuth::Consumer.new("KEY", "SECRET",
    {
        :site => "http://api.twitter.com"
    })
    # now create the access token object from passed values
    token_hash =
    {
      :oauth_token => oauth_token,
      :oauth_token_secret => oauth_token_secret
    }
    access_token = OAuth::AccessToken.from_hash(consumer, token_hash)
    return access_token
end

def tweet
    # Exchange our oauth_token and oauth_token secret for the AccessToken instance.
    @access_token = prepare_access_token(current_user.token, current_user.secret)

    @response = @access_token.request(:post, "http://api.twitter.com/1/statuses/update.json", :status => "Tweet pela API")

    render :html => @response.body
end

end

Строка рендеринга ничего не делает. Кроме того, если я добавлю

<p><%= @response %></p>

на мой взгляд, я получаю

#<Net::HTTPUnauthorized:0x2ac5149e94f0>

Тем не менее, я могу получить имя пользователя из учетной записи Twitter.

Моя пользовательская модель выглядит следующим образом:

class User < ActiveRecord::Base
def self.create_with_omniauth(auth)  
       create! do |user|  
         user.provider = auth["provider"]  
         user.uid = auth["uid"]  
         user.name = auth["user_info"]["name"] 
         user.token = auth['credentials']['token'],
         user.secret = auth['credentials']['secret'] 
       end  
    end  
 end

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Я понял проблему и теперь чувствую себя довольно глупо.На пользовательской модели была запятая, которой там быть не должно.Модель должна быть

class User < ActiveRecord::Base
    def self.create_with_omniauth(auth)  
       create! do |user|  
         user.provider = auth["provider"]  
         user.uid = auth["uid"]  
         user.name = auth["user_info"]["name"] 
         user.token = auth['credentials']['token']
         user.secret = auth['credentials']['secret'] 
       end  
    end  
end

И теперь все отлично работает.

2 голосов
/ 05 января 2011

Вместо того, чтобы кодировать это вручную. Вы можете попробовать использовать gem twitter (gem install twitter.) Работает для нас. Синтаксис:

httpauth = Twitter::HTTPAuth.new(twitterName, twitterPass)
client = Twitter::Base.new(httpauth)
client.update(yourTweetText)
...