使用facebook-node-sdk模块/(#324)上传照片需要上传文件

我正在尝试使用Facebook节点sdk模块发送照片到一个页面。 https://github.com/Thuzi/facebook-node-sdk/

我可以张贴到页面墙或从url上传。 但我有一个问题,试图从数据上传照片。

这是我如何连接:

FB.api('oauth/access_token', { client_id: clientid, client_secret: clientsecret, redirect_uri: redirecturi, code: code, scope: scope, fileUpload : true, }, function (resf) { ...} 

我得到这样的好访问令牌:

  FB.api('/me/accounts', function (resf) { if (!resf || resf.error) { console.log(!resf ? 'error occurred' : resf.error); return; } for (var i = 0; i < resf.data.length; i++) { if (resf.data[i].id == pageid) { resf.data[i]. access_token } }); 

我尝试上传照片:

 var buff = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBg8SEBQQEBQUEBQUFRQVERYUFhMYGBYVFBUVFBUVEhQYHCYgFxkkGhUVHy8gIycpLSwuFR4xNTAqNSYtLCkBCQoKDgwOFw8PFzUcHSQwKS01NTUsNTUpNS8sNCwsKS4pNDUuLTUsLC8pLCwpNTUvNSkpNSkvLCwsKikpKSksNv/AABEIAK8BHwMBIgACEQEDEQH/xAAcAAEAAgIDAQAAAAAAAAAAAAAABwgFBgEDBAL/xABKEAABAwICBgYECgULBQAAAAABAAIDBBEFIQYHEjFBcRMiUWGBsTI0kaEjQlJyc3SCkrKzCBQkYsEVFhczNVNUVZPR0mODoqPC/8QAGwEBAQADAQEBAAAAAAAAAAAAAAECAwUEBgf/xAAoEQEAAgIBAwIFBQAAAAAAAAAAAQIDEQQFEiExcRMyQZHRUYGh8PH/2gAMAwEAAhEDEQA/AJxREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQdFbWxQxulme2NjRdznkBoG65J3LtjkDgHNIIIBBG4g5ghaJrtxMRYRLH8adzI2j7XSO9zD7Vt2CuApYScgIY7/cag96LScX1p0sTiyFjqi29wIazwcczzsvLh+tuFzgJoXRA/Ga4PA5iwPsWv4tN626MdL5dqd8Y51/P29UgIumkrI5WNkicHscLtc03BC7lsc+YmJ1IiIiCIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAuCV8VFQxjS+RwY1ou5ziAAO0k5AKEdZetzp2uo6AkRG7ZpswZBxZFxDO1288Mt4YHW7pm2uq9iE7UFOHMjI3Pef6yQd2QA7m34qUdNcSfHhNOxpt0zYWOI+SItojxsB7VXZ+48j5Ky+kOAPqsKhbGLyRxwyMHyrRgFo7yCfGywvvtnT28G1K8nHOT03CIUXLmkEgggjIg5EHsI4Lhc5+mw3vVVjTmzupSbska57B2PbYm3Nt/uqVFEeqzDnPrDNbqxMdc/vP6oHs2j4KXF7sO+zy+A65FI5c9v6Rv3/zQiItziCIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgLxYzi0dNBJUS7RZE3adsjadYdg4le1EEeu14YWB6NSf+yR7yVgcW/SBZYikpXE8HTuAA+wy5P3gpK0sH7BV/Vp/wAp6qcEVndJdNq+vP7TKXNBu2NvVjHJg3nvNysGiIr5k3HkfJWjfpRT0dLTdNtnbiZs7DC7cxt7ncN6q5JuPI+St1gg/ZYPoYvwNUlaTWLRNo3Hvr8tIxXSrCKg3dSSTyd0Wy483A3WBpNCamrmL44P1KA2ttlxsO4O6zifAKYrLla5x93q6uLqk4KzGGuve0zr2jxDHYFgcVJCIYhkM3OO9zjvc7vWRRYTSzS+lw+Dpqh2ZuIo2+nI4cGjzJyC2xGnJve17Ta07mWZfIGglxAAzJOQA7SVo2P65MLpiWMe6reMrQgFoPfISG+y6hvTDWHW4i4iV3Rw36sLCdgdhfxkd3nLsAWsImkyU2uuvqp2wUNCxz3+iHyOce8usGhoHE3WS0k000ioIxPUUtG+K4DnRGY7JOQD7uuM8r2IXTqF0faynlrXDrSvMcZ7I4/Stzff7gUk41hjKinlp3i7ZY3MN/3gQD4Gx8EEXYT+kDGSBVUrmDi6F4f/AODg0+9SPo/pZRVrNqlmbJb0m7nt+cw5jyVUXsLSWneCQeYNiu2irZYZGywvdFI03a9hIcOR/ghpcBFG2rPWqK21LVlrKn4jhk2YAcB8WTu47x2CSUQREQFgtItNqChH7TM1rrXEbetIeTG5+JsFHmsvW85j3UeHOs5pLZpxY2O4sh4XG4u4cO1Q3LK5zi5xLnON3OcSST2knMlF0mTFNf7b7NJSufnZrpX2v2WjYCfC62rRDEMfqJGy1sVPS05BJjs/pjcdWw2js529LPuUfaiNH45qqWqkAd+rhgiB4Pk2uvzAabfOU7ojXMWo8X23Opp6cMv1GSROuB2F4JvzstPrtZOKUkvQ1cEJcM8ttu0ODmuBII8FIuNYvHSwPqJfRYL2G8k5Bo7ySB4qBNJNIpq2czS2GWyxo3MYCSGjt33J4rpcPH8X5qxMOfyr/D+W07SdhGt2jkIbO19MTxPXZ4uGY8Qt3p6lkjQ+NzXtcLtc0ggjuIVZlsWhel8tDMMyYHuHTM4AHIvaODhv79y3Z+nxreP7NWHnTvWRPaLhjwQCMwcwe4rlcd1RERAREQEREGJ0s9Qq/q1R+U9VOCtjpZ6hV/Vqj8p6qcEWHKIiK+ZNx5HyVusD9Vg+hi/A1VFk3HkfJW6wP1WD6GL8DUSXuRERGN0hx6GjppKmY2ZGL2G9zjk1je0k2CrBpPpLPX1Dqic5nJjR6MbL5MZ3Dt4nNbxrx0qM1U2hYfg6exkscnTOF8/mtIHNzlGSLAiLgjKyKtJq7oOhwqkZuPQse750nwh97lsa82GQbEETPkxsb91oH8F6UYqlaSQ7FbUs+TUTj/2OWOWa02bbEqwD/EzfjKwqMn1FK5rg9hLXNILXA2IINwQeBBVl9WumYxCjD326eKzKgDi62UgHY4Z87jgqzLdtUGkBpsTjYTaOoHQv+cc4zz2svtlEWQWk62tKnUVAREdmac9FGRvaCLveO8NyB7XBbsoN/SAqyaumi4Nhc/xe+3kwIiK0REZJG1I6Sx09a+nlIa2pa1rCd3SsJLAT3hzhzt2qwCpypJ0R111VM1sNW01cYsA+9pWjvccpPGx70RJWtiF7sOJbubJG5/zbkeZaoVU34XrEweuYYumY3bBa6Kf4MkHIt62TvAlabpBqoqGOL6IieM5taSA9o7ATk8d+RXW4PIpSvZadOXzMFrT318tCXGyTkMyd3is6zQbEybfqso5hoHtJst60K1XmGRtRWFrnNO1HE3MNcNznu4kcAMu8r35eVjpXe9vFj4+S861pveDwOZTwsd6TYo2u5tYAfeF7ERfNzO5278RqNCIiiiIiAiIgxOlnqFX9WqPynqpwVsdLPUKv6tUflPVTgiw5RERXzJuPI+St1gfqsH0MX4Gqosm48j5K3WB+qwfQxfgaiS9y6a2qbFG+V3osY57uTQXH3Bdy1rWRUlmE1jhkehc379mf/SIrLiFc+aWSd+bpXukdzeS4+a6ERGQuylj2pGN7XNHtcAutd9A4iaMtbtuEkZa35RDxZvicvFBb4BcqPv57Y5/k7/8AXZ/sn89sc/yd/wDrs/2RihTTf+0636zN+MrCrdMb0DxmoqZqg0UjOmkfJs7UZ2ds3tfazXi/oxxn/By+2P8A5IrWF2U1SY3tkbkWOa8c2EOHktj/AKMcZ/wcvtj/AOS4dqxxmx/Y5dx4x/8AJBZ2GTaaHdoB9ouoN/SApyKynk4OgLRzZISfxhTbh8ZbFG0ixDGAjsIaAVouuvRt1TQCeMbT6VxksN5icLSW5Wa77JRFe0REZCIiDghZfBdLa+kP7NUSRD5N7s8Y3Xb7liUQS7o3r6eCGV8IcN3SwCxHe6Imx8COSlnBcepquITU0jZWHi3eD2Oac2nuKqSsro1pNU0M4npnbJy22m+xI35MjeI7944ImlsUWH0U0lhr6VlVFkHZPad7Hj0mO5e8EHiswiCIiAiIgIiIMTpZ6hV/Vqj8p6qcFbHSz1Cr+rVH5T1U4IsOUREV8ybjyPkrdYH6rB9DF+BqqLJuPI+St1gfqsH0MX4GokvctW1oRk4PWAf3V/uua4+SzGM49DS9D0u18PMyCPZF/hJL7O12DI5r7x3D+npZoP72KRni5pAPtKIqOi5fGWktcLEEhw7CMiPauEZC9uBet0/08H5rF4l6cMfszxO7JYz7HtKC3i5RfMjw0FxyABJ5DMoxYrSDSWCkYDJ1nO9BjbbTu/uHeVolZrKrHH4MRxDgLFx8Sf8AZa/jGKPqJ3zPPpHqjsaPRaOQXiXktlmZ8Pl+T1HJe0xSdQ26j1lVjT8I2OUcRYtPgRl7lvWj+ksFWwmPquHpsdbab3947woXXuwTFXU87Jmm2yesO1h9IHw8grXLMT5ON1HJS0RedwnFa7TaTbeKT4a9rQGQRyxnO7tokSBwOWV27u0rYWOBAI3HMKENPNIDRaSR1XxWRwiQDjG4Oa8ew35gL1PqHm1k6pZad76qhYZICS58bRd0PE7IGbo+WY5ZqMlcOGVr2h7SHNcAWkbiCLgjwWo6UaqsOrSZCw08p3yQ2aSe17PRdztfvRdq1IpGx3UdiMJJpyyrZwsRG+3e1xsfBy0PEcJqKd2xURSQO7JGubfkTkfBFeVERAREQShqGxxzKyWkJ6k0Ze0dkkVt3NhP3Qp2VZtU7yMYpLcXSA8jDJdWZRJEREQREQEREGJ0s9Qq/q1R+U9VOCttpJA59HUsbmXQTNbzdG4DzVSW7giw5RERXzJuPI+St1gfqsH0MX4Gqosm48j5K3WB+qwfQxfgaiS1fWEdqpwqHi6vbJ4Qsc4+a3ZaNO/9a0gjY3NmH073vPATVNmtbz2BdbyiK4639FzSYg+VotFUkysPAPP9azntHa5PWjq1OmeicWIUrqeTqn0on2zZINzh2jeCOIJVZMbwSeknfT1DCx7Dn2EcHMPFp4FFeFNq2fZn7ERFW+w+pEkMcg3PYxw+00H+K5rYS+J7BvcxzRzIIWs6q8XFRhVOb3dG3oX9xi6ovzbsnxW2owmN+EAuYQbHIjI8xkVwt+020JeXuqaZu1tZyxjffi5g434haE5pBsRYjeDkRzC8NqzWXxvI498F5raHCBpOQ3nIczki2XQXATPUiRw+DiIc48C4Ztb7c/DvUrG5014cc5bxSv1StTMsxrTwaB7BZV512/2u/wChh8nKxSrrrt/td/0MPk5e99vHhvOpLTMTQfyfK74SAXhv8eG+4d7Cbci3sUoqoeFYpLTTMqIHbEkbg5p8wRxBFwR2FWd0M0vgxGmbPF1XCzZo75xvtmD2g7weI8UVn101VHHK0slY2Rp3te0OB5g5LuRERzpPqSoJwXUv7HJwDbmIn96M+j9kjkVCWkWjlTQzmnqW7Lhm0jNr28HMdxHluKtmtA114MyXDHzEDbp3Mew8bOcGPbyIcD9kIqvCIiK3nUvQGTF43WuIY5ZD93ox75FY1RrqR0UNPSOq5RaSptsA7xC2+x94ku5bKkpGIiIgIiICIiAVXDWfoDJQ1D5o2k0sri6Nw3RucbmJ/ZmcjxHeFY9dc9Ox7Sx7Wva4Wc1wBBB4EHIhBT1FYPG9SGGTEuh6SkceEZBZ/puvbwIWtz/o9v8AiVg+1Cf4PRdofUuYDrqlFJFSR0r56sMbFEQQWvIGy1xaOtewFwO/MBeuj/R8Zf4arcRxEcQafa5xt7Fv+i+gVBQZ08fXIsZXnakI7No+iO4WCDq0C0YfSQOdUO6SqqHmarfvvI7c0HsaDb2rZkREFgNLtC6TEYujqG2c2/RSNsHxk/JPEdrTkVn0QVo0s1XYhQku2DUQjdLECbD/AKjN7PeO9aerjrXMb1eYXVkumpmbZ3vZeN/MuZa/jdF2hnVPp6ygndDUG1PORtO39HIMg8j5JGR5A8FYWnqWPaHxua9rhdrmkEEdoIyKjKt1A0LjeGeeLudsPA5XAPvXGG6lqinPwGJ1ELeIjaW58hJb3IJRWGx+qw+Nu1VCIngHNa55+aN69k2GbcAgfJIeq1pkDtl7tm3WLhxNs+ZXkw/RCjhO02MOd8qQl7va7csZ20ZYvPisR+/4aLR6LS107pmx/qlO49XIDqgAdRvEm2/dmpIwzDIqeJsUTdlrfaTxLjxJXrsilaRVr4/Fph3MeZn6/wB9BV61yUz5MZMcbXSPdFCGtaCXE2dkAMyrCrFx6OUwrH12zed8bYi4kmzG8Gj4pPE8bLN6lfItUuNObtfqpHc6SIO+6XLz4fJiuDVAnMUlOdzhI09HI2+bXOHVI7wbg7lZ9fEsTXAtcA4HIggEEd4O9F21rQzWHR4iwdG7o5gLvheRtDtLPlt7x42W0LS8Z1SYXO7pGRupJL3D6Z3R2Pbs+jfkAviDR3HafqwV8VUwbm1kLtrxljNz4ojd1HOu/SCOLDzS3HSVLmgN4iNjg97j3XaB4r21Q0ocNln8mxfvt6ckd4Drj3LVX6kq+pmM+IVzXvd6RY1z3ZbgC7ZDQOwCyCG1J+rbVLLUPbVVzDHALOZE4EOm4jaG9sfPN3LNSRozqrw2iIe2Pp5Rukms4g9rG22W8wL963BF24a0AWGQG5coiIIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiIP/Z"; var body = 'My firstdfsfsfd'; FB.api(pageid + '/photos', 'post', { message: body, source: buff, }, function (resf) { if (!resf || resf.error) { console.log(!resf ? 'error occurred' : resf.error); return; } console.log( resf); res.send(resf); }); 

我有这个错误:

 { "error": { "message": "(#324) Requires upload file", "type": "OAuthException", "code": 324 } } 

这个电话正在工作:

 var body = 'My firstdfsfsfd'; FB.api(pageid + '/photos', 'post', { message: body, url: 'url_image', }, function (resf) { if (!resf || resf.error) { console.log(!resf ? 'error occurred' : resf.error); return; } console.log( resf); res.send(resf); }); 

我忘了什么?

分段上传是否允许使用此模块: https : //github.com/Thuzi/facebook-node-sdk/

它似乎不支持多部分。 您可以使用请求模块手动执行此操作:

 var request = require('request'); // .... var access_token = 'abc123', pageid = 'me', fburl = 'https://graph.facebook.com/' + pageid + '/photos?access_token=' + access_token, req, form; req = request.post(fburl, function(err, res, body) { if (err) return console.error('Upload failed:', err); console.log('Upload successful! Server responded with:', body); }); form = req.form() // append a normal literal text field ... form.append('message', 'My photo!'); // append a file field by streaming a file from disk ... form.append('source', fs.createReadStream(path.join(__dirname, 'photo.jpg'))); // or append a Buffer ... form.append('source', someBuffer); // or append the contents of a remote url ... form.append('source', request('http://google.com/doodle.png')); 

上面的示例(来自mscdex)适用于:

 form.append('source', requestLib('<imageURL>')); 

给出回应:

{ “ID”: “756317401077924”, “POST_ID”: “100000990137087_756310827745248”}

也适用于:

 form.append('source', fs.createReadStream('<imagepath>')); 

给出回应:

{ “ID”: “756328687743462”, “POST_ID”: “100000990137087_756310827745248”}

这可能是我所需要的。 谢谢mscdex,非常有帮助。 但出于好奇,当我用图像缓冲区replace它时:

 form.append('source', imageBuffer); 

它给出与OP相同的错误(即使使用与OP相同的图像string):

{“error”:{“message”:“(#324)需要上传文件”,“type”:“OAuthException”,“code”:324}}

为什么? 我的猜测是Facebook想要一个编码图像的特定格式。