├── 01_百度翻译
├── baidu.py
└── sign.js
├── 02_有道翻译
├── sign.js
└── sign_last.js
├── 03_房天下
└── pwd.js
├── 04_G妹游戏
└── password.js
├── 05_中华人才网
└── verify.py
├── 06_微博
└── user-pwd.js
├── 07_南昌人才网
├── enc.js
└── test.py
├── 08_当乐网
└── enc.js
├── 09_酷我音乐
└── reqId.js
├── 10_升学e网通
└── enc_sign_pwd.js
├── 11_全国建筑市场
├── data.js
└── test.py
├── 12_猿人学系列(第一期)
├── 15
│ ├── main.wasm
│ └── test.py
├── 16
│ ├── test.js
│ └── test.py
├── 17
│ ├── 代理fiddler.py
│ └── 库curl_cffi.py
├── 01
│ ├── m.js
│ └── test.py
├── 02
│ ├── m.js
│ └── test.py
├── 03
│ └── test.py
└── 04
│ └── test.py
├── 13_临安人才网
├── enc.js
└── test.py
├── 14_gov
├── enc.js
└── test.py
├── 15_Bilibili
├── password.js
└── test.py
├── 16_去哪儿旅行
├── slideToken.js
└── test.py
├── 17_豆瓣
└── test.py
├── 18_唯品会
├── mars_cid.js
└── test.py
├── 19_超星学习通
├── test.py
└── user_pwd.js
├── 20_山西省电子税务局
├── Verification.js
└── test.py
├── 21_优购网
└── test.py
├── 22_当当网
├── test.js
└── test.py
├── 23_58同城
└── encPwd.js
├── 24_艺恩星数
├── test.py
└── user_pwd.js
├── 25_今日头条
└── test.js
└── README.md
/01_百度翻译/baidu.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import execjs
3 | import re
4 | import os
5 |
6 | current_path = os.path.dirname(os.path.abspath(__file__))
7 | enc_jd_path = os.path.join(current_path, 'sign.js')
8 | ctx = execjs.compile(open(enc_jd_path, encoding='utf-8').read())
9 |
10 | header = {
11 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
12 | }
13 | # 首页获取gtk和token
14 | index_url = 'https://fanyi.baidu.com/'
15 | response = requests.get(index_url, headers=header)
16 | first_cookie = requests.utils.dict_from_cookiejar(response.cookies)
17 | # 需要携带第一次请求返回的ck再次请求首页获取token否则首页token为空
18 | response = requests.get(index_url, headers=header, cookies=first_cookie)
19 | token = re.findall("token: \'(.*?)\'\,", response.text)[0]
20 | gtk = re.findall('gtk = "(.*?)";', response.text)[0]
21 |
22 |
23 | query = 'python'
24 | sign = ctx.call('sign', query, gtk)
25 |
26 | # 翻译接口
27 | trans_api_url = "https://fanyi.baidu.com/v2transapi"
28 | data = {
29 | "from": "en",
30 | "to": "zh",
31 | "query": query,
32 | "transtype": "enter",
33 | "simple_means_flag": "3",
34 | "sign": sign,
35 | "token": token,
36 | "domain": "common",
37 | }
38 | response = requests.post(trans_api_url, headers=header, cookies=first_cookie, data=data)
39 |
40 | print(response.json())
--------------------------------------------------------------------------------
/01_百度翻译/sign.js:
--------------------------------------------------------------------------------
1 | var r = null;
2 | window = globalThis
3 |
4 | function e(t, e) {
5 | (null == e || e > t.length) && (e = t.length);
6 | for (var n = 0, r = new Array(e); n < e; n++)
7 | r[n] = t[n];
8 | return r
9 | }
10 | function n(t, e) {
11 | for (var n = 0; n < e.length - 2; n += 3) {
12 | var r = e.charAt(n + 2);
13 | r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r),
14 | r = "+" === e.charAt(n + 1) ? t >>> r : t << r,
15 | t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r
16 | }
17 | return t
18 | }
19 | function b(t) {
20 | var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
21 | if (null === i) {
22 | var a = t.length;
23 | a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
24 | } else {
25 | for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, u = s.length, l = []; c < u; c++)
26 | "" !== s[c] && l.push.apply(l, function(t) {
27 | if (Array.isArray(t))
28 | return e(t)
29 | }(o = s[c].split("")) || function(t) {
30 | if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"])
31 | return Array.from(t)
32 | }(o) || function(t, n) {
33 | if (t) {
34 | if ("string" == typeof t)
35 | return e(t, n);
36 | var r = Object.prototype.toString.call(t).slice(8, -1);
37 | return "Object" === r && t.constructor && (r = t.constructor.name),
38 | "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
39 | }
40 | }(o) || function() {
41 | throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
42 | }()),
43 | c !== u - 1 && l.push(i[c]);
44 | var p = l.length;
45 | p > 30 && (t = l.slice(0, 10).join("") + l.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + l.slice(-10).join(""))
46 | }
47 | for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = (null !== r ? r : (r = window[d] || "") || "").split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
48 | var _ = t.charCodeAt(v);
49 | _ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
50 | g[y++] = _ >> 18 | 240,
51 | g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
52 | g[y++] = _ >> 6 & 63 | 128),
53 | g[y++] = 63 & _ | 128)
54 | }
55 | for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
56 | b = n(b += g[x], w);
57 | return b = n(b, k),
58 | (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
59 | "".concat((b %= 1e6).toString(), ".").concat(b ^ f)
60 | }
61 |
62 |
63 |
64 | function sign(val, gtk) {
65 | window['gtk'] = gtk
66 | return b(val)
67 | }
68 |
--------------------------------------------------------------------------------
/03_房天下/pwd.js:
--------------------------------------------------------------------------------
1 | function setMaxDigits(n) {
2 | maxDigits = n;
3 | ZERO_ARRAY = new Array(maxDigits);
4 | for (var t = 0; t < ZERO_ARRAY.length; t++)
5 | ZERO_ARRAY[t] = 0;
6 | bigZero = new BigInt;
7 | bigOne = new BigInt;
8 | bigOne.digits[0] = 1
9 | }
10 | function BigInt(n) {
11 | this.digits = typeof n == "boolean" && n == !0 ? null : ZERO_ARRAY.slice(0);
12 | this.isNeg = !1
13 | }
14 | function biFromDecimal(n) {
15 | for (var u = n.charAt(0) == "-", t = u ? 1 : 0, i, f, r; t < n.length && n.charAt(t) == "0"; )
16 | ++t;
17 | if (t == n.length)
18 | i = new BigInt;
19 | else {
20 | for (f = n.length - t,
21 | r = f % dpl10,
22 | r == 0 && (r = dpl10),
23 | i = biFromNumber(Number(n.substr(t, r))),
24 | t += r; t < n.length; )
25 | i = biAdd(biMultiply(i, lr10), biFromNumber(Number(n.substr(t, dpl10)))),
26 | t += dpl10;
27 | i.isNeg = u
28 | }
29 | return i
30 | }
31 | function biCopy(n) {
32 | var t = new BigInt(!0);
33 | return t.digits = n.digits.slice(0),
34 | t.isNeg = n.isNeg,
35 | t
36 | }
37 | function biFromNumber(n) {
38 | var t = new BigInt, i;
39 | for (t.isNeg = n < 0,
40 | n = Math.abs(n),
41 | i = 0; n > 0; )
42 | t.digits[i++] = n & maxDigitVal,
43 | n = Math.floor(n / biRadix);
44 | return t
45 | }
46 | function reverseStr(n) {
47 | for (var i = "", t = n.length - 1; t > -1; --t)
48 | i += n.charAt(t);
49 | return i
50 | }
51 | function biToString(n, t) {
52 | var r = new BigInt, i, u;
53 | for (r.digits[0] = t,
54 | i = biDivideModulo(n, r),
55 | u = hexatrigesimalToChar[i[1].digits[0]]; biCompare(i[0], bigZero) == 1; )
56 | i = biDivideModulo(i[0], r),
57 | digit = i[1].digits[0],
58 | u += hexatrigesimalToChar[i[1].digits[0]];
59 | return (n.isNeg ? "-" : "") + reverseStr(u)
60 | }
61 | function biToDecimal(n) {
62 | var i = new BigInt, t, r;
63 | for (i.digits[0] = 10,
64 | t = biDivideModulo(n, i),
65 | r = String(t[1].digits[0]); biCompare(t[0], bigZero) == 1; )
66 | t = biDivideModulo(t[0], i),
67 | r += String(t[1].digits[0]);
68 | return (n.isNeg ? "-" : "") + reverseStr(r)
69 | }
70 | function digitToHex(n) {
71 | var t = "";
72 | for (i = 0; i < 4; ++i)
73 | t += hexToChar[n & 15],
74 | n >>>= 4;
75 | return reverseStr(t)
76 | }
77 | function biToHex(n) {
78 | for (var i = "", r = biHighIndex(n), t = biHighIndex(n); t > -1; --t)
79 | i += digitToHex(n.digits[t]);
80 | return i
81 | }
82 | function charToHex(n) {
83 | var t = 48
84 | , u = t + 9
85 | , i = 97
86 | , f = i + 25
87 | , r = 65;
88 | return n >= t && n <= u ? n - t : n >= r && n <= 90 ? 10 + n - r : n >= i && n <= f ? 10 + n - i : 0
89 | }
90 | function hexToDigit(n) {
91 | for (var t = 0, r = Math.min(n.length, 4), i = 0; i < r; ++i)
92 | t <<= 4,
93 | t |= charToHex(n.charCodeAt(i));
94 | return t
95 | }
96 | function biFromHex(n) {
97 | for (var i = new BigInt, u = n.length, t = u, r = 0; t > 0; t -= 4,
98 | ++r)
99 | i.digits[r] = hexToDigit(n.substr(Math.max(t - 4, 0), Math.min(t, 4)));
100 | return i
101 | }
102 | function biFromString(n, t) {
103 | var f = n.charAt(0) == "-", e = f ? 1 : 0, i = new BigInt, r = new BigInt, u;
104 | for (r.digits[0] = 1,
105 | u = n.length - 1; u >= e; u--) {
106 | var o = n.charCodeAt(u)
107 | , s = charToHex(o)
108 | , h = biMultiplyDigit(r, s);
109 | i = biAdd(i, h);
110 | r = biMultiplyDigit(r, t)
111 | }
112 | return i.isNeg = f,
113 | i
114 | }
115 | function biDump(n) {
116 | return (n.isNeg ? "-" : "") + n.digits.join(" ")
117 | }
118 | function biAdd(n, t) {
119 | var r, u, f, i;
120 | if (n.isNeg != t.isNeg)
121 | t.isNeg = !t.isNeg,
122 | r = biSubtract(n, t),
123 | t.isNeg = !t.isNeg;
124 | else {
125 | for (r = new BigInt,
126 | u = 0,
127 | i = 0; i < n.digits.length; ++i)
128 | f = n.digits[i] + t.digits[i] + u,
129 | r.digits[i] = f % biRadix,
130 | u = Number(f >= biRadix);
131 | r.isNeg = n.isNeg
132 | }
133 | return r
134 | }
135 | function biSubtract(n, t) {
136 | var r, f, u, i;
137 | if (n.isNeg != t.isNeg)
138 | t.isNeg = !t.isNeg,
139 | r = biAdd(n, t),
140 | t.isNeg = !t.isNeg;
141 | else {
142 | for (r = new BigInt,
143 | u = 0,
144 | i = 0; i < n.digits.length; ++i)
145 | f = n.digits[i] - t.digits[i] + u,
146 | r.digits[i] = f % biRadix,
147 | r.digits[i] < 0 && (r.digits[i] += biRadix),
148 | u = 0 - Number(f < 0);
149 | if (u == -1) {
150 | for (u = 0,
151 | i = 0; i < n.digits.length; ++i)
152 | f = 0 - r.digits[i] + u,
153 | r.digits[i] = f % biRadix,
154 | r.digits[i] < 0 && (r.digits[i] += biRadix),
155 | u = 0 - Number(f < 0);
156 | r.isNeg = !n.isNeg
157 | } else
158 | r.isNeg = n.isNeg
159 | }
160 | return r
161 | }
162 | function biHighIndex(n) {
163 | for (var t = n.digits.length - 1; t > 0 && n.digits[t] == 0; )
164 | --t;
165 | return t
166 | }
167 | function biNumBits(n) {
168 | for (var i = biHighIndex(n), r = n.digits[i], u = (i + 1) * bitsPerDigit, t = u; t > u - bitsPerDigit; --t) {
169 | if ((r & 32768) != 0)
170 | break;
171 | r <<= 1
172 | }
173 | return t
174 | }
175 | function biMultiply(n, t) {
176 | for (var i = new BigInt, u, o = biHighIndex(n), s = biHighIndex(t), e, f, r = 0; r <= s; ++r) {
177 | for (u = 0,
178 | f = r,
179 | j = 0; j <= o; ++j,
180 | ++f)
181 | e = i.digits[f] + n.digits[j] * t.digits[r] + u,
182 | i.digits[f] = e & maxDigitVal,
183 | u = e >>> biRadixBits;
184 | i.digits[r + o + 1] = u
185 | }
186 | return i.isNeg = n.isNeg != t.isNeg,
187 | i
188 | }
189 | function biMultiplyDigit(n, t) {
190 | var u, r, f, i;
191 | for (result = new BigInt,
192 | u = biHighIndex(n),
193 | r = 0,
194 | i = 0; i <= u; ++i)
195 | f = result.digits[i] + n.digits[i] * t + r,
196 | result.digits[i] = f & maxDigitVal,
197 | r = f >>> biRadixBits;
198 | return result.digits[1 + u] = r,
199 | result
200 | }
201 | function arrayCopy(n, t, i, r, u) {
202 | for (var o = Math.min(t + u, n.length), f = t, e = r; f < o; ++f,
203 | ++e)
204 | i[e] = n[f]
205 | }
206 | function biShiftLeft(n, t) {
207 | var e = Math.floor(t / bitsPerDigit), i = new BigInt, u, o, r, f;
208 | for (arrayCopy(n.digits, 0, i.digits, e, i.digits.length - e),
209 | u = t % bitsPerDigit,
210 | o = bitsPerDigit - u,
211 | r = i.digits.length - 1,
212 | f = r - 1; r > 0; --r,
213 | --f)
214 | i.digits[r] = i.digits[r] << u & maxDigitVal | (i.digits[f] & highBitMasks[u]) >>> o;
215 | return i.digits[0] = i.digits[r] << u & maxDigitVal,
216 | i.isNeg = n.isNeg,
217 | i
218 | }
219 | function biShiftRight(n, t) {
220 | var e = Math.floor(t / bitsPerDigit), i = new BigInt, u, o, r, f;
221 | for (arrayCopy(n.digits, e, i.digits, 0, n.digits.length - e),
222 | u = t % bitsPerDigit,
223 | o = bitsPerDigit - u,
224 | r = 0,
225 | f = r + 1; r < i.digits.length - 1; ++r,
226 | ++f)
227 | i.digits[r] = i.digits[r] >>> u | (i.digits[f] & lowBitMasks[u]) << o;
228 | return i.digits[i.digits.length - 1] >>>= u,
229 | i.isNeg = n.isNeg,
230 | i
231 | }
232 | function biMultiplyByRadixPower(n, t) {
233 | var i = new BigInt;
234 | return arrayCopy(n.digits, 0, i.digits, t, i.digits.length - t),
235 | i
236 | }
237 | function biDivideByRadixPower(n, t) {
238 | var i = new BigInt;
239 | return arrayCopy(n.digits, t, i.digits, 0, i.digits.length - t),
240 | i
241 | }
242 | function biModuloByRadixPower(n, t) {
243 | var i = new BigInt;
244 | return arrayCopy(n.digits, 0, i.digits, 0, t),
245 | i
246 | }
247 | function biCompare(n, t) {
248 | if (n.isNeg != t.isNeg)
249 | return 1 - 2 * Number(n.isNeg);
250 | for (var i = n.digits.length - 1; i >= 0; --i)
251 | if (n.digits[i] != t.digits[i])
252 | return n.isNeg ? 1 - 2 * Number(n.digits[i] > t.digits[i]) : 1 - 2 * Number(n.digits[i] < t.digits[i]);
253 | return 0
254 | }
255 | function biDivideModulo(n, t) {
256 | var a = biNumBits(n), s = biNumBits(t), v = t.isNeg, r, i, u, e, h, o, f, y, p;
257 | if (a < s)
258 | return n.isNeg ? (r = biCopy(bigOne),
259 | r.isNeg = !t.isNeg,
260 | n.isNeg = !1,
261 | t.isNeg = !1,
262 | i = biSubtract(t, n),
263 | n.isNeg = !0,
264 | t.isNeg = v) : (r = new BigInt,
265 | i = biCopy(n)),
266 | [r, i];
267 | for (r = new BigInt,
268 | i = n,
269 | u = Math.ceil(s / bitsPerDigit) - 1,
270 | e = 0; t.digits[u] < biHalfRadix; )
271 | t = biShiftLeft(t, 1),
272 | ++e,
273 | ++s,
274 | u = Math.ceil(s / bitsPerDigit) - 1;
275 | for (i = biShiftLeft(i, e),
276 | a += e,
277 | h = Math.ceil(a / bitsPerDigit) - 1,
278 | o = biMultiplyByRadixPower(t, h - u); biCompare(i, o) != -1; )
279 | ++r.digits[h - u],
280 | i = biSubtract(i, o);
281 | for (f = h; f > u; --f) {
282 | var c = f >= i.digits.length ? 0 : i.digits[f]
283 | , w = f - 1 >= i.digits.length ? 0 : i.digits[f - 1]
284 | , b = f - 2 >= i.digits.length ? 0 : i.digits[f - 2]
285 | , l = u >= t.digits.length ? 0 : t.digits[u]
286 | , k = u - 1 >= t.digits.length ? 0 : t.digits[u - 1];
287 | for (r.digits[f - u - 1] = c == l ? maxDigitVal : Math.floor((c * biRadix + w) / l),
288 | y = r.digits[f - u - 1] * (l * biRadix + k),
289 | p = c * biRadixSquared + (w * biRadix + b); y > p; )
290 | --r.digits[f - u - 1],
291 | y = r.digits[f - u - 1] * (l * biRadix | k),
292 | p = c * biRadix * biRadix + (w * biRadix + b);
293 | o = biMultiplyByRadixPower(t, f - u - 1);
294 | i = biSubtract(i, biMultiplyDigit(o, r.digits[f - u - 1]));
295 | i.isNeg && (i = biAdd(i, o),
296 | --r.digits[f - u - 1])
297 | }
298 | return i = biShiftRight(i, e),
299 | r.isNeg = n.isNeg != v,
300 | n.isNeg && (r = v ? biAdd(r, bigOne) : biSubtract(r, bigOne),
301 | t = biShiftRight(t, e),
302 | i = biSubtract(t, i)),
303 | i.digits[0] == 0 && biHighIndex(i) == 0 && (i.isNeg = !1),
304 | [r, i]
305 | }
306 | function biDivide(n, t) {
307 | return biDivideModulo(n, t)[0]
308 | }
309 | function biModulo(n, t) {
310 | return biDivideModulo(n, t)[1]
311 | }
312 | function biMultiplyMod(n, t, i) {
313 | return biModulo(biMultiply(n, t), i)
314 | }
315 | function biPow(n, t) {
316 | for (var r = bigOne, i = n; ; ) {
317 | if ((t & 1) != 0 && (r = biMultiply(r, i)),
318 | t >>= 1,
319 | t == 0)
320 | break;
321 | i = biMultiply(i, i)
322 | }
323 | return r
324 | }
325 | function biPowMod(n, t, i) {
326 | for (var f = bigOne, u = n, r = t; ; ) {
327 | if ((r.digits[0] & 1) != 0 && (f = biMultiplyMod(f, u, i)),
328 | r = biShiftRight(r, 1),
329 | r.digits[0] == 0 && biHighIndex(r) == 0)
330 | break;
331 | u = biMultiplyMod(u, u, i)
332 | }
333 | return f
334 | }
335 | function BarrettMu(n) {
336 | this.modulus = biCopy(n);
337 | this.k = biHighIndex(this.modulus) + 1;
338 | var t = new BigInt;
339 | t.digits[2 * this.k] = 1;
340 | this.mu = biDivide(t, this.modulus);
341 | this.bkplus1 = new BigInt;
342 | this.bkplus1.digits[this.k + 1] = 1;
343 | this.modulo = BarrettMu_modulo;
344 | this.multiplyMod = BarrettMu_multiplyMod;
345 | this.powMod = BarrettMu_powMod
346 | }
347 | function BarrettMu_modulo(n) {
348 | var r = biDivideByRadixPower(n, this.k - 1), u = biMultiply(r, this.mu), f = biDivideByRadixPower(u, this.k + 1), e = biModuloByRadixPower(n, this.k + 1), o = biMultiply(f, this.modulus), s = biModuloByRadixPower(o, this.k + 1), t = biSubtract(e, s), i;
349 | for (t.isNeg && (t = biAdd(t, this.bkplus1)),
350 | i = biCompare(t, this.modulus) >= 0; i; )
351 | t = biSubtract(t, this.modulus),
352 | i = biCompare(t, this.modulus) >= 0;
353 | return t
354 | }
355 | function BarrettMu_multiplyMod(n, t) {
356 | var i = biMultiply(n, t);
357 | return this.modulo(i)
358 | }
359 | function BarrettMu_powMod(n, t) {
360 | var u = new BigInt, r, i;
361 | for (u.digits[0] = 1,
362 | r = n,
363 | i = t; ; ) {
364 | if ((i.digits[0] & 1) != 0 && (u = this.multiplyMod(u, r)),
365 | i = biShiftRight(i, 1),
366 | i.digits[0] == 0 && biHighIndex(i) == 0)
367 | break;
368 | r = this.multiplyMod(r, r)
369 | }
370 | return u
371 | }
372 | function RSAKeyPair(n, t, i) {
373 | this.e = biFromHex(n);
374 | this.d = biFromHex(t);
375 | this.m = biFromHex(i);
376 | this.digitSize = 2 * biHighIndex(this.m) + 2;
377 | this.chunkSize = this.digitSize - 11;
378 | this.radix = 16;
379 | this.barrett = new BarrettMu(this.m)
380 | }
381 | function twoDigit(n) {
382 | return (n < 10 ? "0" : "") + String(n)
383 | }
384 | function encryptedString(n, t) {
385 | var e, o, s, h, c, i, f, u, v, l, y;
386 | if (n.chunkSize > n.digitSize - 11)
387 | return "Error";
388 | for (var a = [], p = t.length, r = 0; r < p; )
389 | a[r] = t.charCodeAt(r),
390 | r++;
391 | for (e = a.length,
392 | o = "",
393 | r = 0; r < e; r += n.chunkSize) {
394 | for (c = new BigInt,
395 | s = 0,
396 | f = r + n.chunkSize > e ? e % n.chunkSize : n.chunkSize,
397 | u = [],
398 | i = 0; i < f; i++)
399 | u[i] = a[r + f - 1 - i];
400 | for (u[f] = 0,
401 | v = Math.max(8, n.digitSize - 3 - f),
402 | i = 0; i < v; i++)
403 | u[f + 1 + i] = Math.floor(Math.random() * 254) + 1;
404 | for (u[n.digitSize - 2] = 2,
405 | u[n.digitSize - 1] = 0,
406 | h = 0; h < n.digitSize; ++s)
407 | c.digits[s] = u[h++],
408 | c.digits[s] += u[h++] << 8;
409 | l = n.barrett.powMod(c, n.e);
410 | y = n.radix == 16 ? biToHex(l) : biToString(l, n.radix);
411 | o += y + " "
412 | }
413 | return o.substring(0, o.length - 1)
414 | }
415 | function decryptedString(n, t) {
416 | for (var e = t.split(" "), i = "", r, u, o, f = 0; f < e.length; ++f)
417 | for (o = n.radix == 16 ? biFromHex(e[f]) : biFromString(e[f], n.radix),
418 | u = n.barrett.powMod(o, n.d),
419 | r = 0; r <= biHighIndex(u); ++r)
420 | i += String.fromCharCode(u.digits[r] & 255, u.digits[r] >> 8);
421 | return i.charCodeAt(i.length - 1) == 0 && (i = i.substring(0, i.length - 1)),
422 | i
423 | }
424 | var biRadixBase = 2, biRadixBits = 16, bitsPerDigit = biRadixBits, biRadix = 65536, biHalfRadix = biRadix >>> 1, biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix - 1, maxInteger = 9999999999999998, maxDigits, ZERO_ARRAY, bigZero, bigOne, dpl10, lr10, hexatrigesimalToChar, hexToChar, highBitMasks, lowBitMasks;
425 | setMaxDigits(20);
426 | dpl10 = 15;
427 | lr10 = biFromNumber(1e15);
428 | hexatrigesimalToChar = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
429 | hexToChar = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
430 | highBitMasks = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535];
431 | lowBitMasks = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535];
432 | setMaxDigits(129);
433 |
434 |
435 |
436 | // 直接扣取rsa文件
437 | function enc_pwd(pwd) {
438 | setMaxDigits(129);
439 | var key_to_encode = new RSAKeyPair("010001", "", "978C0A92D2173439707498F0944AA476B1B62595877DD6FA87F6E2AC6DCB3D0BF0B82857439C99B5091192BC134889DFF60C562EC54EFBA4FF2F9D55ADBCCEA4A2FBA80CB398ED501280A007C83AF30C3D1A142D6133C63012B90AB26AC60C898FB66EDC3192C3EC4FF66925A64003B72496099F4F09A9FB72A2CF9E4D770C41");
440 | return encryptedString(key_to_encode, pwd)
441 | }
442 |
443 | console.log(enc_pwd('123456asd'))
444 |
--------------------------------------------------------------------------------
/05_中华人才网/verify.py:
--------------------------------------------------------------------------------
1 | import requests
2 | from lxml import etree
3 | import cv2
4 | import requests
5 | import base64
6 | from PIL import Image
7 | from io import BytesIO
8 | import time
9 | import random
10 | import re
11 |
12 |
13 | # 缺口识别
14 | def identify_gap(bg,tp,out):
15 | '''
16 | bg: 背景图片
17 | tp: 缺口图片
18 | out:输出图片
19 | '''
20 | # 读取背景图片和缺口图片
21 | bg_img = cv2.imread(bg) # 背景图片
22 | tp_img = cv2.imread(tp) # 缺口图片
23 |
24 | # 识别图片边缘
25 | bg_edge = cv2.Canny(bg_img, 100, 200)
26 | tp_edge = cv2.Canny(tp_img, 100, 200)
27 |
28 | # 转换图片格式
29 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
30 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
31 |
32 | # 缺口匹配
33 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
34 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
35 |
36 | # 绘制方框
37 | th, tw = tp_pic.shape[:2]
38 | tl = max_loc # 左上角点的坐标
39 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
40 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
41 | cv2.imwrite(out, bg_img) # 保存在本地
42 |
43 | # 返回缺口的X坐标
44 | return tl[0]
45 |
46 |
47 |
48 |
49 | headers = {
50 | "X-Requested-With": "XMLHttpRequest",
51 | }
52 | url = "http://www.zhrc.com/CompanyDetail.aspx"
53 |
54 | params = {
55 | "id": "73679"
56 | }
57 | response = requests.get(url, headers=headers, params=params, verify=False, allow_redirects=False)
58 |
59 | if 'Object moved to' in response.text:
60 | print('开始验证')
61 | html = etree.HTML(response.text)
62 | verify_url = html.xpath('//h2/a/@href')[0]
63 | k = re.findall('k=(.*?)&', verify_url)[0]
64 | url = "https://swx.qzrc.com/System/MakeBLCode"
65 | data = {
66 | "key": k
67 | }
68 | response = requests.post(url, headers=headers, data=data).json()
69 | crop_picture = base64.b64decode(response['Data']['normal'].split(',')[1])
70 | slider_picture = base64.b64decode(response['Data']['small'].split(',')[1])
71 | crop_data = BytesIO(crop_picture)
72 | slider_data = BytesIO(slider_picture)
73 | # 图片大小
74 | imgx = response['Data']['imgx']
75 | imgy = response['Data']['imgy']
76 | # 裁剪后每个图片的大小
77 | cutX = imgx / 10;
78 | cutY = imgy / 2;
79 | # 混淆图片位置数组
80 | bgarray = response['Data']['array'].split(',')
81 |
82 | slider = Image.open(slider_data)
83 | img = Image.open(crop_data)
84 | newImg = Image.new(mode='RGB', size=(imgx, imgy)) # 创建一个新图片
85 |
86 | # 底图还原
87 | for i in range(20):
88 | position = bgarray.index(str(i))
89 | topLeftX = cutX * (position % 10)
90 | topLeftY = cutY * (position // 10)
91 | bottomRightX = cutX * (position % 10 + 1 )
92 | bottomRightY = cutY * (position // 10 + 1)
93 | # 前两个坐标点是左上角坐标
94 | # 后两个坐标点是右下角坐标
95 | # width在前, height在后
96 | # 裁剪下第i张图片
97 | box = (int(topLeftX), int(topLeftY), int(bottomRightX), int(bottomRightY))
98 | region = img.crop(box)
99 |
100 | # 第i张图片位置
101 | newImg.paste(region, (int(cutX * (i % 10)), int(cutY * (i // 10))))
102 |
103 | slider.save('slider.jpg')
104 | # img.save('还原前.jpg')
105 | newImg.save('restoration.jpg')
106 |
107 | sliderX = identify_gap('restoration.jpg', 'slider.jpg', 'tip.jpg')
108 | print(sliderX)
109 | timeStart = int(time.time()*1000)
110 | start = 1
111 | datelist = ''
112 | # 轨迹模拟
113 | while start < sliderX:
114 | point = str(start) + ',' + str(int(time.time()*1000))
115 | datelist += point + '|'
116 | start += random.randint(1,5)
117 | datelist += str(sliderX) + ',' + str(int(time.time()*1000))
118 |
119 | timeEnd = int(time.time()*1000)
120 | timespan = timeEnd - timeStart
121 |
122 | url = "https://swx.qzrc.com/System/CheckBLCode"
123 | data = {
124 | "key": f"{k}",
125 | "point": f"{sliderX}",
126 | "timespan": f"{timespan}",
127 | "datelist": f"{datelist}"
128 | }
129 | response = requests.post(url, headers=headers, data=data).json()
130 | if response['Code'] == 0:
131 | url = "http://www.zhrc.com/CompanyDetail.aspx"
132 | params = {
133 | "id": "73679"
134 | }
135 | response = requests.get(url, headers=headers, params=params, verify=False, allow_redirects=False)
136 | print(response.text)
137 | else:
138 | print('验证失败')
139 |
140 | else:
141 | print('无需验证')
--------------------------------------------------------------------------------
/06_微博/user-pwd.js:
--------------------------------------------------------------------------------
1 | var sinaSSOEncoder = sinaSSOEncoder || {};
2 | (function() {
3 | var a = 0
4 | , b = 8;
5 | this.hex_sha1 = function(a) {
6 | return i(c(h(a), a.length * b))
7 | }
8 | ;
9 | var c = function(a, b) {
10 | a[b >> 5] |= 128 << 24 - b % 32;
11 | a[(b + 64 >> 9 << 4) + 15] = b;
12 | var c = Array(80)
13 | , h = 1732584193
14 | , i = -271733879
15 | , j = -1732584194
16 | , k = 271733878
17 | , l = -1009589776;
18 | for (var m = 0; m < a.length; m += 16) {
19 | var n = h
20 | , o = i
21 | , p = j
22 | , q = k
23 | , r = l;
24 | for (var s = 0; s < 80; s++) {
25 | s < 16 ? c[s] = a[m + s] : c[s] = g(c[s - 3] ^ c[s - 8] ^ c[s - 14] ^ c[s - 16], 1);
26 | var t = f(f(g(h, 5), d(s, i, j, k)), f(f(l, c[s]), e(s)));
27 | l = k;
28 | k = j;
29 | j = g(i, 30);
30 | i = h;
31 | h = t
32 | }
33 | h = f(h, n);
34 | i = f(i, o);
35 | j = f(j, p);
36 | k = f(k, q);
37 | l = f(l, r)
38 | }
39 | return [h, i, j, k, l]
40 | }
41 | , d = function(a, b, c, d) {
42 | return a < 20 ? b & c | ~b & d : a < 40 ? b ^ c ^ d : a < 60 ? b & c | b & d | c & d : b ^ c ^ d
43 | }
44 | , e = function(a) {
45 | return a < 20 ? 1518500249 : a < 40 ? 1859775393 : a < 60 ? -1894007588 : -899497514
46 | }
47 | , f = function(a, b) {
48 | var c = (a & 65535) + (b & 65535)
49 | , d = (a >> 16) + (b >> 16) + (c >> 16);
50 | return d << 16 | c & 65535
51 | }
52 | , g = function(a, b) {
53 | return a << b | a >>> 32 - b
54 | }
55 | , h = function(a) {
56 | var c = []
57 | , d = (1 << b) - 1;
58 | for (var e = 0; e < a.length * b; e += b)
59 | c[e >> 5] |= (a.charCodeAt(e / b) & d) << 24 - e % 32;
60 | return c
61 | }
62 | , i = function(b) {
63 | var c = a ? "0123456789ABCDEF" : "0123456789abcdef"
64 | , d = "";
65 | for (var e = 0; e < b.length * 4; e++)
66 | d += c.charAt(b[e >> 2] >> (3 - e % 4) * 8 + 4 & 15) + c.charAt(b[e >> 2] >> (3 - e % 4) * 8 & 15);
67 | return d
68 | }
69 | , j = function(a) {
70 | var b = ""
71 | , c = 0;
72 | for (; c < a.length; c++)
73 | b += "%" + k(a[c]);
74 | return decodeURIComponent(b)
75 | }
76 | , k = function(a) {
77 | var b = "0" + a.toString(16);
78 | return b.length <= 2 ? b : b.substr(1)
79 | };
80 | this.base64 = {
81 | encode: function(a) {
82 | a = "" + a;
83 | if (a == "")
84 | return "";
85 | var b = "", c, d, e = "", f, g, h, i = "", j = 0;
86 | do {
87 | c = a.charCodeAt(j++);
88 | d = a.charCodeAt(j++);
89 | e = a.charCodeAt(j++);
90 | f = c >> 2;
91 | g = (c & 3) << 4 | d >> 4;
92 | h = (d & 15) << 2 | e >> 6;
93 | i = e & 63;
94 | isNaN(d) ? h = i = 64 : isNaN(e) && (i = 64);
95 | b = b + this._keys.charAt(f) + this._keys.charAt(g) + this._keys.charAt(h) + this._keys.charAt(i);
96 | c = d = e = "";
97 | f = g = h = i = ""
98 | } while (j < a.length);
99 | return b
100 | },
101 | decode: function(a, b, c) {
102 | var d = function(a, b) {
103 | for (var c = 0; c < a.length; c++)
104 | if (a[c] === b)
105 | return c;
106 | return -1
107 | };
108 | typeof a == "string" && (a = a.split(""));
109 | var e = [], f, g, h = "", i, j, k, l = "";
110 | a.length % 4 == 0;
111 | var m = /[^A-Za-z0-9+\/=]/
112 | , n = this._keys.split("");
113 | if (b == "urlsafe") {
114 | m = /[^A-Za-z0-9-_=]/;
115 | n = this._keys_urlsafe.split("")
116 | }
117 | if (b == "subp_v2") {
118 | m = /[^A-Za-z0-9_=-]/;
119 | n = this._subp_v2_keys.split("")
120 | }
121 | if (b == "subp_v3_3") {
122 | m = /[^A-Za-z0-9-_.-]/;
123 | n = this._subp_v3_keys_3.split("")
124 | }
125 | var o = 0;
126 | if (b == "binnary") {
127 | n = [];
128 | for (o = 0; o <= 64; o++)
129 | n[o] = o + 128
130 | }
131 | if (b != "binnary" && m.test(a.join("")))
132 | return c == "array" ? [] : "";
133 | o = 0;
134 | do {
135 | i = d(n, a[o++]);
136 | j = d(n, a[o++]);
137 | k = d(n, a[o++]);
138 | l = d(n, a[o++]);
139 | f = i << 2 | j >> 4;
140 | g = (j & 15) << 4 | k >> 2;
141 | h = (k & 3) << 6 | l;
142 | e.push(f);
143 | k != 64 && k != -1 && e.push(g);
144 | l != 64 && l != -1 && e.push(h);
145 | f = g = h = "";
146 | i = j = k = l = ""
147 | } while (o < a.length);
148 | if (c == "array")
149 | return e;
150 | var p = ""
151 | , q = 0;
152 | for (; q < e.lenth; q++)
153 | p += String.fromCharCode(e[q]);
154 | return p
155 | },
156 | _keys: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
157 | _keys_urlsafe: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",
158 | _subp_v2_keys: "uAL715W8e3jJCcNU0lT_FSXVgxpbEDdQ4vKaIOH2GBPtfzqsmYZo-wRM9i6hynrk=",
159 | _subp_v3_keys_3: "5WFh28sGziZTeS1lBxCK-HgPq9IdMUwknybo.LJrQD3uj_Va7pE0XfcNR4AOYvm6t"
160 | };
161 | this.Cookie = {
162 | decode: function(a) {
163 | var b = []
164 | , c = a.substr(0, 3)
165 | , d = a.substr(3);
166 | switch (c) {
167 | case "v01":
168 | for (var e = 0; e < d.length; e += 2)
169 | b.push(parseInt(d.substr(e, 2), 16));
170 | return decodeURIComponent(j(sinaSSOEncoder.base64.decode(b, "binnary", "array")));
171 | case "v02":
172 | d = d.replace(/\./g, "=");
173 | b = sinaSSOEncoder.base64.decode(d, "urlsafe", "array");
174 | return j(sinaSSOEncoder.base64.decode(b, "binnary", "array"));
175 | default:
176 | return decodeURIComponent(a)
177 | }
178 | }
179 | };
180 | this.getSUBPCookie = {
181 | __parse: function(a) {
182 | var b, c, d, e, f, g = 0, h, i = {}, k = "", l = "";
183 | if (!a)
184 | return i;
185 | do {
186 | c = a[g];
187 | b = ++g;
188 | for (h = g; h < c + b; h++,
189 | g++)
190 | k += String.fromCharCode(a[h]);
191 | e = a[g];
192 | b = ++g;
193 | if (k == "status" || k == "flag")
194 | for (h = g; h < e + b; h++,
195 | g++)
196 | l += a[h];
197 | else {
198 | l = a.slice(b, e + b);
199 | try {
200 | l = j(l)
201 | } catch (m) {
202 | l = ""
203 | }
204 | g += e
205 | }
206 | i[k] = l;
207 | k = "";
208 | l = ""
209 | } while (g < a.length);
210 | return i
211 | },
212 | decode: function(a) {
213 | var b = [], c, d = a.substr(0, 3), e = decodeURIComponent(a.substr(3));
214 | switch (d) {
215 | case "002":
216 | b = sinaSSOEncoder.base64.decode(e, "subp_v2", "array");
217 | return sinaSSOEncoder.getSUBPCookie.__parse(b);
218 | case "003":
219 | c = e.substr(0, 1);
220 | e = e.substr(1);
221 | b = sinaSSOEncoder.base64.decode(e, "subp_v3_" + c, "array");
222 | return sinaSSOEncoder.getSUBPCookie.__parse(b);
223 | default:
224 | return decodeURIComponent(a)
225 | }
226 | }
227 | }
228 | }
229 | ).call(sinaSSOEncoder);
230 |
231 |
232 |
233 |
234 | let a = '15858585858'
235 | let su = sinaSSOEncoder.base64.encode(a)
236 | console.log(su)
--------------------------------------------------------------------------------
/07_南昌人才网/enc.js:
--------------------------------------------------------------------------------
1 | B8RR.d2Z = function() {
2 | var r = 2;
3 | while (r !== 1) {
4 | switch (r) {
5 | case 2:
6 | return {
7 | I: function c(f, v) {
8 | var T = 2;
9 | while (T !== 10) {
10 | switch (T) {
11 | case 5:
12 | T = W < f ? 4 : 9;
13 | break;
14 | case 11:
15 | return M;
16 | T = 10;
17 | break;
18 | case 13:
19 | e--;
20 | T = 6;
21 | break;
22 | case 7:
23 | var e = f - 1;
24 | T = 6;
25 | break;
26 | case 12:
27 | B++;
28 | T = 8;
29 | break;
30 | case 6:
31 | T = e >= 0 ? 14 : 12;
32 | break;
33 | case 9:
34 | var B = 0;
35 | T = 8;
36 | break;
37 | case 2:
38 | var M = [];
39 | T = 1;
40 | break;
41 | case 3:
42 | W++;
43 | T = 5;
44 | break;
45 | case 14:
46 | M[B][(e + v * B) % f] = M[e];
47 | T = 13;
48 | break;
49 | case 4:
50 | M[(W + v) % f] = [];
51 | T = 3;
52 | break;
53 | case 8:
54 | T = B < f ? 7 : 11;
55 | break;
56 | case 1:
57 | var W = 0;
58 | T = 5;
59 | break;
60 | }
61 | }
62 | }(48, 12)
63 | };
64 | r = 1;
65 | break;
66 | }
67 | }
68 | }();
69 | B8RR.w3C = function() {
70 | var v = 2;
71 | while (v !== 1) {
72 | switch (v) {
73 | case 2:
74 | return {
75 | I: function(e) {
76 | var r = 2;
77 | while (r !== 14) {
78 | switch (r) {
79 | case 2:
80 | var c = ''
81 | , B = decodeURI("q%3E#9.Q%01&4!%7DUF3/6%7DX@*%20r@/5=)dS=6=/@X/%E3%82%9E%E3%82%B3%E3%82%8AID$#6)I%ED%99%B4%EC%9C%AA%ED%94%9E%EA%B9%A8%7D%EC%9C%B0%ED%95%95r%EC%96%AA%EA%B9%A8%EB%A0%81%14%EC%9D%95%EB%8E%8B;%3E(XM%22'?8IN%3C%15-%3EWD!5%25sSU%0D%25-)kB'4,%3C%5DO/%019%20UQ%22*!%20SU%0D/6;%5B~&/(%7DSU%0D;1%25It%06%00ueIH%3C;(%3CZD%3E%0E=4SI&;%113RN/%E8%AB%8B%E8%A9%A4%E5%A5%AC%E6%95%A3%1B/%E9%A0%B3%E9%9C%BA%E5%B1%9B%E5%9C%9C%13%E7%A6%80%E5%91%88%E8%B6%AB%E8%BC%B1I@%7C!,%02VN*%19,4DR/6*2@N&?(8IM/%0764Y@%25%7C%15%5C%E0%B9%93%E0%B9%A5%E0%B9%A0%E0%B9%8E%E0%B8%86%E0%B8%82%E0%B9%BF%E0%B9%AC%E0%B9%A9%E0%B9%9C%E0%B8%B0%E0%B8%82%E0%B9%AB%E0%B8%8E%25)%5BT1.52BD/%3C0%20UQ%22#69%60N/.:%20wN?648@Dr0=/%5DG;%259)%5DN%3Cf:8XN%25;%E7%B2%A3%E7%BA%82%E6%AD%97%E5%9C%89%E8%86%B8%E5%8B%AE%E5%89%AF%E6%97%AD%E5%9B%8A%E7%89%A6/!,%02WT!270kS7%20*8GI/%03.8ZU/5,%3C@H1%19+8FW74+%20D@%20'41QM/%15=/BD%20f1.%14S7%20*8GI;(?%7D@I7f10UF7;%E3%83%B0%E3%82%B4%E3%83%88%E3%81%86%E3%80%8B%7C%25$DN!;-.QS%13!=3@%5C%7C!,%02DN%223(%02VN*;%E3%83%9A%E3%80%9B%E4%B8%B4%E5%BA%87h;v:@~;(%3E2kU;6%25%E5%92%9A%E5%93%92%EF%BD%BF%E6%81%B8%E7%88%AF%E5%91%9B%E4%BB%9B%E6%8B%88%E5%9B%9Fr%257(ZUr%E7%A6%94%E5%91%96%E9%86%90%E8%AF%A1%5C%1F%15%082%5DO*%10%5BW7;-/X%09/5*%3EIF72%1A2AO6/6:wM;#6)fD12%25'IN0;7;RM;(=%20FN'(%3C%20DN%223(?@O;%22%25%3C%1AF&%1908XQ%0D$-)@N%3C;52BD%1A'69XD%20;%17%3CIM=!%25%19QB=%22=/I%E9%A0%A0%E9%9C%B0%E5%B1%81%E5%9D%B0o%E7%A7%A6%E5%BE%AD%E8%B6%A1%E8%BC%8F%25%7DXN!2y%20gT1%25=.G%5C3,9%25I@%204%25%0EAB1#+.%0E%5C!2!1Qe72=%3E@d%3E#%25?UB9!*2AO6%167.%5DU;)6%20NI%7F2/%20%E5%B9%9F%E5%8A%88/.19Qe7*9$Iv=1&%7DyN%3C5,8F%017',.%14U:#x4Y@5#%251%5B@6#%3C%02@I7+=%20AR7f+)FH12%25%EB%AD%A5%EC%9D%AC%5C74*2F%5C%7C!,%02GM;%25=%20V%10/%E5%99%91%E8%A8%BE%E9%80%93%E5%A4%AE%E6%AC%80h;13ZD%20%0E%0C%10x%5C*'%25%EB%8A%B9%EC%8B%A8%01%EC%8A%8E%EB%8E%82%ED%94%80%EC%85%A5%EC%9A%A0%5C'6%25%E5%87%90%E4%BE%B2%E4%B8%A1%E6%AD%B3%7C%25%3E%5BO1',%20q@/)6%1AQD+)xN3%22=9IF7#,8GU%0D5=%3EWN6#%259F@%25%0F5%3CSD/%11=?dm='%3C8P%5C%E9%AB%9E%E8%AE%87%E5%A5%A9%E8%B5%B8%0E%5C:-%25%10%5BE'*=.I%E8%BC%A8%E5%84%B7%E4%B9%ABvs%1A%5C;(%3E2%7CH6#%25%3E%5BO)ID%3C':1Q%5C5*7?UM/%25*2GR%1D41:%5DO/(73Q%5C1'41V@1-%25%E6%8D%94%E4%BD%BB%E5%B7%87%E8%BF%AB%E6%BA%97%E5%9C%8F%EF%BD%91%E6%8B%A2%E5%8A%89%E5%AF%9E%E6%89%96%E4%B9%92%E6%97%A4%E6%8B%88%E5%9B%9F/%22:%20uO3*!.Q%5Cr;%0A8RS750%20CD0-1)%60S3(+4@H=(%25%13U%5C;(+8FU%10#%3E2FD/%09%3E;XH%3C#%253QY&%151?XH%3C!%25.QM4;?8@m3(?%20W@%3E*:%3CWJ%174*2F%5Cr%2593%14O=2x%3CWB75+%20%5DX/3:%20GD%20/91I@05%25.U%5C%E3%83%90%E3%80%80%E4%B9%98%E5%BB%BB%E3%82%B0%E3%82%AB%E7%9A%A6%E3%80%91%E3%80%BE%E3%80%92%E3%81%94%E3%81%B4%E3%80%96;1%20%02~cw%07jk%10b%19l%02%05%13%0Du%07lk%11%0Ds%07ok%18%0D~%25%E8%AB%90%E8%A8%88%E5%AE%AD%E4%BB%94%7C%252RG!#,%11QG&;%1A/%5BV!#*%20XN1-%25sSU%0D%25-/@@;(%07?AU&)6%20w@/%190)@Q!;%E5%8E%95%E9%A7%95Is77-8GU/h?)kQ=6--kV%20'(%20u@/49%20B@%3E3=%20GU32-.I~3;13DT&h?8QU75,%02GD1%2579Q%5C6/+-X@+;%14%20%1AF&%1913RN/%20%1E)n%11%04'%01isF%7C;+)UU'5%1B5UO5#%25/QG74=/kD%3C%2579Q%5C!29)%5DB!#*+QS!;?)kO=%1942SN/(7%7DGT1.x/QR=3*%3EQ%1Br;%EC%9F%88%EB%8E%84%EC%9E%98%ED%96%A8r%EC%A5%97%25.BFr;.%3CXT7%09%3E%20%E0%B8%BE%E0%B9%A9%E0%B9%B5%E0%B9%A4%E0%B8%98%E0%B9%B6%E0%B8%91%E0%B8%96%E0%B9%BF;?)kB'2%07%20sM=$91I@%22/v:QD+)%1AB=+%25%3E%5BT%3C2%E7%A6%8A%E5%BF%91%E3%82%B6%E3%81%A7%E4%B9%92%E5%BB%A0%E3%83%9C%E3%83%97%E7%9B%80%E3%81%B6%E3%80%B4%E3%80%89%E3%80%B8%E3%80%88%E3%81%B0%5C('%25/QR/!=)%60H?#%25?%5DO6%096%20d@/%0F%25%7BIz=$28WUr%07*/UX%0F;1.uS%20'!%20SD&%1091%5DE32=%20RH%3E2=/Iy3;v.BF/'v:@~%20#%3E/QR:%19:(@U=(%258XD!;v:@~%3E)?2kC'2,2Z%5C%20#52BD%170=3@m;5,8ZD%20;.k%1A%11%7Cvx%1AQD+)%14h%3C%25v%20sD7%12=.@%01%174*2F%1Br4=,AD!2x%20ZT?$=/Ig%3E)/%20yN$#x5QS7f,2%14W741;M%5Cm;,?IC5;(%3CFD%3C2%162PD/%E3%82%97%E3%83%A2%E3%82%B6%E3%82%A6%E5%90%A9%E3%83%9D%E3%80%9D%E3%80%BE%E3%80%92%E3%81%94%E3%81%B4%E3%80%96;%3C8BH1#7/%5DD%3C29)%5DN%3C;+1%5DB7;%142UE7%22%25:QU%1B+9:Qe329%20VD%3C%2500US9;(%3CPE;(?%1F%5BU&)5%20DN;(,8FE=16%20V@1-?/%5BT%3C%22%110UF7;%E0%B9%99%E0%B9%AE%E0%B8%91%E0%B8%90%E0%B9%95%E0%B9%92%E0%B9%AA%E0%B9%BA%E0%B8%AD%E0%B9%AD%E0%B8%90%E0%B9%AD%E0%B9%BD%E0%B9%89%1A%0F%7C;02BD%20%050%3CZF7;v:@~%22)((D~4/64GI/h?)kG%3E'+5Iq=6--IT%3C%22=;%5DO7%22%25%3E%5CH%3E%22%162PD!;9-%5D~!#*+QS//6-AU/%3C72Y%5C6',%3C%0EH?'?8%1BV7$(fV@!#ni%18t9*%1F%0F%5D%15%13%07%19%1Fls%07%0C%09%0BX%60f%12%1B%18u%60%13%07.%1Ca%60%13%03%1AeC%60;%0B/%1CSr%01%08,.Q%0E1%1E2%25Mb%11+*%04zv%0215%15fik,/%10u%5C4'11IS72*$I%E7%94%9A%E5%82%9D%E3%80%8A%E6%9A%AC%E6%97%AD%E3%81%A1%E3%82%AD%E3%80%B4%E3%80%82%E3%80%A6%E3%80%84IP'#*$gD%3E#;)%5BS/2!-Q%5C0$%25-%5BH%3C2=/YN$#%257I%0F5#=)QR&%19;5UM%3E#6:Q%5C1*18ZU%0B;%3C8R@'*,%20GD1f%E7%A6%8A%E7%9B%99%E9%80%AB%E5%BA%87%E8%B7%97%E9%80%88x.WN%20#%7D%7D%E7%9A%B0%E7%94%89%E6%89%A4;%11%3CI%0E52u9%5DR&;+)UU;%25v:QD+)%1AB=+%254YF%3E)99IC=%22!%20%1AF&%19::IQ=/6)QS'6%25%E7%A6%A6%E5%8A%9C%E5%88%91%E6%AC%B6%E5%BD%86%E5%A6%93%E9%AB%91%E8%AF%B5%5C%7C!,%02DN%223(%02WS=5+%20H%5C1*18ZU%0A;w.@@&/;r%5ER%7D;73FD3%22!.@@5UO5#%25-FN&);2X%5C%223,%14Y@5#%1C%3C@@/%EC%9C%BE%EC%A7%85%EC%8A%B9%ED%8C%9C%5C!%25*2XM/h?)kR%3E/%3C8F~9(7?IE=%25-0QO&;%E9%A8%8F%E8%AC%94%E9%80%AE%E9%81%AFh;(2DT%22%19*8UE+;+-UO/27(WI!29/@%5C%13(73ML=3+%20GI7*4%20y%5C%E9%BA%8C%E6%92%8C%E4%B9%92%E5%9D%8B%E4%B8%92%E6%B2%9E%E8%B6%BD%E7%B6%9C%E6%BA%89%E8%86%AE%E7%B5%B6%E9%BB%BF/i%25%E7%B2%A6%E7%B5%85%E6%AD%82%E5%9D%BA%E6%9A%B2%E6%97%A8%E5%9D%8B%E7%89%B3%5C0*-/I%0F52%074ZQ'2%25yU%5C%22479AB&;+8@g%3E)9)Ig=4:4PE7(%25%7F%1D%5C14=%3C@D%17*=0QO&;?%20v%5C#'%25)U%5C32,%3CWI%170=3@%5C%3E);%3CX~%22',5IM='%3C8P%5C%03'%259%5DW/%07%255@U%22%7CwrCV%25h?8QU75,sWN?i;2ZU3%25,~FD%22)*)I%0F52%07-%5BQ'6%075Q@6#*%20gT%2267/@%5C6)5%0EQM7%25,2Fd%2047/Ic3;%0A%3CII7*(%20pS3!x)%5CDr$-)@N%3Cf91%5BO5f,5Q%01%20)99IL=0=%20%E8%AA%B9%E8%A8%9D%E3%80%9E%E5%AF%8A%E4%BB%9E%E3%80%8A%E3%81%8A%E3%81%B6%E3%80%8D;=%25DN%202+%20%5CU&6br%1B%5C+'%25%0EQS$#*%7DqS%20)*gII&2(.%0E%0E%7D;+-XH1#%25-%5BQ'6%07?@O/%227*Z%5C%7C!,%02CH6!=)IG%20)5%1E%5C@%20%0579Q%5C1;+8W%01%E7%A6%80%E7%9B%82%E9%81%87%E5%BB%BB%E8%B6%B1%E8%BF%A6r5;2FDwf%E7%9B%9C%E7%95%B5%E6%88%83%5C;(((@%0F5#=)QR&%19;5UM%3E#6:Q%5C%14341D@5#%25%E6%9A%A9%E6%96%84%E9%A9%B6%E8%AC%9B%E5%9D%90%25%E0%B9%9C%E0%B8%A0%E0%B8%A5%E0%B8%9B%E0%B9%B4%E0%B9%9F%E0%B8%9C%E0%B8%91%E0%B8%91%E0%B9%B7%E0%B9%B4%E0%B9%99%E0%B8%9D%E0%B8%AA%E0%B8%96%E0%B8%9A%E0%B9%AB%E0%B9%8D%E0%B8%95%E0%B8%99%E0%B8%81%E0%B9%A0%E0%B9%98%E0%B8%9B%E0%B9%B6%E0%B9%BD%E0%B8%8B%E0%B9%B3%E0%B9%9C%E0%B9%A1%E0%B9%BE%E0%B8%A7%E0%B9%AD/!=)yN6348I%05/%E0%B9%A5%E0%B9%A8%E0%B9%87%E0%B8%AE%E0%B8%A0%E0%B9%A1%E0%B9%A3%E0%B9%A9%E0%B9%9A%E0%B8%A0%E0%B8%92%E0%B8%92%E0%B9%9F%E0%B9%AC%E0%B9%84%E0%B8%B5%E0%B8%93%E0%B9%B1%E0%B8%86%E0%B9%83%E0%B9%B8%E0%B8%81%E0%B9%A9%E0%B9%B0%E0%B9%9F%E0%B9%B8%E0%B9%AF%E0%B8%AA%E0%B9%A2%E0%B9%B9%E0%B9%A7%E0%B8%90%20%1AF&%195%3CGJ/%E4%BD%A6%E5%8E%9A%E9%95%84%E8%AF%9B%1B/'%3C9qW7(,%11%5DRDF%5C!2-+CY+%3C&%20SU%0D.71PD%20f?)kL=$11Q~:)49QSr!,%02IU75,%20%1AF&%1913RN%0D2=%25@%5C%3E#%3E)IR'%25;8GR/%2544QO&%1119@I/h?)kH%3C%207%02%5DB=(%25%E8%AE%AA%E5%85%87%E9%97%8C%E9%AB%9E%E8%AE%87%E9%86%95%E8%AE%88I%136;w/QG%20#+5%1AQ:6%25%7DSU%0D%2542ZD/%25-/@@;(%076ZN0;10DN%20293@%5C:'+%12CO%0247-QS&?%25%1AQD+)%14S77-4FD!f9%7DCH%3C%227*%14V;20%7DU%016);(YD%3C2%25;%5BS0/%3C9QO/+=.G@5#%25'%5C%0C1(%25%02IC'2,2Z%5C%7D61%3E@T%20#+rSU%7D;04PD%00#%3E/QR:;h%20RT%3C%25,4%5BO/67-AQ/%25*8UU7%12=%25@o=%22=%20SU/.,)DR/-:%20%5DO%3C#*%09QY&;(2DT%22%19;2DX%0D$,3IN%3C%14=;FD!.%25/QM/.,)D%1B%7Di/*C%0F5#=)QR&h;2Y%0E4/*.@~%22'?8IR:)/%02PD%3E'!%20%60N=*%25/QQ%3E';8IR&413S%5C%16'%251%5DO9;?)kI;%22=%20YN'5=0%5BW7;*8RS750%7DQS%20)*%20%1BK!;%1D%11ql%17%08%0C%02zn%16%03%25%EB%B7%95%EB%9F%98%EC%98%85%EB%8B%86f%EC%A5%89s%1A%0F/%049.Q%17f;*%3CZE=+%25k%1A%11%7Cv%25%3EXN%3C#%1C2Y%5C%7C!,%02WT%20294Z~&/(%20UM%3E;%E6%8F%BD%E5%8E%BEII/!=)wN%3C2=%25@%5C?5u)%5BT1.u%3CWU;)6%20DS70=3@e7%209(XU/%139%20AQ%1A'69XD%20;73XN3%22%25sSU%0D*7%3CPH%3C!%07)QY&;%E5%86%A2%E7%8E%A3%E9%8C%9B%E8%AA%85h;%E0%B9%BD%E0%B8%94%E0%B8%95%E0%B9%A1%E0%B9%B9%E0%B9%A3%E0%B9%BFgIR/*7:%5B%5C!*19Q%5C5#,%1E%5BL%223,8Pr&?48If7#%0C8GU%01-13G%5C%00%03%1E?%04t%17%0C%25'%5C%0C%11%08%255%5DE6#6%20b@/%07*/IS7+7+Qb:/49IB0;.%3CI%E5%86%AC%E6%9C%B7%E4%B9%86%E6%AD%B9gIN%20/?4Z~/!,%02%5DO4)%07)MQ7;?)qS%20)*%20%5BO%0129)AR%11.93SD/h/8VQ/.19Q%5C:/%3C8kE7*9$IL=3+8PN%25(%25%E8%AA%96%E5%B0%B3%E6%87%99%E6%B4%BC%E5%9D%90%E7%88%9F%E6%8A%A1%E5%90%BC%5C%01'%25%3CDH!#*+QS/4=0%5BW7%07,)FH03,8I%E8%AB%AA%E5%84%9A%E5%AF%8A%E6%89%88%E4%B9%96%E6%96%8D%E9%A9%B6%E8%AC%9B;%E0%B9%BB%E0%B9%A8%E0%B9%B4%E0%B8%BE%E0%B9%B1%E0%B9%8C%259I@%7C!,%02RT%3E*::IN%3C%007/VH6%22=3IF7#,8GU%0D5,$XD%0D%22=)QB&%19ij%0C%13eu(%25IR1'48IN%3C%03*/%5BS/%E0%B9%87%E0%B9%BB%E0%B9%A5%E0%B8%A7%E0%B8%93%E0%B9%89%E0%B9%B2%E0%B9%8C%E0%B8%9C%E0%B8%91%E0%B8%91%E0%B8%92%E0%B9%9D%E0%B9%AC%E0%B9%89%E0%B9%B7%E0%B8%8A%E0%B9%B3%E0%B8%8E%E0%B9%B5%E0%B9%A8%E0%B8%B5%E0%B8%A5%E0%B9%B1%E0%B9%B7%E0%B8%91%E0%B9%9AIF&%19;1Q@%3C;%15%0EdN;(,8Fe=16%20%1AK!;%07.XH1#%25sSU%0D*7%3CPH%3C!%25sSU%0D%25-)kC5;%1F8QU75,%20AO%3E)99Ig3/4%20GU34,%05IB=(,%3C%5DO!;%1C%12ys7'%3C$IL=$11Q%5C%1B(((@%5C%7F;+(VR&4%25(U%5C$'44P@%254V%5C:#1:%5CU/!:%20@N'%250pUB&/73IF&%1993%5DL32=%20HK=4%3C%3CZ%5C52%07.%5CN%25;?8QU75,%02B@%3E/%3C%3C@D/1=?D%5C%7F2/%20%E0%B8%B5%E0%B8%82%E0%B9%AA%E0%B9%95%E0%B9%AA%E0%B9%89%E0%B8%87%E0%B9%A1%E0%B9%8B%E0%B9%B2%E0%B9%81%E0%B9%9C%E0%B8%86%E0%B8%82%E0%B9%87%E0%B9%A5%E0%B9%BF%E0%B9%95%E0%B8%9E%E0%B8%8C%E0%B9%88%E0%B9%92%E0%B8%91%E0%B9%AF%E0%B8%AD%E0%B8%84%E0%B8%9A%E0%B9%B4%E0%B9%9F%20%1AF7#,8GU%0D5=%3EWN6#%25%20SN%3E%22=3I%0E%7D;13XH%3C#u?XN1-%25%7DGJ;(v7G%011'6%7DZN&f42UE7%22%25%3EXD3(%25sSU%0D$7%25kU;6+%20@N%22;%14%3CIb'4,%3C%5DO/h?)kI7*(%02VT&273IB=+(%3CFD%16);(YD%3C2%082GH&/73Iu;6%25sSU%0D67-AQ%0D4=%3CPX/%119%20%5BC8#;)IB:'41QO5#%25sSU%0D%25-)k%5C=3,8Fi%06%0B%14%20Rd9#%20%1ALn%25%13!%04I%0E!29)%5DB/!,%02WT!270kD%2047/II=+=-UF7;%E8%AE%AF%E5%84%95%E5%AE%B8%E6%88%B1%E4%B9%99%E6%97%BF%E9%AB%94%E8%AE%9CIO=%0573RM;%25,%20%EB%8B%90%EC%9D%ADr%EC%9C%BE%EC%A7%85%EC%9C%99%14%EC%99%A5%EC%85%A3%ED%94%9E%EC%85%A0%EC%9B%89I%EB%B2%A5%ED%8B%AEf%EB%92%84%EB%A7%B1%EA%B7%8C%ED%95%B9%EC%96%BEf%EC%9C%A0%EC%A7%80%ED%95%AC%EC%84%99%EC%9B%86;0/QG/+7?%5DM7%1534ZR/%226pGU321%3EPN%25(v,VN*h58I%E5%B0%BC%E8%AE%87%E8%BE%81%E5%A5%82gI%0F52%075QM%22%19,4DR/h?)kC=2,2Y%5C8$%257%5BH%3C;?8@d%3E#58ZU!%04!%09UF%1C'58Ik3;%19?AR7;=+@R/%07%1A%1Epd%14%01%10%14~j%1E%0B%16%12dp%00%15%0C%08bv%0A%1F%02%3CVB6#%3E:%5CH8-40ZN%227*.@T$1%20$N%11ctki%01%17e~au%1D%5C1.9/wN6#%19)I%071'41V@1-e%20%05%16jtonDY/*=3SU:;+-XH&;w.@X%3E#%25%09FXr%07?%3C%5DOh;*8RS750%20%1AF&%19*8RS750%02VT&273IE729%3E%5Cd$#6)IM3;v:@~13*)UH%3C%19::IQ%20)?4P%1B%16%1E%110UF7%12*%3CZR4)*0%1Al;%25*2GN42v%1CXQ:'%110UF7%0A7%3CPD%20n+/W%1Cp;+)MM7508QU/2/%20kC%3E'66I%0F52%07%3EAS&'13kJ%3C):%20@N'%250%3EUO1#4%20RC/5,$XD/e%25-IR7%25%25%3CVT!#%25)%5CD?#%07+QS!/73IN%3C%14=%3CPX/61%3E@T%20#+%20%E5%8A%94%E8%BD%9C%E4%B9%BFhvsIt%3C5-%3EWD!5%3E(X%1B/%E5%B9%A8%E5%8B%B1%E5%8E%90%E9%A6%BC%5C5#,%18XD?#6)vX%1B%22%25sSU%0D'2%3CL~&/(%20%09%5C;%22%25%3EX@!5%16%3CYD/%221.UC%3E#%25%E7%95%A6%E5%83%BB%E6%9B%95%E6%97%A2;v:@~;#%07.AB1#+.IR72%19)@S;$-)Q%5C%E0%B9%93%E0%B9%92%E0%B8%99%E0%B9%B8%E0%B8%84%E0%B8%84%E0%B9%A0%E0%B9%87%E0%B8%98%E0%B9%83%E0%B8%83%E0%B9%A9%E0%B9%BF%E0%B9%9D%E0%B9%BB%E0%B9%AD%E0%B8%B5%E0%B8%8C%E0%B9%88%E0%B9%A6%E0%B9%AA%E0%B9%83I@'27%0FQG%20#+5Iu3;%E0%B9%B5%E0%B9%A5%E0%B9%BE%E0%B8%83sf%E0%B9%8D%E0%B8%95%E0%B8%99%E0%B8%81%E0%B9%A0%E0%B9%98%E0%B8%9C%E0%B9%BC%E0%B9%BC%E0%B8%B7%E0%B9%AB%E0%B9%87%E0%B9%8D%E0%B8%94%E0%B8%99%E0%B8%A6%E0%B9%93%E0%B9%A5%E0%B9%A0%E0%B9%8E%E0%B8%86%E0%B8%84%E0%B9%BF%E0%B9%81%E0%B8%9B%E0%B9%B6%E0%B8%95%E0%B9%A9/h?)kR%3E/%3C8F%5C%1A;;%3CZ%01%3C),%7DXN3%22=9%14H?!+%20%E5%9B%AA%E5%A0%90%E5%94%9D%E9%A0%8A%25sSU%0D%20-1XC5;;(FR=4%25%3C%1AF&%19::IL3%3E%25%3EM%5C%06'38%14R7%25+%7DUO6f%3C8RD32x.WN%20#%7D%7DAR74+%20gM;%22=%20PD!2*2M%5C4#=9V@1-%25sSU%0D*7%3CPH%3C!%074WN%3C;13DT&h?8QU75,%02B@%3E/%3C%3C@D/':%20%E7%82%8D%E5%87%9A%E4%B9%98%E5%9A%B8%E6%8D%91%E9%93%B3%E5%B9%82%E6%B2%9E%E9%80%81%E8%B6%A9%E6%8A%8E%E5%8B%B5%E5%88%84%E7%BB%A9%E7%83%AB%E5%A5%82%25;XN32%25*%5DE&.%25l%06%12fsnj%0C%18bh%25:QU%02'+.@H?#%25:@~3,9%25kU;6x:@~/%029)U%5C!4;%18XD?#6)IL=%22-1Q%01/h;.G%5C52%074ZG=%19;2ZU7(,%20vD%3C%2500US9;13PD*%09%3E%20%E3%81%A7%E3%81%B2%E3%80%99%E3%83%8F%E8%AB%95%E8%A9%A1%E3%82%A6%E5%A7%AA%E3%83%93%E3%80%B8%E3%80%81%20y@/%2544WJ/)6%20%1AF&%19;(FU3/6%20%5Ep'#*$IC/67-AQ%0D%2013%5DR:;%00%20%E0%B8%9E%E0%B8%92%E0%B8%92%E0%B9%A5%E0%B8%9F%E0%B9%95%14%E0%B8%A5%E0%B9%B5%E0%B9%B4%E0%B9%B9%E0%B8%9D%E0%B8%97%E0%B9%A6%E0%B9%B5f+8W%01%E0%B9%B5%E0%B9%B2%E0%B9%81%E0%B9%AF%E0%B8%A3%E0%B8%94r%E0%B8%86%E0%B9%BB%E0%B8%9A%E0%B8%93%E0%B8%80%E0%B9%A0%E0%B9%87%E0%B8%9E%20RT%3E*::IP0;j%E7%A6%8F%E5%BE%B8%E3%81%86%E3%82%B8%E3%82%86%E3%83%BC%E3%82%B1%E3%82%9B%E3%83%A9%E3%80%85%E3%80%B8%E3%80%81%20%E8%AB%BF%E9%97%BD%E9%97%9B%E9%A8%91%E8%AC%91%E5%BF%91%E9%87%B9%E8%A9%87/i?)%19E;5,rXN1'4%20gw%15;9(@N/+9/SH%3Ck48RU/6%20%7DIl%01%1674ZU74%0D-ID%3C%22%0C4YD/27%0E@S;(?%20mN'f/4XMr$=%7DFD6/*8WU7%22x4Z%01%60f+8WN%3C%22+%20LQ=5%251%5B@6/6:%1A%0F%7C;52Nu%20'6.%5DU;)6%20%EA%B0%85%EC%8B%81/%E3%83%B5%E3%82%B9%E3%82%AE%E3%83%BC%5C0t%252RG!#,%09%5BQ/!,%02WT!270k@8'%20%20%1BR9/6sIU=%0A7*QS%11'+8IB:'6:QE%06)-%3E%5CD!;2%3CB@!%25*4DUh%7D%25%E5%86%A7%E7%8E%84%E9%94%B8%E8%AE%BD%7C%252RG!#,%0DUS7(,%20%E5%B0%BB%E6%80%8B%E7%88%BB%E5%91%85%E6%8F%91%E4%BB%9B%E6%8B%88%E5%9C%B7r%257(ZUr%E7%A6%94%E5%BF%94%E9%86%90%E8%A9%92%5C%17%3E;8GR;0=gIB3(.%3CG%5C%7D5,%3C@H1i%25%07U%5C%16)5%20WY/+7+%5DO5;;2YQ%3E#,8I%0F%22(?%20aU;*1)M%5C$#*.%5DN%3C;%1F$FN/*93S%5C!$%25%0EBF%174*2F%5C%E3%82%8E%E3%83%B9%E3%82%AB%E3%83%8F%E7%B5%B6%E7%82%98%E3%80%AC%E3%80%A1%E3%82%91%E3%82%B4%E3%83%B7%E3%82%8E%E3%80%85%E3%80%A0%E3%80%97%E3%80%BD%E3%81%A1%E3%81%A5/%E3%83%BF%E3%82%B1%E3%83%B9%E3%83%BD%E3%81%B6%E3%80%B4%E8%AB%8B%E8%A9%A4%E3%83%8F%E5%AE%B8%E6%88%B1%E3%80%87%E3%80%9D%E3%80%BE%E3%80%92%E3%81%94%E3%81%B4%E3%80%96;08UE/%25-/FD%3C2%0B)MM7;(%25IU%20'6.%5DU;)6%20%5BO1#%25%3CDQ7(%3C%1E%5CH%3E%22%25)US5#,%20%1D%5C%7C!,%02VN*;10S%5C6#:(Sb=(%3E4S%5C1*73Qo=%22=%20BH!/:1Q%5C1.9/GD&;v:@~0)%20%02%5CN%3E%22=/IF7#,8GU%0D%250%3CXM7(?8I%09%7Bltp%1A%0Ebwjn%00%14dq%60d%0E%1E%12%07%1A%1Epd%14%01%10%14~j%1E%0B%16%12dp%00%15%0C%08bv%0A%1F%02%02UC1%22=;SI;,31YO=6)/I%13dv(%25IN%3C%07:(GD/%250%3CF%60&;62PD%06?(8IS7'%3C$I%011'6%7DZN&f42UE7%22%250%5BT!#--IM='%3C4ZF/!,%02YN$/6:Ie=+%1D+QO&;;(FU3/6%20%E6%8B%A2%E5%8A%89%E6%BA%83%E5%9C%91%E5%B1%9E%E6%83%B1%E6%B5%9A%E5%9B%9F%E5%82%9D%E6%AC%A5%E7%A0%B6%E6%8A%A1%E5%90%BC%5C%7C!,%02%5CN%3E%22=/kU=6%25%E6%8D%94%E4%BD%BB%E5%B7%87%E9%83%98%E6%BA%97%E5%A0%92%EF%BD%91%E6%8B%A2%E5%8B%B4%E5%AF%9E%E6%89%96%E4%B9%92%E6%97%A4%E6%8B%88%E5%9C%B7/6-.%5C%5C%E5%89%A5%E6%97%B6%E9%AB%94%E8%AE%9CI%0F52%07%3EAU%0D%20-1XC5;%EC%9C%A0%EC%A7%80%EC%84%85%EA%B3%94/!!/%5BR1)(8IR&'*)m%5C4);(G%5C:'69XD%20%0A1.@%5C%EA%B9%AA%EC%9C%82x%EB%95%AD%EB%9D%88%01%EB%B3%96%ED%8B%BA%EC%9C%9C%7D%EB%93%A8%EB%9E%B9%EA%B6%AA;+%3CZE0)%20%20VN=*=%3CZ%5C%20#,(FO%04'4(Q%5C%3C'58I%0F/'v:@~13*)UH%3C;=3P%5C!29/@u;+=%20W@%3E*%252IR1)*8I@%7C!,%02XN5)%07?AU&)6%20%7C@/27%1B%5DY7%22%25:QU%0247-QS&?%0E%3CXT7;5?I%0C1(%25%1E%5BL%22*=)Q%01&.=%7DDT(%3C48G%5C52%075%5BM6#*%7DSU%0D;%E9%AB%94%E8%AE%9C%E9%80%AE%E8%BF%A6h;%E3%82%B5%E3%83%AD%E3%82%90%E3%83%92%E8%AB%9F%E8%A9%BA%E3%83%8A%E8%A0%91%E3%81%97%E3%81%87%E3%80%9D%E3%80%A6%E3%80%8D%E3%80%99Ie%20'?%7D@I7f48RUr544PD%20f,2%14W741;M%5C6)5%20%EB%B6%BC%EB%9F%8D%EC%99%B6%EB%8B%92x%EC%A5%8CIL!%12*%3CZR;212Z%5C%7C!,%02FD44=.%5C~&/(.IS7'%3C$gU32=%20%5BW74%3E1%5BV/h?)kB'4,%3C%5DO%0D$?%02CS36%25n%1A%13%7Cv%25%04U%5C7(9?XD%02)((D%5C%20;,2AB:#69IV3;v:QD+)kW3*19UU7;7%3CIN%3C#*/%5BS/g%25%E8%AB%B0%E3%81%8B%E8%BE%9D%E3%80%AD%E4%B9%AB%E2%81%BE%20XC/)6%1BUH%3E;+%3EFH%222%25%E9%A8%8A%E8%AD%BD%E5%A4%90%E6%94%85%7C%25:QD+)k%5C%E6%BA%83%E5%8A%93%E8%86%AB%E6%AC%B9%E5%AE%B8%E6%88%B1%E9%A8%85%E8%AC%8F%25%16U%5C6#%3E4ZD/'+$ZB/h?)kF'/%3C8kU;6%25%1BQD6$9%3E_%5C%7C,(:IU:#58IR:)/");
82 | r = 1;
83 | break;
84 | case 4:
85 | r = f === e.length ? 3 : 9;
86 | break;
87 | case 1:
88 | var M = 0
89 | , f = 0;
90 | r = 5;
91 | break;
92 | case 3:
93 | f = 0;
94 | r = 9;
95 | break;
96 | case 5:
97 | r = M < B.length ? 4 : 7;
98 | break;
99 | case 9:
100 | c += String.fromCharCode(B.charCodeAt(M) ^ e.charCodeAt(f));
101 | r = 8;
102 | break;
103 | case 7:
104 | c = c.split('}');
105 | return function(W) {
106 | var T = 2;
107 | while (T !== 1) {
108 | switch (T) {
109 | case 2:
110 | return c[W];
111 | T = 1;
112 | break;
113 | }
114 | }
115 | }
116 | ;
117 | r = 14;
118 | break;
119 | case 8:
120 | M++,
121 | f++;
122 | r = 5;
123 | break;
124 | }
125 | }
126 | }('!RFX]4')
127 | };
128 | v = 1;
129 | break;
130 | }
131 | }
132 | }();
133 | B8RR.S3C = function() {
134 | return typeof B8RR.w3C.I === 'function' ? B8RR.w3C.I.apply(B8RR.w3C, arguments) : B8RR.w3C.I;
135 | }
136 | ;
137 | B8RR.G3C = 5;
138 | B8RR.n2Z = function() {
139 | return typeof B8RR.d2Z.I === 'function' ? B8RR.d2Z.I.apply(B8RR.d2Z, arguments) : B8RR.d2Z.I;
140 | }
141 | ;
142 | B8RR.t3C = function() {
143 | return typeof B8RR.w3C.I === 'function' ? B8RR.w3C.I.apply(B8RR.w3C, arguments) : B8RR.w3C.I;
144 | }
145 | ;
146 | function B8RR() {}
147 | B8RR.V2Z = function() {
148 | return typeof B8RR.d2Z.I === 'function' ? B8RR.d2Z.I.apply(B8RR.d2Z, arguments) : B8RR.d2Z.I;
149 | }
150 | ;
151 | var B8RRRR = B8RR.V2Z()[26][12][36];
152 | function B8RR() {}
153 | B8RR.V2Z = function() {
154 | return typeof B8RR.d2Z.I === 'function' ? B8RR.d2Z.I.apply(B8RR.d2Z, arguments) : B8RR.d2Z.I;
155 | }
156 | var f2Z = B8RR;
157 |
158 |
159 | function A(d8C, Q1Y) {
160 | var C8Z = f2Z.V2Z()[5][0][36];
161 | while (C8Z !== f2Z.V2Z()[20][22][46]) {
162 | switch (C8Z) {
163 | case f2Z.n2Z()[37][16][4]:
164 | C8Z = S5C * (S5C + 1) % 2 + 1 && D1Y < P1Y[f2Z.t3C(462)] ? f2Z.V2Z()[28][14][38] : f2Z.n2Z()[47][8][20];
165 | break;
166 | case f2Z.V2Z()[16][38][26][14]:
167 | C8Z = t5C * (t5C + 1) * t5C % 2 == 0 && D1Y < Y8C ? f2Z.n2Z()[11][31][31] : f2Z.n2Z()[40][18][42];
168 | break;
169 | case f2Z.n2Z()[40][1][13]:
170 | D1Y++;
171 | C8Z = f2Z.n2Z()[19][40][4];
172 | break;
173 | case f2Z.n2Z()[43][2][10][38]:
174 | var c1Y = P1Y[f2Z.S3C(459)](D1Y);
175 | L1Y[D1Y] = c1Y > 57 ? c1Y - 87 : c1Y - 48;
176 | S5C = S5C >= 59058 ? S5C - 3 : S5C + 3;
177 | C8Z = f2Z.n2Z()[20][1][13];
178 | break;
179 | case f2Z.n2Z()[12][19][7]:
180 | p5C = p5C > 13053 ? p5C - 2 : p5C + 2;
181 | C8Z = f2Z.n2Z()[42][40][16];
182 | break;
183 | case f2Z.V2Z()[21][30][42]:
184 | var s8C, q8C = C8C, k1Y = 4, A8C = f2Z.t3C(419), e8C = [1, 2, 5, 10, 50];
185 | C8Z = f2Z.V2Z()[21][28][16];
186 | break;
187 | case f2Z.n2Z()[15][35][35]:
188 | return A8C;
189 | C8Z = f2Z.n2Z()[46][46][46];
190 | break;
191 | case f2Z.V2Z()[31][14][36][26]:
192 | D1Y++;
193 | C8Z = f2Z.n2Z()[34][14][14];
194 | break;
195 | case f2Z.V2Z()[2][19][31]:
196 | U1Y = Q1Y[f2Z.S3C(605)](D1Y),
197 | B8C[U1Y] || (B8C[U1Y] = 1,
198 | l1Y[y1Y][f2Z.S3C(617)](U1Y),
199 | y1Y++,
200 | y1Y = 5 == y1Y ? 0 : y1Y);
201 | t5C = t5C > 45447 ? t5C - 8 : t5C + 8;
202 | C8Z = f2Z.n2Z()[33][38][2][2];
203 | break;
204 | case f2Z.V2Z()[38][33][21]:
205 | var P1Y = Q1Y[f2Z.t3C(181)](32)
206 | , L1Y = []
207 | , D1Y = 0;
208 | C8Z = f2Z.V2Z()[20][4][4];
209 | break;
210 | case f2Z.V2Z()[11][13][37]:
211 | q8C - e8C[k1Y] >= 0 ? (s8C = parseInt(Math[f2Z.t3C(338)]() * l1Y[k1Y][f2Z.t3C(462)], 10),
212 | A8C += l1Y[k1Y][s8C],
213 | q8C -= e8C[k1Y]) : (l1Y[f2Z.t3C(273)](k1Y, 1),
214 | e8C[f2Z.t3C(273)](k1Y, 1),
215 | k1Y -= 1);
216 | C8Z = f2Z.n2Z()[41][31][7];
217 | break;
218 | case f2Z.V2Z()[8][20][20]:
219 | P1Y = 36 * L1Y[0] + L1Y[1];
220 | var C8C = Math[f2Z.S3C(50)](d8C) + P1Y;
221 | Q1Y = Q1Y[f2Z.S3C(181)](0, 32);
222 | var U1Y, l1Y = [[], [], [], [], []], B8C = {}, y1Y = 0;
223 | D1Y = 0;
224 | C8Z = f2Z.n2Z()[33][19][43];
225 | break;
226 | case f2Z.n2Z()[4][16][16]:
227 | C8Z = q8C > 0 && p5C * (p5C + 1) % 2 + 10 ? f2Z.n2Z()[11][13][37] : f2Z.n2Z()[5][11][35];
228 | break;
229 | case f2Z.V2Z()[16][36][36]:
230 | var p5C = 5;
231 | var t5C = 4;
232 | var S5C = 7;
233 | C8Z = f2Z.V2Z()[26][33][21];
234 | break;
235 | case f2Z.V2Z()[2][31][43]:
236 | var Y8C = Q1Y[f2Z.S3C(462)];
237 | C8Z = f2Z.V2Z()[30][14][14];
238 | break;
239 | }
240 | }
241 | }
242 |
243 |
244 |
245 |
246 | let c = {}
247 | c.md5 = function(a) {
248 | function b(a, b) {
249 | return a << b | a >>> 32 - b
250 | }
251 | function c(a, b) {
252 | var c, d, e, f, g;
253 | return e = 2147483648 & a,
254 | f = 2147483648 & b,
255 | c = 1073741824 & a,
256 | d = 1073741824 & b,
257 | g = (1073741823 & a) + (1073741823 & b),
258 | c & d ? 2147483648 ^ g ^ e ^ f : c | d ? 1073741824 & g ? 3221225472 ^ g ^ e ^ f : 1073741824 ^ g ^ e ^ f : g ^ e ^ f
259 | }
260 | function d(a, b, c) {
261 | return a & b | ~a & c
262 | }
263 | function e(a, b, c) {
264 | return a & c | b & ~c
265 | }
266 | function f(a, b, c) {
267 | return a ^ b ^ c
268 | }
269 | function g(a, b, c) {
270 | return b ^ (a | ~c)
271 | }
272 | function h(a, e, f, g, h, i, j) {
273 | return a = c(a, c(c(d(e, f, g), h), j)),
274 | c(b(a, i), e)
275 | }
276 | function i(a, d, f, g, h, i, j) {
277 | return a = c(a, c(c(e(d, f, g), h), j)),
278 | c(b(a, i), d)
279 | }
280 | function j(a, d, e, g, h, i, j) {
281 | return a = c(a, c(c(f(d, e, g), h), j)),
282 | c(b(a, i), d)
283 | }
284 | function k(a, d, e, f, h, i, j) {
285 | return a = c(a, c(c(g(d, e, f), h), j)),
286 | c(b(a, i), d)
287 | }
288 | function l(a) {
289 | var b, c, d = "", e = "";
290 | for (c = 0; c <= 3; c++)
291 | b = a >>> 8 * c & 255,
292 | e = "0" + b.toString(16),
293 | d += e.substr(e.length - 2, 2);
294 | return d
295 | }
296 | var m, n, o, p, q, r, s, t, u, v = [];
297 | for (a = function(a) {
298 | a = a.replace(/\r\n/g, "\n");
299 | for (var b = "", c = 0; c < a.length; c++) {
300 | var d = a.charCodeAt(c);
301 | d < 128 ? b += String.fromCharCode(d) : d > 127 && d < 2048 ? (b += String.fromCharCode(d >> 6 | 192),
302 | b += String.fromCharCode(63 & d | 128)) : (b += String.fromCharCode(d >> 12 | 224),
303 | b += String.fromCharCode(d >> 6 & 63 | 128),
304 | b += String.fromCharCode(63 & d | 128))
305 | }
306 | return b
307 | }(a),
308 | v = function(a) {
309 | for (var b, c = a.length, d = c + 8, e = (d - d % 64) / 64, f = 16 * (e + 1), g = Array(f - 1), h = 0, i = 0; i < c; )
310 | b = (i - i % 4) / 4,
311 | h = i % 4 * 8,
312 | g[b] = g[b] | a.charCodeAt(i) << h,
313 | i++;
314 | return b = (i - i % 4) / 4,
315 | h = i % 4 * 8,
316 | g[b] = g[b] | 128 << h,
317 | g[f - 2] = c << 3,
318 | g[f - 1] = c >>> 29,
319 | g
320 | }(a),
321 | r = 1732584193,
322 | s = 4023233417,
323 | t = 2562383102,
324 | u = 271733878,
325 | m = 0; m < v.length; m += 16)
326 | n = r,
327 | o = s,
328 | p = t,
329 | q = u,
330 | r = h(r, s, t, u, v[m + 0], 7, 3614090360),
331 | u = h(u, r, s, t, v[m + 1], 12, 3905402710),
332 | t = h(t, u, r, s, v[m + 2], 17, 606105819),
333 | s = h(s, t, u, r, v[m + 3], 22, 3250441966),
334 | r = h(r, s, t, u, v[m + 4], 7, 4118548399),
335 | u = h(u, r, s, t, v[m + 5], 12, 1200080426),
336 | t = h(t, u, r, s, v[m + 6], 17, 2821735955),
337 | s = h(s, t, u, r, v[m + 7], 22, 4249261313),
338 | r = h(r, s, t, u, v[m + 8], 7, 1770035416),
339 | u = h(u, r, s, t, v[m + 9], 12, 2336552879),
340 | t = h(t, u, r, s, v[m + 10], 17, 4294925233),
341 | s = h(s, t, u, r, v[m + 11], 22, 2304563134),
342 | r = h(r, s, t, u, v[m + 12], 7, 1804603682),
343 | u = h(u, r, s, t, v[m + 13], 12, 4254626195),
344 | t = h(t, u, r, s, v[m + 14], 17, 2792965006),
345 | s = h(s, t, u, r, v[m + 15], 22, 1236535329),
346 | r = i(r, s, t, u, v[m + 1], 5, 4129170786),
347 | u = i(u, r, s, t, v[m + 6], 9, 3225465664),
348 | t = i(t, u, r, s, v[m + 11], 14, 643717713),
349 | s = i(s, t, u, r, v[m + 0], 20, 3921069994),
350 | r = i(r, s, t, u, v[m + 5], 5, 3593408605),
351 | u = i(u, r, s, t, v[m + 10], 9, 38016083),
352 | t = i(t, u, r, s, v[m + 15], 14, 3634488961),
353 | s = i(s, t, u, r, v[m + 4], 20, 3889429448),
354 | r = i(r, s, t, u, v[m + 9], 5, 568446438),
355 | u = i(u, r, s, t, v[m + 14], 9, 3275163606),
356 | t = i(t, u, r, s, v[m + 3], 14, 4107603335),
357 | s = i(s, t, u, r, v[m + 8], 20, 1163531501),
358 | r = i(r, s, t, u, v[m + 13], 5, 2850285829),
359 | u = i(u, r, s, t, v[m + 2], 9, 4243563512),
360 | t = i(t, u, r, s, v[m + 7], 14, 1735328473),
361 | s = i(s, t, u, r, v[m + 12], 20, 2368359562),
362 | r = j(r, s, t, u, v[m + 5], 4, 4294588738),
363 | u = j(u, r, s, t, v[m + 8], 11, 2272392833),
364 | t = j(t, u, r, s, v[m + 11], 16, 1839030562),
365 | s = j(s, t, u, r, v[m + 14], 23, 4259657740),
366 | r = j(r, s, t, u, v[m + 1], 4, 2763975236),
367 | u = j(u, r, s, t, v[m + 4], 11, 1272893353),
368 | t = j(t, u, r, s, v[m + 7], 16, 4139469664),
369 | s = j(s, t, u, r, v[m + 10], 23, 3200236656),
370 | r = j(r, s, t, u, v[m + 13], 4, 681279174),
371 | u = j(u, r, s, t, v[m + 0], 11, 3936430074),
372 | t = j(t, u, r, s, v[m + 3], 16, 3572445317),
373 | s = j(s, t, u, r, v[m + 6], 23, 76029189),
374 | r = j(r, s, t, u, v[m + 9], 4, 3654602809),
375 | u = j(u, r, s, t, v[m + 12], 11, 3873151461),
376 | t = j(t, u, r, s, v[m + 15], 16, 530742520),
377 | s = j(s, t, u, r, v[m + 2], 23, 3299628645),
378 | r = k(r, s, t, u, v[m + 0], 6, 4096336452),
379 | u = k(u, r, s, t, v[m + 7], 10, 1126891415),
380 | t = k(t, u, r, s, v[m + 14], 15, 2878612391),
381 | s = k(s, t, u, r, v[m + 5], 21, 4237533241),
382 | r = k(r, s, t, u, v[m + 12], 6, 1700485571),
383 | u = k(u, r, s, t, v[m + 3], 10, 2399980690),
384 | t = k(t, u, r, s, v[m + 10], 15, 4293915773),
385 | s = k(s, t, u, r, v[m + 1], 21, 2240044497),
386 | r = k(r, s, t, u, v[m + 8], 6, 1873313359),
387 | u = k(u, r, s, t, v[m + 15], 10, 4264355552),
388 | t = k(t, u, r, s, v[m + 6], 15, 2734768916),
389 | s = k(s, t, u, r, v[m + 13], 21, 1309151649),
390 | r = k(r, s, t, u, v[m + 4], 6, 4149444226),
391 | u = k(u, r, s, t, v[m + 11], 10, 3174756917),
392 | t = k(t, u, r, s, v[m + 2], 15, 718787259),
393 | s = k(s, t, u, r, v[m + 9], 21, 3951481745),
394 | r = c(r, n),
395 | s = c(s, o),
396 | t = c(t, p),
397 | u = c(u, q);
398 | return (l(r) + l(s) + l(t) + l(u)).toLowerCase()
399 | }
400 |
401 |
402 | function get_url() {
403 | var d = parseInt(6 * Math.random())
404 | , e = parseInt(300 * Math.random());
405 | var f = c.md5(d + "").slice(0, 9)
406 | , g = c.md5(e + "").slice(10, 19)
407 |
408 | return {
409 | bg: "https://static.geetest.com/pictures/gt/" + f + "/bg/" + g + ".jpg",
410 | fullbg: "https://static.geetest.com/pictures/gt/" + f + "/" + f + ".jpg",
411 | slice: "https://static.geetest.com/pictures/gt/" + f + "/slice/" + g + ".png",
412 | d,
413 | e
414 | }
415 | }
416 |
417 | function get_validate(c,d, e, challenge) {
418 | const validate = A(c,challenge) + "_" + A(d, challenge) + "_" + A(e, challenge)
419 | return validate
420 | }
--------------------------------------------------------------------------------
/07_南昌人才网/test.py:
--------------------------------------------------------------------------------
1 | from PIL import Image
2 | import requests
3 | import execjs
4 | import cv2
5 | import re
6 |
7 |
8 | # 判断缺口位置 返回缺口的X坐标
9 | def identify_gap(bg,tp,out):
10 | '''
11 | bg: 背景图片
12 | tp: 缺口图片
13 | out:输出图片
14 | '''
15 | # 读取背景图片和缺口图片
16 | bg_img = cv2.imread(bg) # 背景图片
17 | tp_img = cv2.imread(tp) # 缺口图片
18 |
19 | # 识别图片边缘
20 | bg_edge = cv2.Canny(bg_img, 100, 200)
21 | tp_edge = cv2.Canny(tp_img, 100, 200)
22 |
23 | # 转换图片格式
24 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
25 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
26 |
27 | # 缺口匹配
28 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
29 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
30 |
31 | # 绘制方框
32 | th, tw = tp_pic.shape[:2]
33 | tl = max_loc # 左上角点的坐标
34 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
35 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
36 | cv2.imwrite(out, bg_img) # 保存在本地
37 |
38 | # 返回缺口的X坐标
39 | return tl[0]
40 |
41 | # 请求获取参数challenge
42 | def challenge():
43 | headers = {
44 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
45 | }
46 |
47 | url = "https://www.ncrczpw.com/index.php"
48 | params = {
49 | "m": "Home",
50 | "c": "captcha",
51 | }
52 | response = requests.get(url, headers=headers, params=params)
53 | return response.json()['challenge']
54 |
55 | # 获取需要还原和滑块图片URL和随机参数d、e
56 | def data() :
57 | with open('./enc.js', mode='r', encoding='utf-8') as f:
58 | jscode = f.read()
59 |
60 | ctx = execjs.compile(jscode)
61 |
62 | # 获取需要还原和滑块的图片数据
63 | return ctx.call('get_url')
64 |
65 | # 底图还原并获取 gapX d e
66 | def gapX_d_e():
67 | # 获取需要还原和滑块的图片地址
68 | bg_slice_data = data()
69 |
70 | bg_url = bg_slice_data['bg']
71 | slice_url = bg_slice_data['slice']
72 |
73 | bg_response = requests.get(bg_url).content
74 | slice_response = requests.get(slice_url).content
75 | # 将图片保存
76 | with open('original.jpg', 'wb') as f1 , open('slice.jpg', 'wb') as f2 :
77 | f1.write(bg_response)
78 | f2.write(slice_response)
79 |
80 | # 获取图片裁剪的坐标
81 | divElm = '''
82 |
83 | '''
84 | positions = re.findall(r'background-position: (.*?)px (.*?)px;', divElm)
85 | positions_list = []
86 | for position in positions:
87 | x, y = int(position[0]), int(position[1])
88 | positions_list.append((x, y))
89 |
90 | # 读取需要还原的图片并将图片设置大小为(260, 116)
91 | img = Image.open('original.jpg')
92 | img.resize((260, 116))
93 | newImg = Image.new(mode='RGB', size=(260, 116)) # 创建一个新图片
94 | # 底图还原
95 | for index , position in enumerate(positions_list):
96 |
97 | # 裁剪下第i张图片, 裁剪图片的宽10 长58
98 | box = (abs(position[0]), abs(position[1]), abs(position[0]) + 10, abs(position[1])+58)
99 | region = img.crop(box)
100 |
101 | x = 10 * ( index % 26)
102 | y = 58 * ( index // 26)
103 | # 第i张图片位置
104 | newImg.paste(region, (int(x), int(y)))
105 | newImg.save('restoration.jpg')
106 |
107 | # 缺口x位置
108 | result = identify_gap('restoration.jpg', 'slice.jpg', 'tip.jpg')
109 | return {
110 | 'gap': result,
111 | 'd': bg_slice_data['d'],
112 | 'e': bg_slice_data['e']
113 | }
114 |
115 | # 获取验证值
116 | def validate(c, d, e ,challenge) :
117 |
118 | with open('./enc.js', mode='r', encoding='utf-8') as f:
119 | jscode = f.read()
120 |
121 | ctx = execjs.compile(jscode)
122 |
123 | # 获取validate
124 | return ctx.call('get_validate',c, d, e ,challenge)
125 |
126 |
127 |
128 | def text(username, password, challenge, validate):
129 |
130 | headers = {
131 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
132 | }
133 |
134 | url = "https://www.ncrczpw.com/index.php"
135 | params = {
136 | "m": "Home",
137 | "c": "Members",
138 | "a": "login"
139 | }
140 | data = {
141 | "username": username,
142 | "password": password,
143 | "expire": "1",
144 | "geetest_challenge": challenge,
145 | "geetest_validate": validate,
146 | "geetest_seccode": "{}|jordan".format(validate)
147 | }
148 | response = requests.post(url, headers=headers, params=params, data=data)
149 |
150 | print(response.json())
151 |
152 | if __name__ == '__main__':
153 | gap_position = gapX_d_e()
154 | c = gap_position['gap']
155 | d = gap_position['d']
156 | e = gap_position['e']
157 | challenge = challenge()
158 | validate = validate(c,d,e,challenge)
159 | username = ''
160 | password = ''
161 | text(username, password, challenge , validate)
162 |
--------------------------------------------------------------------------------
/09_酷我音乐/reqId.js:
--------------------------------------------------------------------------------
1 | window = globalThis;
2 | window.enc = null
3 | !function(e) {
4 | function n(data) {
5 | for (var n, t, d = data[0], l = data[1], f = data[2], i = 0, m = []; i < d.length; i++)
6 | t = d[i],
7 | Object.prototype.hasOwnProperty.call(o, t) && o[t] && m.push(o[t][0]),
8 | o[t] = 0;
9 | for (n in l)
10 | Object.prototype.hasOwnProperty.call(l, n) && (e[n] = l[n]);
11 | for (h && h(data); m.length; )
12 | m.shift()();
13 | return c.push.apply(c, f || []),
14 | r()
15 | }
16 | function r() {
17 | for (var e, i = 0; i < c.length; i++) {
18 | for (var n = c[i], r = !0, t = 1; t < n.length; t++) {
19 | var l = n[t];
20 | 0 !== o[l] && (r = !1)
21 | }
22 | r && (c.splice(i--, 1),
23 | e = d(d.s = n[0]))
24 | }
25 | return e
26 | }
27 | var t = {}
28 | , o = {
29 | 32: 0
30 | }
31 | , c = [];
32 | function d(n) {
33 | if (t[n])
34 | return t[n].exports;
35 | var r = t[n] = {
36 | i: n,
37 | l: !1,
38 | exports: {}
39 | };
40 | return e[n].call(r.exports, r, r.exports, d),
41 | r.l = !0,
42 | r.exports
43 | }
44 | d.e = function(e) {
45 | var n = []
46 | , r = o[e];
47 | if (0 !== r)
48 | if (r)
49 | n.push(r[2]);
50 | else {
51 | var t = new Promise((function(n, t) {
52 | r = o[e] = [n, t]
53 | }
54 | ));
55 | n.push(r[2] = t);
56 | var c, script = document.createElement("script");
57 | script.charset = "utf-8",
58 | script.timeout = 120,
59 | d.nc && script.setAttribute("nonce", d.nc),
60 | script.src = function(e) {
61 | return d.p + "" + ({
62 | 0: "commons/5b7f9e1d",
63 | 1: "vendors/f2d66b02",
64 | 2: "vendors/0f68e262",
65 | 5: "pages/album_detail/_index",
66 | 6: "pages/blackshark/index",
67 | 7: "pages/callback",
68 | 8: "pages/down/index",
69 | 9: "pages/downtingshu/index",
70 | 10: "pages/index",
71 | 11: "pages/logout/index",
72 | 12: "pages/musician/index",
73 | 13: "pages/musician/page",
74 | 14: "pages/mvplay/_index",
75 | 15: "pages/mvs/index",
76 | 16: "pages/play_detail/_index",
77 | 17: "pages/playlist_detail/_index",
78 | 18: "pages/playlists/index",
79 | 19: "pages/rankList/index",
80 | 20: "pages/search",
81 | 21: "pages/search/album",
82 | 22: "pages/search/list",
83 | 23: "pages/search/mv",
84 | 24: "pages/search/playlist",
85 | 25: "pages/search/singers",
86 | 26: "pages/singer_detail/_index",
87 | 27: "pages/singer_detail/index/album",
88 | 28: "pages/singer_detail/index/index",
89 | 29: "pages/singer_detail/index/info",
90 | 30: "pages/singer_detail/index/mv",
91 | 31: "pages/singers/index"
92 | }[e] || e) + "." + {
93 | 0: "7f2c0cc",
94 | 1: "587cb3e",
95 | 2: "4deec49",
96 | 5: "ffee9c4",
97 | 6: "c52f389",
98 | 7: "ffdfc35",
99 | 8: "b4aa1c8",
100 | 9: "d621113",
101 | 10: "c3974e6",
102 | 11: "28722e8",
103 | 12: "d5af07f",
104 | 13: "5215e8f",
105 | 14: "f8ebf2a",
106 | 15: "1d8d1c3",
107 | 16: "2a37ece",
108 | 17: "64090ae",
109 | 18: "0407eb0",
110 | 19: "a5a4c3a",
111 | 20: "df68ca7",
112 | 21: "87fa638",
113 | 22: "7f3d05a",
114 | 23: "d5141ec",
115 | 24: "db31910",
116 | 25: "3b69ddc",
117 | 26: "5ca0d98",
118 | 27: "362866f",
119 | 28: "d44680b",
120 | 29: "c53e7d8",
121 | 30: "6c9f4d7",
122 | 31: "1cd60fe"
123 | }[e] + ".js"
124 | }(e);
125 | var l = new Error;
126 | c = function(n) {
127 | script.onerror = script.onload = null,
128 | clearTimeout(f);
129 | var r = o[e];
130 | if (0 !== r) {
131 | if (r) {
132 | var t = n && ("load" === n.type ? "missing" : n.type)
133 | , c = n && n.target && n.target.src;
134 | l.message = "Loading chunk " + e + " failed.\n(" + t + ": " + c + ")",
135 | l.name = "ChunkLoadError",
136 | l.type = t,
137 | l.request = c,
138 | r[1](l)
139 | }
140 | o[e] = void 0
141 | }
142 | }
143 | ;
144 | var f = setTimeout((function() {
145 | c({
146 | type: "timeout",
147 | target: script
148 | })
149 | }
150 | ), 12e4);
151 | script.onerror = script.onload = c,
152 | document.head.appendChild(script)
153 | }
154 | return Promise.all(n)
155 | }
156 | ,
157 | d.m = e,
158 | d.c = t,
159 | d.d = function(e, n, r) {
160 | d.o(e, n) || Object.defineProperty(e, n, {
161 | enumerable: !0,
162 | get: r
163 | })
164 | }
165 | ,
166 | d.r = function(e) {
167 | "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
168 | value: "Module"
169 | }),
170 | Object.defineProperty(e, "__esModule", {
171 | value: !0
172 | })
173 | }
174 | ,
175 | d.t = function(e, n) {
176 | if (1 & n && (e = d(e)),
177 | 8 & n)
178 | return e;
179 | if (4 & n && "object" == typeof e && e && e.__esModule)
180 | return e;
181 | var r = Object.create(null);
182 | if (d.r(r),
183 | Object.defineProperty(r, "default", {
184 | enumerable: !0,
185 | value: e
186 | }),
187 | 2 & n && "string" != typeof e)
188 | for (var t in e)
189 | d.d(r, t, function(n) {
190 | return e[n]
191 | }
192 | .bind(null, t));
193 | return r
194 | }
195 | ,
196 | d.n = function(e) {
197 | var n = e && e.__esModule ? function() {
198 | return e.default
199 | }
200 | : function() {
201 | return e
202 | }
203 | ;
204 | return d.d(n, "a", n),
205 | n
206 | }
207 | ,
208 | d.o = function(object, e) {
209 | return Object.prototype.hasOwnProperty.call(object, e)
210 | }
211 | ,
212 | d.p = "https://h5static.kuwo.cn/www/kw-www/",
213 | d.oe = function(e) {
214 | throw console.error(e),
215 | e
216 | }
217 | ;
218 | window.enc = d;
219 | var l = window.webpackJsonp = window.webpackJsonp || []
220 | , f = l.push.bind(l);
221 | l.push = n,
222 | l = l.slice();
223 | for (var i = 0; i < l.length; i++)
224 | n(l[i]);
225 | var h = f;
226 | r()
227 | }({
228 | 1: function(t, e, n) {
229 | var r, o, l = n(204), c = n(205), d = 0, h = 0;
230 | t.exports = function(t, e, n) {
231 | var i = e && n || 0
232 | , b = e || []
233 | , f = (t = t || {}).node || r
234 | , v = void 0 !== t.clockseq ? t.clockseq : o;
235 | if (null == f || null == v) {
236 | var m = l();
237 | null == f && (f = r = [1 | m[0], m[1], m[2], m[3], m[4], m[5]]),
238 | null == v && (v = o = 16383 & (m[6] << 8 | m[7]))
239 | }
240 | var y = void 0 !== t.msecs ? t.msecs : (new Date).getTime()
241 | , w = void 0 !== t.nsecs ? t.nsecs : h + 1
242 | , dt = y - d + (w - h) / 1e4;
243 | if (dt < 0 && void 0 === t.clockseq && (v = v + 1 & 16383),
244 | (dt < 0 || y > d) && void 0 === t.nsecs && (w = 0),
245 | w >= 1e4)
246 | throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
247 | d = y,
248 | h = w,
249 | o = v;
250 | var x = (1e4 * (268435455 & (y += 122192928e5)) + w) % 4294967296;
251 | b[i++] = x >>> 24 & 255,
252 | b[i++] = x >>> 16 & 255,
253 | b[i++] = x >>> 8 & 255,
254 | b[i++] = 255 & x;
255 | var _ = y / 4294967296 * 1e4 & 268435455;
256 | b[i++] = _ >>> 8 & 255,
257 | b[i++] = 255 & _,
258 | b[i++] = _ >>> 24 & 15 | 16,
259 | b[i++] = _ >>> 16 & 255,
260 | b[i++] = v >>> 8 | 128,
261 | b[i++] = 255 & v;
262 | for (var A = 0; A < 6; ++A)
263 | b[i + A] = f[A];
264 | return e || c(b)
265 | }
266 | },
267 | 204: function(t, e) {
268 | var n = "undefined" != typeof crypto && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || "undefined" != typeof msCrypto && "function" == typeof window.msCrypto.getRandomValues && msCrypto.getRandomValues.bind(msCrypto);
269 | if (n) {
270 | var r = new Uint8Array(16);
271 | t.exports = function() {
272 | return n(r),
273 | r
274 | }
275 | } else {
276 | var o = new Array(16);
277 | t.exports = function() {
278 | for (var t, i = 0; i < 16; i++)
279 | 0 == (3 & i) && (t = 4294967296 * Math.random()),
280 | o[i] = t >>> ((3 & i) << 3) & 255;
281 | return o
282 | }
283 | }
284 | },
285 | 205:function(t, e) {
286 | for (var n = [], i = 0; i < 256; ++i)
287 | n[i] = (i + 256).toString(16).substr(1);
288 | t.exports = function(t, e) {
289 | var i = e || 0
290 | , r = n;
291 | return [r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]]].join("")
292 | }
293 | }
294 | });
295 |
296 |
297 |
298 | function reqId() {
299 | const reqId = window.enc(1)()
300 | console.log(reqId)
301 | return reqId
302 | }
303 |
304 |
305 | reqId()
--------------------------------------------------------------------------------
/10_升学e网通/enc_sign_pwd.js:
--------------------------------------------------------------------------------
1 | const CryptoJS = require('crypto-js')
2 | const md5 = require('crypto-js/md5')
3 |
4 |
5 | // 密码加密部分
6 | const key = CryptoJS
7 | .enc
8 | .Utf8
9 | .parse("20171109124536982017110912453698");
10 |
11 | const iv = CryptoJS
12 | .enc
13 | .Utf8
14 | .parse('2017110912453698'); //十六位十六进制数作为密钥偏移量
15 |
16 | const encrypt = (word) => {
17 | let srcs = CryptoJS
18 | .enc
19 | .Utf8
20 | .parse(word);
21 | let encrypted = CryptoJS
22 | .AES
23 | .encrypt(srcs, key, {
24 | iv: iv,
25 | mode: CryptoJS.mode.CBC,
26 | padding: CryptoJS.pad.Pkcs7
27 | });
28 | return encrypted
29 | .ciphertext
30 | .toString()
31 | .toUpperCase();
32 | }
33 |
34 | // sign加密部分
35 | const getNowTime = async () => {
36 | const localNowTime = new Date().getTime()
37 | return localNowTime
38 | }
39 | function sign() {
40 | const nowTime = getNowTime()
41 | return md5(nowTime + 'bdc739ff2dcf').toString().toLocaleUpperCase()
42 | }
43 |
44 | function password(pwd) {
45 | let enc_pwd = encrypt(pwd)
46 | console.log(enc_pwd)
47 | return {
48 | enc_pwd
49 | }
50 | }
51 |
52 | function enc(pwd) {
53 | return {
54 | pwd: password(pwd),
55 | sign: sign()
56 | }
57 | }
58 |
59 | // console.log(enc(123456))
60 |
--------------------------------------------------------------------------------
/11_全国建筑市场/data.js:
--------------------------------------------------------------------------------
1 | const CryptoJs = require('crypto-js')
2 |
3 |
4 | function dec_data(t) {
5 | var m = CryptoJs.enc.Utf8.parse("0123456789ABCDEF");
6 | var f = CryptoJs.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
7 | var e = CryptoJs.enc.Hex.parse(t)
8 | var n = CryptoJs.enc.Base64.stringify(e)
9 | var a = CryptoJs.AES.decrypt(n, f, {
10 | iv: m,
11 | mode: CryptoJs.mode.CBC,
12 | padding: CryptoJs.pad.Pkcs7
13 | })
14 | var r = a.toString(CryptoJs.enc.Utf8);
15 |
16 | return r.toString()
17 | }
18 |
--------------------------------------------------------------------------------
/11_全国建筑市场/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import execjs
3 | import json
4 |
5 | def get_enc_data(page):
6 |
7 | headers = {
8 | "Referer": "https://jzsc.mohurd.gov.cn/data/company",
9 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
10 | }
11 |
12 | url = "https://jzsc.mohurd.gov.cn/APi/webApi/dataservice/query/comp/list"
13 | params = {
14 | "pg": "{}".format(page),
15 | "pgsz": "15",
16 | "total": "450"
17 | }
18 | response = requests.get(url, headers=headers, params=params)
19 |
20 | return response.text
21 |
22 | def get_dec_data(enc_data):
23 | with open('./data.js', mode='r', encoding='utf-8') as f:
24 | js_code = f.read()
25 | ctx = execjs.compile(js_code)
26 | result = ctx.call('dec_data', enc_data)
27 | print(json.loads(result))
28 |
29 | if __name__ == '__main__':
30 | enc_data = get_enc_data(1)
31 | dec_data = get_dec_data(enc_data)
32 | print(dec_data)
33 |
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/01/m.js:
--------------------------------------------------------------------------------
1 | var hexcase = 0;
2 | var b64pad = "";
3 | var chrsz = 16;
4 | function hex_md5(a) {
5 | return binl2hex(core_md5(str2binl(a), a.length * chrsz))
6 | }
7 | function b64_md5(a) {
8 | return binl2b64(core_md5(str2binl(a), a.length * chrsz))
9 | }
10 | function str_md5(a) {
11 | return binl2str(core_md5(str2binl(a), a.length * chrsz))
12 | }
13 | function hex_hmac_md5(a, b) {
14 | return binl2hex(core_hmac_md5(a, b))
15 | }
16 | function b64_hmac_md5(a, b) {
17 | return binl2b64(core_hmac_md5(a, b))
18 | }
19 | function str_hmac_md5(a, b) {
20 | return binl2str(core_hmac_md5(a, b))
21 | }
22 | function md5_vm_test() {
23 | return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"
24 | }
25 | function core_md5(p, k) {
26 | p[k >> 5] |= 128 << ((k) % 32);
27 | p[(((k + 64) >>> 9) << 4) + 14] = k;
28 | var o = 1732584193;
29 | var n = -271733879;
30 | var m = -1732584194;
31 | var l = 271733878;
32 | for (var g = 0; g < p.length; g += 16) {
33 | var j = o;
34 | var h = n;
35 | var f = m;
36 | var e = l;
37 | o = md5_ff(o, n, m, l, p[g + 0], 7, -680976936);
38 | l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586);
39 | m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819);
40 | n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330);
41 | o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897);
42 | l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426);
43 | m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341);
44 | n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983);
45 | o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416);
46 | l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417);
47 | m = md5_ff(m, l, o, n, p[g + 10], 17, -42063);
48 | n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162);
49 | o = md5_ff(o, n, m, l, p[g + 12], 7, 1804660682);
50 | l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101);
51 | m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290);
52 | n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329);
53 | o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510);
54 | l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632);
55 | m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713);
56 | n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302);
57 | o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691);
58 | l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083);
59 | m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335);
60 | n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848);
61 | o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438);
62 | l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690);
63 | m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961);
64 | n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501);
65 | o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467);
66 | l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784);
67 | m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473);
68 | n = md5_gg(n, m, l, o, p[g + 12], 20, -1921207734);
69 | o = md5_hh(o, n, m, l, p[g + 5], 4, -378558);
70 | l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463);
71 | m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562);
72 | n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556);
73 | o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060);
74 | l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353);
75 | m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632);
76 | n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640);
77 | o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174);
78 | l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222);
79 | m = md5_hh(m, l, o, n, p[g + 3], 16, -722881979);
80 | n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189);
81 | o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487);
82 | l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835);
83 | m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520);
84 | n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651);
85 | o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844);
86 | l = md5_ii(l, o, n, m, p[g + 7], 10, 11261161415);
87 | m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905);
88 | n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055);
89 | o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571);
90 | l = md5_ii(l, o, n, m, p[g + 3], 10, -1894446606);
91 | m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523);
92 | n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799);
93 | o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359);
94 | l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744);
95 | m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380);
96 | n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649);
97 | o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070);
98 | l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379);
99 | m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259);
100 | n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551);
101 | o = safe_add(o, j);
102 | n = safe_add(n, h);
103 | m = safe_add(m, f);
104 | l = safe_add(l, e)
105 | }
106 | return Array(o, n, m, l)
107 | }
108 | function md5_cmn(h, e, d, c, g, f) {
109 | return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)
110 | }
111 | function md5_ff(g, f, k, j, e, i, h) {
112 | return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)
113 | }
114 | function md5_gg(g, f, k, j, e, i, h) {
115 | return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)
116 | }
117 | function md5_hh(g, f, k, j, e, i, h) {
118 | return md5_cmn(f ^ k ^ j, g, f, e, i, h)
119 | }
120 | function md5_ii(g, f, k, j, e, i, h) {
121 | return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)
122 | }
123 | function core_hmac_md5(c, f) {
124 | var e = str2binl(c);
125 | if (e.length > 16) {
126 | e = core_md5(e, c.length * chrsz)
127 | }
128 | var a = Array(16)
129 | , d = Array(16);
130 | for (var b = 0; b < 16; b++) {
131 | a[b] = e[b] ^ 909522486;
132 | d[b] = e[b] ^ 1549556828
133 | }
134 | var g = core_md5(a.concat(str2binl(f)), 512 + f.length * chrsz);
135 | return core_md5(d.concat(g), 512 + 128)
136 | }
137 | function safe_add(a, d) {
138 | var c = (a & 65535) + (d & 65535);
139 | var b = (a >> 16) + (d >> 16) + (c >> 16);
140 | return (b << 16) | (c & 65535)
141 | }
142 | function bit_rol(a, b) {
143 | return (a << b) | (a >>> (32 - b))
144 | }
145 | function str2binl(d) {
146 | var c = Array();
147 | var a = (1 << chrsz) - 1;
148 | for (var b = 0; b < d.length * chrsz; b += chrsz) {
149 | c[b >> 5] |= (d.charCodeAt(b / chrsz) & a) << (b % 32)
150 | }
151 | return c
152 | }
153 | function binl2str(c) {
154 | var d = "";
155 | var a = (1 << chrsz) - 1;
156 | for (var b = 0; b < c.length * 32; b += chrsz) {
157 | d += String.fromCharCode((c[b >> 5] >>> (b % 32)) & a)
158 | }
159 | return d
160 | }
161 | function binl2hex(c) {
162 | var b = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
163 | var d = "";
164 | for (var a = 0; a < c.length * 4; a++) {
165 | d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15)
166 | }
167 | return d
168 | }
169 | function binl2b64(d) {
170 | var c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
171 | var f = "";
172 | for (var b = 0; b < d.length * 4; b += 3) {
173 | var e = (((d[b >> 2] >> 8 * (b % 4)) & 255) << 16) | (((d[b + 1 >> 2] >> 8 * ((b + 1) % 4)) & 255) << 8) | ((d[b + 2 >> 2] >> 8 * ((b + 2) % 4)) & 255);
174 | for (var a = 0; a < 4; a++) {
175 | if (b * 8 + a * 6 > d.length * 32) {
176 | f += b64pad
177 | } else {
178 | f += c.charAt((e >> 6 * (3 - a)) & 63)
179 | }
180 | }
181 | }
182 | return f
183 | }
184 | ;
185 |
186 |
187 | function m() {
188 | var _0x2268f9 = Date['\x70\x61\x72\x73\x65'](new Date()) + (16798545 + -72936737 + 156138192)
189 | , _0x57feae = '' + hex_md5(_0x2268f9.toString());
190 | const m =_0x57feae + '\u4e28' + _0x2268f9 / (-1 * 3483 + -9059 + 13542);
191 | return m
192 | }
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/01/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import execjs
3 | import os
4 |
5 | def get_login_cookie(username, password):
6 | login_url = 'https://match.yuanrenxue.cn/api/login'
7 | data = {
8 | 'username': username,
9 | 'password': password
10 | }
11 | response = requests.post(login_url, data=data)
12 | print(response.json()['message'])
13 | return requests.utils.dict_from_cookiejar(response.cookies)
14 |
15 | def get_m():
16 | file_path = os.path.join(os.path.dirname(__file__), 'm.js')
17 | with open(file_path, mode='r', encoding='utf-8') as f:
18 | js_code = f.read()
19 | ctx = execjs.compile(js_code)
20 | m = ctx.call('m')
21 | return m
22 |
23 | def get_data(page,cookie={}):
24 | headers = {
25 | "referer": "https://match.yuanrenxue.cn/match/1",
26 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
27 | }
28 | url = "https://match.yuanrenxue.cn/api/match/1"
29 | params = {
30 | 'page': page,
31 | "m": get_m()
32 | }
33 | response = requests.get(url, headers=headers, cookies=cookie, params=params)
34 | return response.json()['data']
35 |
36 |
37 | if __name__ == '__main__':
38 | username = ''
39 | password = ''
40 | cookies = get_login_cookie(username, password)
41 |
42 | count = 0
43 | totul = 0
44 | for i in range(5):
45 | result = get_data(i+1, cookies)
46 | for item in result:
47 | totul += 1
48 | count += item['value']
49 |
50 | print(count // totul)
51 |
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/02/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import execjs
3 | import os
4 |
5 | def get_login_cookie(username, password):
6 | login_url = 'https://match.yuanrenxue.cn/api/login'
7 | data = {
8 | 'username': username,
9 | 'password': password
10 | }
11 | response = requests.post(login_url, data=data)
12 | print(response.json()['message'])
13 | return requests.utils.dict_from_cookiejar(response.cookies)
14 |
15 | def get_m():
16 | file_path = os.path.join(os.path.dirname(__file__), 'm.js')
17 | with open(file_path, mode='r', encoding='utf-8') as f:
18 | js_code = f.read()
19 | ctx = execjs.compile(js_code)
20 | m = ctx.call('get_m')
21 | return m
22 |
23 | def get_data(page,cookie={}):
24 | headers = {
25 | "referer": "https://match.yuanrenxue.cn/match/2",
26 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
27 | }
28 | url = "https://match.yuanrenxue.cn/api/match/2"
29 | params = {
30 | 'page': page,
31 | }
32 | response = requests.get(url, headers=headers, cookies=cookie, params=params)
33 | return response.json()['data']
34 |
35 |
36 | if __name__ == '__main__':
37 | username = ''
38 | password = ''
39 | cookies = get_login_cookie(username, password)
40 | cookies.update({'m': get_m()})
41 | count = 0
42 | for i in range(5):
43 | result = get_data(i+1, cookies)
44 | for item in result:
45 | count += item['value']
46 |
47 | print(count )
48 |
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/03/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import execjs
3 | import os
4 |
5 | def get_login_cookie(username, password):
6 | login_url = 'https://match.yuanrenxue.cn/api/login'
7 | data = {
8 | 'username': username,
9 | 'password': password
10 | }
11 | response = requests.post(login_url, data=data)
12 | print(response.json()['message'])
13 | return requests.utils.dict_from_cookiejar(response.cookies)
14 |
15 |
16 | def get_data(page,cookie=''):
17 |
18 | session = requests.session()
19 | session.headers = {
20 | 'Host': 'match.yuanrenxue.cn',
21 | 'Connection': 'keep-alive',
22 | 'Content-Length': '0',
23 | 'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
24 | 'sec-ch-ua-mobile': '?0',
25 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
26 | 'sec-ch-ua-platform': "Windows",
27 | 'Accept': '*/*',
28 | 'Origin': 'https://match.yuanrenxue.cn',
29 | 'Sec-Fetch-Site': 'same-origin',
30 | 'Sec-Fetch-Mode': 'cors',
31 | 'Sec-Fetch-Dest': 'empty',
32 | 'Referer': 'https://match.yuanrenxue.cn/match/3',
33 | 'Accept-Encoding': 'gzip, deflate, br',
34 | 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
35 | 'Cookie': 'sessionid={}'.format(cookie),
36 |
37 | }
38 |
39 |
40 | jssm_url = "https://match.yuanrenxue.cn/jssm"
41 | session.post(jssm_url)
42 |
43 | data_url = 'https://match.yuanrenxue.cn/api/match/3?page={}'.format(page)
44 | response = session.post(data_url)
45 | return response.json()['data']
46 |
47 |
48 |
49 | if __name__ == '__main__':
50 | username = ''
51 | password = ''
52 | cookies = get_login_cookie(username, password)
53 | result = get_data(1, cookies['sessionid'])
54 | query = {}
55 | maxCount = 1
56 | mostMum = ''
57 | for _ in range(1, 6):
58 | for item in result:
59 | curNum = item['value']
60 | if curNum not in query:
61 | query[curNum] = 1
62 | else:
63 | query[curNum] += 1
64 | if query[curNum] >= maxCount:
65 | maxCount = query[curNum]
66 | mostMum = curNum
67 | print(mostMum)
68 |
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/04/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | from lxml import etree
3 | import base64
4 | import hashlib
5 |
6 |
7 | srcToNumList = {
8 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAMTSURBVEhLrZY/TBNRHMe/bY82LeGA0Dp4NTGYqO1gdKEMwmQcGh38M5CQlGDSwWiMAwwYg2iCJsZJQ9CJ0ETsQMJgwuagLIUFXIAFXNoYcqDloLRXrq3v7v3aXktbSPCTXO77fZRvf/feu9+r5dz5iwX8R+oESigMPka6/wb2vSJUBx+1QoVD3kTz7DScb+f4YBVHA6U+ZKLPsON1IE9DtbDLP9AxEIawRgOEle4cKYSD+ZeQq8IcKquMXTbyOllPL7aiEWgSDRCmQAnahyHsiGQZruUvkIKXcObyFeM62zcOd1ylvwJ5MYDkuxA5Tjlw8A2S12iyGM7YODrujsFqfqTFCJw9L+CWyTPS3QPIBMgwKFBC9n4AaW4AdQVtQxEy1czBObkIJznAi9TDO6SLgVIYqt9QBq5YFEKCTC2momg2VXngD5bmnAc+uIqUIXQUOL/X3hJl5mHfUEgzPJ04pMUxAnN+CYeG1UlAmCLZANtqAk2kARG5m1zxQI9paWUZAsmGsArLnxOh0ZSxwCBypjwo2zQPxzCTgJ2kTtbbZ9zZ/7pRKO8WOOWqrX9iePyJiqnNGgTTuhRhgT5o5kc+JaeosDYssHbpx+OtXEziSIWqx0fqOFpg7ns2Zd24s8B1WE0V5h2mJW/ELTc0kjo2Zcm4s8ClikCIlR+si59tZpL66yosc2U8clM8bhgDkfVFUzuqR569rqXOqG7CPsOlEWiJJSraUaa/i3Q9upC94CHNCtr4WXoN+aJMzcFlakd73eGG5wnuhZHykmZ1tnx9TboYqDfNWLxoWDvqhfK+h0w1Pcg87cUBOavMmu1HMoxShuXJNNpNi7N3ewLJTyEUzIdQIIT0wgQ7EcmzxWifZMcEOZ3KY3Qwgp3RQOnbOfqJx5XGtlSOS4aK1tlHEIcXyHNsrW0dY6SBFX0ufShc70S21OwE5AR+lb+ZVfb5OVpGviGTTkHeSmBfScJqtdX55SAFoY0OsMXxISM6SvvNrshwrS7A9WoENupyv+O/oGm831sslno/RU6OsvsHu3+3yQH/AOyW6SvqnweCAAAAAElFTkSuQmCC': 0,
9 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAcCAYAAACOGPReAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAD0SURBVEhLY5RVUPvPQGXABKUJAA2GvzP3Mry6f5PhzfI4qBhuQNjQqD6Gzxc3Mjxzk2H4CRUiBHAYKs3wP7Gd4evhSwzPWr0ZPvBBhYkEqIaaBzL8nrmS4f3FfQzP6oIY3smwM/yFSpECkAyNY/g2q4PhhZsBwxegy/5BRZlfP2HgIdbfUIAnTD8xCGyuZ5AyW8jATqmhzD9fMwjumsUgbWPKwJu3AipKGkAydC8DZ24sg5SGDQNPei8D01OoMBkAydCnDIyHTkHZlAE8YUo+GDWU+mAEGfq46RCUhQAUGypbZwdlIcBoRFEfjBpKfUADQxkYAKYHOb9g+7HMAAAAAElFTkSuQmCC': 1,
10 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAKCSURBVEhLrZZLaBNRFIb/PDp5SFMxjqVOAjYLNUGUbhI3cdEGwaAgbmopWFIQBEUwFhQVldIqCuqilLoymEVVlCqWuNdVXRk31Y1uTKAQMRI0ycQk453JaWaSJjYPPxjmnJPwcefOuSfROXftlvAfaSAUIIXOITfuR9bBQzQBZfqEEzPgVuPY8uIeuMXPVK2lVnjoCrKzJ5F2mKqSZpi/xGCfCEOfpAKhCkPz+HEpgN9sRVpMoqjcJZMJBSVS0Wfeoz94CkaNVE93wOOqygyZr9i+cBnOwT3YsXe/cvUPDsMxHcPWTOU7MmWbD+m5i5RVUIUKGfQt38DOA0dgufuSauskoYuE0RuchV0jzQ8FIAqUMFShmIB9+jhs559SoQnJKKwLcZgpBVwoTFLIUIXXTsMaqdvhZjz8qBECRYeXog2P3CoJts8UMko2F0UdC90o2ihkcAl1mzoTnnGh0kwyGRhXKWR0IBRQOOZGnjL57RsjFDLaF87MI+1Ru9+ysgSOYpn2hKEovo+71RMjfoJtKkpJhRaFAsozr5C67kOOKvLe2e+cBVfXaZsLhSD+LD3DGluZum8p5RA06tt/C4/exK83D7A2xKNEJT07UfzV0aaHoImQHnFuDGlNv8kja2BkBObF5ieqgdDf8BG3PboAPrBx/tVTN7H9KMTuI+WxVQesIRUHPzWKnndU2ATNCgUUn9TKrB8eY8DbukxGFYZu4+dBVWZZYXPvxC3oKG8VEnqRn1R7rCfBfi/Gahu2VSpC3wRyDiViiOhdDre9snUqwsOCZnqkYHhLYSfIb9n5+psESerq6nvOPMylrLDEa7q3C7L7hrVt0z1Fu9Dor0g3AH8BJlTqZkAngxQAAAAASUVORK5CYII=': 2,
11 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAALaSURBVEhLrZVPSBRRHMe/O+rOuuaUyRoyBlGQfw5lh9xTekg8qIdMKSsQFKRAD0WUROhBCIlSBD1YQsJKQSB1iRa8VRf1Up4UQiNcRVw1nXVdx3V3euP+ZnZmR9EVP/CY3/vx5sPMe+/3nu3suYsKjhGrUCxB5GErNssKERIEyDzlIYOX/MgY+4r0zm5w85ROwCRU2j1Yu+fGhi7ZG072Iau3Bc6BacrE4ejJ6EKgySyzy+yrdptpIKJ8HlbahrHZKFImjnEcIeHU6FuIlfk4U3AJObstH2L9C7hmJKTQKEBg0h7sUE/DJLT5x5FbeRWZ99kcTVFSY9wDR/kN5Pxkn6vBFyPUTjFhEPYjs6YBqYkiE/NIfTeODOqpyEUNFMUwCNmy7bNyJr5M787pfuwxhwfhh+1YhWIxtgWKGXafh6IYSQuVjssIUgxMwdFLIZGc8IEHKxV5iFL3xGg37AnzfnAtu68jUlYFueIa1i4IiFDaOfYa2XcGqRfHKnzlxVzdeepYSZVmkfXyERwfrGWnktQvc7If6T62yrxhVRKwCvX6jTet3KK8C4EiN5Y6hrEw6YV811rLhzwPRSi19dhqqmFCFzvINPzI7rwN51B8ZQ4pNNA4iNW2UgTpVOL835Fb0qz/atL7EEPNyPrm01+MutwIPaUOI3khw9Y5aTggeISu1FN8RCHm5YQX7fQ8qlDk9WpR4eRlinQhW37rDtgXpc1Yz2xrsYtLg4StCHz+iHD1IazVPQgY6hnSLzgGKGbov6y4irHY58W/T13YKS2grIHCGoTfeLHcV4V1w9V6+v0zwz2j78MuSH9uYp2SKhwbnKbvYB5hJjHOmyo7OdIC4ckP6segL5wAb7rR1Jd5dslrzSxLYQeE6/ktXbYVCmJp0YfghpRQKbWPsVVXjs0iEWGBxzalVXhZQtrMFJwj/eCHJigbY2FuFpFI7EJNvvT2wPf3NxRF1QD/AbAv8WdRHzjKAAAAAElFTkSuQmCC': 3,
12 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAbCAYAAACTHcTmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHHSURBVEhLrZW9LwNhHMe/WrT10mrKVE2EROIfUAuTTQxMLISBQSxeIjQSTZRIsYgYhYVRIrWzaCxiMjFVoqjWaatPaR9Pe09bbfT6XHKf5Mn9vne9T+55fs/1qhxtnRRqWD1DcLILSR5Nfg+aR495ktHxoyBDiA8WhOVQJaXeKUgtPCggLrXPs6dsxzePSghLU9sjiBh4qICYtG8fUo8Z6UxNXlEvZc+WRUDaC+LpR5SnhssLGHldjopS6l1BpFWuda9XsEwH5KCAstS5iU/WHHkLSbAerAmtl8JvupH0DOCDN8d4e4q6wyc5VKCslHrdCHdwI7mHZXZHrgX4X9r3d9oElvMN1Io9ZJZ/pL1IeIbz06598KFx8UYOgpRI7fg52UWIdzszbev4Mqp4FKVYOrGJSG6Ts27btmZUTTtHQcrWUVpy4otHk39PuNulyFL7GOJ7hXWsCfhgK/mPVAOTstfwaAEhMz9DHmF1zalexyIcbj81UUqh0TBdr9OS7muDDoRAz4ZBxajmN2dggqJrepKE+g8fWFPvXPkeaPDhE0MzaeIrhpfnAGJRSTvp+1sQJBFHOBTUTppOp7LHzM7STGpusvEK+AUL4d3X/AgqvQAAAABJRU5ErkJggg==': 4,
13 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAcCAYAAACOGPReAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAIxSURBVEhLrZU/aBNRHMe/bWKexnoiaSg0FSSCaAfFwT+L7dKloUs7OqRVcHBwcZOCiCAOhk4dxAwdHFRwEEoRSjvoZNqhdDE4tC7aIYmWvOiV1941vnf51dy7S0ou6Qfu+P5+B9/7/e7e+72us+cuVHHE+EzF0jcUzlPQCjyH/itphChUdKub+bcCXv4tVQr7hsp0hmNqWXsob5ek6kWVqUxneNpPw1yfxi+nWo7Y02uIzjkPAuFUWucSrKNqvzEcoUWSAdFNbyewSxJK/SQZEN1U+0kCXaSCopvGGfZJgsv2SQbFY2rI+jqn+Y/ipbYr1dap/WYVWzfra0q98f/nkDDBcWwjj+j7WbC5Fcr6aV6pxG2oEMzAn8EbKDx+ja31jxBytTRCM7WNepVhIWRl6qKEB9tIovDsA8w7fuPWR9/QPezenQAfTmKHUg5iE32To4jkKJYc2r7G5ywiU6PoTWUQK7rKZ0lU7o9TUKN10wPyWUQfLOA0hQrz6jhs0orgporcI0TXXNUacVgkFe2ZSsI/iqT8tG162DBv23RvYICURG4K3xkVmKEZmIOkJWqXhUkrgpsm0tjJjKBCoRqRp+afkK7hMr2I6tgt0g1IXIf94h22l6dRkiPygMjXtzj5kgLCtaOeg3+fQNnR/u1pMaatRUVkYwHxyYfo9pwQTdpncnjol24o0PMpg74Rv6HCZbqC41/y6OG1QeKdpSGZO1HcRGz+FRKpyzgzlaUnXoB/3J2gmVZucHAAAAAASUVORK5CYII=': 5,
14 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAdCAYAAABFRCf7AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAANLSURBVEhLrZZNSFRRFMf/48e8UZtRktFkRsiEdCIKVwaikrlJbZG0MEGDwEWUIPaBQoiIZIJGG4mikoyyIBJKW4gbs4W66WOhtlAXzixq/HzGjG/8eN0378yb+5w3qdAPLnPOmXf/nHfvOfc+U+bR4zL+M/sTrW6F71Ih/CfskAQB2xQ2SyLMU5OwPr+HuEEPRfcSddXB96QeK04BOxQyZg7pWedhJi+GfiOp7sHqwC0s7RKMkyQIwaGfzGdmLFrUAbGlFOsC+ZBwaLwfjqoSZOSeQlpw5MBR1oQjw3NIoKdCGLz+Rfgn72PRTq7khr2tFpbX4TWLwJULTM+QY5Cp/PgGlkOCEJHauYegAieosEuUbUyxU1tDy9c3SOzdQ9AAvWh7ObeOblg7u8k+GJyoA4E8FzbJi5mdhGWCnAPCiVZhM5tMRuLsAFkHJyxakcu6hWy2QcL4pGpW3IR/6AsWZ35iYV4dnvkfWBp7C/+dMvWZ3SglFRzPpuR4WZYRHAtyWsFZ2fFhVha0mPEQFkbljALSoBHO1G7V1hMIQG54Cu+FY6zsVcyhTiI/hOQswq9PfdhyUIChiW7bbWQpOLDOBANMMknppLIcpIc6KasEzrYhJIv0KGPHlo/VrlrydBvFI2CDNXfyu+s4fLkVMdMUDuKBqbcRtvr3SA69BsN/phIByjaKKPvDPQLr7THyDPjcDOuwmxNwYaNBtaKKWse7YSI7GqbO70giWyHgVJdAE431covESipuah/t6fkGMzdNsruCv+FMveuIJzMavpMlEItryIskdGaERYc9XLnYsO0kk2Mr1YG1c3XkRZLgVXc0LDoxAYF7lY28yMm20ZfIbCkij5GfD4mrxFhRPQK5jepjR52XbEW0XCuRaOxcO40/ZLP1g+Wj2tqcKHMesZuRbKVEVl506O4eHRU9WCvWTnPEz47BMqjaOlFMNLJSErVgILsSiyMPsJ3Pp5yLnfY+LHeVclm6kdLWrJWgwR1VCGmkB7+z9V2u9H5wErv3uUZiiEh5xZK5G24UfaZBxiBcaUL6lIhYiigEFLFdgjHsUkztrNEJKvz7Y6K6A76rhfA5lS+TUB1KrHQ8SBztR8LDPpgMemR/nz0HAvgL80YzEyuMQpQAAAAASUVORK5CYII=': 6,
15 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHhSURBVEhLrZY9LANhGMf/PprDVQkxyFXSVCKIwYStiZoqhoqEhTCQWCwiBBEDiUTMBpOJhKQDkw1L1YDFxoSlBi2tlurrrn2uH9xX2/sll/6f4X557n3e903LWhxtDCZSTr/mIXXY4thgjSHGwEp76o7amOkdmih8BHcMlDAULz4DW3htSlf8+RIaJn3Fd8i2ZxAiGeK3sK34UrE4oTCP6JAT31TWneyg8jmdixKyNQ/eOCqCF7AuBKgoRigs48NlR5LK+rP1PEnBwuRmfnf8Kn0rUZhQWEfEJU/if3cSBQmTmwN4o6zUnYRxobh2kb5sd7X+PcWXDQvZohthee3EfWedy042F4PCCXzmTLbGf4hKyn8xJtwYRthGGU/gd9OnQgkDwh7EXB2ZU2G5v0TVFRUK6At7xxCzUxbhb/YoKaMrTM724J2yNIxqha2Si47Qi1hndqtw9wHFYUS7+hF2jaeytnDKi2jGFwfv36GcT6JRQMg9ncqaF+zPwTVe+mi84uc2t4+qbhcZjQ49+GrN7BVYHu50ZRLqwt5BxLLLh6qHfUraqAtHnIhSFG8CcGfa05VRFSZahcxRQ/wZllPKOqgIPfi2yzeBSPAVFRT1UBF2I5GzflzwEWWU9TD5zxLwC1sVsHrJiVs0AAAAAElFTkSuQmCC': 7,
16 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAANtSURBVEhLrZXfS1NhGMe/rumZbR4nOcO2IA1CvQi8UW8y8EJqZCR1IQiKwvRCuiqTfomtkkrqIpN+EFSGNaFECL0IbzQvnH/A6EavNiinJVubO/5a73nPs51zNqf04wPjfJ8X9uV5n/d93ifr8JFjcfxHMhueuYS1dieiFTZIgoAtvihBCAVhnptErvshDAG+qGMHwzJsvh7Cj5MO9vfMGCQ/Ckb6sP/2F1pRMNCXsGPz/Vt8TzEzSiwz/qMFxrbgwEr7I0Tb7LSioDe8OYSVGhHbFOYEZ1DcVIfisuMo4r86ONxTyEsai1jpGcK6xlNj6MRaQznWKTL4p1BU5YLRqy1UAFmvumDtGEN+wlQoR7SnigKd4Qls2EiyDVs/dSGLojRmrsIyF6QAiFQ0ktIaslokspMzMT4gmQFDMEyK1ZO+MqqhL4x9JFn1EK8m+Yeohl4vu2Ok4UCsWa1LOmw3FaWkAbNfvTqaGg4jd86fXAjX34JUS0EK8YGX+FlBARZhfjpJWmfIbnlnHwoX6PiEUiy9mEVkwIV4ubKEWheksVksXSilekvI/9APwcsDTnqn2JsQ81zDikPQFTsdCXmf+2Ht9FCsoMuQE/DAdHkQBeqt2BHz9CDy3XozmZQM7dh+Pozlen3rGViUzRa22COxSWsycj8fcLfA9E69/JoM5T4exTeNWe7CBA6x1rOXKK1XXCK33gSsdBvkfg7eHdX1s5phG8ustxprPJCL3QWxW/+SJLE7Ib25h6WjghKHvCh2tsDIEqUMqxBrT5ixa+3zZDaTCUxCaPXAmtiKWI1f1M+KYXUr1hxcMSRYpvtJ70KgH7k+tdLhGhe/FYphvV1zCHv3cQLjguYlsjn4gSmGooANLv4N+TAUw2AIVF5GIbbaSO7BlqOQFEMK8cdFMRxZhIkLGRGRBhfp3XAhVimSZkbBgMYw8AQmH1ecWGVH2qzQEo3kYfVUGKvqtpA35+EPsmLIDiLn/hQsSsBgs6J3HKHHLYin+p5n47XtLMLP3MleN7DZY+me51rXevE741huLkeM4gQ5bOIp40BgM5qLJAZpEYUdpyHMUKx8FLJunIPtutpaCdZZD8vDPtXM5J/BwUbVTGaHQS9Thu0rF9kUrELEJmKDGSW2J7DTzPbNwzIyiOyPX2lVJYPh3wL8BvLZG6cpuRANAAAAAElFTkSuQmCC': 8,
17 | 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAMzSURBVEhLpZZPSBRhGMYfV9dpdV3UHDVXIw1KDUwJVy/VLTAVWugQRJqUpxAkFyuMIBMPWRGYiCGGC7J0KCRKL13Si9pBvKiH9NIYoavgqKvjujt9M/OuM+uustUPvpn3edl9eL/3+7Mbl3fqjIxoFDnhb76Bzcoi7No47FI6QRJxbHYKKQOdSPi8RFmdKIZ2BDt6sHazCNuUiY4E67cXSLvtJq1hojdhx57nPX4fMDOxL3OSMiihwmHzchu8njrSGmGGclc/Vit5BEibxEXw7bdgzy9BZqEyziLP5UH6Cn2AsV3ZBF+DnVTYlBuxNe/CGqcpSHPIdl6DeY60EXsdfCNtWLVp0rQyhhOORrU6vcKOamyEzNgUU4fuRTdTWHIj6fUkLCSDfCl2GrR433CvuAB+ipXqLM8iVzCMd29gFSiGDb4rWi/J0IE9fr88QFhEAoWHMwWzIFLMeplbAaV3ZFiIIPXjb4gXvBQx+Ax1MfUeGuEM1cYKZzMauhFv2Arg2X6k8CgCuRkUKaQgWGOo0CwYHLlS+LocJA7B3oKdMmOfOMi8wdDUy84nxQrrtU8h1egbNpyLkAbr9T1rQO/h5EtYJ0Q9wRVguXsYG30tCFwq1HJ2B4KtPdiY6cfyac3NrD4VJMQpk1ROij7uyJk/dmTIcgxjXT7+aUK27OsFOZN56BWqjIOrf4isWRHxlImOiLSh+0iaJqnCKmTPA4aMpREkVpcjx/UWGdOLSBZDNw0booC0iY/IuVoO6+NxoJjXbyVRK+LwCzYGAp7v+FWprbR5dhDZ1Z1RKowZB/y5+rbhhK/qO2bD/FMncb7kHClGRT07vxRDgGVgSo1iNrTZUnChrIQUm26zA5sUm4QZcJNa/G89bHDD+6SCFkRCem8Vkp9r1114hfbDToaBmlcQH4TMgMSFL0giM4Vww2Z2AqaGsd3qpIQB5We1bxTe7mqsh46ctIjU9kfq/gsRPuWuUfy8XkCCrRzbexTBz0yCpBRMzCzDdRfcgd/mIxdFYveiNsLNOGEMWc6qCDOFA4vCbu7WJmzXOrDF21SjEBz7x2Bm/xisQ90wf5inbCT/dVIiAf4ApbEnkB6qHqsAAAAASUVORK5CYII=': 9
18 | }
19 |
20 |
21 |
22 | def strToBase64(s):
23 | strEncode = base64.b64encode(s.encode('utf8'))
24 | return str(strEncode, encoding='utf8')
25 |
26 |
27 | def md5(str):
28 | m = hashlib.md5()
29 | m.update(str.encode("utf8"))
30 | return m.hexdigest()
31 |
32 |
33 | # 获取登录ck
34 | def get_login_cookie(username, password):
35 | login_url = 'https://match.yuanrenxue.cn/api/login'
36 | data = {
37 | 'username': username,
38 | 'password': password
39 | }
40 | response = requests.post(login_url, data=data)
41 | print(response.json()['message'])
42 | return requests.utils.dict_from_cookiejar(response.cookies)
43 |
44 |
45 |
46 | def get_page_count(page,cookie=''):
47 | url = 'https://match.yuanrenxue.cn/api/match/4'
48 | data = {
49 | 'page' : page
50 | }
51 | response = requests.get(url, params=data, cookies=cookie).json()
52 | key = response['key']
53 | value = response['value']
54 | info = response["info"].replace('\\', '')
55 | html = etree.HTML(info)
56 | tds = html.xpath('//td')
57 | # 获取隐藏的图片id
58 | classId = md5(strToBase64(key + value).replace('=', ''))
59 | count =0
60 | for td in tds:
61 | num_dict_list = []
62 | numSrcList = td.xpath("./img[not(contains(@class, '{}'))]/@src".format(classId))
63 | numStyleList = td.xpath("./img[not(contains(@class, '{}'))]/@style".format(classId))
64 | for index, item in enumerate(numStyleList):
65 | temp = {}
66 | position = float(item.replace('left:', '').replace('px', ''))
67 | temp[srcToNumList[numSrcList[index]]] = position
68 | num_dict_list.append(temp) # 记录数据直及偏移量
69 |
70 | # 进行位移
71 | num_list = ['', '', '', '']
72 | for index, val in enumerate(num_dict_list):
73 | tem = list(val.values())[0]
74 | key = int(index + tem / 11.5)
75 | num_list[key] = str(list(val.keys())[0])
76 | count += int(''.join(num_list))
77 | return count
78 |
79 |
80 | if __name__ == '__main__':
81 | username = ''
82 | password = ''
83 | cookies = get_login_cookie(username, password)
84 | count = 0
85 | for i in range(1, 6):
86 | result = get_page_count(i, cookies)
87 | count += result
88 | print('count:', count)
89 |
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/15/main.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yingchujun/CrackJs/a4d9bc93079941ae6a87d7d113eca456b7b2210b/12_猿人学系列(第一期)/15/main.wasm
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/15/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import pywasm
3 | import os
4 | import time
5 | import random
6 | import math
7 |
8 |
9 | curFilePath = os.path.dirname(os.path.abspath(__file__))
10 | def get_data(page,m,cookies):
11 |
12 | url = "https://match.yuanrenxue.cn/api/match/15"
13 | params = {
14 | "m": m,
15 | "page": str(page)
16 | }
17 | response = requests.get(url, cookies=cookies, params=params)
18 | return response.json()['data']
19 |
20 | # 获取登录ck
21 | def get_login_cookie(username, password):
22 | login_url = 'https://match.yuanrenxue.cn/api/login'
23 | data = {
24 | 'username': username,
25 | 'password': password
26 | }
27 | response = requests.post(login_url, data=data)
28 | print(response.json()['message'])
29 | return requests.utils.dict_from_cookiejar(response.cookies)
30 |
31 |
32 | def get_m():
33 | t1 = int(time.time()/2)
34 | t2 = int(time.time()/2) - math.floor(random.random() * 50 + 1)
35 |
36 | curFilePath = os.path.dirname(os.path.abspath(__file__))
37 | runtime = pywasm.load(os.path.join(curFilePath, 'main.wasm'))
38 | result = runtime.exec('encode', [t1,t2])
39 | return str(result) + '|' + str(t1) + "|" + str(t2)
40 |
41 | if __name__ == '__main__':
42 | username = ''
43 | password = ''
44 | cookies = get_login_cookie(username, password)
45 | count = 0
46 | for i in range(1, 6):
47 | m = get_m()
48 | datas = get_data(i, m, cookies)
49 | for data in datas:
50 | count += data['value']
51 | print(count)
52 |
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/16/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import os
3 | import execjs
4 |
5 | curFilePath = os.path.dirname(os.path.abspath(__file__))
6 | def get_data(page, m, t, cookies):
7 |
8 | url = "https://match.yuanrenxue.cn/api/match/16"
9 | params = {
10 | "page": str(page),
11 | "m": m,
12 | "t": t
13 | }
14 | response = requests.get(url, cookies=cookies, params=params)
15 | return response.json()['data']
16 |
17 | # 获取登录ck
18 | def get_login_cookie(username, password):
19 | login_url = 'https://match.yuanrenxue.cn/api/login'
20 | data = {
21 | 'username': username,
22 | 'password': password
23 | }
24 | response = requests.post(login_url, data=data)
25 | print(response.json()['message'])
26 | return requests.utils.dict_from_cookiejar(response.cookies)
27 |
28 |
29 | def get_m():
30 | with open(os.path.join(curFilePath, 'text.js'), mode='r', encoding='utf-8') as f:
31 | jsCode = f.read()
32 | ctx = execjs.compile(jsCode)
33 | result = ctx.call('m')
34 | return result
35 |
36 | if __name__ == '__main__':
37 | username = ''
38 | password = ''
39 | cookies = get_login_cookie(username, password)
40 | count = 0
41 | print()
42 | for i in range(1, 6):
43 | result = get_m()
44 | m = result['m']
45 | t = result['t']
46 | datas = get_data(i, m, t, cookies)
47 | for data in datas:
48 | count += data['value']
49 | print(count)
50 |
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/17/代理fiddler.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import os
3 |
4 |
5 | proxy = {'http': 'http://localhost:8888', 'https':'http://localhost:8888'}
6 | def get_data(page, cookies):
7 |
8 |
9 | headers = {
10 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
11 | }
12 | cookies = {
13 | "sessionid": "bhl4635lwnsywjxq1akwm98f5olihlpx",
14 | }
15 | url = "https://match.yuanrenxue.cn/api/match/19"
16 | params = {
17 | "page": "{}".format(page)
18 | }
19 | response = requests.get(url, headers=headers, cookies=cookies, params=params, proxies=proxy, verify=False)
20 |
21 | return response.json()['data']
22 |
23 | # 获取登录ck
24 | def get_login_cookie(username, password):
25 | login_url = 'https://match.yuanrenxue.cn/api/login'
26 | data = {
27 | 'username': username,
28 | 'password': password
29 | }
30 | response = requests.post(login_url, data=data, proxies=proxy, verify=False)
31 | print(response.json()['message'])
32 | return requests.utils.dict_from_cookiejar(response.cookies)
33 |
34 |
35 | if __name__ == '__main__':
36 | username = ''
37 | password = ''
38 | cookies = get_login_cookie(username, password)
39 | count = 0
40 | for i in range(1, 6):
41 | datas = get_data(i, cookies)
42 | for data in datas:
43 | count += data['value']
44 | print(count)
--------------------------------------------------------------------------------
/12_猿人学系列(第一期)/17/库curl_cffi.py:
--------------------------------------------------------------------------------
1 | from requests import utils
2 | from curl_cffi import requests
3 |
4 |
5 | def get_data(page, cookies):
6 |
7 | headers = {
8 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
9 | }
10 | cookies = {
11 | "sessionid": "bhl4635lwnsywjxq1akwm98f5olihlpx",
12 | }
13 | url = "https://match.yuanrenxue.cn/api/match/19"
14 | params = {
15 | "page": "{}".format(page)
16 | }
17 | response = requests.get(url, headers=headers, cookies=cookies, params=params, impersonate="chrome110")
18 | return response.json()['data']
19 |
20 | # 获取登录ck
21 | def get_login_cookie(username, password):
22 | login_url = 'https://match.yuanrenxue.cn/api/login'
23 | data = {
24 | 'username': username,
25 | 'password': password
26 | }
27 | response = requests.post(login_url, data=data)
28 | print(response.json()['message'])
29 | return utils.dict_from_cookiejar(response.cookies)
30 |
31 |
32 | if __name__ == '__main__':
33 | username = ''
34 | password = ''
35 | cookies = get_login_cookie(username, password)
36 | count = 0
37 | for i in range(1, 6):
38 | datas = get_data(i, cookies)
39 | for data in datas:
40 | count += data['value']
41 | print(count)
--------------------------------------------------------------------------------
/13_临安人才网/enc.js:
--------------------------------------------------------------------------------
1 | function arg2(arg1) {
2 |
3 | // 固定
4 | var _0x5e8b26 = "3000176000856006061501533003690027800375";
5 |
6 |
7 | function hexXor(_0x4e08d8) {
8 | var _0x5a5d3b = "";
9 |
10 | for (var _0xe89588 = 0; _0xe89588 < this["length"] && _0xe89588 < _0x4e08d8["length"]; _0xe89588 += 2) {
11 | var _0x401af1 = parseInt(this["slice"](_0xe89588, _0xe89588 + 2), 16);
12 |
13 | var _0x105f59 = parseInt(_0x4e08d8["slice"](_0xe89588, _0xe89588 + 2), 16);
14 |
15 | var _0x189e2c = (_0x401af1 ^ _0x105f59)["toString"](16);
16 |
17 | if (_0x189e2c["length"] == 1) {
18 | _0x189e2c = "0" + _0x189e2c;
19 | }
20 |
21 | _0x5a5d3b += _0x189e2c;
22 | }
23 |
24 | return _0x5a5d3b;
25 | };
26 |
27 |
28 | function unsbox() {
29 | var _0x4b082b = [15, 35, 29, 24, 33, 16, 1, 38, 10, 9, 19, 31, 40, 27, 22, 23, 25, 13, 6, 11, 39, 18, 20, 8, 14, 21, 32, 26, 2, 30, 7, 4, 17, 5, 3, 28, 34, 37, 12, 36];
30 | var _0x4da0dc = [];
31 | var _0x12605e = "";
32 |
33 | for (var _0x20a7bf = 0; _0x20a7bf < this["length"]; _0x20a7bf++) {
34 | var _0x385ee3 = this[_0x20a7bf];
35 |
36 | for (var _0x217721 = 0; _0x217721 < _0x4b082b["length"]; _0x217721++) {
37 | if (_0x4b082b[_0x217721] == _0x20a7bf + 1) {
38 | _0x4da0dc[_0x217721] = _0x385ee3;
39 | }
40 | }
41 | }
42 |
43 | _0x12605e = _0x4da0dc["join"]("");
44 | return _0x12605e;
45 | };
46 |
47 | // 改写
48 | var _0x23a392 = unsbox.call(arg1);
49 | var arg2 = hexXor.call(_0x23a392, _0x5e8b26)
50 |
51 | return arg2
52 |
53 | }
54 |
55 |
56 | // // 测试
57 | // var arg1 = "64AD570103FA66582446A34E443C9FFC32561158";
58 | // console.log(arg2(arg1))
--------------------------------------------------------------------------------
/13_临安人才网/test.py:
--------------------------------------------------------------------------------
1 | import os
2 | import re
3 | import execjs
4 | import requests
5 | from lxml import etree
6 |
7 | url = "https://www.lazpw.cn/job"
8 | params = {
9 | "keyword_type": "1",
10 | "page": "1"
11 | }
12 |
13 | def first_req_get_arg2() :
14 |
15 | response = requests.get(url, params=params)
16 | arg1 = re.findall("var arg1='(.*?)';", response.text)[0]
17 |
18 | cur_path = os.path.dirname(__file__)
19 | with open(os.path.join(cur_path, 'enc.js'), mode='r', encoding='utf-8') as f:
20 | js_code = f.read()
21 | ctx = execjs.compile(js_code)
22 | arg2 = ctx.call('arg2', str(arg1))
23 | return arg2
24 |
25 |
26 | def second_req_get_data():
27 | cookie = {
28 | 'acw_sc__v2': first_req_get_arg2()
29 | }
30 | response = requests.get(url, cookies=cookie, params=params)
31 | html = etree.HTML(response.text)
32 | divs = html.xpath("//div[@class='saith']")
33 | for div in divs:
34 | title = div.xpath(".//li[@class='list1']/a/text()")[0]
35 | salary = div.xpath(".//li[@class='list2']/text()")[0]
36 | company_name = div.xpath(".//li[@class='list4']/a/text()")[0]
37 | print([title, salary, company_name])
38 |
39 |
40 | if __name__ == '__main__':
41 | second_req_get_data()
42 |
--------------------------------------------------------------------------------
/14_gov/enc.js:
--------------------------------------------------------------------------------
1 | window = {
2 | navigator: {
3 | webdriver: false,
4 | appCodeName: "Mozilla",
5 | appName: "Netscape",
6 | appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
7 | userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"
8 | }
9 | };
10 | document = {};
11 | location = {}
12 |
13 | setTimeout = function(func, time) {
14 | func()
15 | }
16 |
17 |
18 |
19 | function jsl_clearance_s(code) {
20 | eval(code)
21 | return document.cookie
22 | }
--------------------------------------------------------------------------------
/14_gov/test.py:
--------------------------------------------------------------------------------
1 | import os
2 | import re
3 | import execjs
4 | import requests
5 | from lxml import etree
6 | from requests.utils import dict_from_cookiejar
7 |
8 |
9 | url = 'https://www.mps.gov.cn/n2254098/n4904352/index_3497341_74.html'
10 | headers = {
11 | "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
12 | "Referer": "https://www.mps.gov.cn/n2254098/n4904352/index_3497341_74.html",
13 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
14 | }
15 | cur_path = os.path.dirname(__file__)
16 |
17 | def first_req():
18 | response = requests.get(url, headers=headers)
19 | cookies = dict_from_cookiejar(response.cookies)
20 | cookies['__jsl_clearance_s'] = execjs.eval(re.findall('\(.*\)', response.text)[0]).split(';')[0].split('=')[1]
21 | return cookies
22 |
23 |
24 | def second_req():
25 | cookies = first_req()
26 | response = requests.get(url, cookies=cookies, headers=headers)
27 | html = etree.HTML(response.text)
28 | enc_code = html.xpath('//script/text()')[0]
29 |
30 | with open(os.path.join(cur_path, 'enc.js'), mode='r', encoding='utf-8') as f:
31 | js_code = f.read()
32 |
33 | ctx = execjs.compile(js_code)
34 | __jsl_clearance_s = ctx.call('jsl_clearance_s', enc_code)
35 | cookies['__jsl_clearance_s'] = __jsl_clearance_s.split(';')[0].split('=')[1]
36 | return cookies
37 |
38 |
39 | def third_req():
40 | cookies = second_req()
41 | response = requests.get(url, cookies=cookies, headers=headers)
42 | response.encoding = response.apparent_encoding
43 | html = etree.HTML(response.text)
44 | dds = html.xpath('//dd/a/text()')
45 | for dd in dds:
46 | print(dd)
47 |
48 | third_req()
49 |
--------------------------------------------------------------------------------
/15_Bilibili/test.py:
--------------------------------------------------------------------------------
1 | import os
2 | import time
3 | import execjs
4 | import requests
5 |
6 |
7 |
8 |
9 | def get_enc_params():
10 |
11 | time_now = int(time.time() * 1000)
12 | headers = {
13 | "origin": "https://space.bilibili.com",
14 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"
15 | }
16 | url = "https://passport.bilibili.com/x/passport-login/web/key"
17 | params = {
18 | "_": str(time_now)
19 | }
20 | response = requests.get(url, headers=headers, params=params)
21 | return response.json()["data"]
22 |
23 | def get_enc_pwd(pwd):
24 |
25 | enc_params = get_enc_params()
26 | key = enc_params['key']
27 | hash = enc_params['hash']
28 | cur_path = os.path.dirname(__file__)
29 |
30 | with open(os.path.join(cur_path, 'password.js'), mode='r', encoding='utf-8') as f:
31 | js_code = f.read()
32 |
33 | ctx = execjs.compile(js_code)
34 | result = ctx.call('password', key, hash, pwd)
35 | print(result)
36 | return result
37 |
38 | get_enc_pwd('123456')
39 |
--------------------------------------------------------------------------------
/16_去哪儿旅行/slideToken.js:
--------------------------------------------------------------------------------
1 | const cryptoJS = require('crypto-js')
2 |
3 |
4 | // 轨迹
5 | var openTime = Date.now()
6 | var track = []
7 | var preX = Math.round(Math.random()*30 + 430)
8 | var preY = Math.round(Math.random()*10 + 500)
9 | var preA = Math.round(Math.random()*440)
10 |
11 | for ( let i = 0; i < Math.round(Math.random()*3 + 2) ; i++) {
12 | var t = Date.now() % 1e5
13 | var f = "".concat(t, ";").concat(preX.toFixed(2), ";").concat(preY.toFixed(2), ";").concat(preA.toFixed(2));
14 | track.push(f)
15 |
16 | var newB = Math.round(Math.random()*60)
17 | while (preA + newB > 850) {
18 | newB = Math.round(Math.random()*60)
19 | }
20 | preX +=
21 | preY = Math.round(Math.random()*10 + 500)
22 | var newA = Math.round(Math.random()*60)
23 | while (preA + newA > 440) {
24 | newA = Math.round(Math.random()*60)
25 | }
26 | preA += newA
27 | }
28 |
29 | track.push("".concat(Date.now() % 1e5, ";").concat(Math.round(Math.random()*30 + 850).toFixed(2), ";").concat(Math.round(Math.random()*10 + 500).toFixed(2), ";").concat(Math.round(Math.random()*10 + 440).toFixed(2)))
30 |
31 | // 滑块轨迹信息
32 | var sliderInfo = {
33 | "openTime": openTime ,
34 | "startTime": openTime + Math.round(Math.random()*1000 + 500),
35 | "endTime": openTime + Math.round(Math.random()*1000 + 1500),
36 | "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0",
37 | "uid": "0000f000306c5b987b60a047", // 固定
38 | "track": track,
39 | "acc": [],
40 | "ori": [],
41 | "deviceMotion": [
42 | {
43 | "isTrusted": true
44 | },
45 | {
46 | "isTrusted": true
47 | },
48 | {
49 | "isTrusted": true
50 | },
51 | {
52 | "isTrusted": true
53 | },
54 | {
55 | "isTrusted": true
56 | },
57 | {
58 | "isTrusted": true
59 | },
60 | {
61 | "isTrusted": true
62 | },
63 | {
64 | "isTrusted": true
65 | },
66 | {
67 | "isTrusted": true
68 | },
69 | {
70 | "isTrusted": true
71 | },
72 | {
73 | "isTrusted": true
74 | },
75 | {
76 | "isTrusted": true
77 | }
78 | ] // 不检测
79 | }
80 |
81 | var e = JSON.stringify(sliderInfo);
82 | var result = cryptoJS.AES.encrypt(cryptoJS.enc.Utf8.parse(e), cryptoJS.enc.Utf8.parse("227V2xYeHTARSh1R"), {
83 | mode: cryptoJS.mode.ECB,
84 | padding: cryptoJS.pad.Pkcs7
85 | }).toString()
86 |
87 |
88 |
89 | function slider(){
90 | return result
91 | }
--------------------------------------------------------------------------------
/16_去哪儿旅行/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import json
3 | import execjs
4 | import os
5 |
6 |
7 | def cst():
8 | with open(os.path.join(os.path.dirname(__file__), 'slideToken.js'), mode='r', encoding='utf-8') as f:
9 | js_code = f.read()
10 |
11 | ctx = execjs.compile(js_code)
12 | res = ctx.call('slider')
13 |
14 | headers = {
15 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
16 | }
17 | url = "https://vercode.qunar.com/inner/captcha/snapshot"
18 | data = {
19 | "data": res,
20 | "orca": 2,
21 | "appCode": "register_pc",
22 | "cs": "pc"
23 | }
24 | data = json.dumps(data, separators=(',', ':'))
25 | cst = requests.post(url, headers=headers, data=data).json()['data']['cst']
26 | return cst
27 |
28 |
29 | def login(username , password ,cst):
30 | url = "https://user.qunar.com/weblogin/password"
31 | headers = {
32 | "content-type": "application/json;charset=UTF-8",
33 | "origin": "https://user.qunar.com",
34 | "referer": "https://user.qunar.com/passport/login.jsp?ret=https%3A%2F%2Fwww.qunar.com%2F",
35 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
36 | }
37 | data = {
38 | "piccoloT": "login_register_pc",
39 | "username": username,
40 | "password": password,
41 | "prenum": "86",
42 | "type": "3",
43 | "source": "",
44 | "remember": True,
45 | "slideToken": cst,
46 | "appcode": "register_pc",
47 | "loginSource": 1,
48 | "captchaType": "",
49 | "usersource": "",
50 | "ret": "https://www.qunar.com/",
51 | "ref": "",
52 | "business": "",
53 | "pid": "",
54 | "originChannel": "",
55 | "activityCode": ""
56 | }
57 |
58 |
59 |
60 | data = json.dumps(data, separators=(',', ':'))
61 | response = requests.post(url, headers=headers, data=data)
62 | print(response.cookies)
63 |
64 |
65 | # test
66 | if __name__ == '__main__':
67 | username = ''
68 | password = ''
69 | cst = cst()
70 | login(username, password, cst)
--------------------------------------------------------------------------------
/17_豆瓣/test.py:
--------------------------------------------------------------------------------
1 | from io import BytesIO
2 | from PIL import Image
3 | import requests
4 | import base64
5 | import json
6 | import cv2
7 | import re
8 |
9 | # 判断缺口位置 返回缺口的X坐标
10 | def identify_gap(bg,tp,out):
11 | '''
12 | bg: 背景图片
13 | tp: 缺口图片
14 | out:输出图片
15 | '''
16 | # 读取背景图片和缺口图片
17 | bg_img = cv2.imread(bg) # 背景图片
18 | tp_img = cv2.imread(tp) # 缺口图片
19 |
20 | # 识别图片边缘
21 | bg_edge = cv2.Canny(bg_img, 100, 200)
22 | tp_edge = cv2.Canny(tp_img, 100, 200)
23 |
24 | # 转换图片格式
25 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
26 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
27 |
28 | # 缺口匹配
29 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
30 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
31 |
32 | # 绘制方框
33 | th, tw = tp_pic.shape[:2]
34 | tl = max_loc # 左上角点的坐标
35 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
36 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
37 | cv2.imwrite(out, bg_img) # 保存在本地
38 |
39 | # 返回缺口的X坐标
40 | return tl[0]
41 |
42 | # 将滑块从精灵图中裁剪下来
43 | def crop_sprite_to_slide(sprite):
44 | image = Image.open(BytesIO(sprite))
45 | image = image.resize((282, 256))
46 | cropped = image.crop((58, 203, 58+49, 203+49))
47 | cropped.save("slide.png")
48 |
49 | # 调整底图大小并保存
50 | def resize_and_save_image(path ,content):
51 | image = Image.open(BytesIO(content))
52 | image = image.resize((278, 161))
53 | image.save(path)
54 |
55 |
56 | def get_tc_app_id():
57 |
58 | headers = {
59 | "Referer": "https://accounts.douban.com/passport/login_popup?login_source=anony",
60 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
61 | }
62 | url = "https://accounts.douban.com/j/mobile/login/basic"
63 | data = {
64 | "remember": "true",
65 | "name": "15858585858",
66 | "password": "123456"
67 | }
68 |
69 | response = requests.post(url, headers=headers, data=data)
70 |
71 | return response.json()['payload']['tc_app_id']
72 |
73 | def get_captcha_params(tc_app_id, user_agent):
74 | headers = {
75 | "Referer": "https://accounts.douban.com/",
76 | "User-Agent": user_agent,
77 | }
78 | url = "https://turing.captcha.qcloud.com/cap_union_prehandle"
79 | params = {
80 | "aid": tc_app_id,
81 | "protocol": "https",
82 | "accver": "1",
83 | "showtype": "popup",
84 | "ua": base64.b64encode(user_agent.encode()).decode(),
85 | "noheader": "1",
86 | "fb": "1",
87 | "aged": "0",
88 | "enableAged": "0",
89 | "enableDarkMode": "0",
90 | "grayscale": "1",
91 | "clientype": "2",
92 | "cap_cd": "",
93 | "uid": "",
94 | "lang": "zh-cn",
95 | "entry_url": "https://accounts.douban.com/passport/login_popup",
96 | "elder_captcha": "0",
97 | "js": "/tcaptcha-frame.22125576.js",
98 | "login_appid": "",
99 | "wb": "1",
100 | "subsid": "11",
101 | "sess": ""
102 | }
103 |
104 | response = requests.get(url, headers=headers, params=params)
105 | data = json.loads(re.findall('\((.*?)\)', response.text)[0])
106 | return dict(data)
107 |
108 | def save_captcha_img(url):
109 | headers = {
110 | "Referer": "https://turing.captcha.gtimg.com/",
111 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0",
112 | }
113 | response = requests.get(url, headers=headers)
114 | return response.content
115 |
116 |
117 |
118 | if __name__ == '__main__':
119 | user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
120 | captcha_params = get_captcha_params(get_tc_app_id(), user_agent)
121 | sess = captcha_params['sess']
122 | img_url = 'https://turing.captcha.qcloud.com' + captcha_params['data']['dyn_show_info']['bg_elem_cfg']['img_url']
123 | sprite_url = 'https://turing.captcha.qcloud.com' + captcha_params['data']['dyn_show_info']['sprite_url']
124 | base_map = save_captcha_img(img_url)
125 | resize_and_save_image('base.png', base_map)
126 |
127 | # 获取滑块
128 | sprite_map = save_captcha_img(sprite_url)
129 | crop_sprite_to_slide(sprite_map)
130 | x = identify_gap('base.png', "slide.png", 'out.png')
131 | print(x)
132 |
--------------------------------------------------------------------------------
/18_唯品会/mars_cid.js:
--------------------------------------------------------------------------------
1 |
2 | window = globalThis
3 | window.screen = {
4 | width: 2560,
5 | height: 1080,
6 | colorDepth: 24
7 | }
8 | window.location = {
9 | "ancestorOrigins": {},
10 | "href": "https://category.vip.com/suggest.php",
11 | "origin": "https://category.vip.com",
12 | "protocol": "https:",
13 | "host": "category.vip.com",
14 | "hostname": "category.vip.com",
15 | "port": "",
16 | "pathname": "/suggest.php",
17 | "search": "",
18 | "hash": ""
19 | }
20 | window.document = {
21 | "ancestorOrigins": {},
22 | "href": "https://category.vip.com/suggest.php",
23 | "origin": "https://category.vip.com",
24 | "protocol": "https:",
25 | "host": "category.vip.com",
26 | "hostname": "category.vip.com",
27 | "port": "",
28 | "pathname": "/suggest.php",
29 | "search": "",
30 | "hash": "",
31 | 'compatMode':'CSS1Compat',
32 | 'domain': 'category.vip.com',
33 | 'location' : window.location,
34 | 'documentElement': {
35 | 'clientHeight': 736,
36 | 'clientWidth': 1416
37 | },
38 | 'body': {
39 | width: undefined,
40 | height: undefined
41 | },
42 | 'getElementsByTagName': function getElementsByTagName(name) {
43 | if (name == 'meta') {
44 | return []
45 | }
46 | }
47 | }
48 |
49 |
50 | window.T0 = (new Date).getTime()
51 | window.Mar = function() {}
52 | Mar.stringify = function(a) {
53 | function b(a) {
54 | return '"' + a.replace(e, function(a) {
55 | var b = f[a];
56 | return "string" == typeof b ? b : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
57 | }) + '"'
58 | }
59 | function c(a) {
60 | return a < 10 ? "0" + a : a
61 | }
62 | function d(a, e) {
63 | var f, g, h, i, j = e[a], k = typeof j;
64 | switch (j && "object" == typeof j && "function" == typeof j.toJSON && (j = j.toJSON(a),
65 | k = typeof j),
66 | k) {
67 | case "string":
68 | return b(j);
69 | case "number":
70 | return isFinite(j) ? String(j) : "null";
71 | case "boolean":
72 | return String(j);
73 | case "object":
74 | if (!j)
75 | return "null";
76 | switch (Object.prototype.toString.call(j)) {
77 | case "[object Date]":
78 | return isFinite(j.valueOf()) ? '"' + j.getUTCFullYear() + "-" + c(j.getUTCMonth() + 1) + "-" + c(j.getUTCDate()) + "T" + c(j.getUTCHours()) + ":" + c(j.getUTCMinutes()) + ":" + c(j.getUTCSeconds()) + 'Z"' : "null";
79 | case "[object Array]":
80 | for (h = j.length,
81 | i = [],
82 | f = 0; f < h; f++)
83 | i.push(d(f, j) || "null");
84 | return "[" + i.join(",") + "]";
85 | default:
86 | i = [];
87 | for (f in j)
88 | Object.prototype.hasOwnProperty.call(j, f) && (g = d(f, j),
89 | g && i.push(b(f) + ":" + g));
90 | return "{" + i.join(",") + "}"
91 | }
92 | }
93 | }
94 | if (window.JSON && window.JSON.stringify)
95 | return window.JSON.stringify(a);
96 | var e = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g
97 | , f = {
98 | "\b": "\\b",
99 | "\t": "\\t",
100 | "\n": "\\n",
101 | "\f": "\\f",
102 | "\r": "\\r",
103 | '"': '\\"',
104 | "\\": "\\\\"
105 | };
106 | return d("", {
107 | "": a
108 | })
109 | }
110 | Mar.getUrlParam = function() {
111 | var a, b, c = {}, d = window.location.search.substring(1);
112 | if (d) {
113 | a = d.split("&");
114 | for (var e = 0, f = a.length; e < f; e++)
115 | b = a[e].split("="),
116 | c[b[0]] = b[1]
117 | }
118 | return c
119 | }
120 | Mar.getWapId = function() {
121 | function a(a) {
122 | var b = document.getElementsByTagName("meta");
123 | for (i in b)
124 | if ("undefined" != typeof b[i].name && b[i].name.toLowerCase() == a)
125 | return b[i].content;
126 | return null
127 | }
128 | var b = encodeURIComponent(a("vip-page-default-wapid"));
129 | return "null" != b && b ? encodeURIComponent(b) : ""
130 | }
131 | Mar.getOSVersion = function() {
132 | function a(a, b) {
133 | for (var c in b)
134 | if (b[c] == a)
135 | return c;
136 | return -1
137 | }
138 | var b, c, d, e, f, g = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0', h = {
139 | os: "",
140 | ver: ""
141 | };
142 | return b = g.match(/\(([^)]*)\)/),
143 | c = (b || [])[1] || "",
144 | c && c.match(/iPhone/i) ? (h.os = "IOS",
145 | e = "OS") : (h.os = "Android",
146 | e = "Android"),
147 | d = c.split(" "),
148 | f = a(e, d),
149 | f != -1 && (h.ver = d[++f],
150 | h.ver = h.ver && h.ver.replace(/[_]/g, ".")),
151 | h
152 | }
153 | var a;
154 | Mar.Base = {},
155 | a = Mar.Base,
156 | a.local = document.location,
157 | a.domain = document.domain,
158 | a.docEle = document.documentElement,
159 | a.context = "css1compat" === document.compatMode.toLowerCase() ? document.body : a.docEle,
160 | a.monitor = window.screen,
161 | a.href = a.local.href,
162 | a.url = escape(a.href),
163 | a.wapId = window.Mar.getWapId(),
164 | a.osVersion = window.Mar.getOSVersion(),
165 | a.paramObj = window.Mar.getUrlParam(),
166 | a.pn = a.local.pathname.toLowerCase(),
167 | a.hn = a.local.hostname.toLowerCase(),
168 | a.ref = escape(document.referrer),
169 | a.cw = a.docEle.clientWidth,
170 | a.ch = a.docEle.clientHeight,
171 | a.res = a.monitor.width + "*" + a.monitor.height,
172 | a.col = a.monitor.colorDepth,
173 | a.w = a.context.width,
174 | a.h = a.context.height,
175 | a.nav = escape('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0'.toLowerCase()),
176 | a.ce = navigator.cookieEnabled ? 1 : 0,
177 | a.title = document.domain.indexOf("vipglobal.hk") > -1 ? encodeURIComponent(document.title) : escape(document.title)
178 |
179 | Mar.Random = {
180 | guid: function() {
181 | for (var a = 0, b = []; a < 8; )
182 | b.push((65536 * (1 + Math.random()) | 0).toString(16).substring(1)),
183 | a++;
184 | return b.join("").toUpperCase()
185 | },
186 | guid2: function() {
187 | function a() {
188 | return (65536 * (1 + Math.random()) | 0).toString(16).substring(1)
189 | }
190 | return a() + a() + "-" + a() + "-" + a() + "-" + a() + "-" + a() + a() + a()
191 | },
192 | guid3: function() {
193 | function a(a, c, d) {
194 | var e = b(a, 16)
195 | , f = new Array
196 | , g = ""
197 | , h = 0;
198 | for (h = 0; h < e.length; h++)
199 | f.push(e.substring(h, h + 1));
200 | for (h = Math.floor(c / 4); h <= Math.floor(d / 4); h++)
201 | g += f[h] && "" != f[h] ? f[h] : "0";
202 | return g
203 | }
204 | function b(a, b) {
205 | return a.toString(b)
206 | }
207 | function c(a) {
208 | return Math.floor(Math.random() * (a + 1))
209 | }
210 | var d = new Date(1582,10,15,0,0,0,0)
211 | , e = new Date
212 | , f = e.getTime() - d.getTime()
213 | , g = a(f, 0, 31)
214 | , h = a(f, 32, 47)
215 | , i = a(f, 48, 59) + "1"
216 | , j = a(c(4095), 0, 7)
217 | , k = a(c(4095), 0, 7)
218 | , l = a(c(8191), 0, 7) + a(c(8191), 8, 15) + a(c(8191), 0, 7) + a(c(8191), 8, 15) + a(c(8191), 0, 15);
219 | return g + h + i + j + k + l
220 | },
221 | rand: function(a) {
222 | var b = "0123456789abcdef"
223 | , c = ""
224 | , d = 0;
225 | for (a = a || 32; d < a; d++)
226 | c += b.charAt(Math.ceil(1e8 * Math.random()) % b.length);
227 | return c
228 | }
229 | }
230 | Mar.Util = {
231 | detect: function() {
232 | var a, b, c, d = !1, e = window.navigator.userAgent;
233 | return /MSIE/.test(e) ? (b = "MSIE",
234 | /IEMobile/.test(e) && (d = !0),
235 | c = /MSIE \d+[.]\d+/.exec(e)[0].split(" ")[1]) : navigator.userAgent.match(/Trident.*rv[ :]*11\./) ? (b = "MSIE",
236 | c = 11) : /Chrome/.test(e) ? (b = "Chrome",
237 | c = /Chrome\/[\d\.]+/.exec(e)[0].split("/")[1]) : /Opera/.test(e) ? (b = "Opera",
238 | (/mini/.test(e) || /Mobile/.test(e)) && (d = !0)) : /Android/.test(e) ? (b = "Android Webkit Browser",
239 | d = !0) : /Firefox/.test(e) ? (b = "Firefox",
240 | /Fennec/.test(e) && (d = !0),
241 | c = /Firefox\/[\.\d]+/.exec(e)[0].split("/")[1]) : /Safari/.test(e) && (b = "Safari",
242 | (/iPhone/.test(e) || /iPad/.test(e) || /iPod/.test(e)) && (d = !0)),
243 | c || (c = /Version\/[\.\d]+/.exec(e),
244 | c = c ? c[0].split("/")[1] : void 0),
245 | a = {
246 | browser: b,
247 | version: c,
248 | mobile: d
249 | }
250 | },
251 | isElement: function(a) {
252 | return !(!a || "function" != typeof HTMLElement && "object" != typeof HTMLElement || !(a instanceof HTMLElement)) || !(!a || !a.nodeType || 1 !== a.nodeType)
253 | },
254 | getProtocal: function() {
255 | return document.domain.toLowerCase().indexOf("vip.vip.com") !== -1 ? 0 === document.location.href.toLowerCase().indexOf("https://") ? "https://" : "http://" : "https://"
256 | },
257 | encryptCid: function(a) {
258 | var b = a.split("_")
259 | , c = b[0]
260 | , d = b[1];
261 | if (!c || !d)
262 | return a;
263 | for (var e = 0, f = c.length, g = 0; g < f; g++)
264 | e += parseInt(c[g]);
265 | for (var h = e % 32, i = e, j = d.length, g = 0; g < j; g++)
266 | g !== h && (i += parseInt(d[g], 16));
267 | var k = (i % 16).toString(16);
268 | return c + "_" + d.substr(0, h) + k.toString() + d.substr(h + 1, j)
269 | },
270 | getParameterByName: function(a) {
271 | a = a.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
272 | var b = "[\\?&]" + a + "=([^]*)"
273 | , c = new RegExp(b)
274 | , d = c.exec(window.location.search);
275 | return null == d ? "" : decodeURIComponent(d[1].replace(/\+/g, " "))
276 | },
277 | getConfig: function(a) {
278 | return "MarConfig"in window && window.MarConfig && window.MarConfig[a] ? window.MarConfig[a] : ""
279 | },
280 | pad: function(a, b) {
281 | for (var c = a.toString().length; c < b; )
282 | a = "0" + a,
283 | c++;
284 | return a
285 | },
286 | getDomain: function() {
287 | var a, b = document.domain.toLowerCase();
288 | return a = b.indexOf("vipshop.com") !== -1 ? "vipshop.com" : b.indexOf("appvipshop.com") !== -1 ? "appvipshop.com" : b.indexOf("vipglobal.hk") !== -1 ? "vipglobal.hk" : b.indexOf("vpal.com") !== -1 ? "vpal.com" : b.indexOf("vip.vip.com") !== -1 ? "vip.vip.com" : "vip.com"
289 | },
290 | parseURL: function(a) {
291 | var b = document.createElement("a");
292 | return b.href = a,
293 | {
294 | source: a,
295 | protocol: b.protocol.replace(":", ""),
296 | host: b.hostname,
297 | port: b.port,
298 | query: b.search,
299 | params: function() {
300 | for (var a, c = {}, d = b.search.replace(/^\?/, "").split("&"), e = d.length, f = 0; f < e; f++)
301 | d[f] && (a = d[f].split("="),
302 | c[a[0]] = a[1]);
303 | return c
304 | }(),
305 | file: (b.pathname.match(/\/([^\/?#]+)$/i) || [, ""])[1],
306 | hash: b.hash.replace("#", ""),
307 | path: b.pathname.replace(/^([^\/])/, "/$1"),
308 | relative: (b.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ""])[1],
309 | segments: b.pathname.replace(/^\//, "").split("/")
310 | }
311 | },
312 | getTimeSpan: function() {
313 | return parseInt(Mar.Util.getTimeSpanMillisecond() / 1e3)
314 | },
315 | getTimeSpanMillisecond: function() {
316 | return (new Date).getTime()
317 | },
318 | Debounce: function(a, b, c) {
319 | var d, e, f, g, h, i = Date.now || function() {
320 | return (new Date).getTime()
321 | }
322 | , j = function() {
323 | var k = i() - g;
324 | k < b && k >= 0 ? d = setTimeout(j, b - k) : (d = null,
325 | c || (h = a.apply(f, e),
326 | d || (f = e = null)))
327 | };
328 | return function() {
329 | f = this,
330 | e = arguments,
331 | g = i();
332 | var k = c && !d;
333 | return d || (d = setTimeout(j, b)),
334 | k && (h = a.apply(f, e),
335 | f = e = null),
336 | h
337 | }
338 | },
339 | getQueryStringByName: function(a, b) {
340 | var c = b.match(new RegExp("[?&]" + a + "=([^&^#]+)","i"));
341 | return null == c || c.length < 1 ? "" : c[1]
342 | },
343 | getMetaByName: function(a) {
344 | var b = document.getElementsByTagName("meta");
345 | for (i in b)
346 | if ("undefined" != typeof b[i].name && b[i].name.toLowerCase() == a)
347 | return b[i].content;
348 | return null
349 | },
350 | isDetailPage: function(a) {
351 | var b = !1;
352 | return !a || a.indexOf("shop.vipshop.com/detail") === -1 && a.indexOf("www.vip.com/detail") === -1 && a.indexOf("detail.vipglobal.hk") === -1 || (b = !0),
353 | b
354 | },
355 | urlEncodedFormString: function(a) {
356 | var b = "";
357 | for (var c in a)
358 | Object.hasOwnProperty.call(a, c) && (b = b + "&" + c + "=" + a[c]);
359 | return b.replace(/^&/, "")
360 | },
361 | urlEncodedFormStringWithEncode: function(a) {
362 | var b = "";
363 | for (var c in a)
364 | Object.hasOwnProperty.call(a, c) && (b = b + "&" + c + "=" + encodeURIComponent(a[c]));
365 | return b.replace(/^&/, "")
366 | },
367 | isWXLite: function() {
368 | var a = navigator && navigator.userAgent || ""
369 | , b = "miniprogram" === window.__wxjs_environment && !window.__qqjs_environment || /MicroMessenger/i.test(a) && /miniProgram/.test(a);
370 | return b && !window.mars_var && window.T0 && (window.mars_var = {
371 | stream_id: window.T0
372 | }),
373 | b
374 | },
375 | isAlipayLite: function() {
376 | var a = navigator && navigator.userAgent || ""
377 | , b = /AliApp/i.test(a) && /MiniProgram/i.test(a);
378 | return b && !window.mars_var && window.T0 && (window.mars_var = {
379 | stream_id: window.T0
380 | }),
381 | b
382 | }
383 | }
384 |
385 |
386 | function mars_cid() {
387 | return Mar.Util.encryptCid(Mar.Util.pad((new Date).getTime(), 13) + "_" + Mar.Random.rand())
388 | }
389 |
--------------------------------------------------------------------------------
/18_唯品会/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import execjs
3 | import json
4 |
5 | with open('./18_唯品会/mars_cid.js', mode='r', encoding='utf-8') as f:
6 | js_code = f.read()
7 |
8 | ctx = execjs.compile(js_code)
9 | mars_cid = ctx.call('mars_cid')
10 |
11 |
12 | headers = {
13 | "referer": "https://category.vip.com/",
14 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
15 | }
16 | url = "https://mapi.vip.com/vips-mobile/rest/shopping/pc/search/product/rank"
17 | params = {
18 | "app_name": "shop_pc",
19 | "app_version": "4.0",
20 | "warehouse": "VIP_SH",
21 | "fdc_area_id": "103103102",
22 | "client": "pc",
23 | "mobile_platform": "1",
24 | "province_id": "103103",
25 | "api_key": "70f71280d5d547b2a7bb370a529aeea1",
26 | "user_id": "",
27 | "mars_cid": mars_cid,
28 | "wap_consumer": "a",
29 | "standby_id": "nature",
30 | "keyword": "python",
31 | "lv3CatIds": "",
32 | "lv2CatIds": "",
33 | "lv1CatIds": "",
34 | "brandStoreSns": "",
35 | "props": "",
36 | "priceMin": "",
37 | "priceMax": "",
38 | "vipService": "",
39 | "sort": "0",
40 | "pageOffset": "0",
41 | "channelId": "1",
42 | "gPlatform": "PC",
43 | "batchSize": "120",
44 | }
45 |
46 |
47 | response = requests.get(url, headers=headers, params=params)
48 | print(json.loads(response.text))
--------------------------------------------------------------------------------
/19_超星学习通/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import execjs
3 |
4 | with open('./user_pwd.js', mode='r', encoding='utf-8') as f:
5 | jsCode = f.read()
6 |
7 | ctx = execjs.compile(jsCode)
8 | result = ctx.call('enc', '123456', '15858585858')
9 | uname = result['phone']
10 | password = result['pwd']
11 | headers = {
12 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
13 | }
14 |
15 | url = "https://passport2.chaoxing.com/fanyalogin"
16 | data = {
17 | "fid": "-1",
18 | "uname": uname,
19 | "password": password,
20 | "refer": "http%3A%2F%2Fi.mooc.chaoxing.com",
21 | "t": "true",
22 | "forbidotherlogin": "0",
23 | "validate": "",
24 | "doubleFactorLogin": "0",
25 | "independentId": "0",
26 | "independentNameId": "0"
27 | }
28 | response = requests.post(url, headers=headers, data=data)
29 |
30 | print(response.json())
--------------------------------------------------------------------------------
/20_山西省电子税务局/test.py:
--------------------------------------------------------------------------------
1 | from io import BytesIO
2 | from PIL import Image
3 | import requests
4 | import base64
5 | import execjs
6 | import time
7 | import json
8 | import cv2
9 |
10 |
11 |
12 | # 调整底图大小并保存
13 | def resize_and_save_image(path ,content, size):
14 | image = Image.open(BytesIO(content))
15 | image = image.resize(size)
16 | image.save(path)
17 |
18 | # 判断缺口位置 返回缺口的X坐标
19 | def identify_gap(bg,tp,out):
20 | '''
21 | bg: 背景图片
22 | tp: 缺口图片
23 | out:输出图片
24 | '''
25 | # 读取背景图片和缺口图片
26 | bg_img = cv2.imread(bg) # 背景图片
27 | tp_img = cv2.imread(tp) # 缺口图片
28 |
29 | # 识别图片边缘
30 | bg_edge = cv2.Canny(bg_img, 100, 200)
31 | tp_edge = cv2.Canny(tp_img, 100, 200)
32 |
33 | # 转换图片格式
34 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
35 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
36 |
37 | # 缺口匹配
38 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
39 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
40 |
41 | # 绘制方框
42 | th, tw = tp_pic.shape[:2]
43 | tl = max_loc # 左上角点的坐标
44 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
45 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
46 | cv2.imwrite(out, bg_img) # 保存在本地
47 |
48 | # 返回缺口的X坐标
49 | return tl[0]
50 |
51 | # 获取验证码参数
52 | def verifyParams():
53 | headers = {
54 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
55 | }
56 | url = "https://etax.shanxi.chinatax.gov.cn/gzfw/common/captcha/get"
57 | data = {
58 | "captchaType": "blockPuzzle",
59 | "clientUid": "slider-b1faba8f-805c-4cf4-8584-e9cb1d006340",
60 | }
61 | data = json.dumps(data, separators=(',', ':'))
62 | return requests.post(url, headers=headers, data=data).json()['repData']
63 |
64 | # 滑块验证码验证
65 | def check(token, pointJson):
66 | headers = {
67 | "Accept": "*/*",
68 | "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
69 | "Cache-Control": "no-cache",
70 | "Connection": "keep-alive",
71 | "Content-Type": "application/json;charset=UTF-8",
72 | "Origin": "https://etax.shanxi.chinatax.gov.cn",
73 | "Pragma": "no-cache",
74 | "Referer": "https://etax.shanxi.chinatax.gov.cn/gzfw/xydjalnsrcx",
75 | "Sec-Fetch-Dest": "empty",
76 | "Sec-Fetch-Mode": "cors",
77 | "Sec-Fetch-Site": "same-origin",
78 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
79 | "sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Microsoft Edge\";v=\"122\"",
80 | "sec-ch-ua-mobile": "?0",
81 | "sec-ch-ua-platform": "\"Windows\""
82 | }
83 | cookies = {
84 | }
85 | url = "https://etax.shanxi.chinatax.gov.cn/gzfw/common/captcha/check"
86 | data = {
87 | "captchaType": "blockPuzzle",
88 | "pointJson": pointJson,
89 | "token": token,
90 | "clientUid": "slider-b1faba8f-805c-4cf4-8584-e9cb1d006340",
91 | "ts": int(time.time()*1000)
92 | }
93 | data = json.dumps(data, separators=(',', ':'))
94 |
95 | requests.post(url, headers=headers, cookies=cookies, data=data)
96 |
97 | # 数据请求
98 | def getData(captchaVerification, nsrsbh, nsrmc):
99 | headers = {
100 | "Referer": "https://etax.shanxi.chinatax.gov.cn/gzfw/xydjalnsrcx",
101 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
102 | }
103 | url = "https://etax.shanxi.chinatax.gov.cn/gzfw/xydjalnsrcx/list"
104 | params = {
105 | "captchaVerification": captchaVerification,
106 | "_search": "false",
107 | "nd": int(time.time()*1000),
108 | "limit": "50",
109 | "page": "1",
110 | "sidx": "",
111 | "sord": "asc",
112 | "CXLX": "0",
113 | "NSRSBH": nsrsbh,
114 | "NSRMC": nsrmc,
115 | "ZGSWJ": "",
116 | "ZGSWJ_DM": "",
117 | "TYPE": "0",
118 | "DJXH": "",
119 | "YEAR": "2023"
120 | }
121 | response = requests.get(url, headers=headers, params=params)
122 | print(response.json())
123 |
124 | # 测试
125 | if __name__ == '__main__':
126 | # 纳税人识别号
127 | nsrsbh = ''
128 | # 纳税人名称
129 | nsrmc = ''
130 |
131 | result = verifyParams()
132 | bg = result['originalImageBase64']
133 | slide = result['jigsawImageBase64']
134 | secretKey = result['secretKey']
135 | token = result['token']
136 | bg_data = base64.b64decode(bg)
137 | slide_data = base64.b64decode(slide)
138 | # 重置图片大小
139 | resize_and_save_image('base.png', bg_data, (400, 200))
140 | resize_and_save_image('slide.png', slide_data, (60, 200))
141 |
142 | # 获取缺口x轴位置
143 | x = identify_gap('base.png', "slide.png", 'out.png') * 310 / 400
144 |
145 | with open('./Verification.js', mode='r', encoding='utf-8') as f:
146 | js_code = f.read()
147 |
148 | ctx = execjs.compile(js_code)
149 | pointJson = ctx.call('pointJson',x, secretKey)
150 | captchaVerification = ctx.call('captchaVerification', token, x, secretKey)
151 |
152 | check(token, pointJson)
153 | getData(captchaVerification, nsrsbh, nsrmc)
154 |
155 |
156 |
--------------------------------------------------------------------------------
/21_优购网/test.py:
--------------------------------------------------------------------------------
1 | from requests.utils import dict_from_cookiejar
2 | from lxml import etree
3 | import requests
4 | import ddddocr
5 | import random
6 | import re
7 |
8 | headers = {
9 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
10 | }
11 |
12 | def get_verify_params():
13 | url = "https://passport.yougou.com/signin.jhtml"
14 | params = {
15 | "redirectURL": "https://www.yougou.com/"
16 | }
17 | response = requests.get(url, headers=headers, params=params)
18 | html = etree.HTML(response.text)
19 | name = html.xpath('//input[@id="loginNonceId"][1]/@name')[0]
20 | value = html.xpath('//input[@id="loginNonceId"][1]/@value')[0]
21 | cookie = dict_from_cookiejar(response.cookies)
22 | cookie.update({'name' : name, 'value': value})
23 | return cookie
24 |
25 |
26 | def login(cookie, verifycode, name, value, username, password):
27 |
28 | url = "https://passport.yougou.com/my/procsignin.jhtml"
29 | params = {
30 | "callback": "jsonp1710471508260"
31 | }
32 | data = {
33 | "username": username,
34 | "password": password,
35 | "verifycode": verifycode,
36 | "isVerify": "true",
37 | name: value,
38 | "callback": "jsonp1710471508260"
39 | }
40 | response = requests.post(url, headers=headers, cookies=cookie, params=params, data=data)
41 | message = re.findall('\((.*?)\)', response.text)[0]
42 | print(message)
43 |
44 |
45 | def get_verify_code(cookies):
46 |
47 | url = "https://passport.yougou.com/servlet/imageCaptcha"
48 | params = {
49 | "rand": random.random()
50 | }
51 | response = requests.get(url, headers=headers, cookies=cookies, params=params)
52 | # with open('./verifyImg.png', 'wb') as f:
53 | # f.write(response.content)
54 |
55 | ocr = ddddocr.DdddOcr()
56 | res = ocr.classification(response.content)
57 | return res
58 |
59 | # 测试
60 | if __name__ == '__main__':
61 | username = ''
62 | password = ''
63 | verify_params = get_verify_params()
64 | cookie = {
65 | 'yg_sid' : verify_params['yg_sid'],
66 | 'JSESSIONID' : verify_params['JSESSIONID']
67 | }
68 | verifycode = get_verify_code(cookie)
69 | login(cookie, verifycode, verify_params['name'], verify_params['value'], username, password)
--------------------------------------------------------------------------------
/22_当当网/test.py:
--------------------------------------------------------------------------------
1 | from io import BytesIO
2 | from PIL import Image
3 | import requests
4 | import execjs
5 | import cv2
6 | import time
7 |
8 | with open('./test.js', 'r', encoding='utf-8') as f:
9 | js_code = f.read()
10 | ctx = execjs.compile(js_code)
11 |
12 |
13 | headers = {
14 | 'Origin': 'https://login.dangdang.com',
15 | 'Referer': 'https://login.dangdang.com/?returnurl=https%3A%2F%2Fwww.dangdang.com%2F',
16 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
17 | }
18 |
19 |
20 |
21 |
22 | # 判断缺口位置 返回缺口的X坐标
23 | def identify_gap(bg,tp,out):
24 | '''
25 | bg: 背景图片
26 | tp: 缺口图片
27 | out:输出图片
28 | '''
29 | # 读取背景图片和缺口图片
30 | bg_img = cv2.imread(bg) # 背景图片
31 | tp_img = cv2.imread(tp) # 缺口图片
32 |
33 | # 识别图片边缘
34 | bg_edge = cv2.Canny(bg_img, 100, 200)
35 | tp_edge = cv2.Canny(tp_img, 100, 200)
36 |
37 | # 转换图片格式
38 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
39 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
40 |
41 | # 缺口匹配
42 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
43 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
44 |
45 | # 绘制方框
46 | th, tw = tp_pic.shape[:2]
47 | tl = max_loc # 左上角点的坐标
48 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
49 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
50 | cv2.imwrite(out, bg_img) # 保存在本地
51 |
52 | # 返回缺口的X坐标
53 | return tl[0]
54 |
55 | # 调整底图大小并保存
56 | def resize_and_save_image(path ,content, size):
57 | image = Image.open(BytesIO(content))
58 | image = image.resize(size)
59 | image.save(path)
60 |
61 |
62 | def ranKey(data):
63 | url = "https://login.dangdang.com/api/customer/loginapi/getRankey"
64 | response = requests.post(url, headers=headers, data=data)
65 | return response.json()
66 |
67 | def getSlidingVerifyCode(data):
68 | url = "https://login.dangdang.com/api/customer/loginapi/getSlidingVerifyCode"
69 | response = requests.post(url, headers=headers, data=data)
70 | print(response.json())
71 | return response.json()
72 |
73 | def save_captcha_img(url):
74 | response = requests.get(url, headers=headers)
75 | return response.content
76 |
77 | def checkSlidingVerifyCode(data3):
78 |
79 |
80 | data = {
81 | 't': data3['t'],
82 | 'ct': 'pc',
83 | 'permanent_id': data3['permanent_id'],
84 | 'requestId': data3['requestId'],
85 | 'situation': 'login',
86 | 'verifyToken': data3['verifyToken'],
87 | 'slide_cost_time': '77',
88 | 'need_new_verifydata': '0',
89 | 'point_json': data3['point_json'],
90 | 'sign': data3['sign'],
91 | }
92 |
93 | response = requests.post('https://login.dangdang.com/api/customer/loginapi/checkSlidingVerifyCode', headers=headers, data=data)
94 | print(response.json())
95 | return response.json()
96 |
97 | def accountLogin(data4):
98 | data = {
99 | 't': data4['t'],
100 | 'ct': 'pc',
101 | 'permanent_id': data4['permanent_id'],
102 | 'requestId': data4['requestId'],
103 | 'username': data4['username'],
104 | 'password': data4['password'],
105 | 'autokey': 'off',
106 | 'token': data4['verifyToken'],
107 | 'check_code': data4['check_code'],
108 | 'check_code_type': '1',
109 | 'sign': data4['sign'],
110 | }
111 |
112 | response = requests.post('https://login.dangdang.com/api/customer/loginapi/accountLogin',headers=headers,data=data)
113 | print(response.json())
114 |
115 | if __name__ == '__main__':
116 | username = ''
117 | password = ''
118 | password = ctx.call('password', password)
119 |
120 | # t 、 ct 、 requestId 、 sign 、 permanent_id
121 | # 第一次请求data
122 | data = ctx.call('params')
123 | permanent_id = data['permanent_id']
124 | requestId = data['requestId']
125 | ranKey = ranKey(data) # requestId
126 | print(data, ranKey)
127 | # 第二次请求data
128 | data2 = ctx.call('params', ranKey['rankey'], ranKey['requestId'], 'login')
129 | result = getSlidingVerifyCode(data2)
130 | slideImg = save_captcha_img(result['data']['slideImg'])
131 | bgImg = save_captcha_img(result['data']['bgImg'])
132 | encryptKey = result['data']['encryptKey']
133 | verifyToken = result['data']['token']
134 | y = result['data']['y']
135 |
136 | resize_and_save_image('./slideImg.png', slideImg, (61,61))
137 | resize_and_save_image('./bgImg.jpg', bgImg, (350,175))
138 |
139 | x = identify_gap('./bgImg.jpg', './slideImg.png', './out.png')
140 | point_json = ctx.call("point_json", x, y, encryptKey)
141 | data3 = ctx.call('params', ranKey['rankey'], ranKey['requestId'], 'login', permanent_id, point_json, verifyToken)
142 | data3['verifyToken'] = verifyToken
143 | data3['point_json'] = point_json
144 | check_code = checkSlidingVerifyCode(data3)['data']['checkCode']
145 |
146 |
147 | data4 = ctx.call('params', ranKey['rankey'], ranKey['requestId'], '', permanent_id, '', verifyToken, check_code, password, username)
148 | data4['username'] = username
149 | data4['check_code'] = check_code
150 | data4['verifyToken'] = verifyToken
151 | data4['password'] = password
152 | accountLogin(data4)
--------------------------------------------------------------------------------
/23_58同城/encPwd.js:
--------------------------------------------------------------------------------
1 | function encPwd(e, t, n) {
2 | var i = {}
3 | , r = {};
4 | !function(e) {
5 | function t(e) {
6 | var t = i
7 | , n = t.biDivideByRadixPower(e, this.k - 1)
8 | , r = t.biMultiply(n, this.mu)
9 | , o = t.biDivideByRadixPower(r, this.k + 1)
10 | , a = t.biModuloByRadixPower(e, this.k + 1)
11 | , s = t.biMultiply(o, this.modulus)
12 | , c = t.biModuloByRadixPower(s, this.k + 1)
13 | , l = t.biSubtract(a, c);
14 | l.isNeg && (l = t.biAdd(l, this.bkplus1));
15 | for (var u = 0 <= t.biCompare(l, this.modulus); u; )
16 | l = t.biSubtract(l, this.modulus),
17 | u = 0 <= t.biCompare(l, this.modulus);
18 | return l
19 | }
20 | function n(e, t) {
21 | var n = i.biMultiply(e, t);
22 | return this.modulo(n)
23 | }
24 | function r(e, t) {
25 | var n = new p;
26 | n.digits[0] = 1;
27 | for (var r = e, o = t; 0 != (1 & o.digits[0]) && (n = this.multiplyMod(n, r)),
28 | 0 != (o = i.biShiftRight(o, 1)).digits[0] || 0 != i.biHighIndex(o); )
29 | r = this.multiplyMod(r, r);
30 | return n
31 | }
32 | function o(t, n, r) {
33 | var o = i;
34 | this.e = o.biFromHex(t),
35 | this.d = o.biFromHex(n),
36 | this.m = o.biFromHex(r),
37 | this.chunkSize = 2 * o.biHighIndex(this.m),
38 | this.radix = 16,
39 | this.barrett = new e.BarrettMu(this.m)
40 | }
41 | void 0 === e.RSAUtils && (e.RSAUtils = {});
42 | var a, s, c, l = 16, u = 65536, d = u - 1, p = e.BigInt = function(e) {
43 | this.digits = "boolean" == typeof e && 1 == e ? null : a.slice(0),
44 | this.isNeg = !1
45 | }
46 | ;
47 | i.setMaxDigits = function(e) {
48 | a = new Array(e);
49 | for (var t = 0; t < a.length; t++)
50 | a[t] = 0;
51 | s = new p,
52 | (c = new p).digits[0] = 1
53 | }
54 | ,
55 | i.setMaxDigits(20),
56 | i.biFromNumber = function(e) {
57 | var t = new p;
58 | t.isNeg = e < 0,
59 | e = Math.abs(e);
60 | for (var n = 0; 0 < e; )
61 | t.digits[n++] = e & d,
62 | e = Math.floor(e / u);
63 | return t
64 | }
65 | ;
66 | var f = i.biFromNumber(1e15);
67 | i.biFromDecimal = function(e) {
68 | for (var t, n = "-" == e.charAt(0), r = n ? 1 : 0; r < e.length && "0" == e.charAt(r); )
69 | ++r;
70 | if (r == e.length)
71 | t = new p;
72 | else {
73 | var o = (e.length - r) % 15;
74 | for (0 == o && (o = 15),
75 | t = i.biFromNumber(Number(e.substr(r, o))),
76 | r += o; r < e.length; )
77 | t = i.biAdd(i.biMultiply(t, f), i.biFromNumber(Number(e.substr(r, 15)))),
78 | r += 15;
79 | t.isNeg = n
80 | }
81 | return t
82 | }
83 | ,
84 | i.biCopy = function(e) {
85 | var t = new p(!0);
86 | return t.digits = e.digits.slice(0),
87 | t.isNeg = e.isNeg,
88 | t
89 | }
90 | ,
91 | i.reverseStr = function(e) {
92 | for (var t = "", n = e.length - 1; -1 < n; --n)
93 | t += e.charAt(n);
94 | return t
95 | }
96 | ;
97 | var h = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
98 | i.biToString = function(e, t) {
99 | var n = new p;
100 | n.digits[0] = t;
101 | for (var r = i.biDivideModulo(e, n), o = h[r[1].digits[0]]; 1 == i.biCompare(r[0], s); )
102 | r = i.biDivideModulo(r[0], n),
103 | digit = r[1].digits[0],
104 | o += h[r[1].digits[0]];
105 | return (e.isNeg ? "-" : "") + i.reverseStr(o)
106 | }
107 | ,
108 | i.biToDecimal = function(e) {
109 | var t = new p;
110 | t.digits[0] = 10;
111 | for (var n = i.biDivideModulo(e, t), r = String(n[1].digits[0]); 1 == i.biCompare(n[0], s); )
112 | n = i.biDivideModulo(n[0], t),
113 | r += String(n[1].digits[0]);
114 | return (e.isNeg ? "-" : "") + i.reverseStr(r)
115 | }
116 | ;
117 | var g = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
118 | i.digitToHex = function(e) {
119 | for (var t = "", n = 0; n < 4; ++n)
120 | t += g[15 & e],
121 | e >>>= 4;
122 | return i.reverseStr(t)
123 | }
124 | ,
125 | i.biToHex = function(e) {
126 | for (var t = "", n = (i.biHighIndex(e),
127 | i.biHighIndex(e)); -1 < n; --n)
128 | t += i.digitToHex(e.digits[n]);
129 | return t
130 | }
131 | ,
132 | i.charToHex = function(e) {
133 | return 48 <= e && e <= 57 ? e - 48 : 65 <= e && e <= 90 ? 10 + e - 65 : 97 <= e && e <= 122 ? 10 + e - 97 : 0
134 | }
135 | ,
136 | i.hexToDigit = function(e) {
137 | for (var t = 0, n = Math.min(e.length, 4), r = 0; r < n; ++r)
138 | t <<= 4,
139 | t |= i.charToHex(e.charCodeAt(r));
140 | return t
141 | }
142 | ,
143 | i.biFromHex = function(e) {
144 | for (var t = new p, n = e.length, r = 0; 0 < n; n -= 4,
145 | ++r)
146 | t.digits[r] = i.hexToDigit(e.substr(Math.max(n - 4, 0), Math.min(n, 4)));
147 | return t
148 | }
149 | ,
150 | i.biFromString = function(e, t) {
151 | var n = "-" == e.charAt(0)
152 | , r = n ? 1 : 0
153 | , o = new p
154 | , a = new p;
155 | a.digits[0] = 1;
156 | for (var s = e.length - 1; r <= s; s--) {
157 | var c = e.charCodeAt(s)
158 | , l = i.charToHex(c)
159 | , u = i.biMultiplyDigit(a, l);
160 | o = i.biAdd(o, u),
161 | a = i.biMultiplyDigit(a, t)
162 | }
163 | return o.isNeg = n,
164 | o
165 | }
166 | ,
167 | i.biDump = function(e) {
168 | return (e.isNeg ? "-" : "") + e.digits.join(" ")
169 | }
170 | ,
171 | i.biAdd = function(e, t) {
172 | var n;
173 | if (e.isNeg != t.isNeg)
174 | t.isNeg = !t.isNeg,
175 | n = i.biSubtract(e, t),
176 | t.isNeg = !t.isNeg;
177 | else {
178 | n = new p;
179 | for (var r, o = 0, a = 0; a < e.digits.length; ++a)
180 | r = e.digits[a] + t.digits[a] + o,
181 | n.digits[a] = r % u,
182 | o = Number(u <= r);
183 | n.isNeg = e.isNeg
184 | }
185 | return n
186 | }
187 | ,
188 | i.biSubtract = function(e, t) {
189 | var n;
190 | if (e.isNeg != t.isNeg)
191 | t.isNeg = !t.isNeg,
192 | n = i.biAdd(e, t),
193 | t.isNeg = !t.isNeg;
194 | else {
195 | var r, o;
196 | n = new p;
197 | for (var a = o = 0; a < e.digits.length; ++a)
198 | r = e.digits[a] - t.digits[a] + o,
199 | n.digits[a] = r % u,
200 | n.digits[a] < 0 && (n.digits[a] += u),
201 | o = 0 - Number(r < 0);
202 | if (-1 == o) {
203 | for (a = o = 0; a < e.digits.length; ++a)
204 | r = 0 - n.digits[a] + o,
205 | n.digits[a] = r % u,
206 | n.digits[a] < 0 && (n.digits[a] += u),
207 | o = 0 - Number(r < 0);
208 | n.isNeg = !e.isNeg
209 | } else
210 | n.isNeg = e.isNeg
211 | }
212 | return n
213 | }
214 | ,
215 | i.biHighIndex = function(e) {
216 | for (var t = e.digits.length - 1; 0 < t && 0 == e.digits[t]; )
217 | --t;
218 | return t
219 | }
220 | ,
221 | i.biNumBits = function(e) {
222 | var t, n = i.biHighIndex(e), r = e.digits[n], o = (n + 1) * l;
223 | for (t = o; o - l < t && 0 == (32768 & r); --t)
224 | r <<= 1;
225 | return t
226 | }
227 | ,
228 | i.biMultiply = function(e, t) {
229 | for (var n, r, o, a, s = new p, c = i.biHighIndex(e), l = i.biHighIndex(t), u = 0; u <= l; ++u) {
230 | for (o = u,
231 | a = n = 0; a <= c; ++a,
232 | ++o)
233 | r = s.digits[o] + e.digits[a] * t.digits[u] + n,
234 | s.digits[o] = r & d,
235 | n = r >>> 16;
236 | s.digits[u + c + 1] = n
237 | }
238 | return s.isNeg = e.isNeg != t.isNeg,
239 | s
240 | }
241 | ,
242 | i.biMultiplyDigit = function(e, t) {
243 | var n, r, o, a;
244 | a = new p,
245 | n = i.biHighIndex(e);
246 | for (var s = r = 0; s <= n; ++s)
247 | o = a.digits[s] + e.digits[s] * t + r,
248 | a.digits[s] = o & d,
249 | r = o >>> 16;
250 | return a.digits[1 + n] = r,
251 | a
252 | }
253 | ,
254 | i.arrayCopy = function(e, t, n, i, r) {
255 | for (var o = Math.min(t + r, e.length), a = t, s = i; a < o; ++a,
256 | ++s)
257 | n[s] = e[a]
258 | }
259 | ;
260 | var m = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535];
261 | i.biShiftLeft = function(e, t) {
262 | var n = Math.floor(t / l)
263 | , r = new p;
264 | i.arrayCopy(e.digits, 0, r.digits, n, r.digits.length - n);
265 | for (var o = t % l, a = l - o, s = r.digits.length - 1, c = s - 1; 0 < s; --s,
266 | --c)
267 | r.digits[s] = r.digits[s] << o & d | (r.digits[c] & m[o]) >>> a;
268 | return r.digits[0] = r.digits[s] << o & d,
269 | r.isNeg = e.isNeg,
270 | r
271 | }
272 | ;
273 | var y = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535];
274 | i.biShiftRight = function(e, t) {
275 | var n = Math.floor(t / l)
276 | , r = new p;
277 | i.arrayCopy(e.digits, n, r.digits, 0, e.digits.length - n);
278 | for (var o = t % l, a = l - o, s = 0, c = s + 1; s < r.digits.length - 1; ++s,
279 | ++c)
280 | r.digits[s] = r.digits[s] >>> o | (r.digits[c] & y[o]) << a;
281 | return r.digits[r.digits.length - 1] >>>= o,
282 | r.isNeg = e.isNeg,
283 | r
284 | }
285 | ,
286 | i.biMultiplyByRadixPower = function(e, t) {
287 | var n = new p;
288 | return i.arrayCopy(e.digits, 0, n.digits, t, n.digits.length - t),
289 | n
290 | }
291 | ,
292 | i.biDivideByRadixPower = function(e, t) {
293 | var n = new p;
294 | return i.arrayCopy(e.digits, t, n.digits, 0, n.digits.length - t),
295 | n
296 | }
297 | ,
298 | i.biModuloByRadixPower = function(e, t) {
299 | var n = new p;
300 | return i.arrayCopy(e.digits, 0, n.digits, 0, t),
301 | n
302 | }
303 | ,
304 | i.biCompare = function(e, t) {
305 | if (e.isNeg != t.isNeg)
306 | return 1 - 2 * Number(e.isNeg);
307 | for (var n = e.digits.length - 1; 0 <= n; --n)
308 | if (e.digits[n] != t.digits[n])
309 | return e.isNeg ? 1 - 2 * Number(e.digits[n] > t.digits[n]) : 1 - 2 * Number(e.digits[n] < t.digits[n]);
310 | return 0
311 | }
312 | ,
313 | i.biDivideModulo = function(e, t) {
314 | var n, r, o = i.biNumBits(e), a = i.biNumBits(t), s = t.isNeg;
315 | if (o < a)
316 | return e.isNeg ? ((n = i.biCopy(c)).isNeg = !t.isNeg,
317 | e.isNeg = !1,
318 | t.isNeg = !1,
319 | r = biSubtract(t, e),
320 | e.isNeg = !0,
321 | t.isNeg = s) : (n = new p,
322 | r = i.biCopy(e)),
323 | [n, r];
324 | n = new p,
325 | r = e;
326 | for (var f = Math.ceil(a / l) - 1, h = 0; t.digits[f] < 32768; )
327 | t = i.biShiftLeft(t, 1),
328 | ++h,
329 | ++a,
330 | f = Math.ceil(a / l) - 1;
331 | r = i.biShiftLeft(r, h),
332 | o += h;
333 | for (var g = Math.ceil(o / l) - 1, m = i.biMultiplyByRadixPower(t, g - f); -1 != i.biCompare(r, m); )
334 | ++n.digits[g - f],
335 | r = i.biSubtract(r, m);
336 | for (var y = g; f < y; --y) {
337 | var v = y >= r.digits.length ? 0 : r.digits[y]
338 | , b = y - 1 >= r.digits.length ? 0 : r.digits[y - 1]
339 | , x = y - 2 >= r.digits.length ? 0 : r.digits[y - 2]
340 | , k = f >= t.digits.length ? 0 : t.digits[f]
341 | , w = f - 1 >= t.digits.length ? 0 : t.digits[f - 1];
342 | n.digits[y - f - 1] = v == k ? d : Math.floor((v * u + b) / k);
343 | for (var C = n.digits[y - f - 1] * (k * u + w), T = 4294967296 * v + (b * u + x); T < C; )
344 | --n.digits[y - f - 1],
345 | C = n.digits[y - f - 1] * (k * u | w),
346 | T = v * u * u + (b * u + x);
347 | m = i.biMultiplyByRadixPower(t, y - f - 1),
348 | (r = i.biSubtract(r, i.biMultiplyDigit(m, n.digits[y - f - 1]))).isNeg && (r = i.biAdd(r, m),
349 | --n.digits[y - f - 1])
350 | }
351 | return r = i.biShiftRight(r, h),
352 | n.isNeg = e.isNeg != s,
353 | e.isNeg && (n = s ? i.biAdd(n, c) : i.biSubtract(n, c),
354 | t = i.biShiftRight(t, h),
355 | r = i.biSubtract(t, r)),
356 | 0 == r.digits[0] && 0 == i.biHighIndex(r) && (r.isNeg = !1),
357 | [n, r]
358 | }
359 | ,
360 | i.biDivide = function(e, t) {
361 | return i.biDivideModulo(e, t)[0]
362 | }
363 | ,
364 | i.biModulo = function(e, t) {
365 | return i.biDivideModulo(e, t)[1]
366 | }
367 | ,
368 | i.biMultiplyMod = function(e, t, n) {
369 | return i.biModulo(i.biMultiply(e, t), n)
370 | }
371 | ,
372 | i.biPow = function(e, t) {
373 | for (var n = c, r = e; 0 != (1 & t) && (n = i.biMultiply(n, r)),
374 | 0 != (t >>= 1); )
375 | r = i.biMultiply(r, r);
376 | return n
377 | }
378 | ,
379 | i.biPowMod = function(e, t, n) {
380 | for (var r = c, o = e, a = t; 0 != (1 & a.digits[0]) && (r = i.biMultiplyMod(r, o, n)),
381 | 0 != (a = i.biShiftRight(a, 1)).digits[0] || 0 != i.biHighIndex(a); )
382 | o = i.biMultiplyMod(o, o, n);
383 | return r
384 | }
385 | ,
386 | e.BarrettMu = function(e) {
387 | this.modulus = i.biCopy(e),
388 | this.k = i.biHighIndex(this.modulus) + 1;
389 | var o = new p;
390 | o.digits[2 * this.k] = 1,
391 | this.mu = i.biDivide(o, this.modulus),
392 | this.bkplus1 = new p,
393 | this.bkplus1.digits[this.k + 1] = 1,
394 | this.modulo = t,
395 | this.multiplyMod = n,
396 | this.powMod = r
397 | }
398 | ,
399 | i.getKeyPair = function(e, t, n) {
400 | return new o(e,t,n)
401 | }
402 | ,
403 | void 0 === e.twoDigit && (e.twoDigit = function(e) {
404 | return (e < 10 ? "0" : "") + String(e)
405 | }
406 | ),
407 | i.encryptedString = function(e, t) {
408 | for (var n = [], r = t.length, o = 0; o < r; )
409 | n[o] = t.charCodeAt(o),
410 | o++;
411 | for (; n.length % e.chunkSize != 0; )
412 | n[o++] = 0;
413 | var a, s, c, l = n.length, u = "";
414 | for (o = 0; o < l; o += e.chunkSize) {
415 | for (c = new p,
416 | a = 0,
417 | s = o; s < o + e.chunkSize; ++a)
418 | c.digits[a] = n[s++],
419 | c.digits[a] += n[s++] << 8;
420 | var d = e.barrett.powMod(c, e.e);
421 | u += (16 == e.radix ? i.biToHex(d) : i.biToString(d, e.radix)) + " "
422 | }
423 | return u.substring(0, u.length - 1)
424 | }
425 | ,
426 | i.decryptedString = function(e, t) {
427 | var n, r, o, a = t.split(" "), s = "";
428 | for (n = 0; n < a.length; ++n) {
429 | var c;
430 | for (c = 16 == e.radix ? i.biFromHex(a[n]) : i.biFromString(a[n], e.radix),
431 | o = e.barrett.powMod(c, e.d),
432 | r = 0; r <= i.biHighIndex(o); ++r)
433 | s += String.fromCharCode(255 & o.digits[r], o.digits[r] >> 8)
434 | }
435 | return 0 == s.charCodeAt(s.length - 1) && (s = s.substring(0, s.length - 1)),
436 | s
437 | }
438 | ,
439 | i.setMaxDigits(130)
440 | }(r);
441 | var o = i.getKeyPair(t, "", n);
442 | return i.encryptedString(o, e)
443 | }
444 |
445 |
446 |
447 | function enc(pwd) {
448 | var rsaExponent = "010001"
449 | var rsaModulus = "008baf14121377fc76eaf7794b8a8af17085628c3590df47e6534574efcfd81ef8635fcdc67d141c15f51649a89533df0db839331e30b8f8e4440ebf7ccbcc494f4ba18e9f492534b8aafc1b1057429ac851d3d9eb66e86fce1b04527c7b95a2431b07ea277cde2365876e2733325df04389a9d891c5d36b7bc752140db74cb69f"
450 | var r = 1411093327735 - (new Date).getTime()
451 | var o = (new Date).getTime() + r;
452 | return encPwd(o + encodeURIComponent(pwd), rsaExponent, rsaModulus)
453 | }
454 |
455 | console.log(enc('125874'))
456 |
457 |
--------------------------------------------------------------------------------
/24_艺恩星数/test.py:
--------------------------------------------------------------------------------
1 | import requests
2 | from requests.utils import dict_from_cookiejar
3 | import execjs
4 | import os
5 |
6 | def transferJsCode(fileName, funName,*args):
7 | jsFilePath = os.path.join(os.path.dirname(__file__), fileName + '.js')
8 | with open(jsFilePath, mode='r', encoding='utf-8') as f:
9 | jsCode = f.read()
10 |
11 | ctx = execjs.compile(jsCode)
12 | result = ctx.call(funName, *args)
13 | return result
14 |
15 |
16 |
17 | def login(user, pwd):
18 | result = transferJsCode('user_pwd', 'encrypt', user, pwd)
19 | url = 'https://star.endata.com.cn/api/public/login'
20 | data = {
21 | 'logintype': '1',
22 | 'name': result['user'],
23 | 'pwd': result['pwd']
24 | }
25 |
26 | response = requests.post(url, data=data)
27 | return response.cookies
28 |
29 |
30 |
31 | if __name__ == '__main__':
32 | user = ''
33 | pwd = ''
34 | cookie = dict_from_cookiejar(login(user, pwd))
35 | print(cookie)
--------------------------------------------------------------------------------
/24_艺恩星数/user_pwd.js:
--------------------------------------------------------------------------------
1 | window = globalThis;;
2 |
3 | (function(e) {
4 | function t(t) {
5 | for (var o, a, s = t[0], l = t[1], c = t[2], u = 0, p = []; u < s.length; u++)
6 | a = s[u],
7 | Object.prototype.hasOwnProperty.call(r, a) && r[a] && p.push(r[a][0]),
8 | r[a] = 0;
9 | for (o in l)
10 | Object.prototype.hasOwnProperty.call(l, o) && (e[o] = l[o]);
11 | d && d(t);
12 | while (p.length)
13 | p.shift()();
14 | return i.push.apply(i, c || []),
15 | n()
16 | }
17 | function n() {
18 | for (var e, t = 0; t < i.length; t++) {
19 | for (var n = i[t], o = !0, a = 1; a < n.length; a++) {
20 | var s = n[a];
21 | 0 !== r[s] && (o = !1)
22 | }
23 | o && (i.splice(t--, 1),
24 | e = l(l.s = n[0]))
25 | }
26 | return e
27 | }
28 | var o = {}
29 | , a = {
30 | app: 0
31 | }
32 | , r = {
33 | app: 0
34 | }
35 | , i = [];
36 | function s(e) {
37 | return l.p + "js/" + ({
38 | "Group-Brand": "Group-Brand",
39 | "Group-Demo~Group-User": "Group-Demo~Group-User",
40 | "Group-Demo": "Group-Demo",
41 | "Group-Help": "Group-Help",
42 | "Group-Html~Group-Star~Group-User-Focus": "Group-Html~Group-Star~Group-User-Focus",
43 | "Group-Star": "Group-Star",
44 | "Group-User-Focus": "Group-User-Focus",
45 | "Group-Html": "Group-Html",
46 | "Group-Risk": "Group-Risk",
47 | "Group-Tools": "Group-Tools",
48 | "Group-User": "Group-User",
49 | "Group-Public": "Group-Public"
50 | }[e] || e) + ".1715247069177.js"
51 | }
52 | function l(t) {
53 | if (t == 'c8ba')
54 | return window;
55 | var n = o[t] = {
56 | i: t,
57 | l: !1,
58 | exports: {}
59 | };
60 | console.log('name:',t)
61 | return e[t].call(n.exports, n, n.exports, l),
62 | n.l = !0,
63 | n.exports
64 | }
65 | l.e = function(e) {
66 | var t = []
67 | , n = {
68 | "Group-Brand": 1,
69 | "Group-Star": 1,
70 | "Group-User-Focus": 1,
71 | "Group-Html": 1,
72 | "Group-Risk": 1,
73 | "Group-Tools": 1,
74 | "Group-User": 1
75 | };
76 | a[e] ? t.push(a[e]) : 0 !== a[e] && n[e] && t.push(a[e] = new Promise((function(t, n) {
77 | for (var o = "css/" + ({
78 | "Group-Brand": "Group-Brand",
79 | "Group-Demo~Group-User": "Group-Demo~Group-User",
80 | "Group-Demo": "Group-Demo",
81 | "Group-Help": "Group-Help",
82 | "Group-Html~Group-Star~Group-User-Focus": "Group-Html~Group-Star~Group-User-Focus",
83 | "Group-Star": "Group-Star",
84 | "Group-User-Focus": "Group-User-Focus",
85 | "Group-Html": "Group-Html",
86 | "Group-Risk": "Group-Risk",
87 | "Group-Tools": "Group-Tools",
88 | "Group-User": "Group-User",
89 | "Group-Public": "Group-Public"
90 | }[e] || e) + "." + {
91 | "Group-Brand": "6e021003",
92 | "Group-Demo~Group-User": "31d6cfe0",
93 | "Group-Demo": "31d6cfe0",
94 | "Group-Help": "31d6cfe0",
95 | "Group-Html~Group-Star~Group-User-Focus": "31d6cfe0",
96 | "Group-Star": "f9edcdaf",
97 | "Group-User-Focus": "1336b200",
98 | "chunk-140484fa": "31d6cfe0",
99 | "Group-Html": "36e832d7",
100 | "Group-Risk": "34da6fc3",
101 | "Group-Tools": "84a16c17",
102 | "Group-User": "2eea4c78",
103 | "chunk-231e072a": "31d6cfe0",
104 | "chunk-4657e2c3": "31d6cfe0",
105 | "Group-Public": "31d6cfe0"
106 | }[e] + ".css", r = l.p + o, i = document.getElementsByTagName("link"), s = 0; s < i.length; s++) {
107 | var c = i[s]
108 | , u = c.getAttribute("data-href") || c.getAttribute("href");
109 | if ("stylesheet" === c.rel && (u === o || u === r))
110 | return t()
111 | }
112 | var p = document.getElementsByTagName("style");
113 | for (s = 0; s < p.length; s++) {
114 | c = p[s],
115 | u = c.getAttribute("data-href");
116 | if (u === o || u === r)
117 | return t()
118 | }
119 | var d = document.createElement("link");
120 | d.rel = "stylesheet",
121 | d.type = "text/css",
122 | d.onload = t,
123 | d.onerror = function(t) {
124 | var o = t && t.target && t.target.src || r
125 | , i = new Error("Loading CSS chunk " + e + " failed.\n(" + o + ")");
126 | i.code = "CSS_CHUNK_LOAD_FAILED",
127 | i.request = o,
128 | delete a[e],
129 | d.parentNode.removeChild(d),
130 | n(i)
131 | }
132 | ,
133 | d.href = r;
134 | var m = document.getElementsByTagName("head")[0];
135 | m.appendChild(d)
136 | }
137 | )).then((function() {
138 | a[e] = 0
139 | }
140 | )));
141 | var o = r[e];
142 | if (0 !== o)
143 | if (o)
144 | t.push(o[2]);
145 | else {
146 | var i = new Promise((function(t, n) {
147 | o = r[e] = [t, n]
148 | }
149 | ));
150 | t.push(o[2] = i);
151 | var c, u = document.createElement("script");
152 | u.charset = "utf-8",
153 | u.timeout = 120,
154 | l.nc && u.setAttribute("nonce", l.nc),
155 | u.src = s(e);
156 | var p = new Error;
157 | c = function(t) {
158 | u.onerror = u.onload = null,
159 | clearTimeout(d);
160 | var n = r[e];
161 | if (0 !== n) {
162 | if (n) {
163 | var o = t && ("load" === t.type ? "missing" : t.type)
164 | , a = t && t.target && t.target.src;
165 | p.message = "Loading chunk " + e + " failed.\n(" + o + ": " + a + ")",
166 | p.name = "ChunkLoadError",
167 | p.type = o,
168 | p.request = a,
169 | n[1](p)
170 | }
171 | r[e] = void 0
172 | }
173 | }
174 | ;
175 | var d = setTimeout((function() {
176 | c({
177 | type: "timeout",
178 | target: u
179 | })
180 | }
181 | ), 12e4);
182 | u.onerror = u.onload = c,
183 | document.head.appendChild(u)
184 | }
185 | return Promise.all(t)
186 | }
187 | ,
188 | l.m = e,
189 | l.c = o,
190 | l.d = function(e, t, n) {
191 | l.o(e, t) || Object.defineProperty(e, t, {
192 | enumerable: !0,
193 | get: n
194 | })
195 | }
196 | ,
197 | l.r = function(e) {
198 | "undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
199 | value: "Module"
200 | }),
201 | Object.defineProperty(e, "__esModule", {
202 | value: !0
203 | })
204 | }
205 | ,
206 | l.t = function(e, t) {
207 | if (1 & t && (e = l(e)),
208 | 8 & t)
209 | return e;
210 | if (4 & t && "object" === typeof e && e && e.__esModule)
211 | return e;
212 | var n = Object.create(null);
213 | if (l.r(n),
214 | Object.defineProperty(n, "default", {
215 | enumerable: !0,
216 | value: e
217 | }),
218 | 2 & t && "string" != typeof e)
219 | for (var o in e)
220 | l.d(n, o, function(t) {
221 | return e[t]
222 | }
223 | .bind(null, o));
224 | return n
225 | }
226 | ,
227 | l.n = function(e) {
228 | var t = e && e.__esModule ? function() {
229 | return e["default"]
230 | }
231 | : function() {
232 | return e
233 | }
234 | ;
235 | return l.d(t, "a", t),
236 | t
237 | }
238 | ,
239 | l.o = function(e, t) {
240 | return Object.prototype.hasOwnProperty.call(e, t)
241 | }
242 | ,
243 | l.p = "/",
244 | l.oe = function(e) {
245 | throw console.error(e),
246 | e
247 | }
248 | ;
249 | window.enc = l
250 | var c = window["webpackJsonp"] = window["webpackJsonp"] || []
251 | , u = c.push.bind(c);
252 | c.push = t,
253 | c = c.slice();
254 | for (var p = 0; p < c.length; p++)
255 | t(c[p]);
256 | var d = u;
257 | i.push([0, "chunk-vendors"]),
258 | n()
259 | }
260 | )({
261 | 1: function(t, e) {},
262 | "21bf": function(t, e, r) {
263 | (function(e) {
264 | (function(e, r) {
265 | t.exports = r()
266 | }
267 | )(0, (function() {
268 | var t = t || function(t, n) {
269 | var i;
270 | if ("undefined" !== typeof window && window.crypto && (i = window.crypto),
271 | "undefined" !== typeof self && self.crypto && (i = self.crypto),
272 | "undefined" !== typeof globalThis && globalThis.crypto && (i = globalThis.crypto),
273 | !i && "undefined" !== typeof window && window.msCrypto && (i = window.msCrypto),
274 | !i && "undefined" !== typeof e && e.crypto && (i = e.crypto),
275 | !i)
276 | try {
277 | i = r(1)
278 | } catch (y) {}
279 | var o = function() {
280 | if (i) {
281 | if ("function" === typeof i.getRandomValues)
282 | try {
283 | return i.getRandomValues(new Uint32Array(1))[0]
284 | } catch (y) {}
285 | if ("function" === typeof i.randomBytes)
286 | try {
287 | return i.randomBytes(4).readInt32LE()
288 | } catch (y) {}
289 | }
290 | throw new Error("Native crypto module could not be used to get secure random number.")
291 | }
292 | , c = Object.create || function() {
293 | function t() {}
294 | return function(e) {
295 | var r;
296 | return t.prototype = e,
297 | r = new t,
298 | t.prototype = null,
299 | r
300 | }
301 | }()
302 | , s = {}
303 | , a = s.lib = {}
304 | , f = a.Base = function() {
305 | return {
306 | extend: function(t) {
307 | var e = c(this);
308 | return t && e.mixIn(t),
309 | e.hasOwnProperty("init") && this.init !== e.init || (e.init = function() {
310 | e.$super.init.apply(this, arguments)
311 | }
312 | ),
313 | e.init.prototype = e,
314 | e.$super = this,
315 | e
316 | },
317 | create: function() {
318 | var t = this.extend();
319 | return t.init.apply(t, arguments),
320 | t
321 | },
322 | init: function() {},
323 | mixIn: function(t) {
324 | for (var e in t)
325 | t.hasOwnProperty(e) && (this[e] = t[e]);
326 | t.hasOwnProperty("toString") && (this.toString = t.toString)
327 | },
328 | clone: function() {
329 | return this.init.prototype.extend(this)
330 | }
331 | }
332 | }()
333 | , h = a.WordArray = f.extend({
334 | init: function(t, e) {
335 | t = this.words = t || [],
336 | this.sigBytes = e != n ? e : 4 * t.length
337 | },
338 | toString: function(t) {
339 | return (t || l).stringify(this)
340 | },
341 | concat: function(t) {
342 | var e = this.words
343 | , r = t.words
344 | , n = this.sigBytes
345 | , i = t.sigBytes;
346 | if (this.clamp(),
347 | n % 4)
348 | for (var o = 0; o < i; o++) {
349 | var c = r[o >>> 2] >>> 24 - o % 4 * 8 & 255;
350 | e[n + o >>> 2] |= c << 24 - (n + o) % 4 * 8
351 | }
352 | else
353 | for (var s = 0; s < i; s += 4)
354 | e[n + s >>> 2] = r[s >>> 2];
355 | return this.sigBytes += i,
356 | this
357 | },
358 | clamp: function() {
359 | var e = this.words
360 | , r = this.sigBytes;
361 | e[r >>> 2] &= 4294967295 << 32 - r % 4 * 8,
362 | e.length = t.ceil(r / 4)
363 | },
364 | clone: function() {
365 | var t = f.clone.call(this);
366 | return t.words = this.words.slice(0),
367 | t
368 | },
369 | random: function(t) {
370 | for (var e = [], r = 0; r < t; r += 4)
371 | e.push(o());
372 | return new h.init(e,t)
373 | }
374 | })
375 | , u = s.enc = {}
376 | , l = u.Hex = {
377 | stringify: function(t) {
378 | for (var e = t.words, r = t.sigBytes, n = [], i = 0; i < r; i++) {
379 | var o = e[i >>> 2] >>> 24 - i % 4 * 8 & 255;
380 | n.push((o >>> 4).toString(16)),
381 | n.push((15 & o).toString(16))
382 | }
383 | return n.join("")
384 | },
385 | parse: function(t) {
386 | for (var e = t.length, r = [], n = 0; n < e; n += 2)
387 | r[n >>> 3] |= parseInt(t.substr(n, 2), 16) << 24 - n % 8 * 4;
388 | return new h.init(r,e / 2)
389 | }
390 | }
391 | , d = u.Latin1 = {
392 | stringify: function(t) {
393 | for (var e = t.words, r = t.sigBytes, n = [], i = 0; i < r; i++) {
394 | var o = e[i >>> 2] >>> 24 - i % 4 * 8 & 255;
395 | n.push(String.fromCharCode(o))
396 | }
397 | return n.join("")
398 | },
399 | parse: function(t) {
400 | for (var e = t.length, r = [], n = 0; n < e; n++)
401 | r[n >>> 2] |= (255 & t.charCodeAt(n)) << 24 - n % 4 * 8;
402 | return new h.init(r,e)
403 | }
404 | }
405 | , p = u.Utf8 = {
406 | stringify: function(t) {
407 | try {
408 | return decodeURIComponent(escape(d.stringify(t)))
409 | } catch (e) {
410 | throw new Error("Malformed UTF-8 data")
411 | }
412 | },
413 | parse: function(t) {
414 | return d.parse(unescape(encodeURIComponent(t)))
415 | }
416 | }
417 | , _ = a.BufferedBlockAlgorithm = f.extend({
418 | reset: function() {
419 | this._data = new h.init,
420 | this._nDataBytes = 0
421 | },
422 | _append: function(t) {
423 | "string" == typeof t && (t = p.parse(t)),
424 | this._data.concat(t),
425 | this._nDataBytes += t.sigBytes
426 | },
427 | _process: function(e) {
428 | var r, n = this._data, i = n.words, o = n.sigBytes, c = this.blockSize, s = 4 * c, a = o / s;
429 | a = e ? t.ceil(a) : t.max((0 | a) - this._minBufferSize, 0);
430 | var f = a * c
431 | , u = t.min(4 * f, o);
432 | if (f) {
433 | for (var l = 0; l < f; l += c)
434 | this._doProcessBlock(i, l);
435 | r = i.splice(0, f),
436 | n.sigBytes -= u
437 | }
438 | return new h.init(r,u)
439 | },
440 | clone: function() {
441 | var t = f.clone.call(this);
442 | return t._data = this._data.clone(),
443 | t
444 | },
445 | _minBufferSize: 0
446 | })
447 | , v = (a.Hasher = _.extend({
448 | cfg: f.extend(),
449 | init: function(t) {
450 | this.cfg = this.cfg.extend(t),
451 | this.reset()
452 | },
453 | reset: function() {
454 | _.reset.call(this),
455 | this._doReset()
456 | },
457 | update: function(t) {
458 | return this._append(t),
459 | this._process(),
460 | this
461 | },
462 | finalize: function(t) {
463 | t && this._append(t);
464 | var e = this._doFinalize();
465 | return e
466 | },
467 | blockSize: 16,
468 | _createHelper: function(t) {
469 | return function(e, r) {
470 | return new t.init(r).finalize(e)
471 | }
472 | },
473 | _createHmacHelper: function(t) {
474 | return function(e, r) {
475 | return new v.HMAC.init(t,r).finalize(e)
476 | }
477 | }
478 | }),
479 | s.algo = {});
480 | return s
481 | }(Math);
482 | return t
483 | }
484 | ))
485 | }
486 | ).call(this, r("c8ba"))
487 | },
488 | 1132: function(t, e, r) {
489 | (function(e, n) {
490 | t.exports = n(r("21bf"))
491 | }
492 | )(0, (function(t) {
493 | return function() {
494 | var e = t
495 | , r = e.lib
496 | , n = r.WordArray
497 | , i = e.enc;
498 | i.Base64 = {
499 | stringify: function(t) {
500 | var e = t.words
501 | , r = t.sigBytes
502 | , n = this._map;
503 | t.clamp();
504 | for (var i = [], o = 0; o < r; o += 3)
505 | for (var c = e[o >>> 2] >>> 24 - o % 4 * 8 & 255, s = e[o + 1 >>> 2] >>> 24 - (o + 1) % 4 * 8 & 255, a = e[o + 2 >>> 2] >>> 24 - (o + 2) % 4 * 8 & 255, f = c << 16 | s << 8 | a, h = 0; h < 4 && o + .75 * h < r; h++)
506 | i.push(n.charAt(f >>> 6 * (3 - h) & 63));
507 | var u = n.charAt(64);
508 | if (u)
509 | while (i.length % 4)
510 | i.push(u);
511 | return i.join("")
512 | },
513 | parse: function(t) {
514 | var e = t.length
515 | , r = this._map
516 | , n = this._reverseMap;
517 | if (!n) {
518 | n = this._reverseMap = [];
519 | for (var i = 0; i < r.length; i++)
520 | n[r.charCodeAt(i)] = i
521 | }
522 | var c = r.charAt(64);
523 | if (c) {
524 | var s = t.indexOf(c);
525 | -1 !== s && (e = s)
526 | }
527 | return o(t, e, n)
528 | },
529 | _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
530 | };
531 | function o(t, e, r) {
532 | for (var i = [], o = 0, c = 0; c < e; c++)
533 | if (c % 4) {
534 | var s = r[t.charCodeAt(c - 1)] << c % 4 * 2
535 | , a = r[t.charCodeAt(c)] >>> 6 - c % 4 * 2
536 | , f = s | a;
537 | i[o >>> 2] |= f << 24 - o % 4 * 8,
538 | o++
539 | }
540 | return n.create(i, o)
541 | }
542 | }(),
543 | t
544 | }
545 | ))
546 | }
547 | });
548 |
549 |
550 |
551 |
552 |
553 | function encrypt(user, pwd) {
554 | var enc = window.enc(1132)
555 | var user = enc.enc.Base64.stringify(enc.enc.Utf8.parse(user))
556 | var pwd = enc.enc.Base64.stringify(enc.enc.Utf8.parse(pwd))
557 | return {user, pwd}
558 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CrackJS
2 | ❗❗❗ 声明:本仓库中所有内容仅供学习交流使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,在本仓库中下载的文件学习完毕之后请于 24 小时内删除!若有侵权,请联系我立即删除!(v:S_june11)
3 |
4 | ### js逆向
5 |
6 |
7 |
8 | | 难度 | 项目 | 备注 | 导航 | URL |
9 | | :--: | :--------: | :---------------------------------------: | :---------------------: | :----------------------------------------------------------: |
10 | | ⭐ | 百度翻译 | 请求加密sign值 | [冲!](./01_百度翻译) | [链接](https://fanyi.baidu.com) |
11 | | ⭐⭐ | 有道翻译 | webpack扣取加密sign值 | [冲!](./02_有道翻译) | [链接](http://fanyi.youdao.com/index.html) |
12 | | ⭐ | 房天下 | 密码加密 | [冲!](./03_房天下) | [链接](https://passport.fang.com/) |
13 | | ⭐ | G妹游戏 | webpack入门 | [冲!](./04_G妹游戏) | [链接](https://passport.gm99.com/) |
14 | | ⭐⭐ | 中华人才网 | 滑块验证码,职位详情页请求多次需要滑块验证 | [冲!](./05_中华人才网) | [链接](http://www.zhrc.com/CompanyDetail.aspx?id=2622#1090265) |
15 | | ⭐⭐ | 微博 | 账号密码加密 | [冲!](./06_微博) | [链接](https://www.weibo.com/login.php/#_loginLayer_1701750554284) |
16 | | ⭐⭐⭐ | 南昌人才网 | 极验初代滑块 | [冲!](./07_南昌人才网) | [链接](https://www.ncrczpw.com/index.php?m=&c=members&a=login) |
17 | | ⭐ | 当乐网 | 密码加密 | [冲!](08_当乐网) | [链接](https://oauth.d.cn/auth/goLogin.html) |
18 | | ⭐ | 酷我音乐 | reqId参数,参数意义不大,纯当webpack练习 | [冲!](09_酷我音乐) | [链接](https://kuwo.cn/) |
19 | | ⭐⭐ | 升学e网通 | sign和password加密 | [冲!](./10_升学e网通) | [链接](https://www.ewt360.com/site-www/home/page) |
20 | | ⭐ | 全国建筑市场 | 返回值加密 | [冲!](./10_全国建筑市场) | [链接](https://jzsc.mohurd.gov.cn/data/company) |
21 | | / | 猿人学(第一期) | / | [冲!](./12_猿人学系列(第一期)) | [链接](https://match.yuanrenxue.cn) |
22 | | ⭐ | 临安人才网 | cookie加密 | [冲!](./13_临安人才网) | [链接](https://www.lazpw.cn/) |
23 | | ⭐⭐ | GOV | 加速乐 | [冲!](./14_gov) | [链接](https://www.mps.gov.cn/n2254098/n4904352/index_3497341_74.html) |
24 | | ⭐⭐ | B站 | password | [冲!](./15_Bilibili) | [链接](https://space.bilibili.com) |
25 | | ⭐⭐⭐ | 去哪儿旅行 | 登录滑块 | [冲!](./16_去哪儿旅行) | [链接](https://user.qunar.com/passport/login.jsp) |
26 | | ⭐⭐⭐⭐ | 豆瓣 | 只完成了滑块缺口位置获取 | [冲!](./17_豆瓣) | [链接](https://www.douban.com/)|
27 | | ⭐ | 唯品会 | 补环境 | [冲!](./18_唯品会) | [链接](https://category.vip.com/)|
28 | | ⭐ | 超星学习通 | 登录 | [冲!](./19_超星学习通) | [链接](https://passport2.chaoxing.com/)|
29 | | ⭐⭐⭐ | 山西省电子税务局 | 滑块验证码 | [冲!](./20_山西省电子税务局) | [链接](https://etax.shanxi.chinatax.gov.cn/gzfw/xydjalnsrcx)|
30 | | ⭐ | 优购网 | 数字字母验证码,登录流程 | [冲!](./21_优购网) | [链接](https://www.yougou.com/)|
31 | | ⭐⭐⭐ | 当当网 | 滑块验证码,登录流程 | [冲!](./22_当当网) | [链接](https://login.dangdang.com/)|
32 | | ⭐ | 58同城 | 密码加密 | [冲!](./23_58同城) | [链接](https://passport.58.com/login)|
33 | | ⭐⭐ | 艺恩星数 | webpack,需要稍微改写一下返回值,账号密码加密 | [冲!](./24_艺恩星数) | [链接](https://www.endata.com.cn/)|
34 | | ⭐⭐⭐ | 今日头条 | 补环境、插桩、条件断点使用 | [冲!](./25_今日头条) | [链接](https://www.toutiao.com/)|
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------