mirror of
https://github.com/smallfawn/decode_action.git
synced 2025-12-22 17:54:54 +08:00
971 lines
40 KiB
JavaScript
971 lines
40 KiB
JavaScript
//Wed Jul 02 2025 06:09:57 GMT+0000 (Coordinated Universal Time)
|
|
//Base:<url id="cv1cref6o68qmpt26ol0" type="url" status="parsed" title="GitHub - echo094/decode-js: JS混淆代码的AST分析工具 AST analysis tool for obfuscated JS code" wc="2165">https://github.com/echo094/decode-js</url>
|
|
//Modify:<url id="cv1cref6o68qmpt26olg" type="url" status="parsed" title="GitHub - smallfawn/decode_action: 世界上本来不存在加密,加密的人多了,也便成就了解密" wc="741">https://github.com/smallfawn/decode_action</url>
|
|
function _0x2bc3(_0x5e0aa9, _0x112568) {
|
|
const _0x54c96f = _0x55b8();
|
|
_0x2bc3 = function (_0x51deda, _0x28a7e4) {
|
|
_0x51deda = _0x51deda - 241;
|
|
let _0x2ef69d = _0x54c96f[_0x51deda];
|
|
return _0x2ef69d;
|
|
};
|
|
return _0x2bc3(_0x5e0aa9, _0x112568);
|
|
}
|
|
const _0x30b83a = _0x2bc3;
|
|
(function (_0x509800, _0x41965d) {
|
|
(function () {})();
|
|
const _0x52c110 = _0x2bc3,
|
|
_0x1f2e49 = _0x509800();
|
|
while (true) {
|
|
try {
|
|
const _0x43dd1d = parseInt(_0x52c110(433)) / 1 * (parseInt(_0x52c110(264)) / 2) + parseInt(_0x52c110(273)) / 3 + parseInt(_0x52c110(405)) / 4 * (-parseInt(_0x52c110(326)) / 5) + -parseInt(_0x52c110(414)) / 6 * (-parseInt(_0x52c110(381)) / 7) + -parseInt(_0x52c110(310)) / 8 + -parseInt(_0x52c110(308)) / 9 + -parseInt(_0x52c110(315)) / 10 * (-parseInt(_0x52c110(396)) / 11);
|
|
if (_0x43dd1d === _0x41965d) break;else _0x1f2e49.push(_0x1f2e49.shift());
|
|
} catch (_0x26bb69) {
|
|
_0x1f2e49.push(_0x1f2e49.shift());
|
|
}
|
|
}
|
|
})(_0x55b8, 458857);
|
|
const CAPTCHA_CONFIG = {
|
|
"username": "37VAFj",
|
|
"password": "37VAF0Nj",
|
|
"typeid": "27",
|
|
"softid": _0x30b83a(309),
|
|
"apiUrl": "https://api.ttshitu.com/predict",
|
|
"reportUrl": _0x30b83a(362)
|
|
};
|
|
function initCaptchaAutoSolver() {
|
|
const _0x50eea7 = _0x30b83a;
|
|
window.isProcessingCaptcha = false;
|
|
window.lastCaptchaTime = 0;
|
|
window[_0x50eea7(353)] = null;
|
|
window[_0x50eea7(366)] = setInterval(detectAndSolveCaptcha, 2000);
|
|
console[_0x50eea7(351)](_0x50eea7(357));
|
|
}
|
|
function stopCaptchaAutoSolver() {
|
|
const _0x9f9e24 = _0x30b83a;
|
|
window[_0x9f9e24(366)] && (clearInterval(window[_0x9f9e24(366)]), console[_0x9f9e24(351)](_0x9f9e24(342)));
|
|
}
|
|
async function detectAndSolveCaptcha() {
|
|
const _0x5cb18f = _0x30b83a;
|
|
if (window.lastCaptchaTime && Date[_0x5cb18f(276)]() - window.lastCaptchaTime < 3000) return;
|
|
if (window.isProcessingCaptcha) return;
|
|
window[_0x5cb18f(353)] && (await reportError(window.lastCaptchaId), window.lastCaptchaId = null);
|
|
await new Promise(_0x55a8f5 => setTimeout(_0x55a8f5, 1000));
|
|
const _0x30250a = document[_0x5cb18f(354)](_0x5cb18f(403));
|
|
if (_0x30250a) {
|
|
const _0x144130 = _0x30250a[_0x5cb18f(409)](_0x5cb18f(244));
|
|
if (_0x144130.length === 9) {
|
|
{
|
|
console.log(_0x5cb18f(330));
|
|
await solveGridCaptcha();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
const _0x47d017 = document.querySelector(_0x5cb18f(307));
|
|
if (_0x47d017) {
|
|
{
|
|
const _0x516458 = _0x47d017[_0x5cb18f(317)] || "";
|
|
if (_0x516458[_0x5cb18f(314)](_0x5cb18f(419)) && _0x516458[_0x5cb18f(314)](_0x5cb18f(337))) {
|
|
console.log(_0x5cb18f(296));
|
|
await solveType2Captcha();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
const _0x26411c = document[_0x5cb18f(354)](_0x5cb18f(248)) || document.querySelector("img[id*=\"captcha\"], img[class*=\"captcha\"]");
|
|
_0x26411c && (console.log(_0x5cb18f(282)), await solveType1Captcha());
|
|
}
|
|
async function refreshType1Captcha() {
|
|
const _0x380f2c = _0x30b83a;
|
|
try {
|
|
const _0x5683fc = [_0x380f2c(252), _0x380f2c(258), _0x380f2c(391), _0x380f2c(367)];
|
|
let _0x243fd9;
|
|
for (const _0x126904 of _0x5683fc) {
|
|
_0x243fd9 = document[_0x380f2c(354)](_0x126904);
|
|
if (_0x243fd9) break;
|
|
}
|
|
if (_0x243fd9) {
|
|
{
|
|
const _0x50d75d = new MouseEvent(_0x380f2c(293), {
|
|
"view": window,
|
|
"bubbles": true,
|
|
"cancelable": true
|
|
});
|
|
_0x243fd9[_0x380f2c(429)](_0x50d75d);
|
|
console[_0x380f2c(351)]("[验证码刷新] 已触发点击");
|
|
const _0x4e4ebd = document.querySelector(_0x380f2c(248));
|
|
if (_0x4e4ebd?.["src"]) {
|
|
const _0x1f9946 = _0x4e4ebd[_0x380f2c(299)];
|
|
await waitForChange(() => _0x4e4ebd[_0x380f2c(299)] !== _0x1f9946, 2000);
|
|
}
|
|
}
|
|
} else console[_0x380f2c(412)](_0x380f2c(292));
|
|
} catch (_0x139489) {
|
|
{
|
|
console[_0x380f2c(412)](_0x380f2c(256), _0x139489);
|
|
throw _0x139489;
|
|
}
|
|
}
|
|
}
|
|
async function getImageBase64(_0x248fa8) {
|
|
return new Promise(_0x5e5e80 => {
|
|
const _0xbdfce6 = _0x2bc3,
|
|
_0x5ea6dd = document[_0xbdfce6(334)](_0xbdfce6(389)),
|
|
_0x27d09f = _0x5ea6dd.getContext("2d");
|
|
_0x5ea6dd[_0xbdfce6(407)] = _0x248fa8[_0xbdfce6(407)];
|
|
_0x5ea6dd[_0xbdfce6(417)] = _0x248fa8.height;
|
|
_0x248fa8.setAttribute(_0xbdfce6(400), _0xbdfce6(442));
|
|
function _0x1cfa23() {
|
|
const _0x2d3cac = _0xbdfce6;
|
|
try {
|
|
{
|
|
_0x27d09f[_0x2d3cac(348)](_0x248fa8, 0, 0, _0x5ea6dd[_0x2d3cac(407)], _0x5ea6dd.height);
|
|
const _0x4c0279 = _0x5ea6dd[_0x2d3cac(356)](_0x2d3cac(251)).split(",")[1];
|
|
_0x5e5e80(_0x4c0279);
|
|
}
|
|
} catch (_0x309414) {
|
|
console[_0x2d3cac(412)]("获取图片Base64失败:", _0x309414);
|
|
_0x5e5e80(null);
|
|
}
|
|
}
|
|
_0x248fa8[_0xbdfce6(349)] ? _0x1cfa23() : (_0x248fa8[_0xbdfce6(286)] = _0x1cfa23, _0x248fa8[_0xbdfce6(301)] = () => _0x5e5e80(null));
|
|
});
|
|
}
|
|
function getElementPosition(_0xdfdfbd) {
|
|
const _0x3252b0 = _0x30b83a,
|
|
_0x436167 = _0xdfdfbd.getBoundingClientRect();
|
|
return {
|
|
"x": _0x436167.left + window[_0x3252b0(413)],
|
|
"y": _0x436167[_0x3252b0(399)] + window[_0x3252b0(268)],
|
|
"width": _0x436167.width,
|
|
"height": _0x436167[_0x3252b0(417)]
|
|
};
|
|
}
|
|
async function simulateType1Clicks(_0x589751, _0x3f8d82) {
|
|
const _0x596837 = _0x30b83a;
|
|
console[_0x596837(351)]("[类型1点击] 开始模拟点击流程");
|
|
const _0x12f906 = getElementPosition(_0x589751);
|
|
console[_0x596837(351)](_0x596837(247) + _0x12f906.x + _0x596837(418) + _0x12f906.y + _0x596837(355) + _0x12f906[_0x596837(407)] + _0x596837(328) + _0x12f906.height);
|
|
const _0x39c853 = _0x3f8d82[_0x596837(280)]("|"),
|
|
_0x1e4188 = _0x39c853[_0x596837(250)](_0x19e0b9 => {
|
|
const _0x97b0cf = _0x596837,
|
|
[_0x202fbd, _0x5c94d6] = _0x19e0b9[_0x97b0cf(280)](",").map(Number);
|
|
return {
|
|
"x": _0x202fbd,
|
|
"y": _0x5c94d6
|
|
};
|
|
});
|
|
for (let _0x3ecf6b = 0; _0x3ecf6b < _0x1e4188[_0x596837(368)]; _0x3ecf6b++) {
|
|
const _0x5cffa4 = _0x1e4188[_0x3ecf6b],
|
|
_0x21cd99 = _0x12f906.x + _0x5cffa4.x,
|
|
_0x4bbd58 = _0x12f906.y + _0x5cffa4.y;
|
|
console[_0x596837(351)](_0x596837(432) + (_0x3ecf6b + 1) + " 个点: (" + _0x21cd99 + ", " + _0x4bbd58 + ")");
|
|
await simulateClick(_0x21cd99, _0x4bbd58);
|
|
await sleep(500);
|
|
}
|
|
console[_0x596837(351)](_0x596837(255));
|
|
}
|
|
async function solveType1Captcha() {
|
|
const _0x7f43ad = _0x30b83a;
|
|
window[_0x7f43ad(343)] = true;
|
|
console[_0x7f43ad(351)](_0x7f43ad(425));
|
|
try {
|
|
(await isSpinnerVisible()) && (console.log("[类型1处理] 检测到加载动画,等待加载完成..."), await waitForSpinnerToDisappear());
|
|
await refreshType1Captcha();
|
|
await new Promise(_0x2a9975 => setTimeout(_0x2a9975, 500));
|
|
(await isSpinnerVisible()) && (console.log(_0x7f43ad(398)), await waitForSpinnerToDisappear());
|
|
const _0x385327 = document[_0x7f43ad(354)]("#captchaImg");
|
|
if (!_0x385327) {
|
|
console[_0x7f43ad(412)]("[类型1处理] 未找到验证码图片元素");
|
|
return;
|
|
}
|
|
await waitForImageLoad(_0x385327);
|
|
await new Promise(_0x52a0c6 => setTimeout(_0x52a0c6, 1500));
|
|
const _0x318b84 = document[_0x7f43ad(354)](_0x7f43ad(438)) || document[_0x7f43ad(354)](_0x7f43ad(388));
|
|
if (!_0x318b84) {
|
|
{
|
|
console[_0x7f43ad(412)](_0x7f43ad(305));
|
|
return;
|
|
}
|
|
}
|
|
const _0x741aaf = await getImageBase64(_0x385327);
|
|
if (!_0x741aaf) {
|
|
console[_0x7f43ad(412)](_0x7f43ad(262));
|
|
return;
|
|
}
|
|
const _0x11ec2b = _0x318b84[_0x7f43ad(317)][_0x7f43ad(294)]();
|
|
console[_0x7f43ad(351)](_0x7f43ad(431) + _0x11ec2b);
|
|
const _0x52400e = await translateText(_0x11ec2b);
|
|
console[_0x7f43ad(351)](_0x7f43ad(359) + _0x52400e);
|
|
const _0x4cd79a = {
|
|
"username": CAPTCHA_CONFIG[_0x7f43ad(420)],
|
|
"password": CAPTCHA_CONFIG[_0x7f43ad(320)],
|
|
"typeid": CAPTCHA_CONFIG[_0x7f43ad(321)],
|
|
"softid": CAPTCHA_CONFIG[_0x7f43ad(318)],
|
|
"remark": _0x52400e,
|
|
"image": _0x741aaf,
|
|
"prompt": _0x11ec2b
|
|
};
|
|
console[_0x7f43ad(351)](_0x7f43ad(270));
|
|
const _0x5b6239 = await fetch(CAPTCHA_CONFIG[_0x7f43ad(311)], {
|
|
"method": _0x7f43ad(249),
|
|
"headers": {
|
|
"Content-Type": _0x7f43ad(289)
|
|
},
|
|
"body": JSON[_0x7f43ad(319)](_0x4cd79a)
|
|
}),
|
|
_0x148ac5 = await _0x5b6239[_0x7f43ad(410)]();
|
|
_0x148ac5[_0x7f43ad(360)] ? (console[_0x7f43ad(351)](_0x7f43ad(441) + _0x148ac5[_0x7f43ad(369)][_0x7f43ad(435)]), window[_0x7f43ad(353)] = _0x148ac5[_0x7f43ad(369)].id, await simulateType1Clicks(_0x385327, _0x148ac5[_0x7f43ad(369)].result)) : console[_0x7f43ad(412)]("[类型1处理] 识别失败: " + _0x148ac5[_0x7f43ad(377)]);
|
|
} catch (_0x13d1b6) {
|
|
console.error(_0x7f43ad(316), _0x13d1b6);
|
|
} finally {
|
|
window[_0x7f43ad(343)] = false;
|
|
window[_0x7f43ad(380)] = Date[_0x7f43ad(276)]();
|
|
}
|
|
}
|
|
async function solveType2Captcha() {
|
|
const _0x1b2ed8 = _0x30b83a;
|
|
window[_0x1b2ed8(343)] = true;
|
|
console[_0x1b2ed8(351)]("[类型2处理] 开始处理多图验证码");
|
|
try {
|
|
{
|
|
(await isSpinnerVisible()) && (console.log(_0x1b2ed8(300)), await waitForSpinnerToDisappear());
|
|
await refreshType2Captcha();
|
|
(await isSpinnerVisible()) && (console[_0x1b2ed8(351)]("[类型2处理] 刷新后检测到加载动画,等待加载完成..."), await waitForSpinnerToDisappear());
|
|
const _0x28008f = document.querySelector(_0x1b2ed8(358));
|
|
if (!_0x28008f) {
|
|
console.error(_0x1b2ed8(291));
|
|
return;
|
|
}
|
|
const _0x44178b = Array[_0x1b2ed8(373)](_0x28008f[_0x1b2ed8(409)](_0x1b2ed8(422)));
|
|
if (_0x44178b.length < 2) {
|
|
console[_0x1b2ed8(412)](_0x1b2ed8(257), _0x44178b[_0x1b2ed8(368)]);
|
|
return;
|
|
}
|
|
for (const _0x1b1009 of _0x44178b) {
|
|
await waitForImageLoad(_0x1b1009);
|
|
}
|
|
await new Promise(_0x19df62 => setTimeout(_0x19df62, 1500));
|
|
const _0x4d0cec = document[_0x1b2ed8(354)](_0x1b2ed8(430)) || document[_0x1b2ed8(354)]("div._3S0ERvXx.VGrF02Bc");
|
|
if (!_0x4d0cec) {
|
|
console[_0x1b2ed8(412)](_0x1b2ed8(379));
|
|
return;
|
|
}
|
|
const _0x5b8e4a = _0x4d0cec.textContent.trim();
|
|
console[_0x1b2ed8(351)](_0x1b2ed8(340) + _0x5b8e4a);
|
|
const _0x3c55b0 = await translateText(_0x5b8e4a);
|
|
console[_0x1b2ed8(351)](_0x1b2ed8(283) + _0x3c55b0);
|
|
const _0x2b9bd6 = await mergeType2CaptchaImages(_0x44178b);
|
|
if (!_0x2b9bd6) {
|
|
{
|
|
console.error(_0x1b2ed8(361));
|
|
return;
|
|
}
|
|
}
|
|
const _0x163a03 = {
|
|
"username": CAPTCHA_CONFIG[_0x1b2ed8(420)],
|
|
"password": CAPTCHA_CONFIG.password,
|
|
"typeid": CAPTCHA_CONFIG[_0x1b2ed8(321)],
|
|
"softid": CAPTCHA_CONFIG[_0x1b2ed8(318)],
|
|
"remark": _0x3c55b0,
|
|
"image": _0x2b9bd6[_0x1b2ed8(242)],
|
|
"prompt": _0x5b8e4a
|
|
};
|
|
console.log(_0x1b2ed8(390));
|
|
const _0x3cc6ee = await fetch(CAPTCHA_CONFIG[_0x1b2ed8(311)], {
|
|
"method": _0x1b2ed8(249),
|
|
"headers": {
|
|
"Content-Type": _0x1b2ed8(289)
|
|
},
|
|
"body": JSON[_0x1b2ed8(319)](_0x163a03)
|
|
}),
|
|
_0x24533c = await _0x3cc6ee[_0x1b2ed8(410)]();
|
|
if (_0x24533c[_0x1b2ed8(360)]) {
|
|
{
|
|
console[_0x1b2ed8(351)]("[类型2处理] 识别成功: " + _0x24533c[_0x1b2ed8(369)][_0x1b2ed8(435)]);
|
|
window[_0x1b2ed8(353)] = _0x24533c[_0x1b2ed8(369)].id;
|
|
const _0x533318 = getElementPosition(_0x28008f);
|
|
await simulateType2Clicks(_0x533318, _0x2b9bd6, _0x24533c[_0x1b2ed8(369)].result);
|
|
(await isSpinnerVisible()) && (console[_0x1b2ed8(351)](_0x1b2ed8(426)), await waitForSpinnerToDisappear());
|
|
await clickConfirmButton();
|
|
(await isSpinnerVisible()) && (console[_0x1b2ed8(351)](_0x1b2ed8(347)), await waitForSpinnerToDisappear());
|
|
}
|
|
} else console[_0x1b2ed8(412)](_0x1b2ed8(303) + _0x24533c[_0x1b2ed8(377)]);
|
|
}
|
|
} catch (_0x39dcff) {
|
|
console[_0x1b2ed8(412)](_0x1b2ed8(416), _0x39dcff);
|
|
} finally {
|
|
window[_0x1b2ed8(343)] = false;
|
|
window[_0x1b2ed8(380)] = Date[_0x1b2ed8(276)]();
|
|
}
|
|
}
|
|
async function mergeType2CaptchaImages(_0x215b8b) {
|
|
return new Promise(_0x37a7d3 => {
|
|
const _0x3407ed = _0x2bc3;
|
|
try {
|
|
const _0x2ca2c2 = document[_0x3407ed(334)](_0x3407ed(389)),
|
|
_0x1fcc3e = _0x2ca2c2.getContext("2d"),
|
|
_0x2d1661 = _0x215b8b[0][_0x3407ed(407)] + 13 + _0x215b8b[1][_0x3407ed(407)],
|
|
_0x1865be = Math.max(_0x215b8b[0][_0x3407ed(417)], _0x215b8b[1][_0x3407ed(417)]);
|
|
_0x2ca2c2.width = _0x2d1661;
|
|
_0x2ca2c2[_0x3407ed(417)] = _0x1865be;
|
|
_0x1fcc3e.drawImage(_0x215b8b[0], 0, 0, _0x215b8b[0][_0x3407ed(407)], _0x215b8b[0][_0x3407ed(417)]);
|
|
_0x1fcc3e.drawImage(_0x215b8b[1], _0x215b8b[0][_0x3407ed(407)] + 13, 0, _0x215b8b[1][_0x3407ed(407)], _0x215b8b[1][_0x3407ed(417)]);
|
|
const _0x153130 = _0x2ca2c2[_0x3407ed(356)](_0x3407ed(251))[_0x3407ed(280)](",")[1];
|
|
_0x37a7d3({
|
|
"base64": _0x153130,
|
|
"width": _0x2d1661,
|
|
"height": _0x1865be,
|
|
"image1Width": _0x215b8b[0][_0x3407ed(407)],
|
|
"image1Height": _0x215b8b[0][_0x3407ed(417)],
|
|
"image2Width": _0x215b8b[1][_0x3407ed(407)],
|
|
"image2Height": _0x215b8b[1][_0x3407ed(417)]
|
|
});
|
|
} catch (_0x81f56b) {
|
|
console[_0x3407ed(412)]("[图片合并] 合并图片时出错:", _0x81f56b);
|
|
_0x37a7d3(null);
|
|
}
|
|
});
|
|
}
|
|
function _0x55b8() {
|
|
const _0x36354c = ["[类型1处理] 刷新后检测到加载动画,等待加载完成...", "top", "crossOrigin", "#verification > div > div > div > div.btnWrap-1LOpd > div.text-gSdWn.textBtn-2BG0E", ") 原始坐标: (", "._3Gh2KHBV", "[类型2点击] 合并图片尺寸: width=", "69292sCupGw", "display", "width", "[九宫格处理] 图片", "querySelectorAll", "json", "[九宫格处理] 验证码加载超时", "error", "pageXOffset", "18nvlabc", "text", "[类型2处理] 处理验证码时出错:", "height", ", y=", "Figure 1", "username", "readyState", "._2BsY-ufz", "style", "[九宫格处理] 刷新后验证码加载超时", "[类型1处理] 开始处理单图验证码", "[类型2处理] 点击后检测到加载动画,等待完成...", "[九宫格处理] 翻译结果: ", "type", "dispatchEvent", "div.subTitle-3S0ER.subTitle-VGrF0", "[类型1处理] 验证码提示: ", "[类型1点击] 准备点击第 ", "1iFbDis", "个点: (", "result", "加载失败,尺寸无效", "图片尺寸:", "#Picture > div._37VAF0Np > div._2Alt0zsN", "none", "[九宫格处理] 未找到提示词元素", "[类型1处理] 识别成功: ", "anonymous", "[九宫格确认] 点击确认按钮 (", "base64", "[九宫格确认] 未找到确认按钮", "img.lazy-image", "</li>", "[九宫格刷新] 等待加载完成...", "[类型1点击] 图片位置: x=", "#captchaImg", "POST", "map", "image/png", "._2zehNgas", "?inputtext=", "[九宫格处理] 处理验证码时出错:", "[类型1点击] 模拟点击流程完成", "[验证码刷新] 出错:", "[类型2处理] 未找到足够的验证码图片元素,当前找到:", ".ZVIQM964 svg", ") 的元素", "mousemove", "[九宫格处理] 识别失败: ", "[类型1处理] 验证码图片的Base64数据为空", "[类型2点击] 准备点击第 ", "980890yJsISk", "add", "options", "[九宫格处理] 未找到完整的九宫格图片元素,当前找到:", "pageYOffset", "[九宫格处理] 识别成功: ", "[类型1处理] 正在调用打码平台API...", "网络请求异常", "getBoundingClientRect", "1060710CYeYwg", "[九宫格合并] 需要9张图片", "round", "now", "remove", "mouseover", "[九宫格处理] 验证图片加载状态...", "split", "<ul id=\"translateResult\">", "[检测模块] 检测到单图验证码", "[类型2处理] 翻译结果: ", "mouseout", "[九宫格处理] 未找到验证码图片容器", "onload", "mousedown", "._2tSNOCuL", "application/json", "[类型2点击] 开始模拟点击流程 (基于合并后大图)", "[类型2处理] 未找到验证码图片容器", "[验证码刷新] 错误:未找到刷新按钮", "click", "trim", "._3Kspx2NT._3rODZQlY._1-CtAMMT._142Hsqej._3_x4R_c5", "[检测模块] 检测到双图验证码", "[九宫格点击] 点击第", "[类型2点击] 无效的坐标字符串", "src", "[类型2处理] 检测到加载动画,等待加载完成...", "onerror", "无法找到位于 (", "[类型2处理] 识别失败: ", ".picture-img-2BsY-", "[类型1处理] 未找到提示词元素", "[九宫格处理] 等待验证码完全加载...", "div[role=\"dialog\"]", "1801818CzTSNn", "ef8afb78e402495484642ea5deb8d443", "4003304CThNhd", "apiUrl", "active", "[九宫格刷新] 触发刷新...", "includes", "3210dDHUxN", "[类型1处理] 处理验证码时出错:", "textContent", "softid", "stringify", "password", "typeid", "[报错功能] 报错成功", "scrollX", "visibility", " 个点: (", "145reVQTI", "[类型2点击] 准备点击确认按钮,位置: (", ", height=", "._3Gh2KHBV img.lazy-image", "[检测模块] 检测到九宫格验证码", "[类型2点击] 确认按钮点击完成", "[类型2点击] 未找到确认按钮", "div._3S0ERvXx._24_syvQ2", "createElement", "getComputedStyle", "GET", "Figure 2", ".picWrap-1DemK", "[类型2处理] 已触发验证码刷新", "[类型2处理] 验证码提示: ", ".btn-3Kspx.primary-3rODZ.loose-1-CtA.xl-142Hs.btn-1je6A", "[系统初始化] 验证码自动识别系统已停止", "isProcessingCaptcha", "naturalWidth", "hidden", "filter", "[类型2处理] 确认后检测到加载动画,等待完成...", "drawImage", "complete", "[九宫格点击] 开始模拟点击 (容器位置:", "log", "[类型2处理] 刷新验证码时出错:", "lastCaptchaId", "querySelector", ", width=", "toDataURL", "[系统初始化] 验证码自动识别系统已启动", "._1DemKYKR", "[类型1处理] 翻译结果: ", "success", "[类型2处理] 合并验证码图片失败", "https://api.ttshitu.com/reporterror.json", "[九宫格刷新] 加载超时", "random", "[九宫格处理] 确认后加载超时", "captchaDetectionInterval", ".refresh-27d6x .icon-ZVIQM svg", "length", "data", "[九宫格处理] 验证码提示: ", "[九宫格处理] 合并验证码图片失败", "[九宫格点击] 无效坐标: ", "from", "classList", "个点击点", "warn", "message", "[类型2点击] 点击确认按钮时出错:", "[类型2处理] 未找到提示词元素", "lastCaptchaTime", "1568959CuzgLS", "elementFromPoint", "[九宫格刷新] 刷新出错:", "mouseup", "[九宫格点击] 无效坐标", ".gSdWn7Dw._1FtpsoBN", "load", ".picture-text-2Alt0", "canvas", "[类型2处理] 正在调用打码平台API...", ".refreshSvg-2zehN", "left", "text/html", "[类型2点击] 模拟点击流程完成", "substring", "4983hhiATw", "._3Kspx2NT._3rODZQlY._1-CtAMMT._142Hsqej._1je6AsL4"];
|
|
_0x55b8 = function () {
|
|
return _0x36354c;
|
|
};
|
|
return _0x55b8();
|
|
}
|
|
async function simulateType2Clicks(_0x1b6db4, _0x3a9f8d, _0x10afc0) {
|
|
const _0x2afe79 = _0x30b83a;
|
|
console.log(_0x2afe79(290));
|
|
console.log("[类型2点击] 容器位置: x=" + _0x1b6db4.x + _0x2afe79(418) + _0x1b6db4.y);
|
|
console[_0x2afe79(351)](_0x2afe79(404) + _0x3a9f8d.width + _0x2afe79(328) + _0x3a9f8d[_0x2afe79(417)]);
|
|
const _0x1ffe71 = _0x10afc0[_0x2afe79(280)]("|")[_0x2afe79(346)](Boolean);
|
|
if (_0x1ffe71[_0x2afe79(368)] === 0) {
|
|
console.error(_0x2afe79(298));
|
|
return;
|
|
}
|
|
const _0x1aed22 = _0x1ffe71.map(_0x26f73c => {
|
|
{
|
|
const [_0x307174, _0x33b3e0] = _0x26f73c.split(",").map(Number);
|
|
return {
|
|
"x": _0x307174,
|
|
"y": _0x33b3e0
|
|
};
|
|
}
|
|
});
|
|
console.log("[类型2点击] 解析到" + _0x1aed22[_0x2afe79(368)] + _0x2afe79(375));
|
|
for (let _0x57d0f2 = 0; _0x57d0f2 < _0x1aed22.length; _0x57d0f2++) {
|
|
const _0x51f497 = _0x1aed22[_0x57d0f2],
|
|
_0xf8eb01 = _0x1b6db4.x + _0x51f497.x,
|
|
_0x3b33b2 = _0x1b6db4.y + _0x51f497.y;
|
|
console.log(_0x2afe79(263) + (_0x57d0f2 + 1) + _0x2afe79(325) + _0xf8eb01 + ", " + _0x3b33b2 + ") - 原始坐标: (" + _0x51f497.x + ", " + _0x51f497.y + ")");
|
|
await simulateClick(_0xf8eb01, _0x3b33b2);
|
|
await sleep(500 + Math.random() * 300);
|
|
}
|
|
console.log(_0x2afe79(394));
|
|
}
|
|
async function refreshType2Captcha() {
|
|
const _0x25d5a1 = _0x30b83a;
|
|
try {
|
|
const _0x4312ae = document[_0x25d5a1(354)](_0x25d5a1(401));
|
|
if (_0x4312ae) {
|
|
const _0x3d28dd = new MouseEvent(_0x25d5a1(293), {
|
|
"view": window,
|
|
"bubbles": true,
|
|
"cancelable": true
|
|
});
|
|
_0x4312ae[_0x25d5a1(429)](_0x3d28dd);
|
|
console.log(_0x25d5a1(339));
|
|
await waitForChange(() => {
|
|
const _0x433728 = _0x25d5a1,
|
|
_0x9c2289 = document[_0x433728(354)](_0x433728(338));
|
|
if (!_0x9c2289) return false;
|
|
const _0x32ade0 = _0x9c2289[_0x433728(409)](_0x433728(304));
|
|
return _0x32ade0 && _0x32ade0[_0x433728(368)] >= 2;
|
|
}, 3000);
|
|
}
|
|
} catch (_0x15a840) {
|
|
{
|
|
console[_0x25d5a1(412)](_0x25d5a1(352), _0x15a840);
|
|
throw _0x15a840;
|
|
}
|
|
}
|
|
}
|
|
async function clickConfirmButton() {
|
|
const _0x249f03 = _0x30b83a;
|
|
try {
|
|
{
|
|
const _0x174eb5 = document[_0x249f03(354)](_0x249f03(397)) || document.querySelector(_0x249f03(341));
|
|
if (!_0x174eb5) {
|
|
console[_0x249f03(412)](_0x249f03(332));
|
|
return;
|
|
}
|
|
const _0x13991b = _0x174eb5[_0x249f03(272)](),
|
|
_0x1a1101 = _0x13991b[_0x249f03(392)] + _0x13991b[_0x249f03(407)] / 2,
|
|
_0x3a2762 = _0x13991b.top + _0x13991b[_0x249f03(417)] / 2;
|
|
console[_0x249f03(351)](_0x249f03(327) + _0x1a1101 + ", " + _0x3a2762 + ")");
|
|
const _0xc62168 = new MouseEvent(_0x249f03(278), {
|
|
"view": window,
|
|
"bubbles": true,
|
|
"cancelable": true,
|
|
"clientX": _0x1a1101,
|
|
"clientY": _0x3a2762
|
|
});
|
|
_0x174eb5[_0x249f03(429)](_0xc62168);
|
|
await sleep(50 + Math[_0x249f03(364)]() * 100);
|
|
const _0x16e315 = new MouseEvent(_0x249f03(287), {
|
|
"view": window,
|
|
"bubbles": true,
|
|
"cancelable": true,
|
|
"clientX": _0x1a1101,
|
|
"clientY": _0x3a2762,
|
|
"button": 0
|
|
});
|
|
_0x174eb5[_0x249f03(429)](_0x16e315);
|
|
_0x174eb5[_0x249f03(374)][_0x249f03(265)](_0x249f03(312));
|
|
await sleep(100 + Math[_0x249f03(364)]() * 100);
|
|
const _0x3ddf7a = new MouseEvent(_0x249f03(384), {
|
|
"view": window,
|
|
"bubbles": true,
|
|
"cancelable": true,
|
|
"clientX": _0x1a1101,
|
|
"clientY": _0x3a2762,
|
|
"button": 0
|
|
});
|
|
_0x174eb5[_0x249f03(429)](_0x3ddf7a);
|
|
const _0x4348bd = new MouseEvent("click", {
|
|
"view": window,
|
|
"bubbles": true,
|
|
"cancelable": true,
|
|
"clientX": _0x1a1101,
|
|
"clientY": _0x3a2762,
|
|
"button": 0
|
|
});
|
|
_0x174eb5[_0x249f03(429)](_0x4348bd);
|
|
_0x174eb5[_0x249f03(374)][_0x249f03(277)]("active");
|
|
await sleep(50 + Math.random() * 100);
|
|
const _0x155c9e = new MouseEvent(_0x249f03(284), {
|
|
"view": window,
|
|
"bubbles": true,
|
|
"cancelable": true,
|
|
"clientX": _0x1a1101 + 10,
|
|
"clientY": _0x3a2762 + 10
|
|
});
|
|
_0x174eb5[_0x249f03(429)](_0x155c9e);
|
|
console[_0x249f03(351)](_0x249f03(331));
|
|
}
|
|
} catch (_0x5ba727) {
|
|
console.error(_0x249f03(378), _0x5ba727);
|
|
}
|
|
}
|
|
async function solveGridCaptcha() {
|
|
const _0x2aacf6 = _0x30b83a;
|
|
window.isProcessingCaptcha = true;
|
|
console[_0x2aacf6(351)]("[九宫格处理] 开始处理九宫格验证码");
|
|
try {
|
|
console[_0x2aacf6(351)](_0x2aacf6(306));
|
|
if (!(await waitForCaptchaReady())) {
|
|
console[_0x2aacf6(412)](_0x2aacf6(411));
|
|
return;
|
|
}
|
|
await refreshGridCaptcha();
|
|
console.log("[九宫格处理] 等待刷新后验证码加载...");
|
|
if (!(await waitForCaptchaReady())) {
|
|
console.error(_0x2aacf6(424));
|
|
return;
|
|
}
|
|
const _0x2e296b = document[_0x2aacf6(354)](_0x2aacf6(403));
|
|
if (!_0x2e296b) {
|
|
console[_0x2aacf6(412)](_0x2aacf6(285));
|
|
return;
|
|
}
|
|
const _0x1c6278 = Array.from(_0x2e296b.querySelectorAll(_0x2aacf6(244)));
|
|
if (_0x1c6278[_0x2aacf6(368)] !== 9) {
|
|
console.error(_0x2aacf6(267), _0x1c6278[_0x2aacf6(368)]);
|
|
return;
|
|
}
|
|
console[_0x2aacf6(351)](_0x2aacf6(279));
|
|
for (let _0x1975b8 = 0; _0x1975b8 < _0x1c6278[_0x2aacf6(368)]; _0x1975b8++) {
|
|
const _0x42f726 = _0x1c6278[_0x1975b8];
|
|
await waitForImageLoad(_0x42f726);
|
|
if (_0x42f726[_0x2aacf6(407)] === 0 || _0x42f726[_0x2aacf6(417)] === 0) {
|
|
console.error(_0x2aacf6(408) + (_0x1975b8 + 1) + _0x2aacf6(436));
|
|
return;
|
|
}
|
|
}
|
|
const _0x7c071f = document[_0x2aacf6(354)](_0x2aacf6(333));
|
|
if (!_0x7c071f) {
|
|
{
|
|
console[_0x2aacf6(412)](_0x2aacf6(440));
|
|
return;
|
|
}
|
|
}
|
|
const _0x4c16ac = _0x7c071f[_0x2aacf6(317)][_0x2aacf6(294)]();
|
|
console.log(_0x2aacf6(370) + _0x4c16ac);
|
|
const _0x3fd2e9 = await translateText(_0x4c16ac);
|
|
console.log(_0x2aacf6(427) + _0x3fd2e9);
|
|
const _0x1be7fd = await mergeGridCaptchaImages(_0x1c6278);
|
|
if (!_0x1be7fd) {
|
|
console[_0x2aacf6(412)](_0x2aacf6(371));
|
|
return;
|
|
}
|
|
const _0x37cf78 = {
|
|
"username": CAPTCHA_CONFIG[_0x2aacf6(420)],
|
|
"password": CAPTCHA_CONFIG.password,
|
|
"typeid": CAPTCHA_CONFIG.typeid,
|
|
"softid": CAPTCHA_CONFIG[_0x2aacf6(318)],
|
|
"remark": _0x3fd2e9,
|
|
"image": _0x1be7fd.base64,
|
|
"prompt": _0x4c16ac
|
|
};
|
|
console[_0x2aacf6(351)]("[九宫格处理] 正在调用打码平台API...");
|
|
const _0xee3e54 = await fetch(CAPTCHA_CONFIG.apiUrl, {
|
|
"method": _0x2aacf6(249),
|
|
"headers": {
|
|
"Content-Type": "application/json"
|
|
},
|
|
"body": JSON.stringify(_0x37cf78)
|
|
}),
|
|
_0x41e1a6 = await _0xee3e54.json();
|
|
if (_0x41e1a6.success) {
|
|
{
|
|
console[_0x2aacf6(351)](_0x2aacf6(269) + _0x41e1a6.data[_0x2aacf6(435)]);
|
|
window.lastCaptchaId = _0x41e1a6.data.id;
|
|
const _0x3fd7bd = getElementPosition(_0x2e296b);
|
|
await simulateGridClicks(_0x3fd7bd, _0x1be7fd, _0x41e1a6[_0x2aacf6(369)].result);
|
|
if (!(await waitForCaptchaReady())) {
|
|
console[_0x2aacf6(412)]("[九宫格处理] 点击后加载超时");
|
|
return;
|
|
}
|
|
await clickGridConfirmButton();
|
|
!(await waitForCaptchaReady()) && console[_0x2aacf6(412)](_0x2aacf6(365));
|
|
}
|
|
} else console[_0x2aacf6(412)](_0x2aacf6(261) + _0x41e1a6.message);
|
|
} catch (_0x572e67) {
|
|
console[_0x2aacf6(412)](_0x2aacf6(254), _0x572e67);
|
|
} finally {
|
|
window[_0x2aacf6(343)] = false;
|
|
window[_0x2aacf6(380)] = Date[_0x2aacf6(276)]();
|
|
}
|
|
}
|
|
async function mergeGridCaptchaImages(_0xa33c2f) {
|
|
return new Promise(_0xc0316b => {
|
|
const _0x498ecb = _0x2bc3;
|
|
try {
|
|
if (_0xa33c2f[_0x498ecb(368)] !== 9) return console[_0x498ecb(412)](_0x498ecb(274)), _0xc0316b(null);
|
|
const _0x598a0c = document[_0x498ecb(334)](_0x498ecb(389)),
|
|
_0x186261 = _0x598a0c.getContext("2d"),
|
|
_0x23913d = _0xa33c2f[0][_0x498ecb(407)],
|
|
_0x5ed029 = _0xa33c2f[0].height,
|
|
_0x1d7ddf = 7,
|
|
_0x290619 = _0x23913d * 3 + _0x1d7ddf * 2,
|
|
_0x5e79a6 = _0x5ed029 * 3 + _0x1d7ddf * 2;
|
|
_0x598a0c.width = _0x290619;
|
|
_0x598a0c[_0x498ecb(417)] = _0x5e79a6;
|
|
for (let _0x34ef77 = 0; _0x34ef77 < 3; _0x34ef77++) {
|
|
for (let _0x44399c = 0; _0x44399c < 3; _0x44399c++) {
|
|
const _0x1f9bdb = _0x34ef77 * 3 + _0x44399c;
|
|
_0x186261.drawImage(_0xa33c2f[_0x1f9bdb], _0x44399c * (_0x23913d + _0x1d7ddf), _0x34ef77 * (_0x5ed029 + _0x1d7ddf), _0x23913d, _0x5ed029);
|
|
}
|
|
}
|
|
_0xc0316b({
|
|
"base64": _0x598a0c.toDataURL(_0x498ecb(251))[_0x498ecb(280)](",")[1],
|
|
"width": _0x290619,
|
|
"height": _0x5e79a6,
|
|
"imgWidth": _0x23913d,
|
|
"imgHeight": _0x5ed029,
|
|
"spacing": _0x1d7ddf
|
|
});
|
|
} catch (_0x1b51ca) {
|
|
console[_0x498ecb(412)]("[九宫格合并] 合并图片时出错:", _0x1b51ca);
|
|
_0xc0316b(null);
|
|
}
|
|
});
|
|
}
|
|
async function simulateGridClicks(_0x2fe73f, _0x4838e5, _0x25d16f) {
|
|
const _0x3a675e = _0x30b83a;
|
|
console[_0x3a675e(351)](_0x3a675e(350), _0x2fe73f, _0x3a675e(437), _0x4838e5[_0x3a675e(407)], "x", _0x4838e5[_0x3a675e(417)] + ")");
|
|
const _0x55c53a = _0x25d16f.split("|")[_0x3a675e(346)](Boolean);
|
|
if (_0x55c53a[_0x3a675e(368)] === 0) {
|
|
{
|
|
console[_0x3a675e(412)](_0x3a675e(385));
|
|
return;
|
|
}
|
|
}
|
|
const _0x150df4 = _0x55c53a[_0x3a675e(250)](_0x42c8bc => {
|
|
{
|
|
const _0xb96299 = _0x3a675e,
|
|
[_0x2ba0b5, _0x54a30b] = _0x42c8bc[_0xb96299(280)](",")[_0xb96299(250)](Number);
|
|
if (isNaN(_0x2ba0b5) || isNaN(_0x54a30b)) return console.error(_0xb96299(372) + _0x42c8bc), null;
|
|
return {
|
|
"x": _0x2ba0b5,
|
|
"y": _0x54a30b
|
|
};
|
|
}
|
|
}).filter(Boolean);
|
|
if (_0x150df4[_0x3a675e(368)] === 0) return;
|
|
for (let _0x5971b7 = 0; _0x5971b7 < _0x150df4.length; _0x5971b7++) {
|
|
{
|
|
const {
|
|
x: _0x2c5ea5,
|
|
y: _0x365275
|
|
} = _0x150df4[_0x5971b7],
|
|
_0x4d03c9 = Math[_0x3a675e(275)](_0x2fe73f.x + _0x2c5ea5 + 1),
|
|
_0x48ffb5 = Math[_0x3a675e(275)](_0x2fe73f.y + _0x365275 + 1);
|
|
console[_0x3a675e(351)](_0x3a675e(297) + (_0x5971b7 + 1) + _0x3a675e(434) + _0x4d03c9 + "," + _0x48ffb5 + _0x3a675e(402) + _0x2c5ea5 + "," + _0x365275 + ")");
|
|
await simulateClick(_0x4d03c9, _0x48ffb5);
|
|
await sleep(600 + Math[_0x3a675e(364)]() * 400);
|
|
}
|
|
}
|
|
}
|
|
async function refreshGridCaptcha() {
|
|
const _0x3fa2ce = _0x30b83a;
|
|
try {
|
|
{
|
|
const _0x352ba8 = document.querySelector(_0x3fa2ce(386));
|
|
if (!_0x352ba8) {
|
|
{
|
|
console.error("[九宫格刷新] 未找到刷新按钮");
|
|
return;
|
|
}
|
|
}
|
|
console[_0x3fa2ce(351)](_0x3fa2ce(313));
|
|
_0x352ba8.click();
|
|
let _0x1a8dbc = false;
|
|
for (let _0x4d361d = 0; _0x4d361d < 5; _0x4d361d++) {
|
|
if (await isSpinnerVisible()) {
|
|
{
|
|
_0x1a8dbc = true;
|
|
break;
|
|
}
|
|
}
|
|
await sleep(300);
|
|
}
|
|
if (_0x1a8dbc) {
|
|
console[_0x3fa2ce(351)](_0x3fa2ce(246));
|
|
if (!(await waitForSpinnerToDisappear(5000))) {
|
|
console[_0x3fa2ce(412)](_0x3fa2ce(363));
|
|
return;
|
|
}
|
|
}
|
|
await sleep(800);
|
|
console[_0x3fa2ce(351)]("[九宫格刷新] 刷新完成");
|
|
}
|
|
} catch (_0x4f8045) {
|
|
{
|
|
console.error(_0x3fa2ce(383), _0x4f8045);
|
|
throw _0x4f8045;
|
|
}
|
|
}
|
|
}
|
|
async function waitForCaptchaReady(_0x48cf0c = 8000) {
|
|
const _0x11616c = _0x30b83a,
|
|
_0x3ff722 = Date[_0x11616c(276)]();
|
|
while (Date.now() - _0x3ff722 < _0x48cf0c) {
|
|
const _0x1e04ad = document[_0x11616c(354)]("._2tSNOCuL");
|
|
if (!_0x1e04ad || _0x1e04ad[_0x11616c(423)].display === _0x11616c(439)) {
|
|
const _0x3b320e = document[_0x11616c(409)](_0x11616c(329));
|
|
if (_0x3b320e[_0x11616c(368)] >= 9) {
|
|
let _0xfc30cb = true;
|
|
for (const _0x4b44a9 of _0x3b320e) {
|
|
if (!_0x4b44a9[_0x11616c(349)] || _0x4b44a9[_0x11616c(344)] === 0) {
|
|
_0xfc30cb = false;
|
|
break;
|
|
}
|
|
}
|
|
if (_0xfc30cb) return true;
|
|
}
|
|
}
|
|
await sleep(200);
|
|
}
|
|
return false;
|
|
}
|
|
async function clickGridConfirmButton() {
|
|
const _0x29b09b = _0x30b83a,
|
|
_0x23f8c7 = document[_0x29b09b(354)](_0x29b09b(295));
|
|
if (!_0x23f8c7) {
|
|
{
|
|
console[_0x29b09b(412)](_0x29b09b(243));
|
|
return;
|
|
}
|
|
}
|
|
const _0x2e0116 = _0x23f8c7[_0x29b09b(272)](),
|
|
_0x281bd9 = _0x2e0116.left + _0x2e0116[_0x29b09b(407)] / 2,
|
|
_0x1415eb = _0x2e0116[_0x29b09b(399)] + _0x2e0116[_0x29b09b(417)] / 2;
|
|
console[_0x29b09b(351)](_0x29b09b(241) + Math[_0x29b09b(275)](_0x281bd9) + "," + Math[_0x29b09b(275)](_0x1415eb) + ")");
|
|
const _0x31e31d = [{
|
|
"type": _0x29b09b(278),
|
|
"x": _0x281bd9,
|
|
"y": _0x1415eb,
|
|
"delay": 50
|
|
}, {
|
|
"type": _0x29b09b(287),
|
|
"x": _0x281bd9,
|
|
"y": _0x1415eb,
|
|
"delay": 100
|
|
}, {
|
|
"type": "mouseup",
|
|
"x": _0x281bd9,
|
|
"y": _0x1415eb,
|
|
"delay": 100
|
|
}, {
|
|
"type": "click",
|
|
"x": _0x281bd9,
|
|
"y": _0x1415eb,
|
|
"delay": 50
|
|
}, {
|
|
"type": _0x29b09b(284),
|
|
"x": _0x281bd9 + 5,
|
|
"y": _0x1415eb + 5,
|
|
"delay": 50
|
|
}];
|
|
for (const {
|
|
type: _0x12d687,
|
|
x: _0x3c38a1,
|
|
y: _0x1b3fa8,
|
|
delay: _0x6b050d
|
|
} of _0x31e31d) {
|
|
_0x23f8c7[_0x29b09b(429)](new MouseEvent(_0x12d687, {
|
|
"bubbles": true,
|
|
"cancelable": true,
|
|
"view": window,
|
|
"clientX": _0x3c38a1,
|
|
"clientY": _0x1b3fa8
|
|
}));
|
|
await sleep(_0x6b050d + Math[_0x29b09b(364)]() * 50);
|
|
}
|
|
}
|
|
async function isSpinnerVisible() {
|
|
const _0x1dcdda = _0x30b83a,
|
|
_0x8d7f08 = document.querySelector("._2tSNOCuL");
|
|
return _0x8d7f08 && _0x8d7f08[_0x1dcdda(423)][_0x1dcdda(406)] !== _0x1dcdda(439);
|
|
}
|
|
async function waitForSpinnerToDisappear(_0x5cb161 = 5000) {
|
|
const _0x9b818d = _0x30b83a,
|
|
_0xa937c1 = Date.now();
|
|
while (Date[_0x9b818d(276)]() - _0xa937c1 < _0x5cb161) {
|
|
const _0x4e3fbe = document[_0x9b818d(354)](_0x9b818d(288));
|
|
if (!_0x4e3fbe || _0x4e3fbe[_0x9b818d(423)].display === "none") return true;
|
|
await sleep(200);
|
|
}
|
|
return false;
|
|
}
|
|
async function waitForImageLoad(_0x4aca20) {
|
|
return new Promise(_0x17df03 => {
|
|
{
|
|
const _0x5aa851 = _0x2bc3;
|
|
_0x4aca20[_0x5aa851(349)] ? _0x17df03() : (_0x4aca20[_0x5aa851(286)] = _0x17df03, _0x4aca20[_0x5aa851(301)] = _0x17df03);
|
|
}
|
|
});
|
|
}
|
|
function getElementPosition(_0x254b07) {
|
|
const _0x1ef0cb = _0x30b83a,
|
|
_0x17eea7 = _0x254b07[_0x1ef0cb(272)]();
|
|
return {
|
|
"x": _0x17eea7.left + window[_0x1ef0cb(323)],
|
|
"y": _0x17eea7[_0x1ef0cb(399)] + window.scrollY,
|
|
"width": _0x17eea7[_0x1ef0cb(407)],
|
|
"height": _0x17eea7[_0x1ef0cb(417)]
|
|
};
|
|
}
|
|
async function simulateClick(_0x3e7474, _0x52c5c0) {
|
|
const _0x2057c9 = _0x30b83a,
|
|
_0x16e7ab = document.elementFromPoint(_0x3e7474, _0x52c5c0);
|
|
if (!_0x16e7ab) return;
|
|
const _0x50379d = [new MouseEvent(_0x2057c9(287), {
|
|
"bubbles": true,
|
|
"clientX": _0x3e7474,
|
|
"clientY": _0x52c5c0
|
|
}), new MouseEvent(_0x2057c9(384), {
|
|
"bubbles": true,
|
|
"clientX": _0x3e7474,
|
|
"clientY": _0x52c5c0
|
|
}), new MouseEvent(_0x2057c9(293), {
|
|
"bubbles": true,
|
|
"clientX": _0x3e7474,
|
|
"clientY": _0x52c5c0
|
|
})];
|
|
for (const _0x587295 of _0x50379d) {
|
|
_0x16e7ab[_0x2057c9(429)](_0x587295);
|
|
await sleep(50 + Math[_0x2057c9(364)]() * 50);
|
|
}
|
|
}
|
|
function sleep(_0x4d88eb) {
|
|
return new Promise(_0x12cb84 => setTimeout(_0x12cb84, _0x4d88eb));
|
|
}
|
|
async function waitForChange(_0x5d426b, _0x271345 = 3000) {
|
|
const _0x423304 = _0x30b83a,
|
|
_0x2283ba = Date[_0x423304(276)]();
|
|
while (Date[_0x423304(276)]() - _0x2283ba < _0x271345) {
|
|
{
|
|
if (_0x5d426b()) return true;
|
|
await sleep(200);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
async function translateText(_0x13d59b) {
|
|
const _0x27f421 = _0x30b83a,
|
|
_0x2d5aee = "https://www.1618.wang/api/translate",
|
|
_0x2e71aa = encodeURIComponent(_0x13d59b);
|
|
try {
|
|
const _0xec0fcd = await fetch(_0x2d5aee + _0x27f421(253) + _0x2e71aa, {
|
|
"method": _0x27f421(336),
|
|
"headers": {
|
|
"Accept": _0x27f421(393)
|
|
}
|
|
}),
|
|
_0x1d8981 = await _0xec0fcd[_0x27f421(415)](),
|
|
_0xa3e83d = extractTranslatedText(_0x1d8981);
|
|
return _0xa3e83d || _0x13d59b;
|
|
} catch (_0x3bda91) {
|
|
console.error("[翻译功能] 翻译出错:", _0x3bda91);
|
|
return _0x13d59b;
|
|
}
|
|
}
|
|
function extractTranslatedText(_0x4877b3) {
|
|
const _0x2e5977 = _0x30b83a,
|
|
_0x28b388 = _0x2e5977(281),
|
|
_0x2d5855 = _0x2e5977(245),
|
|
_0x307cbc = _0x4877b3.indexOf(_0x28b388);
|
|
if (_0x307cbc === -1) return null;
|
|
const _0x1630e5 = _0x4877b3.indexOf("<li>", _0x307cbc) + 4,
|
|
_0x5217bf = _0x4877b3.indexOf(_0x2d5855, _0x1630e5);
|
|
return _0x4877b3[_0x2e5977(395)](_0x1630e5, _0x5217bf)[_0x2e5977(294)]();
|
|
}
|
|
async function reportError(_0x116dfa) {
|
|
const _0xfbdf49 = _0x30b83a,
|
|
_0x5e3c94 = CAPTCHA_CONFIG.reportUrl;
|
|
try {
|
|
console[_0xfbdf49(351)]("[报错功能] 正在报错ID: " + _0x116dfa);
|
|
const _0x1104f8 = await fetch(_0x5e3c94, {
|
|
"method": "POST",
|
|
"headers": {
|
|
"Content-Type": _0xfbdf49(289)
|
|
},
|
|
"body": JSON.stringify({
|
|
"id": _0x116dfa
|
|
})
|
|
}),
|
|
_0x23d670 = await _0x1104f8.json();
|
|
return _0x23d670[_0xfbdf49(360)] ? (console[_0xfbdf49(351)](_0xfbdf49(322)), _0x23d670) : (console[_0xfbdf49(412)]("[报错功能] 报错失败:", _0x23d670.message), _0x23d670);
|
|
} catch (_0x22f74d) {
|
|
console[_0xfbdf49(412)]("[报错功能] 请求出错:", _0x22f74d);
|
|
return {
|
|
"success": false,
|
|
"message": _0xfbdf49(271)
|
|
};
|
|
}
|
|
}
|
|
async function simulateClick(_0x502e1a, _0x269637) {
|
|
const _0x5734bc = _0x30b83a,
|
|
_0x5e5534 = document[_0x5734bc(382)](_0x502e1a - window[_0x5734bc(413)], _0x269637 - window[_0x5734bc(268)]);
|
|
if (!_0x5e5534) {
|
|
{
|
|
console.error(_0x5734bc(302) + _0x502e1a + ", " + _0x269637 + _0x5734bc(259));
|
|
return;
|
|
}
|
|
}
|
|
const _0x198692 = [{
|
|
"type": _0x5734bc(260),
|
|
"options": {
|
|
"clientX": _0x502e1a,
|
|
"clientY": _0x269637
|
|
}
|
|
}, {
|
|
"type": "mouseover",
|
|
"options": {
|
|
"clientX": _0x502e1a,
|
|
"clientY": _0x269637
|
|
}
|
|
}, {
|
|
"type": _0x5734bc(287),
|
|
"options": {
|
|
"clientX": _0x502e1a,
|
|
"clientY": _0x269637,
|
|
"button": 0
|
|
}
|
|
}, {
|
|
"type": _0x5734bc(384),
|
|
"options": {
|
|
"clientX": _0x502e1a,
|
|
"clientY": _0x269637,
|
|
"button": 0
|
|
}
|
|
}, {
|
|
"type": "click",
|
|
"options": {
|
|
"clientX": _0x502e1a,
|
|
"clientY": _0x269637,
|
|
"button": 0
|
|
}
|
|
}];
|
|
for (const _0x3be7c8 of _0x198692) {
|
|
{
|
|
const _0x230cf4 = new MouseEvent(_0x3be7c8[_0x5734bc(428)], {
|
|
"bubbles": true,
|
|
"cancelable": true,
|
|
"view": window,
|
|
..._0x3be7c8[_0x5734bc(266)]
|
|
});
|
|
_0x5e5534.dispatchEvent(_0x230cf4);
|
|
await sleep(50 + Math[_0x5734bc(364)]() * 50);
|
|
}
|
|
}
|
|
}
|
|
function sleep(_0x126c8b) {
|
|
return new Promise(_0x39bf63 => setTimeout(_0x39bf63, _0x126c8b));
|
|
}
|
|
function waitForChange(_0x2700bd, _0x4807e4 = 6000) {
|
|
return new Promise(_0x119538 => {
|
|
{
|
|
const _0x3255f7 = Date.now(),
|
|
_0x20f7f5 = () => {
|
|
const _0x59cd70 = _0x2bc3;
|
|
if (_0x2700bd()) _0x119538(true);else Date[_0x59cd70(276)]() - _0x3255f7 >= _0x4807e4 ? _0x119538(false) : setTimeout(_0x20f7f5, 100);
|
|
};
|
|
_0x20f7f5();
|
|
}
|
|
});
|
|
}
|
|
async function isSpinnerVisible() {
|
|
const _0x3a080a = _0x30b83a,
|
|
_0x576174 = document.querySelector(".root-2tSNO.Picture-spinner, .root-2tSNO.SemanticsVerify-spinner");
|
|
if (!_0x576174) return false;
|
|
const _0x5f3c55 = window[_0x3a080a(335)](_0x576174);
|
|
return _0x5f3c55[_0x3a080a(406)] !== _0x3a080a(439) && _0x5f3c55[_0x3a080a(324)] !== _0x3a080a(345);
|
|
}
|
|
async function waitForSpinnerToDisappear(_0x2359ce = 10000) {
|
|
const _0x202c8a = _0x30b83a,
|
|
_0x5935c6 = Date[_0x202c8a(276)]();
|
|
while (Date[_0x202c8a(276)]() - _0x5935c6 < _0x2359ce) {
|
|
if (!(await isSpinnerVisible())) return;
|
|
await new Promise(_0x3b557c => setTimeout(_0x3b557c, 200));
|
|
}
|
|
console[_0x202c8a(376)]("[加载检测] 等待加载动画超时");
|
|
}
|
|
function waitForImageLoad(_0x515208) {
|
|
return new Promise(_0x21c5b7 => {
|
|
const _0xfaea01 = _0x2bc3;
|
|
_0x515208[_0xfaea01(349)] ? _0x21c5b7() : (_0x515208[_0xfaea01(286)] = () => _0x21c5b7(), _0x515208[_0xfaea01(301)] = () => _0x21c5b7());
|
|
});
|
|
}
|
|
function initCaptchaAutoSolverWithCheck() {
|
|
const _0x3b07cd = _0x30b83a;
|
|
document[_0x3b07cd(421)] !== _0x3b07cd(349) ? window.addEventListener(_0x3b07cd(387), () => {
|
|
setTimeout(conditionalInit, 3000);
|
|
}) : setTimeout(conditionalInit, 3000);
|
|
}
|
|
function conditionalInit() {
|
|
const _0x56d230 = _0x30b83a;
|
|
try {
|
|
{
|
|
const _0x3168bf = document[_0x56d230(354)]("#temu-log-container");
|
|
if (!_0x3168bf) return;
|
|
initCaptchaAutoSolver();
|
|
}
|
|
} catch (_0x1b4845) {
|
|
console.error("[系统启动] 初始化检查时出错:", _0x1b4845);
|
|
}
|
|
}
|
|
initCaptchaAutoSolverWithCheck(); |