我尝试使用 OAuth 1.0a 和 TS 从 twitter API v2 创建带有 POST /2/tweets 的 API,我认为我的代码很好,但是当我尝试使用 postman 时出现错误:
{ "success": false, "error": { "title": "Unauthorized", "type": "about:blank", "status": 401, "detail": "Unauthorized" } }
。这是我的代码:
// twitter.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import axios from 'axios';
import OAuth from 'oauth-1.0a';
import crypto from 'crypto';
import { ConfigService } from '@nestjs/config'
import { createHmac } from 'crypto';
@Injectable()
export class TwitterService implements OnModuleInit{
constructor(
private readonly configService: ConfigService
)
{}
async onModuleInit() {
console.log('twitterService')
}
private readonly consumerKey = 'FaC6d0Ez4LoRCJzZpasiEL3jq';
private readonly consumerSecret = 'nFNu6UD1jx9LqxhsMXf1zjWzqmCyawa8MqBXCYklxtinuhJG7R';
private readonly accessToken = '1443624502957514795-USijMxUZ5JHHbxsNhPmIJlpi7cd7rq';
private readonly tokenSecret = 'a2qjIe31mmbNHYBx7e1j7LwBmiGZeO7UiFBEJhDs9u2ST';
private readonly oauth = new OAuth({
consumer: { key: this.consumerKey, secret: this.consumerSecret },
signature_method: 'HMAC-SHA1',
hash_function(base_string, key) {
return createHmac('sha1', key)
.update(base_string)
.digest('base64');
},
});
async postTweet(text: string): Promise<any> {
const request_data = {
url: 'https://api.twitter.com/2/tweets',
method: 'POST',
data: { text },
};
const requestData = {
url: request_data.url,
method: request_data.method,
data: request_data.data,
};
console.log(requestData)
const token = {
key: this.accessToken,
secret: this.tokenSecret,
};
const oauthHeaders = this.oauth.toHeader(this.oauth.authorize(requestData, token));
const headers: { [key: string]: string } = {
...oauthHeaders,
'Content-Type': 'application/json',
};
console.log(oauthHeaders)
try {
const response = await axios({
method: 'post',
url: request_data.url,
headers: headers,
data: JSON.stringify(request_data.data),
});
return response.data;
} catch (error) {
throw error.response.data;
}
}
}
这是我的控制器:
import { Controller, Post, Body } from '@nestjs/common';
import { TwitterService } from './twitter.service';
@Controller('twitter')
export class TwitterController {
constructor(private readonly twitterService: TwitterService) {}
@Post('post-tweet')
async postTweet(@Body() body: { text: string }): Promise<any> {
try {
const response = await this.twitterService.postTweet(body.text);
return { success: true, response };
} catch (error) {
return { success: false, error };
}
}
}
我指的是这个文档:https://developer.twitter.com/en/docs/authentication/oauth-1-0a
我很确定我正确提供了它所需的所有数据。
你想出来了吗?我也有同样的问题