Skip to content

Instantly share code, notes, and snippets.

@hachi-eiji
Last active August 29, 2015 14:24
Show Gist options
  • Save hachi-eiji/cbeb17aa8925e4e007ec to your computer and use it in GitHub Desktop.
Save hachi-eiji/cbeb17aa8925e4e007ec to your computer and use it in GitHub Desktop.
var mediaIds = []; // ツイート内容とアップした画像を紐付けるためのID
async.series([
function (next) {
// 画像を取得する
var attachImages = getImageBinary();
if (_.isEmpty(attachImages)) {
return next();
}
async.each(attachImages, function (image, done) {
twitterService.uploadMedia(token, {media: image}, function (err, mediaIdString) {
if (err) {
return done(err);
}
mediaIds.push(mediaIdString);
done();
});
}, function (err) {
if (err) {
// log
}
// 画像アップ失敗しても投稿は実行させる
next();
});
},
function (next) {
var status = {
status: 'ツイートメッセージ'
};
if (!_.isEmpty(mediaIds)) {
status.media_ids = mediaIds.join();
}
twitterService.tweet(token, status, function (err) {
if (err) {
// { "errors": [ { "code": 88, "message": "Rate limit exceeded" } ] }はAPI制限越えている
if (!_.isArray(err) || ( _.isArray(err) && err[0].code !== 88)) {
return next('twitter.failedTweet');
} else {
// log
}
}
next();
});
}
])
var config = {
twitter: {
consumerKey: '', // Twitterの管理画面から取得する
consumerSecret: '', // Twitterの管理画面から取得する
oauth: {
requestTokenUrl: 'https://api.twitter.com/oauth/request_token',
accessTokenUrl: 'https://api.twitter.com/oauth/access_token',
authenticateUrl: 'https://twitter.com/oauth/authenticate?oauth_token=',
version: '1.0',
signatureMethod: 'HMAC-SHA1',
callbackUrl: undefined // callbackURLをundefinedにするとPin認証になる
}
}
};
var Twitter = require('twitter');
var OAuth = require('oauth').OAuth;
var twitterConfig = config.twitter;
var oauthConfig = twitterConfig.oauth;
var clientConfig = config.twitter.client || {};
var oauth = new OAuth(
oauthConfig.requestTokenUrl,
oauthConfig.accessTokenUrl,
twitterConfig.consumerKey,
twitterConfig.consumerSecret,
oauthConfig.version,
oauthConfig.callbackUrl,
oauthConfig.signatureMethod
);
function TwitterService() {
}
module.exports = new TwitterService();
/**
* Twitterクライアント作成.
* @param {Object} token トークンオブジェクト
* @param {String} token.oauth_access_token authCallbackで取得したoauth_access_token
* @param {String} token.oauth_token_secret authCallbackで取得したoauth_token_secret
* @return {Twitter|exports|module.exports}
*/
function createClient(token) {
return new Twitter(_.merge(clientConfig, {
consumer_key: twitterConfig.consumer_key,
consumer_secret: twitterConfig.consumer_secret,
access_token_key: token.oauth_access_token,
access_token_secret: token.oauth_token_secret
}));
}
/**
* OAuthTokenを取得する.
* tokenの情報と認証用のURLのリダイレクト先を返却する.
*
* @param {Function} callback
*/
TwitterService.prototype.getOAuthToken = function (callback) {
oauth.getOAuthRequestToken(function (err, oauth_token, oauth_token_secret) {
if (err) {
return callback(err);
}
return callback(null, {
oauth_token: oauth_token,
oauth_token_secret: oauth_token_secret
}, oauthConfig.authenticateUrl + oauth_token);
});
};
/**
* Twitterから呼び出されるcallback処理.
*
* @param {String} oauth_token getOAuthToken処理で取得したoauth_token
* @param {String} oauth_token_secret getOAuthToken処理で取得したoauth_token_secret
* @param {String} oauth_verifier pinコード or Twitterのcallback時にクエリに付与されているoauth_verifier
* @parma {Function} callback
*/
TwitterService.prototype.authCallback = function (oauth_token, oauth_token_secret, oauth_verifier, callback) {
oauth.getOAuthAccessToken(oauth_token, oauth_token_secret, oauth_verifier, function (err, oauth_access_token, oauth_access_token_secret) {
if (err) {
return callback(err);
}
return callback(null, {
oauth_access_token: oauth_access_token,
oauth_access_token_secret: oauth_access_token_secret
});
});
};
/**
* ファイルをupする.
* callbackにmedia_id_stringを返却しているのはmedia_idとmedia_id_stringがずれている時に,media_idを指定しても正しく認識されなかった事があったため.
*
* @param {Object} token
* @param {String} token.oauth_access_token authCallbackで取得したoauth_access_token
* @param {String} token.oauth_token_secret authCallbackで取得したoauth_token_secret
* @param {Object} params アップロード時に必要なパラメータ
* @param {Function} callback
*/
TwitterService.prototype.uploadMedia = function (token, params, callback) {
var client = createClient(token);
client.post('media/upload', params, function (err, media) {
if (err) {
return callback(err);
}
callback(null, media ? media.media_id_string : null);
});
};
/**
* ツイートを行う.
*
* @param {Object} token
* @param {String} token.oauth_access_token authCallbackで取得したoauth_access_token
* @param {String} token.oauth_token_secret authCallbackで取得したoauth_token_secret
* @param {Object} params ツイート時に必要なパラメータ
* @param {Function} callback
*/
TwitterService.prototype.tweet = function (token, params, callback) {
var client = createClient(token);
client.post('statuses/update', params, function (err) {
if (err) {
return callback(err);
}
callback(null, null);
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment