2016-05-20 4 views
0

Это мой первый опыт работы с API Twitter. Я использую следующие инструменты:401 несанкционирован из API Twitter с oauth gem в Ruby

  • рубинового 2.2.0p0 (2014-12-25 ревизии 49005) [x86_64 Линукс]
  • камня 'OAuth'

    • OAuth (0,5. 1)
    • oauth2 (1.1.0)
    • OmniAuth-oauth2 (1.4.0)

Я получил ключ и секрет от Twitter.

Я скопировал и вставил с example on Twitter для Ruby.

=begin 
code taken directly from the example at 
https://dev.twitter.com/oauth/overview/single-user 
=end 

require 'oauth' 
consumer_key, \ 
    consumer_secret = [ 
    'CONSUMER_KEY', 
    'CONSUMER_SECRET' 
].map { |key| ENV[key] } 
raise "Some key undefined." unless [consumer_key, consumer_secret].all? 

# Exchange your oauth_token and oauth_token_secret for an AccessToken instance. 
def prepare_access_token(oauth_token, oauth_token_secret) 
    consumer = OAuth::Consumer.new("APIKey", "APISecret", { :site => "https://api.twitter.com", :scheme => :header }) 

    # 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 

# Exchange our oauth_token and oauth_token secret for the AccessToken instance. 
access_token = prepare_access_token(consumer_key, consumer_secret) 
p access_token 

# use the access token as an agent to get the home timeline 
response = access_token.request(:get, "https://api.twitter.com/1.1/statuses/home_timeline.json") 
p response 

=begin 

|| #<OAuth::AccessToken:0x000000021ed938 
@token="redacted", @secret="redacted", 
@consumer=#<OAuth::Consumer:0x000000021edb68 
@key="APIKey", 
@secret="APISecret", @options={:signature_method=>"HMAC-SHA1", 
:request_token_path=>"/oauth/request_token", 
:authorize_path=>"/oauth/authorize", 
:access_token_path=>"/oauth/access_token", 
:proxy=>nil, :scheme=>:header, 
:http_method=>:post, :oauth_version=>"1.0", 
:site=>"https://api.twitter.com"}>, 
@params={:oauth_token=>"redacted", :oauth_token_secret=>"redacted"}> 
|| #<Net::HTTPUnauthorized 401 Authorization Required readbody=true> 
=end 

Что я пробовал:

  • Получение нового ключа и секрета.

    Результат:

    Net :: HTTPUnauthorized 401 Требуется авторизация readbody = истина

  • Синхронное время моего сервера, потому что много сообщений Stack Overflow упомянул, что 401 возвращается, если сервер времени выходит за пределы определенный момент. Я установил ntp.

  • предложения от this list

  • API Console Tool на Twitter. После аутентификации с моей учетной записи Twitter https://api.twitter.com/1.1/statuses/home_timeline.json возвращает

    HTTP/1.1 200 OK

    наряду с ожидаемыми данными.

  • проверяется на Twitter API operating normally

Предложения куда идти отсюда оценены.

UPDATEOAuth Tool on Twitter Developer возвращает ожидаемый результат с завитка исполнения:

curl --get 'https://api.twitter.com/1.1/statuses/home_timeline.json' --header 'Authorization: OAuth oauth_consumer_key="redacted", oauth_nonce="redacted", oauth_signature="redacted", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1463742270", oauth_token="redacted", oauth_version="1.0"' --verbose 

Ожидаемые данные возвращаются.

[{ "created_at": "Пт 20 мая 11:05:21 +0000 2016", "идентификатор": 733614584754515968, "id_str":
"733614584754515968", "Текст": "Три Навыки Каждый Новый программист должен Learn https: // т со/1p9AxO5JPg через @sitepointdotcom», "усеченный.": ложные, "субъекты": { "хештегов": [], "символы" (укороченные) ...

ответ

-1

На этой строке вы должны заменить «APIKey» и «APISecret» на то, что вы вытащили из переменных среды CONSUMER_ *.

consumer = OAuth::Consumer.new("APIKey", "APISecret", { :site => "https://api.twitter.com", :scheme => :header }) 

Пример кода из Twitter работает отлично для меня. Неправильные ключи потребителя дадут вам 401 точно.

+0

Спасибо! Слишком многое из этого было незнакомо мне, чтобы понять, что происходит. Я ценю помощь! – DMfll