2011-01-04 5 views
5

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

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>

Тем не менее, я могу получить имя пользователя из твиттер аккаунта.

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

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 

Что я делаю неправильно?

ответ

3

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

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

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

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

Это не сработает, поскольку httpauth больше не доступен. Кроме того, у меня уже есть куки. –