/** * Flux RSS Twitter - Google Apps Script * * Application Google pour créer des flux RSS twitter * d'une timeline, de #, de mots clés ou même de liste * * @reauthor Franck Rocca <franck@franckrocca.com> * */ function start() { // Obtenez vos infos applis sur dev.twitter.com/apps var CONSUMER_KEY = "mettez ici votre KEY"; var CONSUMER_SECRET = "mettez ici votre SECRET KEY"; initialize(CONSUMER_KEY, CONSUMER_SECRET); } function initialize(key, secret) { ScriptProperties.setProperty("TWITTER_CONSUMER_KEY", key); ScriptProperties.setProperty("TWITTER_CONSUMER_SECRET", secret); var url = ScriptApp.getService().getUrl(); if (url) { connectTwitter(); var msg = ""; msg += "Exemple de Flux RSS pour Twitter\n"; msg += "============================"; msg += "\n\nTwitter Timeline of user @kalipseo"; msg += "\n" + url + "?action=timeline&q=kalipseo"; msg += "\n\nTwitter Favorites of user @kalipseo"; msg += "\n" + url + "?action=favorites&q=kalipseo"; msg += "\n\nTwitter List kalipseo/kalipseo"; msg += "\n" + url + "?action=list&q=kalipseo/kalipseo"; msg += "\n\nTwitter Search for Sydney Australia"; msg += "\n" + url + "?action=search&q=sydney+australia"; msg += "\n\nRemplacez les valeurs du paramètre 'q' dans l'url par celle que vous voulez."; msg += "\n\nPour d'autres infos écrivez moi à franck@franckrocca.com"; MailApp.sendEmail(Session.getActiveUser().getEmail(), "Flux RSS Twitter", msg); } } function doGet(e) { var a = e.parameter.action; var q = e.parameter.q; var feed; var permalink; var description; switch (a) { case "timeline": feed = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" + q; permalink = "https://twitter.com/" + q; description = "Twitter updates from " + q + "."; break; case "search": feed = "https://api.twitter.com/1.1/search/tweets.json?q=" + encodeString (q); permalink = "https://twitter.com/search?q=" + encodeString (q); description = "Twitter updates from search for: " + q + "."; break; case "favorites": feed = "https://api.twitter.com/1.1/favorites/list.json?screen_name=" + q; permalink = "https://twitter.com/" + q + "/favorites/"; description = "Twitter favorites from " + q + "."; break; case "list": var i = q.split("/"); feed = "https://api.twitter.com/1.1/lists/statuses.json?slug=" + i[1] + "&owner_screen_name=" + i[0]; permalink = "https://twitter.com/" + q; description = "Twitter updates from " + q + "."; break; default: feed = "https://api.twitter.com/1.1/statuses/user_timeline.json"; permalink = "https://twitter.com"; description = "Twitter timeline."; break; } var id = Utilities.base64Encode(feed); var cache = CacheService.getPublicCache(); var rss = cache.get(id); if (!rss) { rss = jsonToRss(feed, permalink, description, a, q); cache.put(id, rss, 900); } return ContentService.createTextOutput(rss) .setMimeType(ContentService.MimeType.RSS); } function jsonToRss(feed, permalink, description, type, key) { oAuth(); var options = { "method": "get", "oAuthServiceName":"twitter", "oAuthUseToken":"always" }; try { var result = UrlFetchApp.fetch(feed, options); if (result.getResponseCode() === 200) { var tweets = Utilities.jsonParse(result.getContentText()); if (type == "search") { tweets = tweets.statuses; } if (tweets) { var len = tweets.length; var rss = ""; if (len) { rss = ''; rss += 'Twitter ' + type + ': ' + key + ''; rss += ' ' + permalink + ''; rss += '' + description + ''; for (var i = 0; i < len; i++) { var sender = tweets[i].user.screen_name; var tweet = htmlentities(tweets[i].text); var date = new Date(tweets[i].created_at); if (i === 0) { rss += '' + date.toUTCString() + ''; } rss += "" + sender + ": " + tweet + ""; rss += "" + date.toUTCString() + ""; rss += "" + tweets[i].id_str + ""; rss += " https://twitter.com/" + sender + "/statuses/" + tweets[i].id_str + ""; rss += "" + tweet + ""; rss += ""; } rss += ""; return rss; } } } } catch (e) { Logger.log(e.toString()); } } function connectTwitter() { oAuth(); var search = "https://api.twitter.com/1.1/application/rate_limit_status.json"; var options = { "method": "get", "oAuthServiceName":"twitter", "oAuthUseToken":"always" }; try { var result = UrlFetchApp.fetch(search, options); } catch (e) { Logger.log(e.toString()); } } function encodeString(q) { var str = encodeURIComponent(q); str = str.replace(/!/g,'%21'); str = str.replace(/\*/g,'%2A'); str = str.replace(/\(/g,'%28'); str = str.replace(/\)/g,'%29'); str = str.replace(/'/g,'%27'); return str; } function htmlentities(str) { str = str.replace(/&/g, "&"); str = str.replace(/>/g, ">"); str = str.replace(/ str = str.replace(/"/g, """); str = str.replace(/'/g, "'"); return str; } function oAuth() { var oauthConfig = UrlFetchApp.addOAuthService("twitter"); oauthConfig.setAccessTokenUrl("https://api.twitter.com/oauth/access_token"); oauthConfig.setRequestTokenUrl("https://api.twitter.com/oauth/request_token"); oauthConfig.setAuthorizationUrl("https://api.twitter.com/oauth/authorize"); oauthConfig.setConsumerKey(ScriptProperties.getProperty("TWITTER_CONSUMER_KE Y")); oauthConfig.setConsumerSecret(ScriptProperties.getProperty("TWITTER_CONSUMER_S ECRET")); }