NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name GeoGuessr Export Result as CSV
// @namespace kommu
// @description Allow to export challenge results as CSV by adding a button on a top of the map. You'll maybe need to allow chrome to download from geoguessr.
// @version 0.0.8
// @updateURL https://openuserjs.org/meta/kommu/GeoGuessr_Export_Result_as_CSV.meta.js
// @include https://www.geoguessr.com/*
// @run-at document-start
// @license MIT
// ==/UserScript==
/*jshint esversion: 6 */
var token = '';
var oldHref = document.location.href;
window.onload = (event) => {
addDownloadButtonBehavior();
var bodyList = document.querySelector("body"),
observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (oldHref != document.location.href) {
oldHref = document.location.href;
addDownloadButtonBehavior();
}
});
});
var config = {
childList: true,
subtree: true
};
observer.observe(bodyList, config);
};
function addDownloadButtonBehavior() {
if (!location.pathname.startsWith("/results/") || location.pathname.endsWith("#")) {
return false;
}
token = location.pathname.replace("/results/", "");
token = token.replace("#", "");
token = token.replace("?friends", "");
var button = '<a id="download-csv-result" href="javascript://" style="margin-bottom: 10px;background: #e0d6c6;color: #3b2c47;text-decoration: none;padding: 2px 10px;display: inline-block;font-weight: bold;font-size: 10px;border-radius: 3px;box-shadow: 2px 3px 6px 0px #98908317;">DOWNLOAD AS CSV</a>';
var div = document.createElement('div');
div.innerHTML = button;
var elements = document.getElementsByClassName('result-map__map');
elements[0].parentNode.insertBefore(div, elements[0]);
var button_element = document.getElementById('download-csv-result');
button_element.onclick = function () {
var csv = [];
csv.push(['nickname', 'geoguessr_id', 'totalScore', 'totalTime', 'totalDistanceInMeters', 'Round1Score', 'Round1Distance', 'Round1Time', 'Round1Geo', 'Round2Score', 'Round2Distance', 'Round2Time', 'Round2Geo', 'Round3Score', 'Round3Distance', 'Round3Time', 'Round3Geo', 'Round4Score', 'Round4Distance', 'Round4Time', 'Round4Geo', 'Round5Score', 'Round5Distance', 'Round5Time', 'Round5Geo'])
var current = null;
while (current === null || current % 26 === 0) {
if (current === null) {
current = 0;
}
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", 'https://www.geoguessr.com/api/v3/results/scores/' + token + '/' + current + '/' + 26, false);
xmlhttp.send();
if (xmlhttp.status === 200) {
var data = JSON.parse(xmlhttp.responseText);
current = current + data.length;
csv = prepareCsvRowsFromData(csv, data);
}
else {
alert('This feature works only on challenge mode. (not single)');
return false;
}
}
let csvContent = "data:text/csv;charset=utf-8,";
csv.forEach(function (rowArray) {
let row = rowArray.join("\t");
csvContent += row + "\r\n";
});
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "geoguessr_result_" + token + ".csv");
document.body.appendChild(link);
link.click();
};
}
function prepareCsvRowsFromData(csv, data) {
for (let obj in data) {
let row = [];
var playerScore = data[obj];
row.push(playerScore.hasOwnProperty('playerName') ? playerScore.playerName : '');
row.push(playerScore.hasOwnProperty('userId') ? playerScore.userId : '');
row.push(playerScore.hasOwnProperty('totalScore') ? playerScore.totalScore : '');
if (playerScore.hasOwnProperty('game')) {
playerScore = playerScore.game;
if (playerScore.hasOwnProperty('player')) {
playerScore = playerScore.player;
row.push(playerScore.hasOwnProperty('totalTime') ? playerScore.totalTime : '');
row.push(playerScore.hasOwnProperty('totalDistanceInMeters') ? playerScore.totalDistanceInMeters : '');
if (playerScore.hasOwnProperty('guesses')) {
for (let round in playerScore.guesses) {
var roundObject = playerScore.guesses[round];
row.push(roundObject.hasOwnProperty('roundScoreInPoints') ? roundObject.roundScoreInPoints : '');
row.push(roundObject.hasOwnProperty('distanceInMeters') ? roundObject.distanceInMeters : '');
row.push(roundObject.hasOwnProperty('time') ? roundObject.time : '');
var geo = '';
if (roundObject.hasOwnProperty('lat') && roundObject.hasOwnProperty('lng')) {
geo = roundObject.lat + ',' + roundObject.lng
}
row.push(geo);
}
}
}
}
csv.push(row);
}
return csv;
}