2012-10-16 36 views
7

我試圖使用Oauth模塊將圖像發佈到Twitter。這是我有:使用Oauth將圖像發佈到Node.js中的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'); 
      } 
      }); 

這裏是我相信的IM supose在做,但我不知道該怎麼做了Node.js的的Oauth模塊中。 Posting image to twitter using Twitter+OAuth

+0

第一件事情是,你是否安裝了nodejs? – Chamilyan

+0

是的,我可以使用正常狀態更新我的twitter狀態/通過api.twiiter.com更新,而不是媒體。 –

+0

我相信我的問題附加到表單數據的職位。 –

回答

13

檢查代碼,它看起來像有沒有multipart/form-datanode-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'); 
    }); 
});  
+0

感謝您花時間編碼! – Luc

+0

顯然有一些改進要做 - 特別是'邊界'應該有一個隨機元素,但這是我拼湊起來的第一件事情,就是對JS完全新開發,並且從那時起我們的項目就開始了。我從來沒有機會。 –

相關問題