/********************************************************************* * #### Twitter Post Fetcher v18.0.3 #### * Coded by Jason Mayes 2015. A present to all the developers out there. * www.jasonmayes.com * Please keep this disclaimer with my code if you use it. Thanks. :-) * Got feedback or questions, ask here: * http://www.jasonmayes.com/projects/twitterApi/ * Github: https://github.com/jasonmayes/Twitter-Post-Fetcher * Updates will be posted to this site. *********************************************************************/ (function(root, factory) { if (typeof define === "function" && define.amd) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof exports === "object") { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } else { // Browser globals. factory(); } })(this, function() { var domNode = ""; var maxTweets = 20; var parseLinks = true; var queue = []; var inProgress = false; var printTime = true; var printUser = true; var formatterFunction = null; var supportsClassName = true; var showRts = true; var customCallbackFunction = null; var showInteractionLinks = true; var showImages = false; var useEmoji = false; var targetBlank = true; var lang = "en"; var permalinks = true; var dataOnly = false; var script = null; var scriptAdded = false; function handleTweets(tweets) { if (customCallbackFunction === null) { var x = tweets.length; var n = 0; var element = document.getElementById(domNode); var html = ""; element.innerHTML = html; } else { customCallbackFunction(tweets); } } function strip(data) { return data .replace(/]*>(.*?)<\/b>/gi, function(a, s) { return s; }) .replace( /class="(?!(tco-hidden|tco-display|tco-ellipsis))+.*?"|data-query-source=".*?"|dir=".*?"|rel=".*?"/gi, "" ); } function targetLinksToNewWindow(el) { var links = el.getElementsByTagName("a"); for (var i = links.length - 1; i >= 0; i--) { links[i].setAttribute("target", "_blank"); links[i].setAttribute("rel", "noopener"); } } function getElementsByClassName(node, classname) { var a = []; var regex = new RegExp("(^| )" + classname + "( |$)"); var elems = node.getElementsByTagName("*"); for (var i = 0, j = elems.length; i < j; i++) { if (regex.test(elems[i].className)) { a.push(elems[i]); } } return a; } function extractImagesUrl(image_data) { if ( image_data !== undefined && image_data.innerHTML.indexOf("data-image") >= 0 ) { var data_src = image_data.innerHTML.match(/data-image=\"([^"]+)\"/gi); for (var i = 0; i < data_src.length; i++) { data_src[i] = data_src[i].match(/data-image=\"([^"]+)\"/i)[1]; data_src[i] = decodeURIComponent(data_src[i]) + ".jpg"; } return data_src; } } var twitterFetcher = { fetch: function(config) { if (config.maxTweets === undefined) { config.maxTweets = 20; } if (config.enableLinks === undefined) { config.enableLinks = true; } if (config.showUser === undefined) { config.showUser = true; } if (config.showTime === undefined) { config.showTime = true; } if (config.dateFunction === undefined) { config.dateFunction = "default"; } if (config.showRetweet === undefined) { config.showRetweet = true; } if (config.customCallback === undefined) { config.customCallback = null; } if (config.showInteraction === undefined) { config.showInteraction = true; } if (config.showImages === undefined) { config.showImages = false; } if (config.useEmoji === undefined) { config.useEmoji = false; } if (config.linksInNewWindow === undefined) { config.linksInNewWindow = true; } if (config.showPermalinks === undefined) { config.showPermalinks = true; } if (config.dataOnly === undefined) { config.dataOnly = false; } if (inProgress) { queue.push(config); } else { inProgress = true; domNode = config.domId; maxTweets = config.maxTweets; parseLinks = config.enableLinks; printUser = config.showUser; printTime = config.showTime; showRts = config.showRetweet; formatterFunction = config.dateFunction; customCallbackFunction = config.customCallback; showInteractionLinks = config.showInteraction; showImages = config.showImages; useEmoji = config.useEmoji; targetBlank = config.linksInNewWindow; permalinks = config.showPermalinks; dataOnly = config.dataOnly; var head = document.getElementsByTagName("head")[0]; if (script !== null) { head.removeChild(script); } script = document.createElement("script"); script.type = "text/javascript"; if (config.list !== undefined) { script.src = "https://syndication.twitter.com/timeline/list?" + "callback=__twttrf.callback&dnt=false&list_slug=" + config.list.listSlug + "&screen_name=" + config.list.screenName + "&suppress_response_codes=true&lang=" + (config.lang || lang) + "&rnd=" + Math.random(); } else if (config.profile !== undefined) { script.src = "https://syndication.twitter.com/timeline/profile?" + "callback=__twttrf.callback&dnt=false" + "&screen_name=" + config.profile.screenName + "&suppress_response_codes=true&lang=" + (config.lang || lang) + "&rnd=" + Math.random(); } else if (config.likes !== undefined) { script.src = "https://syndication.twitter.com/timeline/likes?" + "callback=__twttrf.callback&dnt=false" + "&screen_name=" + config.likes.screenName + "&suppress_response_codes=true&lang=" + (config.lang || lang) + "&rnd=" + Math.random(); } else if (config.collection !== undefined) { script.src = "https://syndication.twitter.com/timeline/collection?" + "callback=__twttrf.callback&dnt=false" + "&collection_id=" + config.collection.collectionId + "&suppress_response_codes=true&lang=" + (config.lang || lang) + "&rnd=" + Math.random(); } else { script.src = "https://cdn.syndication.twimg.com/widgets/timelines/" + config.id + "?&lang=" + (config.lang || lang) + "&callback=__twttrf.callback&" + "suppress_response_codes=true&rnd=" + Math.random(); } head.appendChild(script); } }, callback: function(data) { if (data === undefined || data.body === undefined) { inProgress = false; if (queue.length > 0) { twitterFetcher.fetch(queue[0]); queue.splice(0, 1); } return; } // Remove emoji and summary card images. if (!useEmoji) { data.body = data.body.replace( /(]*>)|(]*>)/g, "" ); } // Remove display images. if (!showImages) { data.body = data.body.replace( /(]*>|(]*>))/g, "" ); } // Remove avatar images. if (!printUser) { data.body = data.body.replace(/(]*>)/g, ""); } var div = document.createElement("div"); div.innerHTML = data.body; if (typeof div.getElementsByClassName === "undefined") { supportsClassName = false; } function swapDataSrc(element) { var avatarImg = element.getElementsByTagName("img")[0]; if (avatarImg) { avatarImg.src = avatarImg.getAttribute("data-src-2x"); } else { var screenName = element .getElementsByTagName("a")[0] .getAttribute("href") .split("twitter.com/")[1]; var img = document.createElement("img"); img.setAttribute( "src", "https://twitter.com/" + screenName + "/profile_image?size=bigger" ); element.prepend(img); } return element; } var tweets = []; var authors = []; var times = []; var images = []; var rts = []; var tids = []; var permalinksURL = []; var x = 0; if (supportsClassName) { var tmp = div.getElementsByClassName("timeline-Tweet"); while (x < tmp.length) { if ( tmp[x].getElementsByClassName("timeline-Tweet-retweetCredit") .length > 0 ) { rts.push(true); } else { rts.push(false); } if (!rts[x] || (rts[x] && showRts)) { tweets.push( tmp[x].getElementsByClassName("timeline-Tweet-text")[0] ); tids.push(tmp[x].getAttribute("data-tweet-id")); if (printUser) { authors.push( swapDataSrc( tmp[x].getElementsByClassName("timeline-Tweet-author")[0] ) ); } times.push(tmp[x].getElementsByClassName("dt-updated")[0]); permalinksURL.push( tmp[x].getElementsByClassName("timeline-Tweet-timestamp")[0] ); if ( tmp[x].getElementsByClassName("timeline-Tweet-media")[0] !== undefined ) { images.push( tmp[x].getElementsByClassName("timeline-Tweet-media")[0] ); } else { images.push(undefined); } } x++; } } else { var tmp = getElementsByClassName(div, "timeline-Tweet"); while (x < tmp.length) { if ( getElementsByClassName(tmp[x], "timeline-Tweet-retweetCredit") .length > 0 ) { rts.push(true); } else { rts.push(false); } if (!rts[x] || (rts[x] && showRts)) { tweets.push( getElementsByClassName(tmp[x], "timeline-Tweet-text")[0] ); tids.push(tmp[x].getAttribute("data-tweet-id")); if (printUser) { authors.push( swapDataSrc( getElementsByClassName(tmp[x], "timeline-Tweet-author")[0] ) ); } times.push(getElementsByClassName(tmp[x], "dt-updated")[0]); permalinksURL.push( getElementsByClassName(tmp[x], "timeline-Tweet-timestamp")[0] ); if ( getElementsByClassName(tmp[x], "timeline-Tweet-media")[0] !== undefined ) { images.push( getElementsByClassName(tmp[x], "timeline-Tweet-media")[0] ); } else { images.push(undefined); } } x++; } } if (tweets.length > maxTweets) { tweets.splice(maxTweets, tweets.length - maxTweets); authors.splice(maxTweets, authors.length - maxTweets); times.splice(maxTweets, times.length - maxTweets); rts.splice(maxTweets, rts.length - maxTweets); images.splice(maxTweets, images.length - maxTweets); permalinksURL.splice(maxTweets, permalinksURL.length - maxTweets); } var arrayTweets = []; var x = tweets.length; var n = 0; if (dataOnly) { while (n < x) { arrayTweets.push({ tweet: tweets[n].innerHTML, tweetText: tweets[n].textContent, author: authors[n] ? authors[n].innerHTML : "Unknown Author", author_data: { profile_url: authors[n] ? authors[n].querySelector('[data-scribe="element:user_link"]') .href : null, profile_image: authors[n] ? "https://twitter.com/" + authors[n] .querySelector('[data-scribe="element:screen_name"]') .title.split("@")[1] + "/profile_image?size=bigger" : null, profile_image_2x: authors[n] ? "https://twitter.com/" + authors[n] .querySelector('[data-scribe="element:screen_name"]') .title.split("@")[1] + "/profile_image?size=original" : null, screen_name: authors[n] ? authors[n].querySelector( '[data-scribe="element:screen_name"]' ).title : null, name: authors[n] ? authors[n].querySelector('[data-scribe="element:name"]').title : null }, time: times[n].textContent, timestamp: times[n] .getAttribute("datetime") .replace("+0000", "Z") .replace(/([\+\-])(\d\d)(\d\d)/, "$1$2:$3"), image: extractImagesUrl(images[n]) ? extractImagesUrl(images[n])[0] : undefined, images: extractImagesUrl(images[n]), rt: rts[n], tid: tids[n], permalinkURL: permalinksURL[n] === undefined ? "" : permalinksURL[n].href }); n++; } } else { while (n < x) { if (typeof formatterFunction !== "string") { var datetimeText = times[n].getAttribute("datetime"); var newDate = new Date( times[n] .getAttribute("datetime") .replace(/-/g, "/") .replace("T", " ") .split("+")[0] ); var dateString = formatterFunction(newDate, datetimeText); times[n].setAttribute("aria-label", dateString); if (tweets[n].textContent) { // IE hack. if (supportsClassName) { times[n].textContent = dateString; } else { var h = document.createElement("p"); var t = document.createTextNode(dateString); h.appendChild(t); h.setAttribute("aria-label", dateString); times[n] = h; } } else { times[n].textContent = dateString; } } var op = ""; if (parseLinks) { if (targetBlank) { targetLinksToNewWindow(tweets[n]); if (printUser) { targetLinksToNewWindow(authors[n]); } } if (printUser) { op += '
' + strip(authors[n].innerHTML) + "
"; } op += '

' + strip(tweets[n].innerHTML) + "

"; if (printTime) { if (permalinks) { op += '

' + times[n].getAttribute("aria-label") + "

"; } else { op += '

' + times[n].getAttribute("aria-label") + "

"; } } } else { if (tweets[n].textContent) { if (printUser) { op += '

' + authors[n].textContent + "

"; } op += '

' + tweets[n].textContent + "

"; if (printTime) { op += '

' + times[n].textContent + "

"; } } else { if (printUser) { op += '

' + authors[n].textContent + "

"; } op += '

' + tweets[n].textContent + "

"; if (printTime) { op += '

' + times[n].textContent + "

"; } } } if (showInteractionLinks) { op += '

" + '

"; } if ( showImages && images[n] !== undefined && extractImagesUrl(images[n]) !== undefined ) { var extractedImages = extractImagesUrl(images[n]); for (var i = 0; i < extractedImages.length; i++) { op += '
' + 'Image from tweet' + "
"; } } if (showImages) { arrayTweets.push(op); } else if (!showImages && tweets[n].textContent.length) { arrayTweets.push(op); } n++; } } handleTweets(arrayTweets); inProgress = false; if (queue.length > 0) { twitterFetcher.fetch(queue[0]); queue.splice(0, 1); } } }; // It must be a global variable because it will be called by JSONP. window.__twttrf = twitterFetcher; window.twitterFetcher = twitterFetcher; return twitterFetcher; }); // Prepend polyfill for IE/Edge. (function(arr) { arr.forEach(function(item) { if (item.hasOwnProperty("prepend")) { return; } Object.defineProperty(item, "prepend", { configurable: true, enumerable: true, writable: true, value: function prepend() { var argArr = Array.prototype.slice.call(arguments), docFrag = document.createDocumentFragment(); argArr.forEach(function(argItem) { var isNode = argItem instanceof Node; docFrag.appendChild( isNode ? argItem : document.createTextNode(String(argItem)) ); }); this.insertBefore(docFrag, this.firstChild); } }); }); })([Element.prototype, Document.prototype, DocumentFragment.prototype]); console.log('hello world'); var configProfile = { profile: { screenName: "NuFiOps" }, maxTweets: 1, enableLinks: true, showUser: true, showTime: true, showImages: true, lang: "en", dataOnly: true, customCallback: getTweets }; function getTweets(tweets) { console.log("length", tweets.length); if (tweets.length > 0) { console.log("has tweets"); } else { console.log("no tweets"); } } async function fetchTweets() { await twitterFetcher.fetch(configProfile); } fetchTweets();