javascript - Twitter API 返回“无效或过期的令牌”。
问题描述
我有一个简单的应用程序,它不使用很多包。所以我认为这将是试用 Deno 的绝佳机会,我确实需要的一个不是第三方模块的包是 Twitter API。我认为没问题,因为我不需要它包含的许多功能。我还不如自己写!
因此,我使用Twitter 文档中的这个文档编写了一个生成 Bearer 令牌的函数:
function getOAuthBearer(consumer_key, consumer_secret) {
const basic = Buffer.from(`${consumer_key}:${consumer_secret}`).toString('base64')
const options = {
url: 'https://api.twitter.com/oauth2/token',
method: 'POST',
headers: {
'Authorization': `Basic ${basic}`,
'Content-Type': `application/x-www-form-urlencoded;charset=UTF-8`
},
body: querystring.stringify({
'grant_type': 'client_credentials'
})
};
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) reject(error);
else resolve(JSON.parse(body).access_token);
});
});
}
哪个有效!我得到了我的不记名令牌,所以我编写了一个函数来user_timeline
从这个文档的请求示例中获取一些信息
function getUserTimeline(bearer_token) {
const options = {
url: 'https://api.twitter.com//1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi',
method: 'GET',
headers: {
'Authorization': 'Bearer ' + Buffer.from(bearer_token).toString('base64'),
}
}
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) reject(error);
else resolve(JSON.parse(body));
});
});
}
这会返回:
{ 错误:[ { 代码:89,消息:'无效或过期的令牌。' } ] }
这很奇怪,但我认为我可以使承载无效并请求一个新的承载,我为此编写了这个函数:
function invalideOAuthBearer(consumer_key, consumer_secret, bearer_token) {
const basic = Buffer.from(`${consumer_key}:${consumer_secret}`).toString('base64');
const options = {
url: 'https://api.twitter.com/oauth2/invalidate_token',
method: 'POST',
headers: {
'Authorization': `Basic ${basic}`,
'Content-Type': `application/x-www-form-urlencoded;charset=UTF-8`
},
body: querystring.stringify({
'access_token': bearer_token
})
};
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) reject(error);
else resolve(JSON.parse(body));
});
});
}
但这会返回:
{错误:[{代码:348,消息:'不允许客户端应用程序使此令牌无效。' } ] }
所以现在我有点卡住了,我尝试重新生成我的凭据,但这并没有多大作用。我在网上搜索,但只能找到人们说这是一个错误/基础设施问题的旧帖子,但由于有这么多应用程序使用 Twitter API,这对我来说似乎不太可能,当然,有些人只是建议使用像twitter这样的包,我愿意,但就像我说的 Deno 平台没有这样的包:(
解决方案
不记名令牌不应采用 base64 编码。尝试这个:
const options = {
url: 'https://api.twitter.com//1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi',
method: 'GET',
headers: {
'Authorization': `Bearer ${bearer_token}`,
}
}
推荐阅读
- dataframe - 如何附加两个具有相同列的csv文件删除R中的重复行
- python - 如何在没有双反斜杠的情况下将转义序列保存到python中的文件中?
- html - 通过活动类名设置活动状态的样式
- typescript - TypeScript 从参数推断泛型类
- mysql - 在不使用类型的情况下删除 SQL 查询中的查询
- wordpress - WordPress 升级失败。管理面板不工作
- mongodb - 如何在 mongodb 查询中检查 if 条件中的空数组?
- javascript - 如何计算和显示来自javascript对象的字段总和
- sql - perl - 比较来自 2 个数据库的两个 SQL 查询的两列
- python - 如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?