反編譯某聽書網站直接獲取音訊地址
阿新 • • 發佈:2020-11-13
最近在聽這本小說, 不過資源部好找, 找到一個線上聽書的,想把資源下載下來,就嘗試反編譯一下,然後把過程分享一下。
F12獲取他播放的音訊檔案 是m4a的。
在檢視對應的目錄結構,裡面是沒有m4a的檔案,只有data-path一個 加密字串,看起來是base64的。
通過地址、檔名等關鍵詞搜尋,也沒有搜尋到相關資訊,怎麼辦呢,繼續找找其他的吧。
通過斷點找到一個這個加密解密相關的檔案,,把他格式化一下。
var CryptoJS = CryptoJS || function(u, p) { var d = {}, l = d.lib = {}, s = function() {}, t = l.Base = { extend: function(a) { s.prototype = this; var c = new s; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function() { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function() { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function() {}, mixIn: function(a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function() { return this.init.prototype.extend(this) } }, r = l.WordArray = t.extend({ init: function(a, c) { a = this.words = a || []; this.sigBytes = c != p ? c : 4 * a.length }, toString: function(a) { return (a || v).stringify(this) }, concat: function(a) { var c = this.words, e = a.words, j = this.sigBytes; a = a.sigBytes; this.clamp(); if (j % 4) for (var k = 0; k < a; k++) c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4); else if (65535 < e.length) for (k = 0; k < a; k += 4) c[j + k >>> 2] = e[k >>> 2]; else c.push.apply(c, e); this.sigBytes += a; return this }, clamp: function() { var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4); a.length = u.ceil(c / 4) }, clone: function() { var a = t.clone.call(this); a.words = this.words.slice(0); return a }, random: function(a) { for (var c = [], e = 0; e < a; e += 4) c.push(4294967296 * u.random() | 0); return new r.init(c, a) } }), w = d.enc = {}, v = w.Hex = { stringify: function(a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) { var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255; e.push((k >>> 4).toString(16)); e.push((k & 15).toString(16)) } return e.join("") }, parse: function(a) { for (var c = a.length, e = [], j = 0; j < c; j += 2) e[j >>> 3] |= parseInt(a.substr(j, 2), 16) << 24 - 4 * (j % 8); return new r.init(e, c / 2) } }, b = w.Latin1 = { stringify: function(a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return e.join("") }, parse: function(a) { for (var c = a.length, e = [], j = 0; j < c; j++) e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4); return new r.init(e, c) } }, x = w.Utf8 = { stringify: function(a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function(a) { return b.parse(unescape(encodeURIComponent(a))) } }, q = l.BufferedBlockAlgorithm = t.extend({ reset: function() { this._data = new r.init; this._nDataBytes = 0 }, _append: function(a) { "string" == typeof a && (a = x.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function(a) { var c = this._data, e = c.words, j = c.sigBytes, k = this.blockSize, b = j / (4 * k), b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0); a = b * k; j = u.min(4 * a, j); if (a) { for (var q = 0; q < a; q += k) this._doProcessBlock(e, q); q = e.splice(0, a); c.sigBytes -= j } return new r.init(q, j) }, clone: function() { var a = t.clone.call(this); a._data = this._data.clone(); return a }, _minBufferSize: 0 }); l.Hasher = q.extend({ cfg: t.extend(), init: function(a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function() { q.reset.call(this); this._doReset() }, update: function(a) { this._append(a); this._process(); return this }, finalize: function(a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function(a) { return function(b, e) { return (new a.init(e)).finalize(b) } }, _createHmacHelper: function(a) { return function(b, e) { return (new n.HMAC.init(a, e)).finalize(b) } } }); var n = d.algo = {}; return d }(Math); (function() { var h = CryptoJS, j = h.lib.WordArray; h.enc.Base64 = { stringify: function(b) { var e = b.words, f = b.sigBytes, c = this._map; b.clamp(); b = []; for (var a = 0; a < f; a += 3) for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63)); if (e = c.charAt(64)) for (; b.length % 4;) b.push(e); return b.join("") }, parse: function(b) { var e = b.length, f = this._map, c = f.charAt(64); c && (c = b.indexOf(c), -1 != c && (e = c)); for (var c = [], a = 0, d = 0; d < e; d++) if (d % 4) { var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4); c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4); a++ } return j.create(c, a) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } })(); CryptoJS.lib.Cipher || function(u) { var p = CryptoJS, d = p.lib, l = d.Base, s = d.WordArray, t = d.BufferedBlockAlgorithm, r = p.enc.Base64, w = p.algo.EvpKDF, v = d.Cipher = t.extend({ cfg: l.extend(), createEncryptor: function(e, a) { return this.create(this._ENC_XFORM_MODE, e, a) }, createDecryptor: function(e, a) { return this.create(this._DEC_XFORM_MODE, e, a) }, init: function(e, a, b) { this.cfg = this.cfg.extend(b); this._xformMode = e; this._key = a; this.reset() }, reset: function() { t.reset.call(this); this._doReset() }, process: function(e) { this._append(e); return this._process() }, finalize: function(e) { e && this._append(e); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function(e) { return { encrypt: function(b, k, d) { return ("string" == typeof k ? c : a).encrypt(e, b, k, d) }, decrypt: function(b, k, d) { return ("string" == typeof k ? c : a).decrypt(e, b, k, d) } } } }); d.StreamCipher = v.extend({ _doFinalize: function() { return this._process(!0) }, blockSize: 1 }); var b = p.mode = {}, x = function(e, a, b) { var c = this._iv; c ? this._iv = u : c = this._prevBlock; for (var d = 0; d < b; d++) e[a + d] ^= c[d] }, q = (d.BlockCipherMode = l.extend({ createEncryptor: function(e, a) { return this.Encryptor.create(e, a) }, createDecryptor: function(e, a) { return this.Decryptor.create(e, a) }, init: function(e, a) { this._cipher = e; this._iv = a } })).extend(); q.Encryptor = q.extend({ processBlock: function(e, a) { var b = this._cipher, c = b.blockSize; x.call(this, e, a, c); b.encryptBlock(e, a); this._prevBlock = e.slice(a, a + c) } }); q.Decryptor = q.extend({ processBlock: function(e, a) { var b = this._cipher, c = b.blockSize, d = e.slice(a, a + c); b.decryptBlock(e, a); x.call(this, e, a, c); this._prevBlock = d } }); b = b.CBC = q; q = (p.pad = {}).Pkcs7 = { pad: function(a, b) { for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4) l.push(d); c = s.create(l, c); a.concat(c) }, unpad: function(a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; d.BlockCipher = v.extend({ cfg: v.cfg.extend({ mode: b, padding: q }), reset: function() { v.reset.call(this); var a = this.cfg, b = a.iv, a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor; else c = a.createDecryptor, this._minBufferSize = 1; this._mode = c.call(a, this, b && b.words) }, _doProcessBlock: function(a, b) { this._mode.processBlock(a, b) }, _doFinalize: function() { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var b = this._process(!0) } else b = this._process(!0), a.unpad(b); return b }, blockSize: 4 }); var n = d.CipherParams = l.extend({ init: function(a) { this.mixIn(a) }, toString: function(a) { return (a || this.formatter).stringify(this) } }), b = (p.format = {}).OpenSSL = { stringify: function(a) { var b = a.ciphertext; a = a.salt; return (a ? s.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r) }, parse: function(a) { a = r.parse(a); var b = a.words; if (1398893684 == b[0] && 1701076831 == b[1]) { var c = s.create(b.slice(2, 4)); b.splice(0, 4); a.sigBytes -= 16 } return n.create({ ciphertext: a, salt: c }) } }, a = d.SerializableCipher = l.extend({ cfg: l.extend({ format: b }), encrypt: function(a, b, c, d) { d = this.cfg.extend(d); var l = a.createEncryptor(c, d); b = l.finalize(b); l = l.cfg; return n.create({ ciphertext: b, key: c, iv: l.iv, algorithm: a, mode: l.mode, padding: l.padding, blockSize: a.blockSize, formatter: d.format }) }, decrypt: function(a, b, c, d) { d = this.cfg.extend(d); b = this._parse(b, d.format); return a.createDecryptor(c, d).finalize(b.ciphertext) }, _parse: function(a, b) { return "string" == typeof a ? b.parse(a, this) : a } }), p = (p.kdf = {}).OpenSSL = { execute: function(a, b, c, d) { d || (d = s.random(8)); a = w.create({ keySize: b + c }).compute(a, d); c = s.create(a.words.slice(b), 4 * c); a.sigBytes = 4 * b; return n.create({ key: a, iv: c, salt: d }) } }, c = d.PasswordBasedCipher = a.extend({ cfg: a.cfg.extend({ kdf: p }), encrypt: function(b, c, d, l) { l = this.cfg.extend(l); d = l.kdf.execute(d, b.keySize, b.ivSize); l.iv = d.iv; b = a.encrypt.call(this, b, c, d.key, l); b.mixIn(d); return b }, decrypt: function(b, c, d, l) { l = this.cfg.extend(l); c = this._parse(c, l.format); d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt); l.iv = d.iv; return a.decrypt.call(this, b, c, d.key, l) } }) }(); (function() { for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++) a[c] = 128 > c ? c << 1 : c << 1 ^ 283; for (var e = 0, j = 0, c = 0; 256 > c; c++) { var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4, k = k >>> 8 ^ k & 255 ^ 99; l[e] = k; s[k] = e; var z = a[e], F = a[z], G = a[F], y = 257 * a[k] ^ 16843008 * k; t[e] = y << 24 | y >>> 8; r[e] = y << 16 | y >>> 16; w[e] = y << 8 | y >>> 24; v[e] = y; y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e; b[k] = y << 24 | y >>> 8; x[k] = y << 16 | y >>> 16; q[k] = y << 8 | y >>> 24; n[k] = y; e ? (e = z ^ a[a[a[G ^ z]]], j ^= a[a[j]]) : e = j = 1 } var H = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], d = d.AES = p.extend({ _doReset: function() { for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++) if (j < d) e[j] = c[j]; else { var k = e[j - 1]; j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24, k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255], k ^= H[j / d | 0] << 24); e[j] = e[j - d] ^ k } c = this._invKeySchedule = []; for (d = 0; d < a; d++) j = a - d, k = d % 4 ? e[j] : e[j - 4], c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>> 8 & 255]] ^ n[l[k & 255]] }, encryptBlock: function(a, b) { this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l) }, decryptBlock: function(a, c) { var d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d; this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s); d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d }, _doCryptBlock: function(a, b, c, d, e, j, l, f) { for (var m = this._nRounds, g = a ^ c[0], h = a[b + 1] ^ c[1], k = a[b + 2] ^ c[2], n = a[b + 3] ^ c[3], p = 4, r = 1; r < m; r++) var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p++], s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p++], t = d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p++], n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p++], g = q, h = s, k = t; q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p++]; s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p++]; t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p++]; n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p++]; a = q; a[b + 1] = s; a[b + 2] = t; a[b + 3] = n }, keySize: 8 }); u.AES = p._createHelper(d) })(); function Base64() { _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; this.encode = function(input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = _utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64 } else if (isNaN(chr3)) { enc4 = 64 } output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); } return output; }, this.decode = function(input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = _utf8_decode(output); return output; }, _utf8_encode = function(string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128) } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, _utf8_decode = function(utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++ } else if ((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2 } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3 } } return string; } } var _0xodl = 'jsjiami.com.v6', _0x37e8 = [_0xodl, 'YsKlG8Ohw4xLw5QawqHCr0fDnjoU', 'UlfCnA==', 'w53CizQ4', 'VcOwNMO1Ww==', 'Dnx2A8Oz', 'cMOlIMK+', 'EjM+wpE0', 'w4t9Fg==', 'QcO0JcO0R8KkKw==', 'NUpq', 'InAfC8OXSMKWIw==', 'wq0Twqc=', 'fD7DlnnCpg==', 'wpEpw7TDnQ8=', 'w6nCjyJswpw=', 'AghJwpxH', 'XVHDgcKXbg==', 'eMOzwprDksKZ', 'w4bCt8KFwpvCpcKqccO7wrM=', 'AjbDvcOOw4BQWMKi', 'SQ4Ww558wobDvsOhXEjDtlo0JsKVT0HDq8K1w7LCmBBPwplefMKYNMKTcTHCozjDrcOdMEPCjsKlw5HCksKvXgUzwpQ2wrUdWA==', 'w4Ecw6BYFA==', 'wofCk0pwwqk=', 'RWDDkyPDqA==', 'wr0+PMK2cg==', 'w5nDsmVWDw==', 'QcO8w7LCjio=', 'YcOQw6vDk8OT', 'NsKAPgs/', 'LBlhwrN/', 'w4HDqcOhNQs=', 'AgVZcV7CsHs=', 'BjMDwrIo', 'RcKcOcOPwoo=', 'w6PDkMKXa8Kew7fDqCxew7A=', 'NRzDt2g+', 'PC1nw5Ea', 'XcKKMsOUwps=', 'An/Cu8KSwp4=', 'IMKLAAAV', 'aMOhw43Dr8On', 'FsKvJAggMA==', 'a8OywpHDl8KI', 'w7YLw7rCtn8=', 'WF/Cmh8w', 'wps0w7/DiDPDtQ==', 'w4PCrx14wok=', 'RU7DnxHDqQ==', 'w5fDp8OEISY=', 'HzrDu0Avw4c=', 'woHCjEfDilfDoQ==', 'dz7DkjrDqg==', 'AcOrw6cBKA==', 'wo1CHXEQ', 'w7PDqHVUDg==', 'DzXDhcO9w5s=', 'w40Hw7tiPQ==', 'RWLDuAPCjww=', 'EcOjw45APcKM', 'QGnDsgHCgysm', 'b8OhD2zCi8KY', 'HhRmw6Ep', 'H1N0IsOaw5jDtQ==', 'EMOgw45yEw==', 'wrXDkMKST8Oj', 'wqhhw6nCnHTCqQo0wok=', 'JzYZgrjskjinamiY.nclomEAk.v6Td==']; (function(_0x352039, _0x49452d, _0x39af96) { var _0x36a017 = function(_0x4ab7ef, _0x56e13b, _0x4fb331, _0x1de395, _0xaa5fe2) { _0x56e13b = _0x56e13b >> 0x8, _0xaa5fe2 = 'po'; var _0x2691c6 = 'shift', _0x4b4a30 = 'push'; if (_0x56e13b < _0x4ab7ef) { while (--_0x4ab7ef) { _0x1de395 = _0x352039[_0x2691c6](); if (_0x56e13b === _0x4ab7ef) { _0x56e13b = _0x1de395; _0x4fb331 = _0x352039[_0xaa5fe2 + 'p'](); } else if (_0x56e13b && _0x4fb331['replace'](/[JzYZgrknYnlEAkTd=]/g, '') === _0x56e13b) { _0x352039[_0x4b4a30](_0x1de395); } } _0x352039[_0x4b4a30](_0x352039[_0x2691c6]()); } return 0x52e23; }; return _0x36a017(++_0x49452d, _0x39af96) >> _0x49452d ^ _0x39af96; }(_0x37e8, 0x90, 0x9000)); var _0x2555 = function(_0x3f9a28, _0x47dd6f) { _0x3f9a28 = ~~'0x' ['concat'](_0x3f9a28); var _0x1e1327 = _0x37e8[_0x3f9a28]; if (_0x2555['XVHLTR'] === undefined) { (function() { var _0x1885d1 = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this; var _0x2fc5e2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; _0x1885d1['atob'] || (_0x1885d1['atob'] = function(_0x5918bb) { var _0x51db74 = String(_0x5918bb)['replace'](/=+$/, ''); for (var _0x544078 = 0x0, _0x574720, _0x44586c, _0x2ec80e = 0x0, _0x511cb7 = ''; _0x44586c = _0x51db74['charAt'](_0x2ec80e++);~_0x44586c && (_0x574720 = _0x544078 % 0x4 ? _0x574720 * 0x40 + _0x44586c : _0x44586c, _0x544078++ % 0x4) ? _0x511cb7 += String['fromCharCode'](0xff & _0x574720 >> (-0x2 * _0x544078 & 0x6)) : 0x0) { _0x44586c = _0x2fc5e2['indexOf'](_0x44586c); } return _0x511cb7; }); }()); var _0x2d7e9f = function(_0x188f49, _0x47dd6f) { var _0x49cbdc = [], _0x2a5905 = 0x0, _0x5b9e45, _0x253e96 = '', _0xb75a96 = ''; _0x188f49 = atob(_0x188f49); for (var _0x5bfa5d = 0x0, _0x42e242 = _0x188f49['length']; _0x5bfa5d < _0x42e242; _0x5bfa5d++) { _0xb75a96 += '%' + ('00' + _0x188f49['charCodeAt'](_0x5bfa5d)['toString'](0x10))['slice'](-0x2); } _0x188f49 = decodeURIComponent(_0xb75a96); for (var _0x2be2b7 = 0x0; _0x2be2b7 < 0x100; _0x2be2b7++) { _0x49cbdc[_0x2be2b7] = _0x2be2b7; } for (_0x2be2b7 = 0x0; _0x2be2b7 < 0x100; _0x2be2b7++) { _0x2a5905 = (_0x2a5905 + _0x49cbdc[_0x2be2b7] + _0x47dd6f['charCodeAt'](_0x2be2b7 % _0x47dd6f['length'])) % 0x100; _0x5b9e45 = _0x49cbdc[_0x2be2b7]; _0x49cbdc[_0x2be2b7] = _0x49cbdc[_0x2a5905]; _0x49cbdc[_0x2a5905] = _0x5b9e45; } _0x2be2b7 = 0x0; _0x2a5905 = 0x0; for (var _0x204da7 = 0x0; _0x204da7 < _0x188f49['length']; _0x204da7++) { _0x2be2b7 = (_0x2be2b7 + 0x1) % 0x100; _0x2a5905 = (_0x2a5905 + _0x49cbdc[_0x2be2b7]) % 0x100; _0x5b9e45 = _0x49cbdc[_0x2be2b7]; _0x49cbdc[_0x2be2b7] = _0x49cbdc[_0x2a5905]; _0x49cbdc[_0x2a5905] = _0x5b9e45; _0x253e96 += String['fromCharCode'](_0x188f49['charCodeAt'](_0x204da7) ^ _0x49cbdc[(_0x49cbdc[_0x2be2b7] + _0x49cbdc[_0x2a5905]) % 0x100]); } return _0x253e96; }; _0x2555['hQGVbW'] = _0x2d7e9f; _0x2555['wPdCUn'] = {}; _0x2555['XVHLTR'] = !! []; } var _0x16ec99 = _0x2555['wPdCUn'][_0x3f9a28]; if (_0x16ec99 === undefined) { if (_0x2555['gmKTTM'] === undefined) { _0x2555['gmKTTM'] = !! []; } _0x1e1327 = _0x2555['hQGVbW'](_0x1e1327, _0x47dd6f); _0x2555['wPdCUn'][_0x3f9a28] = _0x1e1327; } else { _0x1e1327 = _0x16ec99; } return _0x1e1327; }; var _0x12c907 = function() { var _0x5874b2 = { 'LAvwk': function(_0x2fbbe3, _0x8ba10b) { return _0x2fbbe3 === _0x8ba10b; }, 'PjrYs': 'fxerH' }; var _0x18e9ee = !! []; return function(_0x28f71e, _0xd97c64) { var _0xc4d46e = { 'oqJiP': function(_0x11f4da, _0x116167) { return _0x5874b2['LAvwk'](_0x11f4da, _0x116167); }, 'EiOAz': _0x5874b2['PjrYs'] }; var _0x25f1bd = _0x18e9ee ? function() { if (_0xc4d46e['oqJiP'](_0xc4d46e[_0x2555('0', 'IWU5')], _0x2555('1', 'SRZU'))) { if (_0xd97c64) { var _0x56b5ec = _0xd97c64[_0x2555('2', 'S12o')](_0x28f71e, arguments); _0xd97c64 = null; return _0x56b5ec; } } else { func(); } } : function() {}; _0x18e9ee = ![]; return _0x25f1bd; }; }(); var _0x334e01 = _0x12c907(this, function() { var _0x439407 = { 'KcRco': function(_0x6bd48a, _0x443f38) { return _0x6bd48a !== _0x443f38; }, 'DhKbO': _0x2555('3', '%H!6'), 'nsuTX': function(_0x446408, _0x33c56f) { return _0x446408 == _0x33c56f; }, 'kfgre': 'Nifhd', 'hYihY': _0x2555('4', '&G5%'), 'ZAJoA': _0x2555('5', 'eZfw'), 'LzRMS': _0x2555('6', 'j%xJ'), 'jDFlQ': 'object', 'pNZIM': function(_0x337dcd, _0x12872a) { return _0x337dcd === _0x12872a; }, 'gBShl': _0x2555('7', 'RzD6'), 'LJtdk': function(_0x1bb670, _0x1d3ca0) { return _0x1bb670 === _0x1d3ca0; }, 'pLCVa': _0x2555('8', 'U4nZ'), 'daOPy': '[hzdJjxeesrklGQTJSlbOGrQRsJBIYZUIHeJd]', 'vxrdx': function(_0x1ac519, _0x23de7f) { return _0x1ac519 !== _0x23de7f; }, 'qyFfA': 'RDmqB', 'ofedG': function(_0x2eccb4, _0x5aa725) { return _0x2eccb4 == _0x5aa725; }, 'KPOxl': function(_0x2f9fd4, _0x1f4536) { return _0x2f9fd4 !== _0x1f4536; }, 'fBfBL': _0x2555('9', 'zfh#'), 'NDSzd': function(_0x3d1484, _0x4d05a0) { return _0x3d1484 == _0x4d05a0; }, 'EsPSb': 'TTzOH', 'ELnoL': 'AOtaz', 'VkFsA': function(_0x1e7142, _0x813b5b) { return _0x1e7142 || _0x813b5b; }, 'ayBan': _0x2555('a', 'q&Y)'), 'YmTXQ': function(_0x538aaa, _0x3da27f) { return _0x538aaa < _0x3da27f; }, 'narNd': function(_0x22fd16, _0x3ec484) { return _0x22fd16 - _0x3ec484; }, 'tbnFd': function(_0x5d7b3f, _0x5d4985) { return _0x5d7b3f !== _0x5d4985; }, 'oOXzR': function(_0x2cb824, _0x300f75) { return _0x2cb824 === _0x300f75; }, 'xiuZi': _0x2555('b', 'xPUC'), 'mfnUZ': _0x2555('c', 'Zf9)'), 'CCZNa': function(_0x521a01, _0x5af6db) { return _0x521a01 !== _0x5af6db; }, 'ktKQW': function(_0x26210b) { return _0x26210b(); } }; var _0x3ebaae = _0x439407[_0x2555('d', '!UHc')](typeof window, _0x439407[_0x2555('e', 'CJp%')]) ? window : typeof process === _0x439407['jDFlQ'] && _0x439407['pNZIM'](typeof require, _0x439407[_0x2555('f', '!mco')]) && _0x439407[_0x2555('10', 'yzGm')](typeof global, _0x439407[_0x2555('11', '%H!6')]) ? global : this; var _0x35b617 = [ [0x0, 0x0, 0x0, 0x0, 0x0], [_0x439407[_0x2555('12', 'UbKX')][_0x2555('13', 'xWy0')](new RegExp(_0x439407[_0x2555('14', '[Lbx')], 'g'), '')[_0x2555('15', 'EWh!')](';'), ![]], [function(_0x41ccf2, _0x1eb0f2, _0x395c47) { return _0x41ccf2[_0x2555('16', 'TJ&E')](_0x1eb0f2) == _0x395c47; }, function(_0xccc123, _0x5299d6, _0x238449) { _0x35b617[_0xccc123][_0x5299d6] = _0x238449; }, function() { if (_0x439407['KcRco'](_0x2555('17', 'Zdc9'), _0x439407['DhKbO'])) { return !0x0; } else { _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x2]][_0x35b617[0x0][0x4]] = _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x2]][_0x35b617[0x0][0x4]]; } }] ]; var _0x4dfb46 = function() { var _0x2051f6 = { 'eupta': function(_0x218c68, _0x34fd0f) { return _0x439407[_0x2555('18', 'x(Ho')](_0x218c68, _0x34fd0f); } }; if (_0x439407['kfgre'] !== _0x439407[_0x2555('19', 'EWh!')]) { if (_0x2051f6[_0x2555('1a', 'HN*G')](_0x26e5fd['length'], 0x4) && _0x35b617[0x2][0x0](_0x26e5fd, 0x3, 0x66)) { _0x35b617[0x2][0x1](0x0, 0x4, _0x26e5fd); } else if (_0x26e5fd['length'] == 0x8 && _0x35b617[0x2][0x0](_0x26e5fd, 0x7, 0x65) && _0x35b617[0x2][0x0](_0x26e5fd, 0x0, 0x68)) { _0x35b617[0x2][0x1](0x0, 0x3, _0x26e5fd); } } else { while (_0x35b617[0x2][0x2]()) { if (_0x439407['hYihY'] === _0x439407[_0x2555('1b', 'yzGm')]) { var _0x4d5a27 = fn['apply'](context, arguments); fn = null; return _0x4d5a27; } else { _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x2]][_0x35b617[0x0][0x4]] = _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x2]][_0x35b617[0x0][0x4]]; } }; } }; for (var _0x223501 in _0x3ebaae) { if (_0x439407[_0x2555('1c', '!mco')](_0x223501[_0x2555('1d', 'yzGm')], 0x8) && _0x35b617[0x2][0x0](_0x223501, 0x7, 0x74) && _0x35b617[0x2][0x0](_0x223501, 0x5, 0x65) && _0x35b617[0x2][0x0](_0x223501, 0x3, 0x75) && _0x35b617[0x2][0x0](_0x223501, 0x0, 0x64)) { if (_0x439407[_0x2555('1e', 'eZfw')](_0x2555('1f', 'IyVv'), _0x439407['qyFfA'])) { _0x35b617[0x2][0x1](0x0, 0x0, _0x223501); break; } else { _0x35b617[a] = c; } } } for (var _0x5c3a71 in _0x3ebaae[_0x35b617[0x0][0x0]]) { if (_0x439407[_0x2555('20', 'Wra5')](_0x5c3a71[_0x2555('21', 'SRZU')], 0x6) && _0x35b617[0x2][0x0](_0x5c3a71, 0x5, 0x6e) && _0x35b617[0x2][0x0](_0x5c3a71, 0x0, 0x64)) { if (_0x439407[_0x2555('22', 'S12o')](_0x2555('23', 'xPUC'), _0x439407[_0x2555('24', 'UbKX')])) { return; } else { _0x35b617[0x2][0x1](0x0, 0x1, _0x5c3a71); break; } } } for (var _0x5db779 in _0x3ebaae[_0x35b617[0x0][0x0]]) { if (_0x5db779[_0x2555('25', 'Zdc9')] == 0x8 && _0x35b617[0x2][0x0](_0x5db779, 0x7, 0x6e) && _0x35b617[0x2][0x0](_0x5db779, 0x0, 0x6c)) { _0x35b617[0x2][0x1](0x0, 0x2, _0x5db779); break; } } for (var _0x26e5fd in _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x2]]) { if (_0x26e5fd[_0x2555('26', 'GFv@')] == 0x4 && _0x35b617[0x2][0x0](_0x26e5fd, 0x3, 0x66)) { _0x35b617[0x2][0x1](0x0, 0x4, _0x26e5fd); } else if (_0x439407[_0x2555('27', '8B^R')](_0x26e5fd[_0x2555('25', 'Zdc9')], 0x8) && _0x35b617[0x2][0x0](_0x26e5fd, 0x7, 0x65) && _0x35b617[0x2][0x0](_0x26e5fd, 0x0, 0x68)) { if (_0x439407['EsPSb'] === _0x439407[_0x2555('28', 'X@gA')]) { return !0x0; } else { _0x35b617[0x2][0x1](0x0, 0x3, _0x26e5fd); } } } if (!_0x35b617[0x0][0x0] || !_0x3ebaae[_0x35b617[0x0][0x0]]) { return; } var _0x5725b0 = _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x1]]; var _0x4ab975 = !! _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x2]] && _0x3ebaae[_0x35b617[0x0][0x0]][_0x35b617[0x0][0x2]][_0x35b617[0x0][0x3]]; var _0x244366 = _0x439407[_0x2555('29', 'V*oM')](_0x5725b0, _0x4ab975); if (!_0x244366) { if (_0x439407[_0x2555('2a', '!UHc')] === _0x2555('2b', 'RzD6')) { _0x35b617[0x2][0x1](0x0, 0x3, _0x26e5fd); } else { return; } } _0x2107f3: for (var _0x3a5359 = 0x0; _0x439407['YmTXQ'](_0x3a5359, _0x35b617[0x1][0x0]['length']); _0x3a5359++) { var _0x380aeb = _0x35b617[0x1][0x0][_0x3a5359]; var _0x324495 = _0x439407[_0x2555('2c', 'zfh#')](_0x244366[_0x2555('2d', 'es]w')], _0x380aeb[_0x2555('2e', 'QC3(')]); var _0x438dca = _0x244366[_0x2555('2f', 'es]w')](_0x380aeb, _0x324495); var _0x93d578 = _0x439407['tbnFd'](_0x438dca, -0x1) && _0x439407['LJtdk'](_0x438dca, _0x324495); if (_0x93d578) { if (_0x244366[_0x2555('30', 'iHE]')] == _0x380aeb['length'] || _0x439407[_0x2555('31', 'x(Ho')](_0x380aeb[_0x2555('32', '1^Yy')]('.'), 0x0)) { if (_0x439407['oOXzR'](_0x439407['xiuZi'], _0x439407[_0x2555('33', 'QC3(')])) { var _0x3ff077 = firstCall ? function() { if (fn) { var _0x2c0571 = fn[_0x2555('34', 'Z5o9')](context, arguments); fn = null; return _0x2c0571; } } : function() {}; firstCall = ![]; return _0x3ff077; } else { _0x35b617[0x1][0x0] = _0x2555('35', 'SRZU'); break _0x2107f3; } } } } if (_0x439407['CCZNa'](_0x35b617[0x1][0x0], '_0x334e01')) { _0x439407['ktKQW'](_0x4dfb46); } }); _0x334e01(); function secret(_0x644a5d, _0x36a8a9) { var _0x40d7c6 = { 'xAfDQ': _0x2555('36', 'EWh!') }; var _0x2038be = CryptoJS[_0x2555('37', 'Wra5')][_0x2555('38', 'S12o')][_0x2555('39', '[78$')](_0x40d7c6[_0x2555('3a', '1^Yy')]), _0x36a8a9 = CryptoJS['enc'][_0x2555('3b', '[78$')][_0x2555('3c', '[Lbx')](_0x36a8a9); return CryptoJS[_0x2555('3d', '@$AB')][_0x2555('3e', '[78$')](_0x644a5d, _0x36a8a9, { 'iv': _0x2038be, 'padding': CryptoJS[_0x2555('3f', 'g$ky')]['Pkcs7'] })[_0x2555('40', 'mVK)')](CryptoJS[_0x2555('41', 'jsoz')]['Utf8']); }; _0xodl = 'jsjiami.com.v6'; (function($) { var audio = document.createElement('audio'), source = document.createElement('source'); audio.appendChild(source); var duration = 0; var currenttime = 0; var all_nub = 0; var playing = false; var frist_load = true; var up_load = false; var pagesize = 10; audio.volume = 1.0; ajax(novel_id); function ajax(novel_j) { var page = Math.ceil(novel_j / pagesize); if (window.innerWidth > 799 && window.innerHeight > 599 && typeof(window.navigator.webdriver) == "undefined") { $.ajax({ url: "/api.php?c=Json&id=" + tingid + "&page=" + page + "&pagesize=" + pagesize, type: "get", dataType: "JSONP", async: false, headers: { "sign": $.now() }, success: function(msg) { if (up_load) { UpsetList(msg); up_load = false } else { setList(msg) } }, error: function(msg) { console.log(msg) } }) } } function setList(msg) { var list = msg.playlist; for (var i = 0; i < list.length; i++) { var strHtml = '<li class="section-item" id="item' + list[i].pid + '" data-path="' + list[i].file + '" data-url="' + list[i].url + '" data-atp="' + list[i].atp + '">' + '<div class="column1">' + '<div class="column1-l">' + '<span class="section-number" style="">' + list[i].pid + '</span>' + '<i class="playing"></i>' + '</div>' + '<span class="set">' + list[i].trackName + '</span>' + '</div>' + '<div class="column2">' + msg.announcer + '</div>' + '</li>'; $('.section-body').append(strHtml) } if (frist_load) { all_nub = msg.limit; defaultStart(novel_id); frist_load = false } } function UpsetList(msg) { var list = msg.playlist; for (var i = list.length - 1; i >= 0; i--) { var strHtml = '<li class="section-item" id="item' + list[i].pid + '" data-path="' + list[i].file + '" data-url="' + list[i].url + '" data-atp="' + list[i].atp + '">' + '<div class="column1">' + '<div class="column1-l">' + '<span class="section-number" style="">' + list[i].pid + '</span>' + '<i class="playing"></i>' + '</div>' + '<span class="set">' + list[i].trackName + '</span>' + '</div>' + '<div class="column2">' + msg.announcer + '</div>' + '</li>'; $('.section-body').prepend(strHtml) } } var click_li; function defaultStart(id) { if (id <= all_nub) { click_li = $("#item" + id); var path = click_li.data("path"), url = click_li.data("url"), title = getTitle(click_li.find(".set").text()), nub = $(".section-body li").eq(0).find(".section-number").text(); setCookie(tingid + "_setNAME", title, 48); setCookie(tingid + "_setURL", url, 48); setCookie("index_setID", tingid, 48); JieXi(JieMa(path)); click_li.siblings().removeClass("section-pause"); click_li.addClass("section-active").siblings().removeClass("section-active"); if (click_li.find(".section-number").text() == nub && nub >= pagesize) { up_load = true; ajax(nub - pagesize) } if (click_li.next().length != 1) { click_li = $(".section-body li").eq($(".section-body li").length - 1); nub = parseInt(click_li.find(".section-number").text()); if (Math.ceil(nub / (pagesize + 1)) <= Math.ceil(all_nub / (pagesize + 1)) && isInteger(nub)) { frist_load = false; ajax(nub + 1) } } } }; function isInteger(obj) { return obj % pagesize === 0 } $(".section-body ").on("click", "li", function() { var url = $(this).data("url"); top.location.href = url }); $(".player-prev").click(function() { var nub = parseInt(click_li.find(".section-number").text()); if (nub > 1) { var prev_li = click_li.prev(); var url = prev_li.data("url"); top.location.href = url } }); $(".player-next").click(function() { var nub = parseInt(click_li.find(".section-number").text()); if (nub < all_nub) { var next_li = click_li.next(); var url = next_li.data("url"); top.location.href = url } }); $('.player-play').click(function() { click_li.removeClass('section-pause'); toPlay("play"); playing = true; $(this).hide(); $('.player-pause').show(); }); $('.player-pause').click(function() { if (playing) { click_li.addClass('section-pause').siblings().removeClass('section-pause'); toPlay("pause"); $(this).hide(); $('.player-play').show() } }); audio.addEventListener("canplay", function() { $('.player-volume-position').css('width', (audio.volume * 100) + '%'); duration = parseInt(audio.duration); $('.player-duration-time').text(conversionTime(duration)); var p_height = $('.player-progress').width(), tag = false; $('.player-progress-control').mousedown(function(e) { tag = true }); $(document).mouseup(function() { tag = false }); $(".player-progress").mousemove(function(e) { if (tag) { var actLage = e.clientX - $(this).offset().left; if (actLage <= 0) { actLage = 0 } else if (actLage > p_height) { actLage = p_height } var progressBP = progressBarPercentage(p_height, actLage); $('.player-progress-control').css('left', progressBP + '%'); $('.player-progress-position').css('width', progressBP + '%'); var SongProgress = progressBP * duration / 100; songProgressAdjust(SongProgress) } }); $('.player-progress').click(function(e) { if (playing) { var actLage = e.clientX - $(this).offset().left, progressBP = progressBarPercentage(p_height, actLage); $('.player-progress-control').css('left', progressBP + '%'); $('.player-progress-position').css('width', progressBP + '%'); var SongProgress = progressBP * duration / 100; songProgressAdjust(SongProgress) } }); var s_width = $('.player-volume-progress').width(); $('.player-volume-progress').click(function(e) { var actLage = e.clientX - $(this).offset().left, progressBP = progressBarPercentage(s_width, actLage); $('.player-volume-position').css('width', progressBP + '%'); audio.volume = progressBP / 100 }) }); function play() { $('.top-set').text(click_li.find('.set').text()); var txt = click_li.find('.set').text().split("_"), ua = /(?=.*Mac)(?!.*Chrome)[|(?=.*Safari)]/.test(navigator.userAgent); $('.title h1').text(txt[1] + " " + txt[0]); if (ua) { toPlay("pause"); } else { toPlay("play"); } playing = true; $('.player-play').hide(); $('.player-pause').show() } audio.onended = function() { playing = false; var nub = parseInt(click_li.find(".section-number").text()); if (nub < all_nub) { click_li = click_li.next(); nub = parseInt(click_li.find(".section-number").text()); if (Math.ceil(nub / (pagesize + 1)) <= Math.ceil(all_nub / (pagesize + 1)) && isInteger(nub) && click_li.next().length != 1) { ajax(nub + 1) } var url = click_li.data("url"), atp = click_li.data("atp"); if (atp) top.location.href = url; } else { click_li.addClass('section-pause').siblings().removeClass('section-pause'); toPlay("pause"); $('.player-pause').hide(); $('.player-play').show(); alert("本書已播放完畢!"); } }; $('.player-wolume-w').hover(function() { if (playing) { $('.player-volume-progress').show() } }, function() { $('.player-volume-progress').hide() }); function toPlay(toPlay) { if (toPlay === "play") { audio.play(); playbackProgress("play"); getBuffered() } if (toPlay === "pause") { audio.pause(); playbackProgress("pause") } } function getBuffered() { var buffered = audio.buffered, loaded; if (buffered.length) { loaded = 100 * buffered.end(0) / audio.duration; $('.player-progress-loaded').css("width", loaded + "%") } setTimeout(getBuffered, 1000); } function playbackProgress(playSwitch) { if (playSwitch === "play") { $('.play-info .img-box').removeAttr('style').css('animation', 'Circle 10s linear infinite 0s forwards'); timer = setInterval(function() { timeall = duration; currenttime = audio.currentTime; songPlaybackTime(timeall, currenttime); $('.player-progress-control').css('left', currenttime / timeall * 100 + '%'); $('.player-progress-position').css('width', currenttime / timeall * 100 + '%'); if (audio.ended) { clearInterval(timer) } }, 1000) } if (playSwitch === "pause") { $('.play-info .img-box').removeAttr('style').css('animation-play-state', 'paused'); clearInterval(timer) } } function songPlaybackTime(timeall, currenttime) { if (currenttime < timeall) { leftTime = parseInt(currenttime); $('.player-current-time').text(conversionTime(leftTime)) } } function songProgressAdjust(time) { audio.currentTime = time; } function progressBarPercentage(totalLength, actLage) { var Result = (parseInt(actLage) / parseInt(totalLength)) * 100; return Math.ceil(Result); } function conversionTime(time) { var surplusMinite, surplusSecond, cTime; surplusMinite = Math.floor((time / 60) % 60); if (surplusMinite < 10) { surplusMinite = "0" + surplusMinite } surplusSecond = Math.floor(time % 60); if (surplusSecond < 10) { surplusSecond = "0" + surplusSecond } cTime = surplusMinite + ":" + surplusSecond; return cTime } function getTitle(u) { var tArr = u.split("_"); return tArr[1] + " " + tArr[0]; } function setHtmlTitle(str) { if (str == null) return null; var title = $(document).attr("title"), titArr = title.split(","); $("title").html(str + "線上收聽," + titArr[1]); } function JieMa(u) { return new Base64().decode(u).split("&&&"); } function JieXi(str) { str = new Base64().decode(secret(str[0], str[1])).split('$'); if (str[1] === "tc") { var data = str[0].split('/'); data = data[0] + '/' + data[1] + '/play_' + data[1] + '_' + data[2] + '.htm'; $.ajax({ type: 'get', url: "//c.ting22.com/mchina.php", data: 'file=' + data, dataType: "jsonp", success: function(data) { if (data.status) { playing = false; source.src = data.url; audio.load(); play(); } } }); } else if (str[1] === "xm") { var data = str[0].split('/'), oMeta = document.createElement('meta'); oMeta.name = 'referrer'; oMeta.content = 'never'; document.getElementsByTagName('head')[0].appendChild(oMeta); playing = false; source.src = "http://mobile.ximalaya.com/mobile/redirect/free/play/" + data[1] + "/0"; audio.load(); play(); } else if (str[1] === "qt") { var data = str[0]; $.ajax({ type: 'get', url: "//c.ting22.com/tqingting.php", data: 'file=' + data, dataType: "jsonp", success: function(data) { if (data.status) { playing = false; source.src = data.url; audio.load(); play(); } } }); } else { playing = false; source.src = str; audio.load(); play() } } function getCookie(name) { var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); if (arr != null) { return decodeURI(arr[2]); } return null; } function setCookie(name, value, ihour) { var iH = ihour || 1, exp = new Date; exp.setTime(exp.getTime() + iH * 60 * 60 * 1000); document.cookie = name + ("=" + encodeURI(value) + ";expires=" + exp.toGMTString() + ";path=/;"); } })(jQuery);
通過簡單查詢 發現預設直接 defaultStart() , 主要關鍵函式 是 JieXi(JieMa(path)); 這個,path就是 html中的 data-path,繼續解析 jieMa()
function defaultStart(id) { if (id <= all_nub) { click_li = $("#item" + id); var path = click_li.data("path"), url = click_li.data("url"), title = getTitle(click_li.find(".set").text()), nub = $(".section-body li").eq(0).find(".section-number").text(); setCookie(tingid + "_setNAME", title, 48); setCookie(tingid + "_setURL", url, 48); setCookie("index_setID", tingid, 48); JieXi(JieMa(path)); click_li.siblings().removeClass("section-pause"); click_li.addClass("section-active").siblings().removeClass("section-active"); if (click_li.find(".section-number").text() == nub && nub >= pagesize) { up_load = true; ajax(nub - pagesize) } if (click_li.next().length != 1) { click_li = $(".section-body li").eq($(".section-body li").length - 1); nub = parseInt(click_li.find(".section-number").text()); if (Math.ceil(nub / (pagesize + 1)) <= Math.ceil(all_nub / (pagesize + 1)) && isInteger(nub)) { frist_load = false; ajax(nub + 1) } } } };
不清楚他這個Base64是 自定義的還是 預設演算法,就單獨把方法,拿出來 在本地執行一下,
function JieMa(u) { return new Base64().decode(u).split("&&&"); }
<script> _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function decode(input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = _utf8_decode(output); return output; } _utf8_decode = function(utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++ } else if ((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2 } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3 } } return string; } //就是Base64解密 console.log(decode("NXdqV2FpWFBIUmpTT1pVcnozYkw1UzFodGE5K2orb2J1SjZpaC9rNEh1MGVMMnlBQ1M1aWl4alIwcGt0clhzUHVVc21GeGtzcVJWUXAyRDhDcHllN2Uwa1B2R2IwVkdQZVhONHlmdlhGMlVoNGtUVEJNRjhJVWs0N1dlS3Y2NFVIL1BmMGRrem5ZVWNVYkkvNFdWQkNRPT0mJiZOdkM5Uk5LaDBIbXhZUlVX"));
發現最後的結果,就是base64 。。。。
然後繼續, JieXi()這個方法,裡面有一個人secret()方法,發現裡面是各種混淆的。直接執行失敗,有一些方法是不存在的。怎麼辦呢,直接去他網站去執行試試
function secret(_0x644a5d, _0x36a8a9) { var _0x40d7c6 = { 'xAfDQ': _0x2555('36', 'EWh!') }; var _0x2038be = CryptoJS[_0x2555('37', 'Wra5')][_0x2555('38', 'S12o')][_0x2555('39', '[78$')](_0x40d7c6[_0x2555('3a', '1^Yy')]), _0x36a8a9 = CryptoJS['enc'][_0x2555('3b', '[78$')][_0x2555('3c', '[Lbx')](_0x36a8a9); return CryptoJS[_0x2555('3d', '@$AB')][_0x2555('3e', '[78$')](_0x644a5d, _0x36a8a9, { 'iv': _0x2038be, 'padding': CryptoJS[_0x2555('3f', 'g$ky')]['Pkcs7'] })[_0x2555('40', 'mVK)')](CryptoJS[_0x2555('41', 'jsoz')]['Utf8']); };
直接會有結果,正好把其他的都解密出來
根據解密的結果,看的出來是AES的加密,需要獲取 key iv 引數,在從網站執行試試獲取對應的資訊
發現解密後是這樣,看不太懂,本人不是專門搞前端的。。試試直接把解密方法列印一下吧,直接就有結果了。
結果還是base64的,直接 解密一下,結果就是
http://audio.cos.xmcdn.com/group70/M02/2B/FB/wKgO2F41UOPCaGiyAFehhER6zNw787.m4a