Aquí está mi código, estoy tratando de hacer un bot de Twitter con IA usando la API de Twitter y Firebase:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); const dbRef = admin.firestore().doc('tokens/cvstate'); const dbRef2 = admin.firestore().doc('tokens/access') const TwitterApi = require('twitter-api-v2').default; const twitterClient = new TwitterApi({ clientId: 'MY_ID', clientSecret: 'MY_SECRET', }); const callbackURL = 'MY CALLBACK URL'; const { Configuration, OpenAIApi } = require('openai'); const configuration = new Configuration({ organization: 'MY ORG', apiKey: 'MY KEY', }); const openai = new OpenAIApi(configuration); exports.auth = functions.https.onRequest(async (request, response) => { const { url, codeVerifier, state } = twitterClient.generateOAuth2AuthLink( callbackURL, { scope: ['tweet.read', 'tweet.write', 'users.read', 'offline.access'] } ); await dbRef.set({ codeVerifier, state }); response.redirect(url); }); exports.callback = functions.https.onRequest(async (request, response) => { const { state, code } = request.query; const dbSnapshot = await dbRef.get(); const { codeVerifier, state: storedState } = dbSnapshot.data(); if (state !== storedState) { return response.status(400).send('Stored tokens not match.'); } const { client: loggedClient, accessToken, refreshToken, } = await twitterClient.loginWithOAuth2({ code, codeVerifier, redirectUri: callbackURL, }); await dbRef2.set({ accessToken, refreshToken }); const { data } = await loggedClient.v2.me(); response.send(data); }); exports.newTweet = functions.https.onRequest(async (request, response) => { const { refreshToken } = (await dbRef2.get()).data(); const { client: refreshedClient, accessToken, refreshToken: newRefreshToken, } = await twitterClient.refreshOAuth2Token(refreshToken); await dbRef2.set({ accessToken, refreshToken: newRefreshToken }); const newTweet = await openai.createCompletion('text-davinci-001', { prompt: 'tweet something political', max_tokens: 64, }); const { data } = await refreshedClient.v2.tweet( newTweet.data.choices[0].text ); response.send(data); });Los comandos de autenticación y devolución de llamada funcionan; sin embargo, cuando ejecuto el comando de autenticación, aparece el siguiente mensaje de error:
Error: la solicitud falló con el código de estado 401 en createError (/home/cog9/TwitterBot/functions/node_modules/axios/lib/core/createError.js:16:15) en la liquidación (/home/cog9/TwitterBot/functions/node_modules/ axios/lib/core/settle.js:17:12) en IncomingMessage.handleStreamEnd (/home/cog9/TwitterBot/functions/node_modules/axios/lib/adapters/http.js:322:11) en IncomingMessage.emit (nodo :events:402:35) en endReadableNT (nodo:internal/streams/readable:1343:12) en processTicksAndRejections (nodo:internal/process/task_queues:83:21)