2023/8/31 16:16:43
// ==UserScript==
// @name TJ_crack
// @namespace Violentmonkey Scripts
// @match *://ids.tongji.edu.cn:8443/nidp/app/login*
// @connect api.shinoai.com
// @grant GM_xmlhttpRequest
// @run-at document-end
// @version 0.1.1
// @author Shinoai Kyoka
// @license MIT
// @description 2023/8/31 16:16:43
// ==/UserScript==
var a = document.getElementById("reg");
var hook = a.onclick;
function globalErrorHandle(msg, url, l, c, error) {
console.error("global js error: ", msg);
if (msg.message === "Uncaught timeout") {
hook();
a.disabled = false;
a.style.cursor = null;
}
}
window.onerror = globalErrorHandle;
(async function () {
"use strict";
console.log("use strict");
a.onclick = () => {
a.disabled = true;
a.style.cursor = "not-allowed";
// 首先请求验证码图片,然后向后端发送请求并接收从后端返回的验证码,将前端验证码元素修改后调用元素的提交函数即可
CrackCode();
};
})();
async function CrackCode() {
let times = 1;
do {
console.log(`第${times}次尝试:`);
times += 1;
var raw_json = await getCode();
// console.log(raw_json);
var point = await sendCode(raw_json);
if (!point) continue;
var res = await checkCode(point.enc, raw_json.token);
// console.log(res);
} while (!point || res.repCode != "0000");
let validatecode = await genCode(raw_json, point.point);
// console.log(validatecode);
subbmit(validatecode);
}
const getCode = () =>
//访问地址获得验证码图片
new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST",
url: "https://ids.tongji.edu.cn:8443/nidp/app/login?sid=0&sid=0/getCaptcha=1",
onload: function (res) {
var responseText = res.responseText; //返回结果
var obj = JSON.parse(responseText);
resolve(obj.repData);
// sendCode(obj.repData);
},
});
});
const sendCode = (d) =>
//将图片发送至后台获取坐标
new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST",
url: "https://api.shinoai.com/something/tj_crack",
headers: { "Content-Type": "application/json" },
data: JSON.stringify(d),
timeout: 2000,
onload: function (res) {
if (res.responseText != "null") {
var obj = JSON.parse(res.responseText);
resolve(obj);
}
resolve();
},
ontimeout: function (res) {
console.log("timeout, use default method");
throw "timeout";
},
});
});
const checkCode = (code, token) =>
new Promise((resolve, reject) => {
var d = {
token: token,
pointJson: code,
};
// console.log(d);
GM_xmlhttpRequest({
method: "POST",
url: "https://ids.tongji.edu.cn:8443/nidp/app/login?sid=0&sid=0/checkCaptcha=1",
headers: { "Content-Type": "application/json" },
data: JSON.stringify(d),
onload: function (res) {
var obj = JSON.parse(res.responseText);
resolve(obj);
},
});
});
const genCode = (raw, point) =>
new Promise((resolve, reject) => {
var d = {
secretKey: raw.secretKey,
token: raw.token,
point: point,
};
// console.log(d);
GM_xmlhttpRequest({
method: "POST",
url: "https://api.shinoai.com/something/tj_check",
headers: { "Content-Type": "application/json" },
data: JSON.stringify(d),
onload: function (res) {
var responseText = res.responseText; //返回结果
resolve(responseText.substring(1, responseText.length - 1));
},
onerror: function (res) {},
});
});
const subbmit = (code) => {
var c = document.getElementById("validatecode");
c.value = code;
loginSubmit();
};