Try it out
Apps
Blog
About
Contact
Developers
Docs
Login
Developers
tweet@obindo.com
Written by
Chuck
Post the contents of a message, and any attached photos, to Twitter.
/*! * TWEET posts the contents of an email to Twitter */ //#region PRIVATE consumer key and secret var requestTokenUrl = 'https://api.twitter.com/oauth/request_token'; var authRedirectUrl= 'https://api.twitter.com/oauth/authenticate?oauth_token='; var accessTokenUrl= 'https://api.twitter.com/oauth/access_token'; var tweetUrl= 'https://api.twitter.com/1.1/statuses/update.json'; var uploadUrl= 'https://upload.twitter.com/1.1/media/upload.json'; var sigMethod= 'HMAC-SHA1'; var oAuthVersion= '1.0'; //OAUTH2 function getDefaultParams() { return { oauth_consumer_key: consumerKey, oauth_nonce: util.getNonce(), oauth_signature_method: sigMethod, oauth_timestamp: util.getTimeStamp(), oauth_version: oAuthVersion }; } function getSig(args, action, url, key) { var sigBase= action + '&' + util.urlEncode(url) + '&' + util.urlEncode(args); return util.getSignature(sigBase, key); } function getRequestTokenUrl() { var params= getDefaultParams(); params.oauth_callback= oauth2.getCallbackUrl(); var args= util.getQueryArgsFromObject(params); var sig= getSig(args, 'GET', requestTokenUrl, consumerSecret + '&'); return requestTokenUrl + '?' + args + '&oauth_signature=' + sig; } function getAccessToken(authResponse) { var params= getDefaultParams(); params.oauth_token= authResponse.oauth_token; var args= util.getQueryArgsFromObject(params); var sig= getSig(args, 'POST', accessTokenUrl, consumerSecret + '&' + tokens.requestToken.oauth_token_secret); var url= accessTokenUrl + "?" + args + "&oauth_verifier=" + authResponse.oauth_verifier + "&oauth_signature=" + sig; return post({ url: url, header: { Authorization : 'OAuth' } }); } oauth2.getAuthRedirectUrl= function(q) { var requestUrl= getRequestTokenUrl(); var response= get(requestUrl); var t= util.getObjectFromQueryArgs(response.text); if (q) { var o= util.getObjectFromQueryArgs(q); if (o.redirect_uri) t.redirect_uri= o.redirect_uri; } tokens.requestToken= t; return authRedirectUrl + t.oauth_token; } oauth2.onAuthResponse= function(q) { var authResponse= util.getObjectFromQueryArgs(q); var accessResponse= getAccessToken(authResponse); tokens.accessToken= util.getObjectFromQueryArgs(accessResponse.text); if (tokens.requestToken && tokens.requestToken.redirect_uri) return tokens.requestToken.redirect_uri; } //TWITTER API function tweet(text, mediaIds) { var params= getDefaultParams(); params.oauth_token= tokens.accessToken.oauth_token; params.status= text; if (mediaIds) params.media_ids= mediaIds; var args= util.getQueryArgsFromObject(params); var sig= getSig(args, 'POST', tweetUrl, consumerSecret + '&' + tokens.accessToken.oauth_token_secret); params.oauth_signature= sig; var authHeader= util.getHeaderArgsFromObject(params); var header= { 'Authorization': 'OAuth ' + authHeader, 'Content-Type': 'application/x-www-form-urlencoded'}; var tweetArgs= {status : text}; if (mediaIds) tweetArgs.media_ids= mediaIds; var response= post({ url: tweetUrl, header: header,args: tweetArgs }); return util.jsonify(response.text); } function uploadImage(img) { var url= 'https://upload.twitter.com/1.1/media/upload.json'; var params= getDefaultParams(); params.oauth_token= tokens.accessToken.oauth_token; var args= util.getQueryArgsFromObject(params); var sig= getSig(args, 'POST', url, consumerSecret + '&' + tokens.accessToken.oauth_token_secret); params.oauth_signature= sig; var header= util.getHeaderArgsFromObject(params); var response= post({ url: url, header: { Authorization : 'OAuth ' + header }, args: { 'media': img } }); return util.jsonify(response.text); } //UTIL function getTweet(m, maxLength) { var text; if (m.selections) { text= m.selections.tweet; return getTweetFromText((text) ? text : ''); } text= getTweetFromText(m.text); return (text.length > 0) ? text : getTweetFromText(m.subject); } function getTweetFromText(s, maxLength) { if (!s || s.length == 0) return ''; var text= s.replace(/\s/g,' '); text= text.replace(/ {2,}/g,' '); //double spaces text= (text.length > maxLength) ? text.substring(0,maxLength) : text; return util.trim(text); } function getMediaIds(images) { var arr= []; for (var i=0; i < images.length; i++) { var media= uploadImage(images[i]); arr.push(media.media_id_string); } return (arr.length > 0) ? arr.join(',') : null; } function getImages(m) { if (!m.files) return []; var maxFiles= 4; var arr= []; for (var i=0; i < m.files.length; i++) { if (m.files[i].contentType.toLowerCase().indexOf('image/') == 0) { arr.push(m.files[i]); if (arr.length >= maxFiles) break; } } return arr; } function sendConfirm(info) { var emailArgs= { to: message.from.emailAddress, templateFields: { recipientName: message.from.name } }; if (info) { message.appUrl= 'https://twitter.com/'+ info.user.screen_name +'/status/' + info.id_str; emailArgs.subject= "Obindo tweeted for you!"; emailArgs.text= "Check it out!"; emailArgs.templateFields.buttonText= 'View in Twitter'; emailArgs.templateFields.buttonLink= message.appUrl; } else { emailArgs.subject= "Obindo didn't know what to do with that one"; emailArgs.text= "We're sorry, we didn't see any text or images, so we didn't know what you wanted to tweet. " + "Please try us again next time you want to tweet directly from your email."; } emailArgs.text+= "\n\nThanks for using Obindo!"; sendEmail(emailArgs); } $(function() { var images= getImages(message); var mediaIds= getMediaIds(images); var text= getTweet(message, (mediaIds) ? 117 : 140); var info= null; if (text.length > 0 || mediaIds) info= tweet(text, mediaIds); sendConfirm(info); });