Pobieranie tokena żądania z interfejsu API Twittera za pomocą Pythona 3

Próbuję użyć Pythona 3 do łączenia się z interfejsem API Twittera, aby zwrócić link do strony, która daje mi numer PIN do użycia do żądania tokenów dostępu. Jak wyszczególniono tutaj:https://dev.twitter.com/docs/auth/pin-based-authorization

Interfejs API Twittera odpowiada mi, mówiąc mi, że nie autoryzowałem poprawnie żądania POST, zwracając 401. Najlepiej zgaduję, dlaczego nie koduję poprawnie podpisu HMAC w base64. Wszystko, co generuje inna część żądania POST, wydaje się poprawne na podstawie próbek poprawnych żądań POST, które przeglądałem.

Spędziłem kilka dni pracując nad tym i mam nadzieję, że ktoś może mi pomóc w pokonaniu ostatniej części.

Oto najważniejsze części dokumentów API Twittera:https://dev.twitter.com/docs/api/1/post/oauth/request_token

https://dev.twitter.com/docs/auth/authorizing-request

To jest kod, którego używam:

<code>import urllib.parse, urllib.request, json
from hashlib import sha1
import hmac
import binascii
import time
import random
import sys

#Server Links
REQUEST_URL = "https://api.twitter.com/oauth/request_token";
ACCESS_URL = "https://api.twitter.com/oauth/access_token";
AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize";

#Consumer keys
TOKEN = "Omitted"
TOKEN_SECRET = "Omitted"

#Access keys
ACCESS_TOKEN = ""
ACCESS_TOKEN_SECRET = ""

TWEET = ""

count = 1

while len(sys.argv) > count:
    TWEET += sys.argv[count] + " "
    count += 1

TWEET = TWEET[:-1] #Get rid of trailing space

print(TWEET + "\n")

#Build content header for POST to return request tokens

HEADER_TITLE = "Authorization:"

#Consumer key
HEADER = 'OAuth oauth_callback="oob" oauth_consumer_key="' + TOKEN + '", '

#Nonce
HEADER += 'oauth_nonce="'
NONCE = ""
for i in range(32):
    NONCE += chr(random.randint(97, 122))
HEADER += NONCE
HEADER += '", '

#Timestamp
TIMESTAMP = str(int(time.time()))

#Signature
HEADER += 'oauth_signature="'
PARAMETER_STRING = "include_entities=true&oauth_consumer_key=" + TOKEN + "&oauth_nonce=" + NONCE + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + TIMESTAMP + "&oauth_version=1.0"
BASE_STRING = 'POST&' + urllib.parse.quote(REQUEST_URL, '') + '&' + urllib.parse.quote(PARAMETER_STRING, '')
SIGNING_KEY = urllib.parse.quote(TOKEN_SECRET, '') + '&'
print("DEBUG : SIGNING KEY " + SIGNING_KEY + " BASE STRING " + BASE_STRING + "\n")
HEADER += str(binascii.b2a_base64(hmac.new(BASE_STRING.encode(), SIGNING_KEY.encode(), sha1).digest()[:-1]))#Note to self, we may not want to remove the last character...
HEADER += '", '

#Signature Method
HEADER += 'oauth_signature_method="HMAC-SHA1", '

#Timestamp
HEADER += 'oauth_timestamp="' + TIMESTAMP + '", '

#Version
HEADER += 'oauth_version="1.0"'

print(HEADER_TITLE + "\n" + HEADER)

print(urllib.request.urlopen(urllib.request.Request(REQUEST_URL, bytes(HEADER_TITLE+HEADER, 'utf-8'))).read())
</code>

Na koniec chciałbym zauważyć, że jestem świadomy istnienia modułów Python OAuth i Twitter, które pomagają w tym rozwoju. Jednak jako doświadczenie uczenia się wybieram ich nieużywanie.

Z góry dziękuję za poświęcony czas i pomoc.

questionAnswers(2)

yourAnswerToTheQuestion