使用Oauth在Node.js中将图像发布到twitter

我正在尝试使用Oauth模块将图像发布到Twitter。 这是我有什么:

它抛出了一个403错误,我知道我做了错误的方式如何添加媒体的post,但林只是不知道该从哪里去。

var https = require('https'); var OAuth= require('oauth').OAuth; var keys = require('./twitterkeys'); var twitterer = new OAuth( "https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/access_token", keys.consumerKey, keys.consumerSecret, "1.0", null, "HMAC-SHA1" ); var params = { status : "Tiger!", media : [("data:" + mimeType + ";base64,") + fs.readFileSync(path,'base64')] }; //function(url, oauth_token, oauth_token_secret, post_body, post_content_type, callback) twitterer.post("https://upload.twitter.com/1/statuses/update_with_media.json", keys.token, keys.secret, params, "multipart/form-data", function (error, data, response2) { if(error){ console.log('Error: Something is wrong.\n'+JSON.stringify(error)+'\n'); }else{ console.log('Twitter status updated.\n'); console.log(response2+'\n'); } }); 

这是我相信我所做的,但我不知道如何在Node.js Oauth模块中做到这一点。 使用Twitter + OAuth将图像发布到Twitter

回顾一下代码,看起来好像在node-oauth包中没有任何multipart/form-data处理。 您仍然可以使用node-oauth函数来创build授权标头,但是您必须自己完成多部分内容。

可能有第三方库可以帮助,但这是我如何得到它的手工构build。

 var data = fs.readFileSync(fileName); var oauth = new OAuth( 'https://api.twitter.com/oauth/request_token', 'https://api.twitter.com/oauth/access_token', twitterKey, twitterSecret, '1.0', null, 'HMAC-SHA1'); var crlf = "\r\n"; var boundary = '---------------------------10102754414578508781458777923'; var separator = '--' + boundary; var footer = crlf + separator + '--' + crlf; var fileHeader = 'Content-Disposition: file; name="media"; filename="' + photoName + '"'; var contents = separator + crlf + 'Content-Disposition: form-data; name="status"' + crlf + crlf + tweet + crlf + separator + crlf + fileHeader + crlf + 'Content-Type: image/jpeg' + crlf + crlf; var multipartBody = Buffer.concat([ new Buffer(contents), data, new Buffer(footer)]); var hostname = 'upload.twitter.com'; var authorization = oauth.authHeader( 'https://upload.twitter.com/1/statuses/update_with_media.json', accessToken, tokenSecret, 'POST'); var headers = { 'Authorization': authorization, 'Content-Type': 'multipart/form-data; boundary=' + boundary, 'Host': hostname, 'Content-Length': multipartBody.length, 'Connection': 'Keep-Alive' }; var options = { host: hostname, port: 443, path: '/1/statuses/update_with_media.json', method: 'POST', headers: headers }; var request = https.request(options); request.write(multipartBody); request.end(); request.on('error', function (err) { console.log('Error: Something is wrong.\n'+JSON.stringify(err)+'\n'); }); request.on('response', function (response) { response.setEncoding('utf8'); response.on('data', function (chunk) { console.log(chunk.toString()); }); response.on('end', function () { console.log(response.statusCode +'\n'); }); });