Проблема с загрузкой файла в мессенджер facebook через NodeJS - PullRequest
0 голосов
/ 11 октября 2018

Я создаю чат-бота для Facebook с помощью NodeJS и с трудом пытаюсь отправить локальный файл через messeger через API Facebook, в соответствии с документацией для загрузки файла, необходимо сделать удаленный вызов, как в примере ниже:

curl  \
  -F 'message={"attachment":{"type":"image", "payload":{"is_reusable":true}}}' \
  -F 'filedata=@/tmp/shirt.png;type=image/png' \
  "https://graph.facebook.com/v2.6/me/message_attachments?access_token=<PAGE_ACCESS_TOKEN>"

На самом деле, используя этот пример, выполняется загрузка файла, и возвращается «attachment_id», чтобы я мог прикрепитьфайл в одно или несколько сообщений, однако я не могу загрузить его через свое приложение, я уже пытался по-разному структурировать файл на объекте, пытаясь указать путь, пытаться поместить поток файла и т. д.,но всегда возвращается следующая ошибка:

{
    message: '(#100) Incorrect number of files uploaded. Must upload exactly one file.',
    type: 'OAuthException',
    code: 100,
    error_subcode: 2018005,
    fbtrace_id: 'XXXXXXXXXX',
    { recipient: { id: 'XXXXXXXXXX' },
    message: { attachment: { type: 'file', payload: [Object] } },
    filedata: '@pdf_exemple.pdf;type=application/pdf' 
}

Я не эксперт по Node / JavaScript, поэтому возможно, что я делаю какую-то глупую ошибку ... В любом случае, ниже приведен фрагмент моего кода, ответственногодля сборки объекта и отправки его в фейсбук.Любая помощь приветствуется.

function callSendAPI(messageData) {
    request({
        url: 'https://graph.facebook.com/v2.6/me',
        qs : { access_token: TOKEN },
        method: 'POST',
        json: messageData
    }, function(error, response, body) {
        if (error) {
            console.log(error);
        } else if (response.body.error) {
            console.log(response.body.error);
        }
    })
}

function sendAttachment(recipientID) {
    var messageData = {
        recipient: {
            id: recipientID
        },
        message: {
            attachment: {
                type: 'file', 
                payload: {
                    'is_reusable': true,
                }
            }
        },
        filedata: '@pdf_exemple.pdf;type=application/pdf'
    };
    callSendAPI(messageData);
}

1 Ответ

0 голосов
/ 11 октября 2018

После долгих поисков я смог внести необходимые изменения в методы моего приложения, чтобы сделать возможной передачу файлов через messeger, концепция была почти правильной, что было неправильным, так это способ отправки данных, правильныйодин из них отправить их через форму.Вот решение:

function callSendAPI(messageData, formData) {
    request({
        url: 'https://graph.facebook.com/v2.6/me',
        qs : { access_token: TOKEN },
        method: 'POST',
        json: messageData,
        formData: formData,
    }, function(error, response, body) {
        if (error) {
            console.log(error);
        } else if (response.body.error) {
            console.log(response.body.error);
        }
    })
}

function sendAttachment(recipientID, fileName) {
    var fileReaderStream = fs.createReadStream(fileName)
    var formData = {
                recipient: JSON.stringify({
                id: recipientID
            }),
            message: JSON.stringify({
            attachment: {
                type: 'file',
                payload: {
                    is_reusable: false
                }
            }
        }),
       filedata: fileReaderStream
    }
    callSendAPI(true, formData);
}
...