您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
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(); };