我正在尝试制作一个可以发送猫图片的Facebook聊天机器人。我使用RESTful API来获取猫的图片。它们以原始png的形式返回。下一步也是最后一步是将图像转换为可读流,以便Facebook Chat API可以将其作为附件发送。
我使用request.js
抓取图像。 Request的文档仅提及将图像保存为文件并将文件读取到stream.Readable
。我想知道是否有一种方法可以绕过该临时文件,并将图像直接传送到Facebook Chat API。
到目前为止,这是我的代码:
var request = require("request");
var stream = require("stream");
module.exports = function getCatPicture(api, threadID, body) {
var options = {
url: 'http://thecatapi.com/api/images/get?type=png',
encoding: 'base64'
}
var picStream = new stream.Readable;
request.get(options, function (error, response, body) {
picStream.push(body, 'base64');
var catPic = {
attachment: picStream
};
api.sendMessage(catPic, threadID);
return;
});
}
我收到一个错误:
Error in uploadAttachment Error: form-data: not implemented
Error in uploadAttachment at Readable._read (_stream_readable.js:457:22)
Error in uploadAttachment at Readable.read (_stream_readable.js:336:10)
Error in uploadAttachment at flow (_stream_readable.js:751:26)
Error in uploadAttachment at resume_ (_stream_readable.js:731:3)
Error in uploadAttachment at nextTickCallbackWith2Args (node.js:442:9)
Error in uploadAttachment at process._tickCallback (node.js:356:17)
Error in uploadAttachment { [Error: form-data: not implemented]
Error in uploadAttachment cause: [Error: form-data: not implemented],
Error in uploadAttachment isOperational: true }
最佳答案
这里有一些问题:
这是主要问题,因为您需要在新的._read()
流实例上实现Readable
。即将发布的节点版本将具有更好的错误消息。因此,现在,您可以在创建picStream._read = function(n){};
之后仅添加picStream
。
该映像被不必要地转换为base64,然后再次返回。您只需在encoding: null
对象中设置options
,body
将成为回调中的Buffer
实例。然后,您可以执行picStream.push(body);
。
流没有结束。执行picStream.push(null);
后添加picStream.push(body);
最后,这有点题外话,但是当form-data
使用的基础request
模块支持许多不同类型的值(包括原始的Buffer
实例用作文件的内容)。