#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-parameters2. Также существуют библиотеки Python для OAuth: oauth.net/code