├── 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 | --------------------------------------------------------------------------------