Update script to handle new captcha format

This commit is contained in:
adithyagenie 2023-10-22 10:59:48 +05:30
parent daa4c422d0
commit 461186e252
2 changed files with 65 additions and 9 deletions

View file

@ -1,6 +1,28 @@
# skillrack-captcha-solver # skillrack-captcha-solver
Captcha solver for skillrack. ## Captcha solver for skillrack.
Use GreaseMonkey/TamperMonkey to run the script. Use GreaseMonkey/TamperMonkey to run the script.
__Note:__ Attempting to navigate the page while the captcha solver is running may lead to unintended effects. If it gets stuck in a loop, closing and opening the tabs will fix it. > ⚠️ **Please disable the script if you are attending the test as it might lead to unintended effects.**
> ⚠️ **Attempting to navigate the page while the captcha solver is running may lead to unintended effects. If it gets stuck in a loop, closing and opening the tabs will fix it.**
---
### Optional username parsing
**You don't need to do this unless you see a warning asking you to do so.**
The script handles most of the username checking by itself, but if it fails to do so and gives an alert instead, replace the `USERNAME` variable on the top of the script from the string the alert gives.
For example, if the alert says
```
STRING RECOGNISED: bch12xyz232@abcd 123+456=
```
change the first line as
```js
const USERNAME = "bch12xyz232@abcd";
```
and save the script.

View file

@ -7,16 +7,18 @@
// ==UserScript== // ==UserScript==
// @name Skillrack Captcha Solver // @name Skillrack Captcha Solver
// @namespace https://github.com/adithyagenie/skillrack-captcha-solver // @namespace https://github.com/adithyagenie/skillrack-captcha-solver
// @version 0.4 // @version 0.5
// @description Solves math captcha in SkillRack using Tesseract.js // @description Solves math captcha in SkillRack using Tesseract.js
// @author adithyagenie // @author adithyagenie
// @license AGPL-3.0-or-later // @license AGPL-3.0-or-later
// @include https://www.skillrack.com/faces/candidate/codeprogram.xhtml // @include https://www.skillrack.com/faces/candidate/codeprogram.xhtml
// @include https://www.skillrack.com/faces/candidate/tutorprogram.xhtml // @include https://www.skillrack.com/faces/candidate/tutorprogram.xhtml
// @include https://www.skillrack.com/faces/candidate/codeprogramgroup.xhtml // @include https://www.skillrack.com/faces/candidate/codeprogramgroup.xhtml
// @require https://cdn.jsdelivr.net/npm/tesseract.js@5.0.0/dist/tesseract.min.js // @require https://cdn.jsdelivr.net/npm/tesseract.js@5.0.2/dist/tesseract.min.js
// ==/UserScript== // ==/UserScript==
const USERNAME = "";
(function () { (function () {
"use strict"; "use strict";
@ -74,12 +76,12 @@
window.location.href == window.location.href ==
"https://www.skillrack.com/faces/candidate/codeprogram.xhtml" "https://www.skillrack.com/faces/candidate/codeprogram.xhtml"
) )
image = document.getElementById("j_id_6s"); image = document.getElementById("j_id_6x");
else if ( else if (
window.location.href == window.location.href ==
"https://www.skillrack.com/faces/candidate/tutorprogram.xhtml" "https://www.skillrack.com/faces/candidate/tutorprogram.xhtml"
) )
image = document.getElementById("j_id_5j"); image = document.getElementById("j_id_5o");
const textbox = document.getElementById("capval"); const textbox = document.getElementById("capval");
const button = document.getElementById("proceedbtn"); const button = document.getElementById("proceedbtn");
@ -101,7 +103,7 @@
} }
sessionStorage.setItem("captchaFail", "true"); sessionStorage.setItem("captchaFail", "true");
console.log("Detected failed attempt at solving captcha"); console.log("Detected failed attempt at solving captcha");
const back = document.getElementById("j_id_5r"); const back = document.getElementById("j_id_5s");
back.click(); back.click();
return; return;
} }
@ -126,6 +128,33 @@
ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillRect(0, 0, canvas.width, canvas.height);
return canvas.toDataURL(); return canvas.toDataURL();
} }
// Remove username from captcha
/**
*
* @param {string} text
* @returns
*/
function removeText(text) {
text = text.replace(USERNAME, "");
let i = text.length - 1;
i = text.lastIndexOf("+")
if (i == -1) {
console.error("Error parsing username.");
return;
}
i--;
for (i; i >= 0; i--) {
if (!("1234567890".includes(text[i]))) {
return text.slice(i + 1);
}
}
console.error("Error parsing username.");
return;
}
// Parse OCR result and solve the problem // Parse OCR result and solve the problem
function getNums(text) { function getNums(text) {
@ -137,14 +166,19 @@
console.log(`Converting image: ${new Date().getTime() - time} ms.`); console.log(`Converting image: ${new Date().getTime() - time} ms.`);
// Image Processing with Tesseract.js // Image Processing with Tesseract.js
Tesseract.recognize(invertedimg, "eng", { Tesseract.recognize(invertedimg, "eng", {
whitelist: "1234567890+=", whitelist: "1234567890+=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@ ",
psm: 7, psm: 7,
}) })
.then(({ data: { text } }) => { .then(({ data: { text } }) => {
console.log(`OCR: ${new Date().getTime() - time} ms.`); console.log(`OCR: ${new Date().getTime() - time} ms.`);
// Solve the Math Problem // Solve the Math Problem
try { try {
const result = getNums(text); const mathprob = removeText(text);
const result = getNums(mathprob);
if (isNaN(result)) {
alert(`Unable to solve math captcha... Check the readme file on https://github.com/adithyagenie/skillrack-captcha-solver for instructions on optional username parsing.\n\nSTRING RECOGNISED: ${text}`)
return;
}
console.log( console.log(
"Found math captcha. Auto-filling answer: ", "Found math captcha. Auto-filling answer: ",
result result