从node.js上传图片到twitter API

我试图发布一个图像到Twitter的API,V1.1我已经尝试过所有的例子,似乎没有任何东西可以发布。 包括使用Oauth在Node.js中将图像发布到twitter

我正在使用那里提到的oauth库,我也有jsOauth,我想我会按照https://gist.github.com/lukaszkorecki/1038408

什么都没有起作用,在这一点上我开始失去希望,甚至可以做到这一点。

function postStatusWithMedia(status, file) { var err = new Object(); if(fs.existsSync(file) === false) { err.message = "File not found :("; parseTwitterError(err); } else { var oauth = OAuth(options = { "consumerKey": consumer_key, "consumerSecret": consumer_secret, "accessTokenKey": access_token, "accessTokenSecret": access_token_secret }); callbacks = { onSuccess : function() { console.log('upload worked!') }, onFailure : function() { console.log('upload failed!'); console.dir(arguments); } }, uploadData = { 'status' : status, 'media' : Base64.encode(fs.readFileSync(file)) }; oauth.post('https://api.twitter.com/1.1/statuses/update_with_media.json',uploadData, callbacks.onSuccess, callbacks.onFailure); return false; } } 

如果做不到,你能解释一下为什么 ? 否则,任何可能导致我走向正确方向的东西都会很棒。

 var fs = require('fs'); var request = require('request'); var FormData = require('form-data'); var utf8 = require('utf8'); // Encode in UTF-8 status = utf8.encode(status); var form = new FormData(); form.append('status', status) form.append('media[]', fs.createReadStream(file)); // Twitter OAuth form.getLength(function(err, length){ if (err) { return requestCallback(err); } var oauth = { consumer_key: consumer_key, consumer_secret: consumer_secret, token: access_token, token_secret: access_token_secret }; var r = request.post({url:"https://api.twitter.com/1.1/statuses/update_with_media.json", oauth:oauth, host: "api.twitter.com", protocol: "https:"}, requestCallback); r._form = form; r.setHeader('content-length', length); }); function requestCallback(err, res, body) { if(err) { throw err; } else { console.log("Tweet and Image uploaded successfully!"); } } 

我最终使用requestnode-form-data来手动构造一个multipart / form-data请求并发送状态请求, utf8是将状态编码为UTF-8,而不是这样做导致的问题与“<3”和其他人物。

我没有testing这些code.Its从我的同事。代码正在工作。 也许这会有所帮助。

//twitter_update_with_media.js

  (function() { var fs, path, request, twitter_update_with_media; fs = require('fs'); path = require('path'); request = require('request'); twitter_update_with_media = (function() { function twitter_update_with_media(auth_settings) { this.auth_settings = auth_settings; this.api_url = 'https://api.twitter.com/1.1/statuses/update_with_media.json'; } twitter_update_with_media.prototype.post = function(status, imageUrl, callback) { var form, r; r = request.post(this.api_url, { oauth: this.auth_settings }, callback); form = r.form(); form.append('status', status); return form.append('media[]', request(imageUrl)); }; return twitter_update_with_media; })(); module.exports = twitter_update_with_media; }).call(this); 

下一个文件//upload_to_twitter.js

  var tuwm = new twitter_update_with_media({ consumer_key: TWITTER_OAUTH_KEY, consumer_secret: TWITTER_OAUTH_SECRET, token: access[0], token_secret: access[1] }); media_picture.picture = imageURL; if (media_picture.picture) { console.log('with media upload'); request.head(media_picture.picture, function (error, response, body) { if (!error && response.statusCode == 200) { var image_size = response.headers['content-length']; if (image_size > 2000000) { // 2mb max upload limit console.log('greater than 2mb'); sendMessageWithoutImage(err, req, res, next, twit, wallpost, access); } else { console.log('less than 2mb'); console.log('twitter text', content); tuwm.post(content, media_picture.picture, function(err, response) { if (err) { console.log('error', err); return next(err); } error_parse = JSON.parse(response.body); console.log('with media response', response.body); if (error_parse.errors) { console.log('have errors', error_parse); res.json({ status: 500, info: error_parse.errors[0].code + ' ' + error_parse.errors[0].message }); } else { res.json({ status: 200, info: "OK", id: response.id }); } }); } } });