Recuperación de un token de solicitud de la API de Twitter con Python 3
Estoy intentando usar Python 3 para interactuar con la API de Twitter para devolver el enlace a una página que me da un número PIN para usar para solicitar tokens de acceso. Como se detalla aquí:https://dev.twitter.com/docs/auth/pin-based-authorization
La API de Twitter me responde diciéndome que no he autorizado correctamente mi solicitud POST devolviendo un 401. Mi mejor suposición es por qué no estoy codificando correctamente la firma HMAC en base64. Todo lo que forma parte de la solicitud POST que genero parece correcto según los ejemplos de solicitudes POST correctas que he examinado.
He pasado varios días trabajando en esto y espero que alguien pueda ayudarme a pasar la última parte.
Aquí están las partes más relevantes de los documentos de la API de Twitter:https://dev.twitter.com/docs/api/1/post/oauth/request_token
https://dev.twitter.com/docs/auth/authorizing-request
Este es el código que estoy usando:
<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>
Finalmente, me gustaría señalar que estoy al tanto de la existencia de los módulos Python OAuth y Twitter que ayudan en el desarrollo para esto. Sin embargo, como experiencia de aprendizaje, elijo no usarlos.
Muchas gracias de antemano por su tiempo y asistencia.