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.