Created
May 3, 2020 22:36
-
-
Save eliasmalik/16da38fed857536bc50a40fbd6509e61 to your computer and use it in GitHub Desktop.
codewars-scraper
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
function insert(val, i, xs) { | |
return xs.slice(0, i).concat(val).concat(xs.slice(i)); | |
} | |
function validateURL(url) { | |
return !url.match('codepen'); | |
} | |
function fetch(url) { | |
var response = UrlFetchApp.fetch(url); | |
return response.getContentText(); | |
} | |
function fetchJSON(url) { | |
var json = fetch(url); | |
return JSON.parse(json); | |
} | |
function exists(name, xs) { | |
return xs.indexOf(name) > 0; | |
} | |
function addColumns(cols, idxAfter) { | |
cols.forEach(function(col, idxCol) { | |
SpreadsheetApp | |
.getActiveSheet() | |
.insertColumnAfter(idxAfter + idxCol) | |
.getRange(1, idxAfter + idxCol + 1) | |
.setValue(col); | |
}); | |
} | |
function addDataToNewCols(url, kyu, honor, rowId, baseColId) { | |
addDataToCol(rowId, baseColId + 2, url); | |
addDataToCol(rowId, baseColId + 3, kyu); | |
addDataToCol(rowId, baseColId + 4, honor); | |
} | |
function addDataToCol(rowId, colId, data) { | |
Logger.log(rowId + ':' + colId) | |
SpreadsheetApp | |
.getActiveSheet() | |
.getRange(rowId, colId) | |
.setValue(data) | |
.setFontColor('black') | |
.setFontLine('none'); | |
} | |
function main() { | |
var range = SpreadsheetApp | |
.getActiveSpreadsheet() | |
.getDataRange(); | |
var values = range.getValues(); | |
var columnData = values.slice(0, 1)[0]; | |
var idxURL = columnData.indexOf('The URL of your application website'); | |
if (idxURL < 0) { | |
// do something | |
Logger.log('No URL column'); | |
return; | |
} | |
if (!exists('Codewars URL', columnData)) { | |
addColumns(['Codewars URL', 'Kyu', 'Honor'], idxURL + 1); | |
} | |
var applicantData = values.slice(1); | |
applicantData.forEach(function(row, rowIdx) { | |
var rowId = rowIdx + 2; | |
var url = row[idxURL]; | |
if (!validateURL(url)) { | |
addDataToNewCols( | |
'Bad URL', | |
'N/A', | |
'N/A', | |
rowId, | |
idxURL | |
); | |
return; | |
} | |
try { | |
var HTML = fetch(url); | |
var reMatch = HTML.match(/codewars.com\/users\/([\w\-\.]+)/); | |
if (!reMatch) { | |
addDataToNewCols( | |
'No codewars link found', | |
'N/A', | |
'N/A', | |
rowId, | |
idxURL | |
); | |
return; | |
} | |
var username = reMatch[0].replace('codewars.com/users/', ''); | |
var cwURL = 'https://codewars.com/api/v1/users/' + username; | |
try { | |
var data = fetchJSON(cwURL); | |
addDataToNewCols( | |
'https://codewars.com/users/' + username, | |
data['ranks']['languages']['javascript']['name'], | |
data['honor'], | |
rowId, | |
idxURL | |
); | |
} catch (err) { | |
Logger.log(err); | |
addDataToNewCols( | |
'https://codewars.com/users/' + username, | |
'codewars API error', | |
'codewars API error', | |
rowId, | |
idxURL | |
); | |
} | |
} catch (err) { | |
Logger.log(err); | |
addDataToNewCols( | |
'Request failed', | |
'error', | |
'error', | |
rowId, | |
idxURL | |
); | |
} | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment