DRYな備忘録

Don't Repeat Yourself.

Could not authenticate with OAuth【OAuth】【twitter API】【favorites/create】

【問題】

twitter OAuth を使ってnode.jsで作ったtwitter botに特定のツイートをファボらせたい。

ためしにツイート投稿API(statuses/update)を叩き、これは正常に動くのだが、

favorites/create API

 { statusCode: 401,
  data: '{"request":"\\/1\\/favorites\\/create\\/132256714090229760.json","error":"Could not authenticate with OAuth."}' }

を返す。おっかしーなー

【原因】

APIに渡すパラメータの渡し方が間違ってた。笑っちゃうほど阿呆くさいミス(これで1日喰ったけどね) なので問題コードの詳細は割愛

【解決】

以下、コード全文

my_modules/twitter.js

/**
 * my module
 * twitter.js
**/

var conf = require('../my_conf.js').conf;

var OAuth = require('oauth').OAuth;
var oauth = new OAuth(
  conf.request_token,
  conf.access_token_app,
  conf.consumer_key,
  conf.consumer_secret,
  conf.oauth_version, // 1.0
  null,
  conf.encryption
);

// これ動いた。(゚⊿゚)
exports.fav = function(params, callback){
  // dataで渡すんじゃなくて、叩くurlで渡すのがいいみたい
  var favorites_create_target = conf.favorites_create_api + params.id + '.json';
  try{
    oauth.post(
      favorites_create_target,
      conf.access_token,
      conf.access_token_secret,
      null,
      function(err, data){
        callback(err,data);
      }
    );
  }catch(e){
    callback(e,e);
  }
};

// これは動かない
//   data: '{"request":"\\/1\\/favorites\\/create\\/:id.json","error":"Could not authenticate with OAuth."}' }
exports.fav_dont_work = function(params, callback){
  try{
    oauth.post(
      favorites_create_api,
      conf.access_token,
      conf.access_token_secret,
      params.id + '.json',
      function(err, data){
        callback(err,data);
      }
    );
  }catch(e){
    callback(e,e);
  }
};

// ちなみにこれは動く。https://twitter.com/twit_tap/status/267605921008590849
exports.tweet = function(params, callback){
  try{
    oauth.post(
      conf.status_update_api,
      conf.access_token,
      conf.access_token_secret,
      {status: params.message},
      function(err, data){
        callback(err, data);
      }
    );
  }catch(e){
      callback(e,e);
  }
};

my_conf.js

/**
 * conf.js
**/

exports.conf = { 

    // app
    request_token   : 'https://api.twitter.com/oauth/request_token',
    access_token_app: 'https://api.twitter.com/oauth/access_token',
    consumer_key    : CONSUMERKEY_OF_YOUR_APP,
    consumer_secret : CONSUMERSECRET_OF_YOUR_APP,
    //callback_url    : 'http://twittap.com/auth',

    // const
    oauth_version : '1.0',
    encryption    : 'HMAC-SHA1',

    // api end point
    statuses_update_api    : 'https://api.twitter.com/1/statuses/update.json',
    favorites_create_api   : 'https://api.twitter.com/1/favorites/create/',
    friendships_create_api : 'https://api.twitter.com/1/friendships/create.json',

    // bot
    access_token        : ACCESSTOKEN_OF_YOUR_BOT_ACCOUNT,
    access_token_secret : ACCESSTOKENSECRET_OF_YOUR_BOT_ACCOUT,

};

test/fav_runner.js

/**
 * test for fav
**/

var twitter_bot = require('../modules/twitter.js');

var params = { 
    id : '267633222240849922',
};

twitter_bot.fav(params,function(err,data){
    console.log("=ERROR===========================\n",err);
    console.log("=DATA============================\n",data);
});

【参考】

TwitterにPHPでツイートするときのはまりどころ - オレスタ

Could not authenticate with OAuth.|プログラム系の覚書

人生ずっと勉強。 Twitter API でCould not authenticate with OAuthエラーが出ると思ったらアクセストークン設定できてなかった

POST favorites/create/:id | Twitter Developers