2

我正在尝试制作一个可以发送猫图片的 Facebook 聊天机器人。我使用RESTful API来获取猫的图片。它们以原始 png 的形式返回。下一步也是最后一步是将该图像转换为可读流,以便Facebook 聊天 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 }
4

1 回答 1

1

这里有几个问题:

  1. 这是您需要._read()在新的Readable流实例上实现的主要问题。即将发布的节点版本将有更好的错误消息。所以现在,您可能可以picStream._read = function(n){};在创建picStream.
  2. 图像被不必要地转换为 base64 并再次转换回来。您可以只encoding: null在您的options对象中设置,并将成为您回调body中的一个实例。Buffer然后你就可以做picStream.push(body);
  3. 流未结束。picStream.push(null);完成后添加picStream.push(body);

最后,这有点离题,但是当使用的底层form-data模块request支持许多不同类型的值(包括Buffer用作文件内容的原始实例)时,模块强制使用流是有点愚蠢的。

于 2016-08-02T23:09:28.453 回答