一、目标网址:aHR0cHM6Ly9zZWMueGlhb2R1bi5jb20vb25saW5lRXhwZXJpZW5jZS9zbGlkaW5nUHV6emxl
二、接口分析
1.png (147.19 KB, 下载次数: 0)
下载附件
2024-2-22 08:50 上传
2.png (116.12 KB, 下载次数: 0)
下载附件
2024-2-22 08:50 上传
三、构建第一个接口请求------>获取滑块图片
3.png (422.17 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传
4.png (76.59 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传
5.png (200.07 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传
6.png (314.72 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传
1、对p1-p9参数逐个分析,还原
1.png (87.12 KB, 下载次数: 0)
下载附件
2024-2-22 08:53 上传
2.png (80.65 KB, 下载次数: 0)
下载附件
2024-2-22 08:54 上传
3.png (121.68 KB, 下载次数: 0)
下载附件
2024-2-22 08:59 上传
4.png (86.99 KB, 下载次数: 0)
下载附件
2024-2-22 09:00 上传
5.png (15.92 KB, 下载次数: 0)
下载附件
2024-2-22 09:00 上传
6.png (66.46 KB, 下载次数: 0)
下载附件
2024-2-22 09:01 上传
7.png (28.91 KB, 下载次数: 0)
下载附件
2024-2-22 09:01 上传
8.png (13.14 KB, 下载次数: 0)
下载附件
2024-2-22 09:03 上传
9.png (23.1 KB, 下载次数: 0)
下载附件
2024-2-22 09:03 上传
10.png (14.32 KB, 下载次数: 0)
下载附件
2024-2-22 09:03 上传
2、上面已经把所有的请求参数分析还原出来了,下面整理构造一个方法,方便python调用即可
[JavaScript] 纯文本查看 复制代码// 完整的js代码
const Crypto = require('crypto-js');
token = 'tongdun' + '-' + new Date().getTime() + '-' + Math.random().toString(16).substr(2);
oOoQQ0 = 'b37uCyfyme4S7TF/MVDRqSRxP4CB2BjsnDxr4bSxz0vSL/~hXNGID9Tr7vzaBm~F'
var oQO0Q0 = (oOoQQ0 || '|') + '^^' + (token || '|') + '^^' + ('tongdun' || '|') + '^^' + ('x_tongdun2_web' || '|');
oQO0Q0 = oQO0Q0 + '';
var OoOQ0O = ('nWPHb170847576679YyhGqayf0' || '|') + '^^' + 1 + '^^' + 1 + '^^' + 1;
function QQ00QO(oQQ0Qo) {
var QQoooQ = '';
for (var ooQOQO = 0; ooQOQO = 97 && QOoOOO >> 2] >>> 24 - OoOQ0O % 4 * 8 & 255;
QQoooQ[QOoOOO + OoOQ0O >>> 2] |= oOOoQO >> 2] = ooQOQO[OoOQ0O >>> 2];
}
}
this.sigBytes += oQO0Q0;
return this;
},
mb: function() {
var oQQ0Qo = this.words;
var QQoooQ = this.sigBytes;
oQQ0Qo[QQoooQ >>> 2] &= 4294967295 > 16) & OoO00O;
oOoQoQ = 18000 * (oOoQoQ & 65535) + (oOoQoQ >> 16) & OoO00O;
var oQQ0Qo = (QooOoO 0.5 ? 1 : -1);
}
;
};
for (var QOoOOO = 0, oQO0Q0; QOoOOO >> 2] >>> 24 - oQO0Q0 % 4 * 8 & 255;
QOoOOO.push((OoOQ0O >>> 4).fF(16));
QOoOOO.push((OoOQ0O & 15).fF(16));
}
return QOoOOO.join('');
},
ty: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.length;
var ooQOQO = [];
for (var QOoOOO = 0; QOoOOO >> 3] |= parseInt(oQQ0Qo.substr(QOoOOO, 2), 16) >> 2] >>> 24 - oQO0Q0 % 4 * 8 & 255;
QOoOOO.push(String.fromCharCode(OoOQ0O));
}
return QOoOOO.join('');
},
ty: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.length;
var ooQOQO = [];
for (var QOoOOO = 0; QOoOOO >> 2] |= (oQQ0Qo.charCodeAt(QOoOOO) & 255) >> 2] >>> 24 - OoOQ0O % 4 * 8 & 255;
var ooQQ0Q = QQoooQ[OoOQ0O + 1 >>> 2] >>> 24 - (OoOQ0O + 1) % 4 * 8 & 255;
var QOo0Oo = QQoooQ[OoOQ0O + 2 >>> 2] >>> 24 - (OoOQ0O + 2) % 4 * 8 & 255;
var OOOQOQ = oOOoQO >> 6 * (3 - QoQQo0) & 63));
}
}
var QQQOQO = QOoOOO.charAt(64);
if (QQQOQO) {
while (oQO0Q0.length % 4) {
oQO0Q0.push(QQQOQO);
}
}
return oQO0Q0.join('');
},
ty: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.length;
var ooQOQO = this.Ky;
var QOoOOO = ooQOQO.charAt(64);
if (QOoOOO) {
var oQO0Q0 = oQQ0Qo.indexOf(QOoOOO);
if (oQO0Q0 != -1) {
QQoooQ = oQO0Q0;
}
}
var OoOQ0O = [];
var oOOoQO = 0;
for (var ooQQ0Q = 0; ooQQ0Q >> 6 - ooQQ0Q % 4 * 2;
var QoQQo0 = QOo0Oo | OOOQOQ;
OoOQ0O[oOOoQO >>> 2] |= QoQQo0 >> 2] & 255;
oQQ0Qo.sigBytes -= QQoooQ;
}
};
var OO00QQ = ooQOQO.BlockCipher = oOOoQo.tp({
uu: oOOoQo.uu.tp({
ed: oOOOoo,
HL: OO0OO0
}),
gK: function() {
oOOoQo.gK.call(this);
var oQQ0Qo = this.uu;
var QQoooQ = oQQ0Qo.jh;
var ooQOQO = oQQ0Qo.ed;
if (this._xformMode == this.Gj) {
var QOoOOO = ooQOQO.Jr;
} else {
var QOoOOO = ooQOQO.ch;
this.eL = 1;
}
this._mode = QOoOOO.call(ooQOQO, this, QQoooQ && QQoooQ.words);
},
zH: function(oQQ0Qo, QQoooQ) {
this._mode.yr(oQQ0Qo, QQoooQ);
},
fz: function() {
var oQQ0Qo = this.uu.HL;
if (this._xformMode == this.Gj) {
oQQ0Qo.mP(this._data, this.Lr);
var QQoooQ = this.Pu(!!QQ00QO('gmvti'));
} else {
var QQoooQ = this.Pu(!!QQ00QO('gmvti'));
oQQ0Qo.xq(QQoooQ);
}
return QQoooQ;
},
Lr: 128 / 32
});
var OOQOOQ = ooQOQO.CipherParams = QOoOOO.tp({
fE: function(oQQ0Qo) {
this.Gv(oQQ0Qo);
},
fF: function(oQQ0Qo) {
return (oQQ0Qo || this.yD).fe(this);
}
});
var o000oQ = QQoooQ.yJ = {};
var oQo0Qo = o000oQ.OpenSSL = {
fe: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.lm;
var ooQOQO = oQQ0Qo.MB;
if (ooQOQO) {
var QOoOOO = QOoOQO.xA([1398893684, 1701076831]).Fj(ooQOQO).Fj(QQoooQ);
} else {
var QOoOOO = QQoooQ;
}
return QOoOOO.fF(OOoo0Q);
},
ty: function(oQQ0Qo) {
var QQoooQ = OOoo0Q.ty(oQQ0Qo);
var ooQOQO = QQoooQ.words;
if (ooQOQO[0] == 1398893684 && ooQOQO[1] == 1701076831) {
var QOoOOO = QOoOQO.xA(ooQOQO.slice(2, 4));
ooQOQO.splice(0, 4);
QQoooQ.sigBytes -= 16;
}
return OOQOOQ.xA({
lm: QQoooQ,
MB: QOoOOO
});
}
};
var OQoo0o = ooQOQO.SerializableCipher = QOoOOO.tp({
uu: QOoOOO.tp({
yJ: oQo0Qo
}),
jq: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
var oQO0Q0 = oQQ0Qo.Jr(ooQOQO, QOoOOO);
var OoOQ0O = oQO0Q0.ds(QQoooQ);
var oOOoQO = oQO0Q0.uu;
return OOQOOQ.xA({
lm: OoOQ0O,
fG: ooQOQO,
jh: oOOoQO.jh,
sf: oQQ0Qo,
ed: oOOoQO.ed,
HL: oOOoQO.HL,
Lr: oQQ0Qo.Lr,
yD: QOoOOO.yJ
});
},
qm: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
QQoooQ = this.bq(QQoooQ, QOoOOO.yJ);
var oQO0Q0 = oQQ0Qo.ch(ooQOQO, QOoOOO).ds(QQoooQ.lm);
return oQO0Q0;
},
bq: function(oQQ0Qo, QQoooQ) {
if (typeof oQQ0Qo == QQ00QO('tusjoh')) {
return QQoooQ.ty(oQQ0Qo, this);
} else {
return oQQ0Qo;
}
}
});
var oQoQoO = QQoooQ.CE = {};
var Q0QOOo = oQoQoO.OpenSSL = {
gu: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
if (!QOoOOO) {
QOoOOO = QOoOQO.Bu(64 / 8);
}
var oQO0Q0 = O0O0o0.xA({
Jv: QQoooQ + ooQOQO
}).compute(oQQ0Qo, QOoOOO);
var OoOQ0O = QOoOQO.xA(oQO0Q0.words.slice(QQoooQ), ooQOQO * 4);
oQO0Q0.sigBytes = QQoooQ * 4;
return OOQOOQ.xA({
fG: oQO0Q0,
jh: OoOQ0O,
MB: QOoOOO
});
}
};
var oOQQ0o = ooQOQO.PasswordBasedCipher = OQoo0o.tp({
uu: OQoo0o.uu.tp({
CE: Q0QOOo
}),
jq: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
var oQO0Q0 = QOoOOO.CE.gu(ooQOQO, oQQ0Qo.Jv, oQQ0Qo.lk);
QOoOOO.jh = oQO0Q0.jh;
var OoOQ0O = OQoo0o.jq.call(this, oQQ0Qo, QQoooQ, oQO0Q0.fG, QOoOOO);
OoOQ0O.Gv(oQO0Q0);
return OoOQ0O;
},
qm: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
QQoooQ = this.bq(QQoooQ, QOoOOO.yJ);
var oQO0Q0 = QOoOOO.CE.gu(ooQOQO, oQQ0Qo.Jv, oQQ0Qo.lk, QQoooQ.MB);
QOoOOO.jh = oQO0Q0.jh;
var OoOQ0O = OQoo0o.qm.call(this, oQQ0Qo, QQoooQ, oQO0Q0.fG, QOoOOO);
return OoOQ0O;
}
});
}();
OOo0OQ.ed.CFB = function() {
var oQQ0Qo = OOo0OQ.lib.BlockCipherMode.tp();
oQQ0Qo.Encryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
oQOQOQ.call(this, oQQ0Qo, QQoooQ, QOoOOO, ooQOQO);
this._prevBlock = oQQ0Qo.slice(QQoooQ, QQoooQ + QOoOOO);
}
});
oQQ0Qo.Decryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
var oQO0Q0 = oQQ0Qo.slice(QQoooQ, QQoooQ + QOoOOO);
oQOQOQ.call(this, oQQ0Qo, QQoooQ, QOoOOO, ooQOQO);
this._prevBlock = oQO0Q0;
}
});
function oQOQOQ(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
var oQO0Q0 = this._iv;
if (oQO0Q0) {
var OoOQ0O = oQO0Q0.slice(0);
this._iv = OQOO0Q;
} else {
var OoOQ0O = this._prevBlock;
}
QOoOOO.Bc(OoOQ0O, 0);
for (var ooQQ0Q = 0; ooQQ0Q >> 2] |= oQO0Q0 >> 2] & 255;
oQQ0Qo.sigBytes -= QQoooQ;
}
};
OOo0OQ.ed.OFB = function() {
var oQQ0Qo = OOo0OQ.lib.BlockCipherMode.tp();
var QQoooQ = oQQ0Qo.Encryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
var oQO0Q0 = this._iv;
var OoOQ0O = this._keystream;
if (oQO0Q0) {
OoOQ0O = this._keystream = oQO0Q0.slice(0);
this._iv = OQOO0Q;
}
ooQOQO.Bc(OoOQ0O, 0);
for (var oOOoQO = 0; oOOoQO >> 2] >>> 24 - ooQOQO % 4 * 8 & 255)) {
ooQOQO--;
}
oQQ0Qo.sigBytes = ooQOQO + 1;
}
};
(function() {
var oQQ0Qo = OOo0OQ;
var QQoooQ = oQQ0Qo.lib;
var ooQOQO = QQoooQ.BlockCipher;
var QOoOOO = oQQ0Qo.algo;
var Oo0Q0Q = [];
var OQO0QO = [];
var oooOoo = [];
var o0QQOQ = [];
var O0QoQo = [];
var ooO0O0 = [];
var oO0QOQ = [];
var Q0OQQO = [];
var QQ00OO = [];
var Ooo0o0 = [];
(function() {
var oQQ0Qo = [];
for (var QQoooQ = 0; QQoooQ >> 8 ^ OoOQ0O & 255 ^ 99;
Oo0Q0Q[ooQOQO] = OoOQ0O;
OQO0QO[OoOQ0O] = ooQOQO;
var oOOoQO = oQQ0Qo[ooQOQO];
var ooQQ0Q = oQQ0Qo[oOOoQO];
var QOo0Oo = oQQ0Qo[ooQQ0Q];
var OOOQOQ = oQQ0Qo[OoOQ0O] * 257 ^ OoOQ0O * 16843008;
oooOoo[ooQOQO] = OOOQOQ >> 8;
o0QQOQ[ooQOQO] = OOOQOQ >> 16;
O0QoQo[ooQOQO] = OOOQOQ >> 24;
ooO0O0[ooQOQO] = OOOQOQ;
var OOOQOQ = QOo0Oo * 16843009 ^ ooQQ0Q * 65537 ^ oOOoQO * 257 ^ ooQOQO * 16843008;
oO0QOQ[OoOQ0O] = OOOQOQ >> 8;
Q0OQQO[OoOQ0O] = OOOQOQ >> 16;
QQ00OO[OoOQ0O] = OOOQOQ >> 24;
Ooo0o0[OoOQ0O] = OOOQOQ;
if (!ooQOQO) {
ooQOQO = QOoOOO = 1;
} else {
ooQOQO = oOOoQO ^ oQQ0Qo[oQQ0Qo[oQQ0Qo[QOo0Oo ^ oOOoQO]]];
QOoOOO ^= oQQ0Qo[oQQ0Qo[QOoOOO]];
}
}
}());
var ooOQOO = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54];
var oOOOoo = QOoOOO.AES = ooQOQO.tp({
fP: function() {
var oQQ0Qo = this._key;
var QQoooQ = oQQ0Qo.words;
var ooQOQO = oQQ0Qo.sigBytes / 4;
var QOoOOO = this._nRounds = ooQOQO + 6;
var oQO0Q0 = (QOoOOO + 1) * 4;
var OoOQ0O = this._keySchedule = [];
for (var oOOoQO = 0; oOOoQO >> 24;
ooQQ0Q = Oo0Q0Q[ooQQ0Q >>> 24] >> 16 & 255] >> 8 & 255] 6 && oOOoQO % ooQOQO == 4) {
ooQQ0Q = Oo0Q0Q[ooQQ0Q >>> 24] >> 16 & 255] >> 8 & 255] >> 24]] ^ Q0OQQO[Oo0Q0Q[ooQQ0Q >>> 16 & 255]] ^ QQ00OO[Oo0Q0Q[ooQQ0Q >>> 8 & 255]] ^ Ooo0o0[Oo0Q0Q[ooQQ0Q & 255]];
}
}
},
Bc: function(oQQ0Qo, QQoooQ) {
this.GG(oQQ0Qo, QQoooQ, this._keySchedule, oooOoo, o0QQOQ, O0QoQo, ooO0O0, Oo0Q0Q);
},
hx: function(oQQ0Qo, QQoooQ) {
var ooQOQO = oQQ0Qo[QQoooQ + 1];
oQQ0Qo[QQoooQ + 1] = oQQ0Qo[QQoooQ + 3];
oQQ0Qo[QQoooQ + 3] = ooQOQO;
this.GG(oQQ0Qo, QQoooQ, this._invKeySchedule, oO0QOQ, Q0OQQO, QQ00OO, Ooo0o0, OQO0QO);
var ooQOQO = oQQ0Qo[QQoooQ + 1];
oQQ0Qo[QQoooQ + 1] = oQQ0Qo[QQoooQ + 3];
oQQ0Qo[QQoooQ + 3] = ooQOQO;
},
GG: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO, oQO0Q0, OoOQ0O, oOOoQO, ooQQ0Q) {
var QOo0Oo = this._nRounds;
var OOOQOQ = oQQ0Qo[QQoooQ] ^ ooQOQO[0];
var QoQQo0 = oQQ0Qo[QQoooQ + 1] ^ ooQOQO[1];
var QQQOQO = oQQ0Qo[QQoooQ + 2] ^ ooQOQO[2];
var QOQQO0 = oQQ0Qo[QQoooQ + 3] ^ ooQOQO[3];
var Qoo0Q0 = 4;
for (var QOQ0QQ = 1; QOQ0QQ >> 24] ^ oQO0Q0[QoQQo0 >>> 16 & 255] ^ OoOQ0O[QQQOQO >>> 8 & 255] ^ oOOoQO[QOQQO0 & 255] ^ ooQOQO[Qoo0Q0++];
var QoOO00 = QOoOOO[QoQQo0 >>> 24] ^ oQO0Q0[QQQOQO >>> 16 & 255] ^ OoOQ0O[QOQQO0 >>> 8 & 255] ^ oOOoQO[OOOQOQ & 255] ^ ooQOQO[Qoo0Q0++];
var OO0OO0 = QOoOOO[QQQOQO >>> 24] ^ oQO0Q0[QOQQO0 >>> 16 & 255] ^ OoOQ0O[OOOQOQ >>> 8 & 255] ^ oOOoQO[QoQQo0 & 255] ^ ooQOQO[Qoo0Q0++];
var OO00QQ = QOoOOO[QOQQO0 >>> 24] ^ oQO0Q0[OOOQOQ >>> 16 & 255] ^ OoOQ0O[QoQQo0 >>> 8 & 255] ^ oOOoQO[QQQOQO & 255] ^ ooQOQO[Qoo0Q0++];
OOOQOQ = oOOOoo;
QoQQo0 = QoOO00;
QQQOQO = OO0OO0;
QOQQO0 = OO00QQ;
}
var oOOOoo = (ooQQ0Q[OOOQOQ >>> 24] >> 16 & 255] >> 8 & 255] >> 24] >> 16 & 255] >> 8 & 255] >> 24] >> 16 & 255] >> 8 & 255] >> 24] >> 16 & 255] >> 8 & 255]
7.png (163.22 KB, 下载次数: 0)
下载附件
2024-2-22 09:06 上传
3、构造请求获取图片以及所需的数据,这个很简单,就不展开了
四、还原背景图
8.png (71.73 KB, 下载次数: 0)
下载附件
2024-2-22 09:06 上传
9.png (94.77 KB, 下载次数: 0)
下载附件
2024-2-22 09:06 上传
10.png (85.21 KB, 下载次数: 0)
下载附件
2024-2-22 09:07 上传
11.png (162.48 KB, 下载次数: 0)
下载附件
2024-2-22 09:07 上传
12.png (242.57 KB, 下载次数: 0)
下载附件
2024-2-22 09:07 上传
1、分析图片还原逻辑
[JavaScript] 纯文本查看 复制代码// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
for (var ooQOQO = 0; ooQOQO
13.png (33.3 KB, 下载次数: 0)
下载附件
2024-2-22 09:10 上传
[JavaScript] 纯文本查看 复制代码// 这段js逻辑是将切割好的小图,按一定的规律重新排序
OQQ000 = [{}, {}];
for (var QOoOOO = 0; QOoOOO = Oo0QoQ) {
OQQ000[0][oOOoQO] = O0QoQ0[1][QOoOOO - Oo0QoQ];
} else {
OQQ000[0][oOOoQO] = O0QoQ0[0][QOoOOO];
}
} else {
OQQ000[1][oOOoQO - Oo0QoQ] = {};
if (QOoOOO >= Oo0QoQ) {
OQQ000[1][oOOoQO - Oo0QoQ] = O0QoQ0[1][QOoOOO - Oo0QoQ];
} else {
OQQ000[1][oOOoQO - Oo0QoQ] = O0QoQ0[0][QOoOOO];
}
}
}
[JavaScript] 纯文本查看 复制代码// 这段js逻辑是将重新排序好的小图,按2层,每层8张进行拼接
for (var ooQOQO = 0; ooQOQO
2、下面是根据上述代码改写的js;打印输出可以清楚的看到还原逻辑
[JavaScript] 纯文本查看 复制代码// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
O0QoQ0 = {}
for (var ooQOQO = 0; ooQOQO = 8) {
OQQ000[0][oOOoQO] = O0QoQ0[1][QOoOOO - 8];
} else {
OQQ000[0][oOOoQO] = O0QoQ0[0][QOoOOO];
}
} else {
OQQ000[1][oOOoQO - 8] = {};
if (QOoOOO >= 8) {
OQQ000[1][oOOoQO - 8] = O0QoQ0[1][QOoOOO - 8];
} else {
OQQ000[1][oOOoQO - 8] = O0QoQ0[0][QOoOOO];
}
}
}
console.log('小图进行重新排序');
console.log(OQQ000);
// 这段js逻辑是将重新排序好的小图,按2层,每层8张进行拼接
for (var ooQOQO = 0; ooQOQO
14.png (84.95 KB, 下载次数: 0)
下载附件
2024-2-22 09:12 上传
3、python代码实现图片还原操作
[Python] 纯文本查看 复制代码from pathlib import Path
from PIL import Image
def reduction_img(img_ss, img_path, file_path):
_img = Image.open(img_path)
# 图片大小
__imgx = 320
__imgy = 180
# 图片分割为8块、2层
_cutX = int(__imgx / 8)
_cutY = int(__imgy / 2)
img_ceng = {}
for ce in range(0, 2):
img_ceng[ce] = {}
if ce =8:
new_img_ceng[0] = img_ceng[1][x-8]
else:
new_img_ceng[0] = img_ceng[0][x]
else:
new_img_ceng[1][i-8] = {}
if x >=8:
new_img_ceng[1][i-8] = img_ceng[1][x-8]
else:
new_img_ceng[1][i-8] = img_ceng[0][x]
# 进行还原拼接操作
for ce in range(0, 2):
for i in range(0, 8):
new_img.paste(new_img_ceng[ce], (int(320 / 8) * i, int(180 / 2) * ce))
save_path = Path(file_path).resolve().__str__()
# 保存图片
new_img.save(save_path)
if __name__ == '__main__':
# 背景图片还原所需的分割码
img_ss = "bgImageSplitSequence值"
# 需要还原的背景图
img_path = './bg.jpg'
# 还原后的背景图
file_path = './new_bg.jpg'
reduction_img(img_ss, img_path, file_path)
15.png (32.76 KB, 下载次数: 0)
下载附件
2024-2-22 09:13 上传
4、进行缺口距离计算、这里可以使用cv2、yolov8、ddddocr等;比较简单这里就不展开了
五、验证滑块请求------>获取valIDAteToken值
16.png (223.04 KB, 下载次数: 0)
下载附件
2024-2-22 09:13 上传
1、那些参数需要变化和生成
[JavaScript] 纯文本查看 复制代码// 1、QQoooQ.requestType = 3
// 2、QQoooQ.validateCodeObj 第一个接口返回数据
// 3、QQoooQ.userAnswer 需要还原
// 4、QQoooQ.mouseInfo 鼠标移动轨迹,需要还原(重点参数)
// 5、QQoooQ.usedTime 可以写个固定值,不要是0就好
// 其它参数不变
17.png (302.81 KB, 下载次数: 0)
下载附件
2024-2-22 09:14 上传
18.png (114.01 KB, 下载次数: 0)
下载附件
2024-2-22 09:14 上传
19.png (108.49 KB, 下载次数: 0)
下载附件
2024-2-22 09:15 上传
2、分析还原 userAnswer、mouseInfo 参数
11.png (78.08 KB, 下载次数: 0)
下载附件
2024-2-22 09:16 上传
12.png (33.92 KB, 下载次数: 0)
下载附件
2024-2-22 09:16 上传
20.png (245.52 KB, 下载次数: 0)
下载附件
2024-2-22 09:17 上传
3、鼠标轨迹分析
21.png (102.5 KB, 下载次数: 0)
下载附件
2024-2-22 09:17 上传
22.png (83.52 KB, 下载次数: 0)
下载附件
2024-2-22 09:18 上传
4、根据上述规律模拟处轨迹就可以了,代码就不贴了,知道规律了模拟生成就很简单了。
5、生成请求参数发送请求,和第一次获取图片请求一样,这里就不贴代码了,直接看下结果
23.png (73.33 KB, 下载次数: 0)
下载附件
2024-2-22 09:18 上传
总结:
1、分析接口
2、模拟接口请求参数发送请求----->获取背景图片----->还原图片----->计算缺口距离
3、模拟生成鼠标移动轨迹----->生成请求参数发送请求----->获取最终结果
声明:本文章仅供学习使用,上述代码请不要违规使用,所造成的一切不良后果与作者无关;如有侵权,请联系删除!!!