var base64 = base64 || (function () { var base64Map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''); var base64DeMap = !function () { var result = {}; $.each(base64Map, function (i, e) { result[e] = i; }); return result; }(); var target = {}; target.encode = function (data) { var buf = []; var map = base64Map; var n = data.length; //总字节数 var val; //中间值 var i = 0; /* * 3字节 ==> val ==> 4字符 */ while (i < n) { val = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]); buf.push(map[val >> 18], map[val >> 12 & 63], map[val >> 6 & 63], map[val & 63]); i += 3; } if (n % 3 == 1) //凑两个"=" buf.pop(), buf.pop(), buf.push('=', '='); else //凑一个"=" buf.pop(), buf.push('='); return buf.join(''); }; target.decode = function (str) { var buf = []; var arr = str.split(''); var map = base64DeMap; var n = arr.length; //总字符数 var val; //中间值 var i = 0; /* * 长度异常 */ if (n % 4) return null; /* * 4字符 ==> val ==> 3字节 */ while (i < n) { val = (map[arr[i]] << 18) | (map[arr[i + 1]] << 12) | (map[arr[i + 2]] << 6) | (map[arr[i + 3]]); buf.push(val >> 16, val >> 8 & 0xFF, val & 0xFF); i += 4; } /* * 凑字字符"="个数 */ while (arr[--n] == '=') buf.pop(); return buf; }; target.encodeArrayBuffer = function (arrayBuffer) { /// 将ArrayBuffer转换为Base64字符串 var dv = new DataView(arrayBuffer); var length = dv.byteLength; var data = []; for (var i = 0; i < length; i++) { data.push(dv.getUint8(i)); } return base64.encode(data); }; target.toObjectUrl = function (base64str, type) { /// 获得指定base64字符串的对象链接格式 return "data:" + type + ";base64," + base64str; }; return target; })(); $(function () { var enableDirectAccess = false; var directAccessCounter = 0; //监听ajax事件 document.addEventListener("ajaxproxy", function (e) { var detail = e.detail; var data = detail.data; var handle = { success: null, status: null, statusText: null, url: data.url, text: null, model: null, request: data, index: detail.index }; //set header data.headers = data.headers || {}; if (data.headers) { var nheader = {}; $.each(data.headers, function (k, v) { nheader["Fish-" + k] = v; }); data.headers = nheader; } if (data.refer) data.headers["Fish-Referer"] = data.refer; data.headers["Fish-User-Agent"] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"; data.headers["Fish-Origin"] = /(https?:\/\/[^\/]+\/)/i.exec(data.url)[1]; if (!data.headers["Fish-Referer"]) data.headers["Fish-Referer"] = null; if (!enableDirectAccess || data.url.indexOf("leftTicket/query") === -1 || (directAccessCounter++) % 3 === 0) { $.ajax(data).done(function (result, status, xhr) { handle.success = true; handle.status = xhr.status; handle.statusText = xhr.statusText; handle.text = xhr.responseText; handle.model = result; handle.headers = xhr.getAllResponseHeaders(); notifyAjaxComplete(handle); }).fail(function (xhr) { handle.success = false; handle.status = xhr.status; handle.statusText = xhr.statusText || ""; handle.text = xhr.responseText || ""; handle.model = null; handle.headers = xhr.getAllResponseHeaders(); notifyAjaxComplete(handle); }); } else { chrome.runtime.sendMessage({ action: "directAccess", data: data }, function(args) { (function(success, status, statusText, text, headers, model) { handle.success = success; handle.status = status; handle.statusText = statusText || ""; handle.text = text || ""; handle.model = model; handle.headers = headers; notifyAjaxComplete(handle); }).apply(this, args); }); } e.preventDefault && e.preventDefault(); e.stopPropagation && e.stopPropagation(); }); var notifyAjaxComplete = function (key) { var e = new CustomEvent("ajaxproxyfinished", { detail: key }); document.dispatchEvent(e); }; document.addEventListener("ajaxLoadVerifyCode", function (e) { var ctx = e.detail; var xhr = new XMLHttpRequest(); xhr.open("GET", ctx.url, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status != 200) { document.dispatchEvent(new CustomEvent("ajaxproxyfinished", { detail: { url: null, success: false, index: ctx.index, headers: xhr.getAllResponseHeaders() } })); } else { var imgUrl = base64.toObjectUrl(base64.encodeArrayBuffer(xhr.response), "image/jpeg"); document.dispatchEvent(new CustomEvent("ajaxproxyfinished", { detail: { url: imgUrl, success: true, index: ctx.index, headers: xhr.getAllResponseHeaders() } })); } } }; xhr.responseType = "arraybuffer"; xhr.setRequestHeader("Fish-Referer", ctx.refer); xhr.setRequestHeader("Fish-User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"); xhr.setRequestHeader("Fish-Origin", /(https?:\/\/[^\/]+\/)/.exec(ctx.url)[1]); if (ctx.headers) { $.each(ctx.headers, function (k, v) { xhr.setRequestHeader("Fish-" + k, v); }); } xhr.send(ctx.data || null); e.preventDefault && e.preventDefault(); e.stopPropagation && e.stopPropagation(); }); document.body.dataset["targetExtensionId"] = chrome.runtime.id; document.body.dataset["targetExtensionVersion"] = chrome.runtime.getManifest().version; document.body.dataset["mobileSupportInitialized"] = 1; chrome.runtime.sendMessage({ action: "getBv" }, function (m) { document.body.dataset["browserVersion"] = m.bv; document.dispatchEvent(new CustomEvent("mobileSupportInitialized")); }); chrome.runtime.sendMessage({ action: "servervalid" }, function (vm) { console.log("liebao detected: " + vm.valid); if (!vm.valid) return; chrome.runtime.sendMessage({ action: "getServerStatus" }, function (m) { enableDirectAccess = m.enableDirectAccess; console.log("direct access: " + enableDirectAccess); }); }); });