2016-08-02 18 views
1

私はネコ画像を送信できるFacebookチャットボットを作ろうとしています。私はRESTful APIを使って猫の写真を撮る。それらは生のpngとして返されます。次の最後のステップは、その画像を読み取り可能なストリームに変換して、Facebook Chat APIがそれを添付ファイルとして送信できるようにすることです。PNGをGETリクエストからNode.jsの読み込み可能なストリームに変換する

私は画像をつかむためにrequest.jsを使用します。リクエストのドキュメントには、イメージをファイルとして保存し、ファイルをstream.Readableに保存することだけが記載されています。その一時ファイルをバイパスし、画像をFacebookチャット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 } 
+0

https://github.com/maxogden/mississippi#fromとhttps://github.com/yoshuawuyts/from2-stringを参照してください。 –

+0

あなたが読んでいるストリームにプッシュするのは、あなたがコールバックを使って作業しています。あなたは 'request( 'http://google.com/doodle.png').pipe(fs.createWriteStream( 'doodle.png'))のようにパイプする必要があります。 – yeya

答えて

1

いくつかの問題がここにあります

  1. これはどの主要な問題です新しいReadableストリームインスタンスに._read()を実装する必要があるということです。ノードの次のバージョンでは、より良いエラーメッセージが表示されます。今のところpicStreamを作成した後は、おそらくpicStream._read = function(n){};を追加するだけです。
  2. イメージが不必要にbase64に変換されて戻ってきました。 optionsオブジェクトにencoding: nullを設定するだけで、bodyはコールバック内にBufferインスタンスになります。それではpicStream.push(body);を実行してください。
  3. ストリームが終了していません。あなたはpicStream.push(body);

最後を行った後picStream.push(null);を追加し、含む(これは少しofftopicですが、それは、モジュール力がrequestが使用する基礎となるform-dataモジュールは、値の多くの異なる種類をサポートしているときに使用するストリームという種類の愚かです生のBufferインスタンスをファイルの内容として使用する)。

+0

!私はこれら3つの提案をすべて実装しました。私はもうフォームデータエラーを取得しませんが、新しいエラーが表示されました: 'TypeError:未定義またはnullをオブジェクトに変換できません '。それは[sendMessage.jsの行205](https://github.com/Schmavery/facebook-chat-api/blob/master/src/sendMessage.js#L205)です。私は 'ファイル'がnullか何かであると思います。参考までに、私はリクエストbodyを印刷しました。リクエストは実際にバッファを正しく読み込んでいるので、そこに問題はないはずです。 – renxinhe

+0

更新8/2 5:30 pm: 'sendMessage.js'の行205に' file'を記録しました。これは 'file'が' undefined'であることを示しています。私はまた、 'Error in uploadAttachment Error:ECONNRESET'を一度読みました。私はスクリプトを再試行し、古い 'TypeError'が戻ってきました。 – renxinhe

関連する問題