首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Twitter 1.0a适用于Twitter v1.1,但不适用于v2

Twitter 1.0a适用于Twitter v1.1,但不适用于v2
EN

Stack Overflow用户
提问于 2021-07-11 01:12:48
回答 1查看 197关注 0票数 0

我使用found这个函数来生成oauth-1.0a报头:

代码语言:javascript
复制
// auth.js

const crypto = require("crypto");
const OAuth1a = require("oauth-1.0a");

function auth(request) {
  const oauth = new OAuth1a({
    consumer: {
      key: process.env.TWITTER_API_KEY,
      secret: process.env.TWITTER_API_SECRET_KEY,
    },
    signature_method: "HMAC-SHA1",
    hash_function(baseString, key) {
      return crypto.createHmac("sha1", key).update(baseString).digest("base64");
    },
  });

  const authorization = oauth.authorize(request, {
    key: process.env.TWITTER_ACCESS_TOKEN,
    secret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
  });

  return oauth.toHeader(authorization).Authorization;
}

module.exports = auth;

如果我在Twitter API v1.1上试用它,它工作得很好:

代码语言:javascript
复制
// v1.js

require("dotenv").config();
const axios = require("axios");
const auth = require("./auth");

const url = "https://api.twitter.com/1.1/favorites/create.json";
const method = "POST";
const params = new URLSearchParams({
  id: "1397568983931392004",
});

axios
  .post(url, undefined, {
    params,
    headers: {
      authorization: auth({
        method,
        url: `${url}?${params}`,
      }),
    },
  })
  .then((data) => {
    return console.log(data);
  })
  .catch((err) => {
    if (err.response) {
      return console.log(err.response);
    }
    console.log(err);
  });

但如果我尝试使用Twitter API v2:

代码语言:javascript
复制
// v2.js

require("dotenv").config();
const axios = require("axios");
const auth = require("./auth");

const url = `https://api.twitter.com/2/users/${process.env.TWITTER_USER_ID}/likes`;
const method = "POST";
const data = {
  tweet_id: "1397568983931392004",
};

axios
  .post(url, data, {
    headers: {
      authorization: auth({
        method,
        url,
        data,
      }),
    },
  })
  .then((data) => {
    return console.log(data);
  })
  .catch((err) => {
    if (err.response) {
      return console.log(err.response);
    }
    console.log(err);
  });

它会失败,错误为:

代码语言:javascript
复制
{
  title: 'Unauthorized',
  type: 'about:blank',
  status: 401,
  detail: 'Unauthorized'
}

我尝试按照建议的here对请求的正文进行编码,但得到了相同的错误:

代码语言:javascript
复制
require("dotenv").config();
const axios = require("axios");
const auth = require("./auth");
const querystring = require("querystring");

const url = `https://api.twitter.com/2/users/${process.env.TWITTER_USER_ID}/likes`;
const method = "POST";
const data = percentEncode(
  querystring.stringify({
    tweet_id: "1397568983931392004",
  })
);

function percentEncode(string) {
  return string
    .replace(/!/g, "%21")
    .replace(/\*/g, "%2A")
    .replace(/'/g, "%27")
    .replace(/\(/g, "%28")
    .replace(/\)/g, "%29");
}

axios
  .post(url, data, {
    headers: {
      "content-type": "application/json",
      authorization: auth({
        method,
        url,
        data,
      }),
    },
  })
  .then((data) => {
    return console.log(data);
  })
  .catch((err) => {
    if (err.response) {
      return console.log(err.response);
    }
    console.log(err);
  });

如果使用Postman进行测试,则两个端点(1.1和2)使用相同的凭据都可以正常工作。

关于我在使用v2时做错了什么,或者如何让它与Twitter API v2一起工作,有什么想法吗?

我怀疑这与请求的主体有关,因为这是两个请求之间的主要区别,但无法使其工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-11 20:55:55

弄清楚,在生成authorization header时不应该包含请求的正文:

代码语言:javascript
复制
require("dotenv").config();
const axios = require("axios");
const auth = require("./auth");

const url = `https://api.twitter.com/2/users/${process.env.TWITTER_USER_ID}/likes`;
const method = "POST";
const data = {
  tweet_id: "1397568983931392004",
};

axios
  .post(url, data, {
    headers: {
      authorization: auth({
        method,
        url,
      }),
    },
  })
  .then((data) => {
    return console.log(data);
  })
  .catch((err) => {
    if (err.response) {
      return console.log(err.response);
    }
    console.log(err);
  });

基本上,当向Twitter APIV1.1发出post请求时,应该对数据进行编码,应该使用它来生成授权头,并且post请求应该作为application/x-www-form-urlencoded发送。

当向Twitter API v2发出post请求时,不应该对数据进行编码,不应该在生成授权头时包含数据,并且必须以application/json的形式发送数据。

希望这能对其他人有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68329999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档