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.