Twitter OAuth не удается проверить мой инструмент командной строки Python

#python #twitter #oauth

#python #Twitter #oauth

Вопрос:

Я провел часы в отчаянии, и теперь у меня есть это:

 import requests, json, urllib
import time
import string, random

from hashlib import sha1
import hmac, binascii

def twitterIDGenerator(length):
    toRet = ""
    for i in range(0, length):
        toRet = toRet   random.choice(string.hexdigits)
    return toRet

def twitterSignatureGenerator(baseString, keyString):
    hashed = hmac.new(keyString, baseString, sha1)
    return binascii.b2a_base64(hashed.digest()).rstrip('n')

OAUTH_CONSUMER_KEY = ''
OAUTH_NONCE = twitterIDGenerator(32)
OAUTH_SIGNATURE_METHOD = 'HMAC-SHA1'
OAUTH_TIMESTAMP = str(int(time.time()))
OAUTH_VERSION = '1.0'

# Get request token from Twitter
request_tokenURL = 'https://api.twitter.com/oauth/request_token'

request_tokenParameterString = ("oauth_consumer_key="   OAUTH_CONSUMER_KEY   
        "amp;oauth_nonce="   OAUTH_NONCE   "amp;oauth_signature_method="   
        OAUTH_SIGNATURE_METHOD   "amp;oauth_timestamp="   OAUTH_TIMESTAMP   
        "amp;oauth_version="   OAUTH_VERSION)
request_tokenSigBaseString = ("POSTamp;https://api.twitter.com/oauth/request_tokenamp;"  
        urllib.quote(request_tokenParameterString))

request_tokenSignature = twitterSignatureGenerator(request_tokenSigBaseString, 
        '[REDACTED consumer secret key]')
request_tokenHeaders = {'oauth_nonce': OAUTH_NONCE,
                        'oauth_callback': 'oob',
                        'oauth_signature_method': OAUTH_SIGNATURE_METHOD,
                        'oauth_timestamp': OAUTH_TIMESTAMP,
                        'oauth_consumer_key': OAUTH_CONSUMER_KEY,
                        'oauth_signature': urllib.quote(request_tokenSignature),
                        'oauth_version': OAUTH_VERSION}

request_tokenResponse = requests.post(request_tokenURL, headers=request_tokenHeaders)
print request_tokenResponse.text
  

Пока что предполагается, что он возвращает request_token, чтобы я мог отправить моего пользователя на веб-сайт PIN, чтобы я мог получить access_token. Но я просто получаю «Не удалось проверить подпись и токен oauth» из Twitter.

Возможной причиной этого является неправильная кодировка URL. Я вижу, что Twitter нуждается в кодировке RFC3986. Есть ли способ сделать это на Python? Если да, должен ли я делать это только в двух местах, которые я в настоящее время использую urllib.quote? Правильно ли сгенерирован мой oauth_signature?

Документация раздражающе запутана.

Комментарии:

1. Из того, что я помню, когда я реализовывал его в perl, документация на самом деле довольно четкая. Вы проверили, что с теми же входными данными, которые они используют, вы получаете ту же подпись и запрос? Обратите внимание на важный момент: urllib.quote могут экранироваться не только те символы, которые они хотят, чтобы вы: dev.twitter.com/docs/auth/percent-encoding-parameters

2. Также существуют библиотеки Python для OAuth: oauth.net/code