Skip to content

Instantly share code, notes, and snippets.

@daniele-rapagnani
Created March 1, 2017 10:55
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save daniele-rapagnani/2e7372210726b28aec8f0d2d1d149ffb to your computer and use it in GitHub Desktop.
Save daniele-rapagnani/2e7372210726b28aec8f0d2d1d149ffb to your computer and use it in GitHub Desktop.
Quick and dirty snippet for exporting links from Google Spaces
/**
* 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