Ошибка HTTP: 400 неправильных запросов в GIF или загрузка видео в Twitter - PullRequest
0 голосов
/ 26 января 2019

Я использую пакет Twitter npm, чтобы сделать простое приложение, которое может загружать GIF или видео на платформу.Ошибка 400 Bad Request на шаге FINALIZE .Я не могу понять, почему я получаю эту ошибку.Я структурировал свой код в качестве примера, предоставленного пакетом и документами 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 голосов
/ 29 января 2019

Первая проблема заключается в том, что вы получаете Error: HTTP Error: 400 Bad Request - данные, которые вы получаете fs.readFileSync - это необработанный двоичный файл , а не файл в кодировке base64 . Ссылка API на Twitter гласит:

media : загружается необработанный двоичный файл. Не может использоваться с media_data

media_data : загружается содержимое файла в кодировке base64. Не может использоваться с media

POST media / upload> Параметры

Таким образом, вы должны использовать параметр media для передачи файла вместо media_data.

Вторая проблема, которую ваша цепочка обещаний при попытке использовать подход chunked-upload немного проблематична, и на самом деле она должна выглядеть так:

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 не поддерживается этой библиотекой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...