Last active
August 29, 2015 14:24
-
-
Save hachi-eiji/cbeb17aa8925e4e007ec to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
}); | |
} | |
]) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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