TwitterOAuth无法验证我的Python命令行工具

TwitterOAuth无法验证我的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.cho

我在挫折中度过了数小时,现在我有了这样一个问题:

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 + 
        "&oauth_nonce=" + OAUTH_NONCE + "&oauth_signature_method=" + 
        OAUTH_SIGNATURE_METHOD + "&oauth_timestamp=" + OAUTH_TIMESTAMP + 
        "&oauth_version=" + OAUTH_VERSION)
request_tokenSigBaseString = ("POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&" +
        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
到目前为止,它应该返回一个请求令牌,这样我就可以让我的用户访问PIN网站,这样我就可以获得访问令牌。但我刚刚从Twitter上得到“验证oauth签名和令牌失败”

一个可能的原因是错误的URL编码。我发现Twitter需要RFC3986编码。在Python中有没有实现这一点的方法?如果是,我是否应该仅在当前使用urllib.quote的两个位置执行此操作?我的oauth_签名生成正确吗


非常复杂。

根据我在perl中实现它时的记忆,文档实际上非常明确。您是否检查了他们使用的输入是否相同,您是否得到了相同的签名和请求?请注意一个要点:
urllib.quote
可能无法仅转义它们希望您转义的字符:还有用于OAuth的Python库: