Abrufen eines Anforderungstokens von der Twitter-API mit Python 3

Ich versuche, mit Python 3 eine Schnittstelle mit der Twitter-API herzustellen, um den Link für eine Seite zurückzugeben, auf der ich eine PIN-Nummer zum Anfordern von Zugriffstoken erhalte. Wie hier detailliert:https://dev.twitter.com/docs/auth/pin-based-authorization

Die API von Twitter antwortet mir mit der Meldung, dass ich meine POST-Anfrage nicht ordnungsgemäß autorisiert habe, indem ich einen 401 zurücksende. Ich rate nach bestem Wissen, warum ich die HMAC-Signatur in base64 nicht richtig codiere. Alles andere in der POST-Anfrage, die ich erstelle, wird korrekt angezeigt, basierend auf Beispielen der korrekten POST-Anfragen, die ich angeschaut habe.

Ich habe mehrere Tage damit verbracht und hoffe, dass jemand mir helfen kann, den letzten Teil hinter mich zu bringen.

Hier sind die wichtigsten Teile der Twitter API-Dokumente:https://dev.twitter.com/docs/api/1/post/oauth/request_token

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

Dies ist der Code, den ich benutze:

<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>

Abschließend möchte ich darauf hinweisen, dass mir die Existenz von Python OAuth- und Twitter-Modulen bekannt ist, die bei der Entwicklung hierfür hilfreich sind. Als Lernerfahrung entscheide ich mich jedoch, sie nicht zu verwenden.

Vielen Dank im Voraus für Ihre Zeit und Unterstützung.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage