2016-11-25 19 views
2

Я реализую бота, который использует API отправки Facebook. Согласно documentation можно отправлять файлы с помощью запроса. Документация предлагает два метода: один отправляет URL-адрес в файл и другую загрузку файла. Я не хочу загружать файл и указывать ему URL-адрес, поскольку это библиотека с открытым исходным кодом, которая не хочет ничего воспринимать в реализации.Как отправить файл в API-интерфейс Facebook, используя запрос npm, без загрузки файла?

Я хочу загрузить файл напрямую. Документация для загрузки файла использует cURL для примера и выглядит следующим образом:

curl \ 
    -F recipient='{"id":"USER_ID"}' \ 
    -F message='{"attachment":{"type":"file", "payload":{}}}' \ 
    -F [email protected]/tmp/receipt.pdf \ 
    "https://graph.facebook.com/v2.6/me/messages?access_token=PAGE_ACCESS_TOKEN"  

Мой текущий взять то, что это должно выглядеть примерно так:

facebook_message.access_token = configuration.access_token; 
var fileReaderStream = fs.createReadStream('./sampleData.json') 
var formData = { 
       "recipient": JSON.stringify({ 
        "id":message.channel 
       }), 
       "attachment": JSON.stringify({ 
        "type":"file", 
        "payload":{} 
       }), 
       "filedata": fileReaderStream 
       } 

request({ 
     "method": 'POST', 
     "json": true, 
     "formData": formData, 
     "uri": 'https://graph.facebook.com/v2.6/me/messages?access_token=' + configuration.access_token 
     }, 
     function(err, res, body) { 
       //*** 
     }); 

Когда я запускаю это я получаю следующее ответ:

{ 
    message: '(#100) Must send either message or state', 
    type: 'OAuthException', 
    code: 100, 
    error_subcode: 2018015, 
    fbtrace_id: '***' 
} 
+1

Вы как пропустили что-то очень важное в своем вопросе: что именно не работает? вы его отлаживали? любая информация в обратном вызове? он вызван? «это мое решение, но оно не работает» слишком велико для stackoverflow. – luschn

+0

Добавление этого в настоящее время. Спасибо. –

ответ

-2

официальный пример приложение включает в себя функции для загрузки файлов через URL: https://github.com/fbsamples/messenger-platform-samples/blob/master/node/app.js

Это соответствующая функция:

function sendFileMessage(recipientId) { 
    var messageData = { 
    recipient: { 
     id: recipientId 
    }, 
    message: { 
     attachment: { 
     type: "file", 
     payload: { 
      url: SERVER_URL + "/assets/test.txt" 
     } 
     } 
    } 
    }; 

    callSendAPI(messageData); 
} 

Если вы действительно хотите сделать это трудный путь, возьмите взгляд на запрос модуля документации: https://www.npmjs.com/package/request#forms ЗАКАНЧИВАТЬ пример кода с «FormData» в раздел. Вы используете «форму», которая, как представляется, используется для регулярных данных.

+0

Я прямо сказал, что я не хочу загружать файл. Чтобы использовать эту функцию, у меня должен быть URL-адрес для файла. У меня нет URL-адреса для файла, и я хочу загрузить его напрямую. –

+0

файл должен быть на сервере, так почему бы не использовать url вместо этого? почему у вас нет URL-адреса? я не понимаю. – luschn

+0

не знаю, почему вы отказались, я просто хотел помочь с более простым решением. это не неправильное решение в любом случае, это сработает - просто с URL-адресом. пользователь все равно получит файл, так почему бы просто не сделать это? – luschn

2

Ошибка, которую вы принимаете, потому что "attachment":{} должен находиться внутри объекта, называемого сообщением. Вы должны отправить сообщение или объект sender_action с API-интерфейсом facebook.

var formData = { 
       "recipient": JSON.stringify({ 
        "id":message.channel 
       }), 
       "message": JSON.stringify({ 
       "attachment": { 
        "type":"file", 
        "payload":{} 
       } 
      }), 
       "filedata": fileReaderStream 

       } 

Facebook должен принять ваш вызов api после этого, однако мне не удалось отобразить файл jpg, отправленный с использованием вашего кода. Возможно, он будет работать с вашим файлом JSON.