Created
March 1, 2017 10:55
-
-
Save daniele-rapagnani/2e7372210726b28aec8f0d2d1d149ffb to your computer and use it in GitHub Desktop.
Quick and dirty snippet for exporting links from Google Spaces
This file contains 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
/** | |
* This dirty, dirty script, allows you to export links from google spaces | |
* so that you don't have to do it manually before April 17th. | |
* I could not find any official way to do this so I quickly threw this script | |
* together. | |
* | |
* USAGE: | |
* 1. Place yourself on the space page you want to export | |
* (such as: https://spaces.google.com/space/XXXXXXXXXXXXXXX) | |
* | |
* 2. Refresh the page (don't forget to do this) | |
* | |
* 3. Paste the following script in the console run it | |
* | |
* 4. Choose a location for the resulting file | |
* | |
* I've only tested this in Chrome 50 only. | |
* It probably needs a modern browser given that I've used ES6 Promises. | |
*/ | |
function waitForCb(selector, resolve, action) { | |
if (!document.querySelector(selector)) { | |
if (action) { action(selector); }; | |
setTimeout(waitForCb.bind(this, selector, resolve, action), 500); | |
} else { | |
console.log("Selector detected", selector); | |
resolve(); | |
} | |
} | |
function waitFor(selector, action) { | |
console.log("Waiting for", selector); | |
return new Promise(function(resolve) { | |
waitForCb(selector, resolve, action); | |
}); | |
} | |
function getScript(source, callback) { | |
var script = document.createElement("script"); | |
var prior = document.getElementsByTagName("script")[0]; | |
script.async = 1; | |
prior.parentNode.insertBefore(script, prior); | |
script.onload = script.onreadystatechange = function( _, isAbort ) { | |
if(isAbort || !script.readyState || /loaded|complete/.test(script.readyState) ) { | |
script.onload = script.onreadystatechange = null; | |
script = undefined; | |
if(!isAbort) { if(callback) callback(); } | |
} | |
}; | |
script.src = source; | |
} | |
function dumpPosts() { | |
var posts = Array.prototype.slice.call(document.querySelectorAll(".c1tmJe")); | |
return posts.map( | |
function(item) { | |
var linkElem = item.querySelector("a.b3n6fb"); | |
var link = linkElem ? linkElem.getAttribute("href") : false; | |
var titleElem = item.querySelector(".q9hwKf"); | |
var title = titleElem ? titleElem.innerHTML : false; | |
var commentElem = item.querySelector(".RdlBPc"); | |
var comment = commentElem ? commentElem.innerHTML : false; | |
return { | |
title: title, | |
link: link, | |
comment: comment | |
}; | |
} | |
) | |
.filter(function(item) { return Boolean(item.link) }); | |
} | |
function loadMore() { | |
document.querySelector(".CtH2pf.eejsDc").scrollTop = | |
document.querySelector(".CtH2pf.eejsDc").scrollHeight | |
; | |
} | |
function loadAllContent() { | |
return waitFor(".kGA74e", loadMore).then(function() { | |
console.log("Dumping all posts"); | |
var data = dumpPosts(); | |
return Promise.resolve(data); | |
}); | |
} | |
function dumpCurrentSpace() { | |
waitFor(".OlExvc.W8JrHd").then(function() { | |
var name = document.querySelector(".OlExvc.W8JrHd").innerHTML; | |
loadAllContent().then(function(data) { | |
var f = new File([JSON.stringify(data, null, 4)], "Spaces "+name+".json", { type: "text/plain" }); | |
saveAs(f); | |
}); | |
}); | |
} | |
getScript("https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js", function() { | |
dumpCurrentSpace(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment