Skip to content

Instantly share code, notes, and snippets.

@eliasmalik
Created May 3, 2020 22:36
Show Gist options
  • Save eliasmalik/16da38fed857536bc50a40fbd6509e61 to your computer and use it in GitHub Desktop.
Save eliasmalik/16da38fed857536bc50a40fbd6509e61 to your computer and use it in GitHub Desktop.
codewars-scraper
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