2016-08-02 6 views
1

고양이 사진을 보낼 수있는 Facebook 채팅 봇을 만들려고합니다. 나는 RESTful API을 사용하여 고양이 사진을 얻습니다. 그들은 원시 png로 반환됩니다. 다음 단계는 이미지를 읽을 수있는 스트림으로 변환하여 Facebook Chat API이 이미지를 첨부 파일로 보낼 수 있도록하는 것입니다.PNG를 GET 요청에서 Node.js의 읽을 수있는 스트림으로 변환

나는 이미지를 잡기 위해 request.js을 사용합니다. 요청의 설명서에는 이미지를 파일로 저장하고 파일을 stream.Readable에 저장하는 것에 대해서만 언급되어 있습니다. 임시 파일을 무시하고 이미지를 Facebook Chat API에 직접 파이프하는 방법이 있는지 궁금합니다.

여기 내 코드는 지금까지의 :

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

요청이 모든 pody를 반환 한 후에 만 ​​읽을 수있는 스트림으로 푸시합니다. 콜백으로 작업 할 때 ... 'request ('http://google.com/doodle.png '). 파이프 (fs.createWriteStream ('doodle.png '))와 같은 파이프가 필요합니다.' – yeya

답변

1

몇 여기에 문제가 있습니다 :

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

나는 오류지고있어이 주요 문제가

  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); 추가하는을 포함하여 (이것은 조금 논외이지만, 모듈 세력이 request가 사용하는 기본 form-data 모듈 값의 많은 다른 유형을 지원하는 경우 사용되는 스트림 그런 종류의 바보 원시 Buffer 인스턴스를 파일의 내용으로 사용).

+0

! 나는이 세 가지 제안을 모두 구현했다. 그 form-data 오류는 더 이상 발생하지 않지만 새로운 오류가 발생했습니다 : 'TypeError : 정의되지 않은 객체 또는 null을 객체로 변환 할 수 없습니다.' [sendMessage.js의 205 행] (https://github.com/Schmavery/facebook-chat-api/blob/master/src/sendMessage.js#L205)에 있습니다. 나는'file'이 null이거나 뭔가라고 생각합니다. 참고로 'body'요청을 인쇄했는데 'request'가 버퍼를 올바르게 읽었으므로 거기에 문제가 없어야합니다. – renxinhe

+0

업데이트 8/2 5:30 pm :'sendMessage.js'의 205 행에'file'을 기록했습니다. 그것은'file'이'undefined '임을 보여줍니다. 또한 'UploadAttachment Error : 오류 ECONNRESET 읽음'오류가 발생했습니다. 나는 스크립트를 재 시도했고 오래된'TypeError'가 돌아왔다. – renxinhe