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

时间:2012-10-16 18:43:04

标签: node.js twitter twitter-oauth

我正在尝试使用Oauth模块将图片发布到Twitter。这就是我所拥有的:

它引发403错误,我知道我在如何将媒体添加到帖子时做错了但是我不知道从哪里开始。

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模块中做到这一点。 Posting image to twitter using Twitter+OAuth

1 个答案:

答案 0 :(得分:13)

查看代码,现在似乎multipart/form-data包中没有node-oauth处理 。您仍然可以使用node-oauth函数创建授权标题,但您必须自己完成多部分内容。

可能有第三方图书馆可以帮助解决这个问题,但这就是我如何通过手工构建它来实现的。

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