Estoy tratando de convertir una aplicación de Python que hice hace algunos años en una (mejor) implementación de NodeJS. La función en cuestión obtiene un token de acceso de la API de Twitter para adjuntarlo a futuras solicitudes, pero mi implementación devuelve 403 solicitud incorrecta. Aquí hay una implementación funcional de Python.
def get_bearer_header(): uri_token_endpoint = 'https://api.twitter.com/oauth2/token' key_secret = f"{twitter_creds.CONSUMER_KEY}:{twitter_creds.CONSUMER_KEY_SECRET}".encode('ascii') b64_encoded_key = base64.b64encode(key_secret) b64_encoded_key = b64_encoded_key.decode('ascii') auth_headers = { 'Authorization': 'Basic {}'.format(b64_encoded_key), 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } auth_data = { 'grant_type': 'client_credentials' } auth_resp = requests.post(uri_token_endpoint, headers=auth_headers, data=auth_data) bearer_token = auth_resp.json()['access_token'] bearer_header = { 'Accept-Encoding': 'gzip', 'Authorization': 'Bearer {}'.format(bearer_token), 'oauth_consumer_key': twitter_creds.CONSUMER_KEY } return bearer_headery aquí está la implementación de JS hasta ahora ...
export const getBearerHeader = async () => { const keyAndSecret = btoa(`${config.twitterApi.consumerKey}:${config.twitterApi.consumerKeySecret}`) const buff = Buffer.from(keyAndSecret, 'utf-8'); const b64KeyAndSecret = buff.toString('base64'); const body = new URLSearchParams({ 'grant_type': 'client_credentials' }) const url = config.twitterApi.oauthTokenEndpoint const headers = { 'Authorization': `Basic ${b64KeyAndSecret}`, 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } const resp = await axios.post(url, body, headers) console.log("RESPONSE.data") console.log(resp.data) }la solicitud se ve bien según los documentos de Twitter, ¡pero mi respuesta dice 403!
¡Cualquier ayuda apreciada!
Obtenga el token de acceso de Twitter v2 por código python y node.js.
Para crear una clave API y un secreto desde el portal de desarrolladores de Twitter
Idea principal para usar curl commend para obtener token de acceso. POST oauth2/token
Usando el archivo config.json
{ "API_KEY" : "Xx7MxxxxxTkzxxxxxq9xxxxxQ", "API_KEY_SECRET" : "om4QxxxxxPrcPlxxxxxFikDxxxxxoC5mQxxxxxLy7M17xxxxxK" }Código Node.js
const axios = require('axios') const config = require('./config.json'); const getAccessToken = async () => { try { const resp = await axios.post( 'https://api.twitter.com/oauth2/token', '', { params: { 'grant_type': 'client_credentials' }, auth: { username: config.API_KEY, password: config.API_KEY_SECRET } } ); console.log(resp.data); } catch (err) { // Handle Error Here console.error(err); } }; getAccessToken();código pitón
import requests import json import ast def get_access_token(): with open('config.json') as config_file: data = json.load(config_file) params = { 'grant_type': 'client_credentials', } response = requests.post('https://api.twitter.com/oauth2/token', params=params, auth=(data['API_KEY'], data['API_KEY_SECRET'])) print(response.content) json_data = ast.literal_eval(response.content.decode("UTF-8")) return json_data['access_token'] print(get_access_token())