出现HTTP错误:GIF上的400错误请求或Twitter上的视频上传

时间:2019-01-26 11:32:41

标签: node.js twitter

我正在使用 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
        })
    })
}

1 个答案:

答案 0 :(得分:1)

第一个问题是,导致您获得Error: HTTP Error: 400 Bad Request的原因是fs.readFileSync获得的数据是原始二进制文件,而不是 base64编码的文件< / strong>。 Twitter的API参考指出:

  

媒体:要上传的原始二进制文件内容。不能与media_data

一起使用      

media_data :正在上传以base64编码的文件内容。不能与media

一起使用      

POST media/upload > Parameters

因此,您应该使用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');
    });
  });
});

我认为您尝试编写无极瀑布,但是我认为它在这种情况下不能很好地工作,或者如果它可以工作,则需要编写更多的代码,并且性能没有差异全部。

此外,twitter软件包的README.md中没有提到STATUS命令,因此该库似乎不支持STATUS