2012-10-16 9 views
7

Oauthモジュールを使用して画像をTwitterに投稿しようとしています。Oauthを使用してNode.jsのツイッターに画像を投稿する

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

は私がやっているイムsuposeを信じたが、私はNode.jsののOAuthモジュールでそれを行う方法がわからないものです。コードの確認 Posting image to twitter using Twitter+OAuth

+0

まず、nodejsがインストールされていますか? – Chamilyan

+0

はい、私のtwitterのステータスを更新するには、通常のステータス/アップデートをapi.twiiter.comを使って、メディアではできません。 –

+0

私は自分の問題が投稿にフォームデータを添付すると信じています。 –

答えて

13

node-oauthパッケージ内のすべてのでを扱う何multipart/form-dataがありませんように、それが見えます。 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

明らかに、 'boundary 'にはランダムな要素があるはずですが、これは私がJSに完全に合っていて合理的にうまくいっているために結んだ最初のものでした。私たちのプロジェクトはそれ以来ずっと続いています私は決してチャンスを得なかった。 –

関連する問題