2016-08-02 34 views
1

Ich versuche, einen Facebook-Chat-Bot, der Katzenbilder senden kann. Ich verwende eine RESTful API, um die Katzenbilder zu bekommen. Sie werden als rohe PNG zurückgegeben. Der nächste und letzte Schritt besteht darin, dieses Bild in einen lesbaren Stream umzuwandeln, so dass die Facebook Chat API es als Anhang senden kann.Convert PNG von GET-Anfrage in einen lesbaren Stream in Node.js

Ich benutze request.js, um das Bild zu greifen. Die Dokumentation von Request erwähnt nur das Speichern von Bildern als Datei und das Lesen von Dateien unter stream.Readable. Ich frage mich, ob es eine Möglichkeit gibt, diese temporäre Datei zu umgehen und das Bild direkt in die Facebook Chat API zu leiten.

Hier ist mein Code so weit:

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; 
    }); 
} 

Ich erhalte eine Fehlermeldung:

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 } 
+0

siehe https://github.com/maxogden/mississippi#from und https://github.com/yoshuawuyts/from2-string –

+0

Sie drücken auf den lesbaren Stream nur nach der Anfrage zurückgeben alle pody, weil Sie sind Wenn Sie mit Callback arbeiten, müssen Sie eine Pipe ... wie 'request ('http://google.com/doodle.png') .pipe (fs.createWriteStream ('doodle.png'))' – yeya

Antwort

1

Es gibt ein paar Probleme hier:

  1. Dies ist das Hauptproblem, das Sie müssen ._read() in Ihrer neuen Stream-Instanz Readable implementieren. Eine kommende Version von Node wird eine bessere Fehlermeldung haben. Jetzt können Sie wahrscheinlich einfach picStream._read = function(n){}; hinzufügen, nachdem Sie picStream erstellt haben.
  2. Das Bild wird unnötigerweise in base64 und wieder zurück konvertiert. Sie können einfach encoding: null in Ihrem options Objekt und body eine Buffer Instanz in Ihrem Callback setzen. Dann können Sie einfach picStream.push(body); tun.
  3. Der Stream wird nicht beendet. In picStream.push(null); nach picStream.push(body);

Schließlich tun, ist dies ein bisschen offtopic, aber es ist ein bisschen dumm, dass die Modulkräfte verwendet werden Ströme, wenn die zugrunde liegenden form-data Modul, das request verwendet viele verschiedene Arten von Werten unterstützt (einschließlich ein rohe Buffer Instanz als Inhalt einer Datei zu verwenden).

+0

Vielen Dank für die Klärung der Dinge ! Ich habe alle drei dieser Vorschläge umgesetzt. Ich erhalte diesen Formulardatenfehler nicht mehr, aber es tauchte ein neuer auf: 'TypeError: Kann nicht undefiniert oder null in Objekt konvertieren. Es befindet sich in [Zeile 205 von sendMessage.js] (https://github.com/Schmavery/facebook-chat-api/blob/master/src/sendMessage.js#L205). Ich denke 'Datei' ist null oder so. Als Referenz habe ich die Anfrage 'body' ausgedruckt und' request' liest tatsächlich einen Puffer richtig, es sollte also kein Problem geben. – renxinhe

+0

Update 8/2 17:30 Uhr: Ich habe gerade 'Datei' in Zeile 205 von' sendMessage.js' angemeldet. Es zeigt, dass "Datei" nicht definiert ist. Ich habe auch einmal einen Fehler in UploadAttachment Error: ECONNRESET gelesen. Ich habe das Skript wiederholt und der alte 'TypeError' kam zurück. – renxinhe