Код 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 несколькими способами, и это действительно сводит меня с ума, поэтому любая помощь будет оценена по достоинству! Спасибо.

0 ответов

Другие вопросы по тегам