我正在使用 Twitter npm软件包制作一个简单的应用程序,可以将gif或视频上传到平台。在 FINALIZE 步骤上收到 400错误请求错误。 我不明白为什么会收到此错误。我已经将代码结构化为软件包和Twitter文档提供的示例。关于堆栈溢出和Twitter论坛上此错误的讨论不多,他们说,如果媒体文件未通过验证,则会产生此错误,但他们未指定验证。如果有人可以解释为什么会发生这种情况,那将是很大的帮助。
let fs = require('fs')
let path = require('path')
const keys = require('./config')
const client = new Twitter(keys)
let mediaIdString = ''
let mediaId = 0
// reading file (GIF)
const gifFile = fs.readFileSync(path.join(__dirname, 'memes', 'gif1.gif'))
// getting file details
const gifFileStat = fs.statSync(path.join(__dirname, 'memes', 'gif1.gif'))
const gifSize = gifFileStat.size
const contentType = 'image/gif'
console.log(`gif size in bytes ==> ${gifSize}`)
// calling uploadMedia
uploadMedia().then((result) => {
console.log('UPLOAD SUCCESSFUL')
}).catch((err) => {
console.log(err)
})
function uploadMedia () {
// STEP 1 (INIT)
return client.post('media/upload', {
command: 'INIT',
total_bytes: gifSize,
media_type: contentType
}).then((response) => {
console.log(`INIT \t response ==> ${JSON.stringify(response)}`)
mediaIdString = response.media_id_string
mediaId = response.media_id
console.log(`mediaId ==> ${mediaId}`)
console.log(`media id string ==> ${mediaIdString}`)
// step 2 (APPEND)
return client.post('media/upload', {
command: 'APPEND',
media_id: mediaIdString,
media_data: gifFile,
segment_index: 0
})
}).then((response) => {
console.log(`APPEND \t response ==> ${JSON.stringify(response)}`)
// STEP 3 (STATUS)
return client.get('media/upload', {
command: 'STATUS',
media_id: mediaIdString
})
}).then((response) => {
console.log(`STATUS \t response ==> ${response}`)
// STEP 4 (FINALIZE)
return client.post('media/upload', {
command: 'FINALIZE',
media_id: mediaIdString
})
})
}
答案 0 :(得分:1)
第一个问题是,导致您获得Error: HTTP Error: 400 Bad Request
的原因是fs.readFileSync
获得的数据是原始二进制文件,而不是 base64编码的文件< / strong>。 Twitter的API参考指出:
媒体:要上传的原始二进制文件内容。不能与
一起使用media_data
media_data :正在上传以base64编码的文件内容。不能与
一起使用media
因此,您应该使用media
参数而不是media_data
来传递文件。
您的承诺链在尝试使用分块上传方法时的第二个问题有点问题,它实际上应该是这样的:
client.post('media/upload', {
command: 'INIT',
total_bytes: gifSize,
media_type: contentType
}).then((response) => {
mediaIdString = response.media_id_string;
client.post('media/upload', {
command: 'APPEND',
media_id: mediaIdString,
media: gifFile,
segment_index: 0
}).then((response) => {
client.post('media/upload', {
command: 'FINALIZE',
media_id: mediaIdString,
}).then((response) => {
console.log(response);
console.log('UPLOAD SUCCESSFUL');
});
});
});
我认为您尝试编写无极瀑布,但是我认为它在这种情况下不能很好地工作,或者如果它可以工作,则需要编写更多的代码,并且性能没有差异全部。