Код 32 Публикация твита через API твиттера, только с помощью Needle
Я пытаюсь публиковать твиты через twitter API, используя Needle для выполнения POST-запроса, и получаю сообщение об ошибке 32: Не удалось аутентифицировать вас.
Я использую oauth-1.0a для формирования данных авторизации. Я работал над кодом примера, который они дают , который использует Request (теперь устаревший / больше не обновляется) вместо Needle. Я знаю, что мои ключи/токены в порядке, потому что я могу нормально публиковать сообщения с помощью библиотеки запросов, я просто хочу делать это с помощью Needle, так что, очевидно, что-то неправильно сформировано. Вместо того, чтобы просто делать то, что работает, я использую это как возможность обучения.
Вот мой запрос на иглу:
const oauth = OAuth({
consumer: {
key: the_key,
secret: the_secret,
},
signature_method: "HMAC-SHA1",
hash_function(base_string, key) {
return crypto.createHmac("sha1", key).update(base_string).digest("base64");
},
});
const request_data = {
url: "https://api.twitter.com/1.1/statuses/update.json",
method: "POST",
data: { status: "this is th best test tweet i've ever written" },
};
let options = {
headers: {
Authorization: oauth.toHeader(oauth.authorize(request_data, token))
.Authorization,
},
};
// Weird indent here, sumarrizing, sorry
needle(request_data.method, request_data.url, request_data.data, options)
.then((resp) => {
// console.log(Object.keys(resp.req));
console.log(resp.req._header);
if (resp.statusCode == 200) {
console.log(`Tweet posted at ${resp.body.created_at}`);
} else {
let err = resp.body.errors[0];
console.log(`Got code "${err.code}, ${err.message}" from twitter`);
}
})
.catch(async (err) => {
console.log(
`Got ${err} from twitter request, waiting ${
reconnectDelay / 1000
} seconds and trying again...`
);
await sleep(reconnectDelay);
reconnectDelay *= 2;
postTweet();
});
где request_data.data
{status: "this is a status that gets updated"}
Взглянув на заголовки, которые я отправил из Needle, я получаю:
POST /1.1/statuses/update.json HTTP/1.1
accept: */*
user-agent: Needle/2.5.2 (Node.js v12.18.3; win32 x64)
authorization: OAuth oauth_consumer_key="XXX", oauth_nonce="XXX", oauth_signature="XXX", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1609292426", oauth_token="XXX", oauth_version="1.0"
content-length: 67
content-type: application/x-www-form-urlencoded
host: api.twitter.com
Connection: close
Заголовки выглядят абсолютно правильно? Вот как в документации твиттера говорится, что заголовок должен выглядеть .
Опять же, я знаю, что мои токены верны, потому что это отлично работает с:
request(
{
url: request_data.url,
method: request_data.method,
form: oauth.authorize(request_data, token),
},
function(error, response, body) {
if (error) console.log(error)
console.log(Object.keys(response.request))
console.log(response.request.body)
// console.log(response.req)
}
)
Я пытался реформировать запрос Needle несколькими способами, и это действительно сводит меня с ума, поэтому любая помощь будет оценена по достоинству! Спасибо.