🚀 支持 91短视频、海角社区、SWAG、19JTV、糖心、海角APP、萝莉巴士等十几个站点哦~ 🚀
// ==UserScript==
// @name AkWebMasterV2
// @namespace https://ak-sky.com
// @version v2.2.10
// @author ak-sky
// @description 🚀 支持 91短视频、海角社区、SWAG、19JTV、糖心、海角APP、萝莉巴士等十几个站点哦~ 🚀
// @license MIT
// @homepage https://ak-sky.com
// @supportURL https://ak-sky.com
// @icon https://store.ak-sky.com/akWebMaster/akwm.ico
// @include https://*.h.*j*.*/home
// @include https://*h*j*.*/home
// @include https://hai*.top/*
// @include *://www.loibox*.top/*
// @include *://www.loibus*.top/*
// @include *://www.loibus*.xyz/*
// @include *://www.loibus.com/*
// @include *://www.loiraft.com/*
// @include *://www.loiship.com/*
// @include *://www.loix.org/*
// @include *://loix.org/*
// @include https://*txh*.com/*
// @match https://haijiao.com/*
// @match https://www.haijiao.com/*
// @match *://*/post/details*
// @match https://p1.lsqykbvl.com/*
// @match https://p5.fkdadqjju.cc*
// @match https://19jtv.com/*
// @match https://javhd.com/*
// @match https://www.mdav.live/*
// @match https://5ktmi048.com/*
// @match https://p2.lxrzwdq.xyz/*
// @match https://www.loiship.com/*
// @match https://51fengliu.com/*
// @match https://51fengliu3.com/*
// @match https://pwa3.dsp11a.cc/*
// @match https://pwa1.oyqwgpzi.xyz/*
// @match https://lubosp.com/*
// @match https://moso.monster/*
// ==/UserScript==
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
enumerable: true,
configurable: true,
writable: true,
value: value
}) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
(function() {
"use strict";
function Jtv19Inject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!/category\/.*?\/\d+/.test(pathname)) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页使用"
});
return;
}
resolve({
analyzeURL: url.href,
failReason: ""
});
});
}
const Config = {
ApiURL: "https://webmaster.ak-sky.com",
ServerAPI: "https://ak-sky.com/api"
};
function PhoenixAnalyze(req) {
const reqURL = `${Config.ServerAPI}/v1/phoenix/analyze`;
return fetch(reqURL, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(req)
}).then(async response => {
const data = await response.json();
if (response.status !== 200) {
throw data;
}
return data;
});
}
class LocalStorage {
static set(key2, value) {
window.localStorage.setItem(key2, JSON.stringify(value));
}
static get(key2) {
const value = window.localStorage.getItem(key2);
if (!value) {
return null;
}
try {
return JSON.parse(value);
} catch {
return value;
}
}
static remove(key2) {
window.localStorage.removeItem(key2);
}
}
class SessionStorage {
static set(key2, value) {
window.sessionStorage.setItem(key2, JSON.stringify(value));
}
static get(key2) {
const value = window.sessionStorage.getItem(key2);
if (!value) {
return null;
}
try {
return JSON.parse(value);
} catch {
return value;
}
}
static remove(key2) {
window.sessionStorage.removeItem(key2);
}
}
const columnZhName = {
qq: "QQ",
wechat: "微信",
telegram: "电报",
yuNi: "与你号",
phone: "电话",
address: "地址",
textConcat: "内容",
description: "简介"
};
function FengLiu51Inject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!/\/show|guide|merchant|info|\/\d+\.html/.test(pathname)) {
resolve({
analyzeURL: "",
failReason: "请在详情页面中解析"
});
return;
}
const token = LocalStorage.get("akSkyUserToken");
if (!token) {
resolve({
openActivateToken: true
});
return;
}
let href = window.location.href;
if (window.location.host === "51fengliu3.com") {
const id = url.searchParams.get("id");
const type = url.searchParams.get("type");
switch (type) {
case "INFO":
href = `https://51fengliu.com/show/${id}.html`;
break;
case "STREET":
href = `https://51fengliu.com/guide/${id}.html`;
break;
case "MERCHANT":
href = `https://51fengliu.com/merchant/${id}.html`;
break;
}
}
console.log(href);
PhoenixAnalyze({
token: token,
targetURL: href
}).then(reply => {
const haveValueKeys = Object.keys(reply).filter(key2 => reply[key2]);
const options = haveValueKeys.map(k => columnZhName[k]);
const data = haveValueKeys.reduce((obj, key2) => {
obj[columnZhName[key2]] = reply[key2];
return obj;
}, {});
resolve({
segmented: {
options: options,
data: data
},
remindMsg: "⚠️ 请注意甄别信息真伪 ⚠️"
});
}).catch(err => {
resolve({
failReason: err.msg
});
});
});
}
function TMInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!pathname.includes("/movie/detail/")) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页使用"
});
return;
}
resolve({
analyzeURL: url.href,
failReason: ""
});
});
}
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
function getDefaultExportFromCjs(x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
}
function getAugmentedNamespace(n) {
if (n.__esModule) return n;
var f = n.default;
if (typeof f == "function") {
var a = function a2() {
if (this instanceof a2) {
return Reflect.construct(f, arguments, this.constructor);
}
return f.apply(this, arguments);
};
a.prototype = f.prototype;
} else a = {};
Object.defineProperty(a, "__esModule", {
value: true
});
Object.keys(n).forEach(function(k) {
var d = Object.getOwnPropertyDescriptor(n, k);
Object.defineProperty(a, k, d.get ? d : {
enumerable: true,
get: function() {
return n[k];
}
});
});
return a;
}
var aes = {
exports: {}
};
function commonjsRequire(path) {
throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
}
var core = {
exports: {}
};
const __viteBrowserExternal = {};
const __viteBrowserExternal$1 = Object.freeze(Object.defineProperty({
__proto__: null,
default: __viteBrowserExternal
}, Symbol.toStringTag, {
value: "Module"
}));
const require$$0 = getAugmentedNamespace(__viteBrowserExternal$1);
var hasRequiredCore;
function requireCore() {
if (hasRequiredCore) return core.exports;
hasRequiredCore = 1;
(function(module, exports) {
(function(root, factory) {
{
module.exports = factory();
}
})(commonjsGlobal, function() {
var CryptoJS = CryptoJS || function(Math2, undefined$1) {
var crypto;
if (typeof window !== "undefined" && window.crypto) {
crypto = window.crypto;
}
if (typeof self !== "undefined" && self.crypto) {
crypto = self.crypto;
}
if (typeof globalThis !== "undefined" && globalThis.crypto) {
crypto = globalThis.crypto;
}
if (!crypto && typeof window !== "undefined" && window.msCrypto) {
crypto = window.msCrypto;
}
if (!crypto && typeof commonjsGlobal !== "undefined" && commonjsGlobal.crypto) {
crypto = commonjsGlobal.crypto;
}
if (!crypto && typeof commonjsRequire === "function") {
try {
crypto = require$$0;
} catch (err) {}
}
var cryptoSecureRandomInt = function() {
if (crypto) {
if (typeof crypto.getRandomValues === "function") {
try {
return crypto.getRandomValues(new Uint32Array(1))[0];
} catch (err) {}
}
if (typeof crypto.randomBytes === "function") {
try {
return crypto.randomBytes(4).readInt32LE();
} catch (err) {}
}
}
throw new Error("Native crypto module could not be used to get secure random number.");
};
var create = Object.create || function() {
function F() {}
return function(obj) {
var subtype;
F.prototype = obj;
subtype = new F;
F.prototype = null;
return subtype;
};
}();
var C = {};
var C_lib = C.lib = {};
var Base = C_lib.Base = function() {
return {
extend: function(overrides) {
var subtype = create(this);
if (overrides) {
subtype.mixIn(overrides);
}
if (!subtype.hasOwnProperty("init") || this.init === subtype.init) {
subtype.init = function() {
subtype.$super.init.apply(this, arguments);
};
}
subtype.init.prototype = subtype;
subtype.$super = this;
return subtype;
},
create: function() {
var instance = this.extend();
instance.init.apply(instance, arguments);
return instance;
},
init: function() {},
mixIn: function(properties) {
for (var propertyName in properties) {
if (properties.hasOwnProperty(propertyName)) {
this[propertyName] = properties[propertyName];
}
}
if (properties.hasOwnProperty("toString")) {
this.toString = properties.toString;
}
},
clone: function() {
return this.init.prototype.extend(this);
}
};
}();
var WordArray = C_lib.WordArray = Base.extend({
init: function(words, sigBytes) {
words = this.words = words || [];
if (sigBytes != undefined$1) {
this.sigBytes = sigBytes;
} else {
this.sigBytes = words.length * 4;
}
},
toString: function(encoder) {
return (encoder || Hex2).stringify(this);
},
concat: function(wordArray) {
var thisWords = this.words;
var thatWords = wordArray.words;
var thisSigBytes = this.sigBytes;
var thatSigBytes = wordArray.sigBytes;
this.clamp();
if (thisSigBytes % 4) {
for (var i = 0; i < thatSigBytes; i++) {
var thatByte = thatWords[i >>> 2] >>> 24 - i % 4 * 8 & 255;
thisWords[thisSigBytes + i >>> 2] |= thatByte << 24 - (thisSigBytes + i) % 4 * 8;
}
} else {
for (var j = 0; j < thatSigBytes; j += 4) {
thisWords[thisSigBytes + j >>> 2] = thatWords[j >>> 2];
}
}
this.sigBytes += thatSigBytes;
return this;
},
clamp: function() {
var words = this.words;
var sigBytes = this.sigBytes;
words[sigBytes >>> 2] &= 4294967295 << 32 - sigBytes % 4 * 8;
words.length = Math2.ceil(sigBytes / 4);
},
clone: function() {
var clone = Base.clone.call(this);
clone.words = this.words.slice(0);
return clone;
},
random: function(nBytes) {
var words = [];
for (var i = 0; i < nBytes; i += 4) {
words.push(cryptoSecureRandomInt());
}
return new WordArray.init(words, nBytes);
}
});
var C_enc = C.enc = {};
var Hex2 = C_enc.Hex = {
stringify: function(wordArray) {
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var hexChars = [];
for (var i = 0; i < sigBytes; i++) {
var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 255;
hexChars.push((bite >>> 4).toString(16));
hexChars.push((bite & 15).toString(16));
}
return hexChars.join("");
},
parse: function(hexStr) {
var hexStrLength = hexStr.length;
var words = [];
for (var i = 0; i < hexStrLength; i += 2) {
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << 24 - i % 8 * 4;
}
return new WordArray.init(words, hexStrLength / 2);
}
};
var Latin1 = C_enc.Latin1 = {
stringify: function(wordArray) {
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var latin1Chars = [];
for (var i = 0; i < sigBytes; i++) {
var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 255;
latin1Chars.push(String.fromCharCode(bite));
}
return latin1Chars.join("");
},
parse: function(latin1Str) {
var latin1StrLength = latin1Str.length;
var words = [];
for (var i = 0; i < latin1StrLength; i++) {
words[i >>> 2] |= (latin1Str.charCodeAt(i) & 255) << 24 - i % 4 * 8;
}
return new WordArray.init(words, latin1StrLength);
}
};
var Utf82 = C_enc.Utf8 = {
stringify: function(wordArray) {
try {
return decodeURIComponent(escape(Latin1.stringify(wordArray)));
} catch (e) {
throw new Error("Malformed UTF-8 data");
}
},
parse: function(utf8Str) {
return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
}
};
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
reset: function() {
this._data = new WordArray.init;
this._nDataBytes = 0;
},
_append: function(data) {
if (typeof data == "string") {
data = Utf82.parse(data);
}
this._data.concat(data);
this._nDataBytes += data.sigBytes;
},
_process: function(doFlush) {
var processedWords;
var data = this._data;
var dataWords = data.words;
var dataSigBytes = data.sigBytes;
var blockSize = this.blockSize;
var blockSizeBytes = blockSize * 4;
var nBlocksReady = dataSigBytes / blockSizeBytes;
if (doFlush) {
nBlocksReady = Math2.ceil(nBlocksReady);
} else {
nBlocksReady = Math2.max((nBlocksReady | 0) - this._minBufferSize, 0);
}
var nWordsReady = nBlocksReady * blockSize;
var nBytesReady = Math2.min(nWordsReady * 4, dataSigBytes);
if (nWordsReady) {
for (var offset = 0; offset < nWordsReady; offset += blockSize) {
this._doProcessBlock(dataWords, offset);
}
processedWords = dataWords.splice(0, nWordsReady);
data.sigBytes -= nBytesReady;
}
return new WordArray.init(processedWords, nBytesReady);
},
clone: function() {
var clone = Base.clone.call(this);
clone._data = this._data.clone();
return clone;
},
_minBufferSize: 0
});
C_lib.Hasher = BufferedBlockAlgorithm.extend({
cfg: Base.extend(),
init: function(cfg) {
this.cfg = this.cfg.extend(cfg);
this.reset();
},
reset: function() {
BufferedBlockAlgorithm.reset.call(this);
this._doReset();
},
update: function(messageUpdate) {
this._append(messageUpdate);
this._process();
return this;
},
finalize: function(messageUpdate) {
if (messageUpdate) {
this._append(messageUpdate);
}
var hash = this._doFinalize();
return hash;
},
blockSize: 512 / 32,
_createHelper: function(hasher) {
return function(message, cfg) {
return new hasher.init(cfg).finalize(message);
};
},
_createHmacHelper: function(hasher) {
return function(message, key2) {
return new C_algo.HMAC.init(hasher, key2).finalize(message);
};
}
});
var C_algo = C.algo = {};
return C;
}(Math);
return CryptoJS;
});
})(core);
return core.exports;
}
var encBase64 = {
exports: {}
};
(function(module, exports) {
(function(root, factory) {
{
module.exports = factory(requireCore());
}
})(commonjsGlobal, function(CryptoJS) {
(function() {
var C = CryptoJS;
var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var C_enc = C.enc;
C_enc.Base64 = {
stringify: function(wordArray) {
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var map = this._map;
wordArray.clamp();
var base64Chars = [];
for (var i = 0; i < sigBytes; i += 3) {
var byte1 = words[i >>> 2] >>> 24 - i % 4 * 8 & 255;
var byte2 = words[i + 1 >>> 2] >>> 24 - (i + 1) % 4 * 8 & 255;
var byte3 = words[i + 2 >>> 2] >>> 24 - (i + 2) % 4 * 8 & 255;
var triplet = byte1 << 16 | byte2 << 8 | byte3;
for (var j = 0; j < 4 && i + j * .75 < sigBytes; j++) {
base64Chars.push(map.charAt(triplet >>> 6 * (3 - j) & 63));
}
}
var paddingChar = map.charAt(64);
if (paddingChar) {
while (base64Chars.length % 4) {
base64Chars.push(paddingChar);
}
}
return base64Chars.join("");
},
parse: function(base64Str) {
var base64StrLength = base64Str.length;
var map = this._map;
var reverseMap = this._reverseMap;
if (!reverseMap) {
reverseMap = this._reverseMap = [];
for (var j = 0; j < map.length; j++) {
reverseMap[map.charCodeAt(j)] = j;
}
}
var paddingChar = map.charAt(64);
if (paddingChar) {
var paddingIndex = base64Str.indexOf(paddingChar);
if (paddingIndex !== -1) {
base64StrLength = paddingIndex;
}
}
return parseLoop(base64Str, base64StrLength, reverseMap);
},
_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
};
function parseLoop(base64Str, base64StrLength, reverseMap) {
var words = [];
var nBytes = 0;
for (var i = 0; i < base64StrLength; i++) {
if (i % 4) {
var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << i % 4 * 2;
var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> 6 - i % 4 * 2;
var bitsCombined = bits1 | bits2;
words[nBytes >>> 2] |= bitsCombined << 24 - nBytes % 4 * 8;
nBytes++;
}
}
return WordArray.create(words, nBytes);
}
})();
return CryptoJS.enc.Base64;
});
})(encBase64);
var encBase64Exports = encBase64.exports;
const Base64 = getDefaultExportFromCjs(encBase64Exports);
var md5 = {
exports: {}
};
(function(module, exports) {
(function(root, factory) {
{
module.exports = factory(requireCore());
}
})(commonjsGlobal, function(CryptoJS) {
(function(Math2) {
var C = CryptoJS;
var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var Hasher = C_lib.Hasher;
var C_algo = C.algo;
var T = [];
(function() {
for (var i = 0; i < 64; i++) {
T[i] = Math2.abs(Math2.sin(i + 1)) * 4294967296 | 0;
}
})();
var MD52 = C_algo.MD5 = Hasher.extend({
_doReset: function() {
this._hash = new WordArray.init([ 1732584193, 4023233417, 2562383102, 271733878 ]);
},
_doProcessBlock: function(M, offset) {
for (var i = 0; i < 16; i++) {
var offset_i = offset + i;
var M_offset_i = M[offset_i];
M[offset_i] = (M_offset_i << 8 | M_offset_i >>> 24) & 16711935 | (M_offset_i << 24 | M_offset_i >>> 8) & 4278255360;
}
var H = this._hash.words;
var M_offset_0 = M[offset + 0];
var M_offset_1 = M[offset + 1];
var M_offset_2 = M[offset + 2];
var M_offset_3 = M[offset + 3];
var M_offset_4 = M[offset + 4];
var M_offset_5 = M[offset + 5];
var M_offset_6 = M[offset + 6];
var M_offset_7 = M[offset + 7];
var M_offset_8 = M[offset + 8];
var M_offset_9 = M[offset + 9];
var M_offset_10 = M[offset + 10];
var M_offset_11 = M[offset + 11];
var M_offset_12 = M[offset + 12];
var M_offset_13 = M[offset + 13];
var M_offset_14 = M[offset + 14];
var M_offset_15 = M[offset + 15];
var a = H[0];
var b = H[1];
var c = H[2];
var d = H[3];
a = FF(a, b, c, d, M_offset_0, 7, T[0]);
d = FF(d, a, b, c, M_offset_1, 12, T[1]);
c = FF(c, d, a, b, M_offset_2, 17, T[2]);
b = FF(b, c, d, a, M_offset_3, 22, T[3]);
a = FF(a, b, c, d, M_offset_4, 7, T[4]);
d = FF(d, a, b, c, M_offset_5, 12, T[5]);
c = FF(c, d, a, b, M_offset_6, 17, T[6]);
b = FF(b, c, d, a, M_offset_7, 22, T[7]);
a = FF(a, b, c, d, M_offset_8, 7, T[8]);
d = FF(d, a, b, c, M_offset_9, 12, T[9]);
c = FF(c, d, a, b, M_offset_10, 17, T[10]);
b = FF(b, c, d, a, M_offset_11, 22, T[11]);
a = FF(a, b, c, d, M_offset_12, 7, T[12]);
d = FF(d, a, b, c, M_offset_13, 12, T[13]);
c = FF(c, d, a, b, M_offset_14, 17, T[14]);
b = FF(b, c, d, a, M_offset_15, 22, T[15]);
a = GG(a, b, c, d, M_offset_1, 5, T[16]);
d = GG(d, a, b, c, M_offset_6, 9, T[17]);
c = GG(c, d, a, b, M_offset_11, 14, T[18]);
b = GG(b, c, d, a, M_offset_0, 20, T[19]);
a = GG(a, b, c, d, M_offset_5, 5, T[20]);
d = GG(d, a, b, c, M_offset_10, 9, T[21]);
c = GG(c, d, a, b, M_offset_15, 14, T[22]);
b = GG(b, c, d, a, M_offset_4, 20, T[23]);
a = GG(a, b, c, d, M_offset_9, 5, T[24]);
d = GG(d, a, b, c, M_offset_14, 9, T[25]);
c = GG(c, d, a, b, M_offset_3, 14, T[26]);
b = GG(b, c, d, a, M_offset_8, 20, T[27]);
a = GG(a, b, c, d, M_offset_13, 5, T[28]);
d = GG(d, a, b, c, M_offset_2, 9, T[29]);
c = GG(c, d, a, b, M_offset_7, 14, T[30]);
b = GG(b, c, d, a, M_offset_12, 20, T[31]);
a = HH(a, b, c, d, M_offset_5, 4, T[32]);
d = HH(d, a, b, c, M_offset_8, 11, T[33]);
c = HH(c, d, a, b, M_offset_11, 16, T[34]);
b = HH(b, c, d, a, M_offset_14, 23, T[35]);
a = HH(a, b, c, d, M_offset_1, 4, T[36]);
d = HH(d, a, b, c, M_offset_4, 11, T[37]);
c = HH(c, d, a, b, M_offset_7, 16, T[38]);
b = HH(b, c, d, a, M_offset_10, 23, T[39]);
a = HH(a, b, c, d, M_offset_13, 4, T[40]);
d = HH(d, a, b, c, M_offset_0, 11, T[41]);
c = HH(c, d, a, b, M_offset_3, 16, T[42]);
b = HH(b, c, d, a, M_offset_6, 23, T[43]);
a = HH(a, b, c, d, M_offset_9, 4, T[44]);
d = HH(d, a, b, c, M_offset_12, 11, T[45]);
c = HH(c, d, a, b, M_offset_15, 16, T[46]);
b = HH(b, c, d, a, M_offset_2, 23, T[47]);
a = II(a, b, c, d, M_offset_0, 6, T[48]);
d = II(d, a, b, c, M_offset_7, 10, T[49]);
c = II(c, d, a, b, M_offset_14, 15, T[50]);
b = II(b, c, d, a, M_offset_5, 21, T[51]);
a = II(a, b, c, d, M_offset_12, 6, T[52]);
d = II(d, a, b, c, M_offset_3, 10, T[53]);
c = II(c, d, a, b, M_offset_10, 15, T[54]);
b = II(b, c, d, a, M_offset_1, 21, T[55]);
a = II(a, b, c, d, M_offset_8, 6, T[56]);
d = II(d, a, b, c, M_offset_15, 10, T[57]);
c = II(c, d, a, b, M_offset_6, 15, T[58]);
b = II(b, c, d, a, M_offset_13, 21, T[59]);
a = II(a, b, c, d, M_offset_4, 6, T[60]);
d = II(d, a, b, c, M_offset_11, 10, T[61]);
c = II(c, d, a, b, M_offset_2, 15, T[62]);
b = II(b, c, d, a, M_offset_9, 21, T[63]);
H[0] = H[0] + a | 0;
H[1] = H[1] + b | 0;
H[2] = H[2] + c | 0;
H[3] = H[3] + d | 0;
},
_doFinalize: function() {
var data = this._data;
var dataWords = data.words;
var nBitsTotal = this._nDataBytes * 8;
var nBitsLeft = data.sigBytes * 8;
dataWords[nBitsLeft >>> 5] |= 128 << 24 - nBitsLeft % 32;
var nBitsTotalH = Math2.floor(nBitsTotal / 4294967296);
var nBitsTotalL = nBitsTotal;
dataWords[(nBitsLeft + 64 >>> 9 << 4) + 15] = (nBitsTotalH << 8 | nBitsTotalH >>> 24) & 16711935 | (nBitsTotalH << 24 | nBitsTotalH >>> 8) & 4278255360;
dataWords[(nBitsLeft + 64 >>> 9 << 4) + 14] = (nBitsTotalL << 8 | nBitsTotalL >>> 24) & 16711935 | (nBitsTotalL << 24 | nBitsTotalL >>> 8) & 4278255360;
data.sigBytes = (dataWords.length + 1) * 4;
this._process();
var hash = this._hash;
var H = hash.words;
for (var i = 0; i < 4; i++) {
var H_i = H[i];
H[i] = (H_i << 8 | H_i >>> 24) & 16711935 | (H_i << 24 | H_i >>> 8) & 4278255360;
}
return hash;
},
clone: function() {
var clone = Hasher.clone.call(this);
clone._hash = this._hash.clone();
return clone;
}
});
function FF(a, b, c, d, x, s, t) {
var n = a + (b & c | ~b & d) + x + t;
return (n << s | n >>> 32 - s) + b;
}
function GG(a, b, c, d, x, s, t) {
var n = a + (b & d | c & ~d) + x + t;
return (n << s | n >>> 32 - s) + b;
}
function HH(a, b, c, d, x, s, t) {
var n = a + (b ^ c ^ d) + x + t;
return (n << s | n >>> 32 - s) + b;
}
function II(a, b, c, d, x, s, t) {
var n = a + (c ^ (b | ~d)) + x + t;
return (n << s | n >>> 32 - s) + b;
}
C.MD5 = Hasher._createHelper(MD52);
C.HmacMD5 = Hasher._createHmacHelper(MD52);
})(Math);
return CryptoJS.MD5;
});
})(md5);
var md5Exports = md5.exports;
const MD5 = getDefaultExportFromCjs(md5Exports);
var evpkdf = {
exports: {}
};
var sha1 = {
exports: {}
};
var hasRequiredSha1;
function requireSha1() {
if (hasRequiredSha1) return sha1.exports;
hasRequiredSha1 = 1;
(function(module, exports) {
(function(root, factory) {
{
module.exports = factory(requireCore());
}
})(commonjsGlobal, function(CryptoJS) {
(function() {
var C = CryptoJS;
var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var Hasher = C_lib.Hasher;
var C_algo = C.algo;
var W = [];
var SHA1 = C_algo.SHA1 = Hasher.extend({
_doReset: function() {
this._hash = new WordArray.init([ 1732584193, 4023233417, 2562383102, 271733878, 3285377520 ]);
},
_doProcessBlock: function(M, offset) {
var H = this._hash.words;
var a = H[0];
var b = H[1];
var c = H[2];
var d = H[3];
var e = H[4];
for (var i = 0; i < 80; i++) {
if (i < 16) {
W[i] = M[offset + i] | 0;
} else {
var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
W[i] = n << 1 | n >>> 31;
}
var t = (a << 5 | a >>> 27) + e + W[i];
if (i < 20) {
t += (b & c | ~b & d) + 1518500249;
} else if (i < 40) {
t += (b ^ c ^ d) + 1859775393;
} else if (i < 60) {
t += (b & c | b & d | c & d) - 1894007588;
} else {
t += (b ^ c ^ d) - 899497514;
}
e = d;
d = c;
c = b << 30 | b >>> 2;
b = a;
a = t;
}
H[0] = H[0] + a | 0;
H[1] = H[1] + b | 0;
H[2] = H[2] + c | 0;
H[3] = H[3] + d | 0;
H[4] = H[4] + e | 0;
},
_doFinalize: function() {
var data = this._data;
var dataWords = data.words;
var nBitsTotal = this._nDataBytes * 8;
var nBitsLeft = data.sigBytes * 8;
dataWords[nBitsLeft >>> 5] |= 128 << 24 - nBitsLeft % 32;
dataWords[(nBitsLeft + 64 >>> 9 << 4) + 14] = Math.floor(nBitsTotal / 4294967296);
dataWords[(nBitsLeft + 64 >>> 9 << 4) + 15] = nBitsTotal;
data.sigBytes = dataWords.length * 4;
this._process();
return this._hash;
},
clone: function() {
var clone = Hasher.clone.call(this);
clone._hash = this._hash.clone();
return clone;
}
});
C.SHA1 = Hasher._createHelper(SHA1);
C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
})();
return CryptoJS.SHA1;
});
})(sha1);
return sha1.exports;
}
var hmac = {
exports: {}
};
var hasRequiredHmac;
function requireHmac() {
if (hasRequiredHmac) return hmac.exports;
hasRequiredHmac = 1;
(function(module, exports) {
(function(root, factory) {
{
module.exports = factory(requireCore());
}
})(commonjsGlobal, function(CryptoJS) {
(function() {
var C = CryptoJS;
var C_lib = C.lib;
var Base = C_lib.Base;
var C_enc = C.enc;
var Utf82 = C_enc.Utf8;
var C_algo = C.algo;
C_algo.HMAC = Base.extend({
init: function(hasher, key2) {
hasher = this._hasher = new hasher.init;
if (typeof key2 == "string") {
key2 = Utf82.parse(key2);
}
var hasherBlockSize = hasher.blockSize;
var hasherBlockSizeBytes = hasherBlockSize * 4;
if (key2.sigBytes > hasherBlockSizeBytes) {
key2 = hasher.finalize(key2);
}
key2.clamp();
var oKey = this._oKey = key2.clone();
var iKey = this._iKey = key2.clone();
var oKeyWords = oKey.words;
var iKeyWords = iKey.words;
for (var i = 0; i < hasherBlockSize; i++) {
oKeyWords[i] ^= 1549556828;
iKeyWords[i] ^= 909522486;
}
oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
this.reset();
},
reset: function() {
var hasher = this._hasher;
hasher.reset();
hasher.update(this._iKey);
},
update: function(messageUpdate) {
this._hasher.update(messageUpdate);
return this;
},
finalize: function(messageUpdate) {
var hasher = this._hasher;
var innerHash = hasher.finalize(messageUpdate);
hasher.reset();
var hmac2 = hasher.finalize(this._oKey.clone().concat(innerHash));
return hmac2;
}
});
})();
});
})(hmac);
return hmac.exports;
}
var hasRequiredEvpkdf;
function requireEvpkdf() {
if (hasRequiredEvpkdf) return evpkdf.exports;
hasRequiredEvpkdf = 1;
(function(module, exports) {
(function(root, factory, undef) {
{
module.exports = factory(requireCore(), requireSha1(), requireHmac());
}
})(commonjsGlobal, function(CryptoJS) {
(function() {
var C = CryptoJS;
var C_lib = C.lib;
var Base = C_lib.Base;
var WordArray = C_lib.WordArray;
var C_algo = C.algo;
var MD52 = C_algo.MD5;
var EvpKDF = C_algo.EvpKDF = Base.extend({
cfg: Base.extend({
keySize: 128 / 32,
hasher: MD52,
iterations: 1
}),
init: function(cfg) {
this.cfg = this.cfg.extend(cfg);
},
compute: function(password, salt) {
var block;
var cfg = this.cfg;
var hasher = cfg.hasher.create();
var derivedKey = WordArray.create();
var derivedKeyWords = derivedKey.words;
var keySize = cfg.keySize;
var iterations = cfg.iterations;
while (derivedKeyWords.length < keySize) {
if (block) {
hasher.update(block);
}
block = hasher.update(password).finalize(salt);
hasher.reset();
for (var i = 1; i < iterations; i++) {
block = hasher.finalize(block);
hasher.reset();
}
derivedKey.concat(block);
}
derivedKey.sigBytes = keySize * 4;
return derivedKey;
}
});
C.EvpKDF = function(password, salt, cfg) {
return EvpKDF.create(cfg).compute(password, salt);
};
})();
return CryptoJS.EvpKDF;
});
})(evpkdf);
return evpkdf.exports;
}
var cipherCore = {
exports: {}
};
var hasRequiredCipherCore;
function requireCipherCore() {
if (hasRequiredCipherCore) return cipherCore.exports;
hasRequiredCipherCore = 1;
(function(module, exports) {
(function(root, factory, undef) {
{
module.exports = factory(requireCore(), requireEvpkdf());
}
})(commonjsGlobal, function(CryptoJS) {
CryptoJS.lib.Cipher || function(undefined$1) {
var C = CryptoJS;
var C_lib = C.lib;
var Base = C_lib.Base;
var WordArray = C_lib.WordArray;
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
var C_enc = C.enc;
var Base642 = C_enc.Base64;
var C_algo = C.algo;
var EvpKDF = C_algo.EvpKDF;
var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
cfg: Base.extend(),
createEncryptor: function(key2, cfg) {
return this.create(this._ENC_XFORM_MODE, key2, cfg);
},
createDecryptor: function(key2, cfg) {
return this.create(this._DEC_XFORM_MODE, key2, cfg);
},
init: function(xformMode, key2, cfg) {
this.cfg = this.cfg.extend(cfg);
this._xformMode = xformMode;
this._key = key2;
this.reset();
},
reset: function() {
BufferedBlockAlgorithm.reset.call(this);
this._doReset();
},
process: function(dataUpdate) {
this._append(dataUpdate);
return this._process();
},
finalize: function(dataUpdate) {
if (dataUpdate) {
this._append(dataUpdate);
}
var finalProcessedData = this._doFinalize();
return finalProcessedData;
},
keySize: 128 / 32,
ivSize: 128 / 32,
_ENC_XFORM_MODE: 1,
_DEC_XFORM_MODE: 2,
_createHelper: function() {
function selectCipherStrategy(key2) {
if (typeof key2 == "string") {
return PasswordBasedCipher;
} else {
return SerializableCipher;
}
}
return function(cipher) {
return {
encrypt: function(message, key2, cfg) {
return selectCipherStrategy(key2).encrypt(cipher, message, key2, cfg);
},
decrypt: function(ciphertext, key2, cfg) {
return selectCipherStrategy(key2).decrypt(cipher, ciphertext, key2, cfg);
}
};
};
}()
});
C_lib.StreamCipher = Cipher.extend({
_doFinalize: function() {
var finalProcessedBlocks = this._process(true);
return finalProcessedBlocks;
},
blockSize: 1
});
var C_mode = C.mode = {};
var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
createEncryptor: function(cipher, iv2) {
return this.Encryptor.create(cipher, iv2);
},
createDecryptor: function(cipher, iv2) {
return this.Decryptor.create(cipher, iv2);
},
init: function(cipher, iv2) {
this._cipher = cipher;
this._iv = iv2;
}
});
var CBC = C_mode.CBC = function() {
var CBC2 = BlockCipherMode.extend();
CBC2.Encryptor = CBC2.extend({
processBlock: function(words, offset) {
var cipher = this._cipher;
var blockSize = cipher.blockSize;
xorBlock.call(this, words, offset, blockSize);
cipher.encryptBlock(words, offset);
this._prevBlock = words.slice(offset, offset + blockSize);
}
});
CBC2.Decryptor = CBC2.extend({
processBlock: function(words, offset) {
var cipher = this._cipher;
var blockSize = cipher.blockSize;
var thisBlock = words.slice(offset, offset + blockSize);
cipher.decryptBlock(words, offset);
xorBlock.call(this, words, offset, blockSize);
this._prevBlock = thisBlock;
}
});
function xorBlock(words, offset, blockSize) {
var block;
var iv2 = this._iv;
if (iv2) {
block = iv2;
this._iv = undefined$1;
} else {
block = this._prevBlock;
}
for (var i = 0; i < blockSize; i++) {
words[offset + i] ^= block[i];
}
}
return CBC2;
}();
var C_pad = C.pad = {};
var Pkcs72 = C_pad.Pkcs7 = {
pad: function(data, blockSize) {
var blockSizeBytes = blockSize * 4;
var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
var paddingWord = nPaddingBytes << 24 | nPaddingBytes << 16 | nPaddingBytes << 8 | nPaddingBytes;
var paddingWords = [];
for (var i = 0; i < nPaddingBytes; i += 4) {
paddingWords.push(paddingWord);
}
var padding = WordArray.create(paddingWords, nPaddingBytes);
data.concat(padding);
},
unpad: function(data) {
var nPaddingBytes = data.words[data.sigBytes - 1 >>> 2] & 255;
data.sigBytes -= nPaddingBytes;
}
};
C_lib.BlockCipher = Cipher.extend({
cfg: Cipher.cfg.extend({
mode: CBC,
padding: Pkcs72
}),
reset: function() {
var modeCreator;
Cipher.reset.call(this);
var cfg = this.cfg;
var iv2 = cfg.iv;
var mode = cfg.mode;
if (this._xformMode == this._ENC_XFORM_MODE) {
modeCreator = mode.createEncryptor;
} else {
modeCreator = mode.createDecryptor;
this._minBufferSize = 1;
}
if (this._mode && this._mode.__creator == modeCreator) {
this._mode.init(this, iv2 && iv2.words);
} else {
this._mode = modeCreator.call(mode, this, iv2 && iv2.words);
this._mode.__creator = modeCreator;
}
},
_doProcessBlock: function(words, offset) {
this._mode.processBlock(words, offset);
},
_doFinalize: function() {
var finalProcessedBlocks;
var padding = this.cfg.padding;
if (this._xformMode == this._ENC_XFORM_MODE) {
padding.pad(this._data, this.blockSize);
finalProcessedBlocks = this._process(true);
} else {
finalProcessedBlocks = this._process(true);
padding.unpad(finalProcessedBlocks);
}
return finalProcessedBlocks;
},
blockSize: 128 / 32
});
var CipherParams = C_lib.CipherParams = Base.extend({
init: function(cipherParams) {
this.mixIn(cipherParams);
},
toString: function(formatter) {
return (formatter || this.formatter).stringify(this);
}
});
var C_format = C.format = {};
var OpenSSLFormatter = C_format.OpenSSL = {
stringify: function(cipherParams) {
var wordArray;
var ciphertext = cipherParams.ciphertext;
var salt = cipherParams.salt;
if (salt) {
wordArray = WordArray.create([ 1398893684, 1701076831 ]).concat(salt).concat(ciphertext);
} else {
wordArray = ciphertext;
}
return wordArray.toString(Base642);
},
parse: function(openSSLStr) {
var salt;
var ciphertext = Base642.parse(openSSLStr);
var ciphertextWords = ciphertext.words;
if (ciphertextWords[0] == 1398893684 && ciphertextWords[1] == 1701076831) {
salt = WordArray.create(ciphertextWords.slice(2, 4));
ciphertextWords.splice(0, 4);
ciphertext.sigBytes -= 16;
}
return CipherParams.create({
ciphertext: ciphertext,
salt: salt
});
}
};
var SerializableCipher = C_lib.SerializableCipher = Base.extend({
cfg: Base.extend({
format: OpenSSLFormatter
}),
encrypt: function(cipher, message, key2, cfg) {
cfg = this.cfg.extend(cfg);
var encryptor = cipher.createEncryptor(key2, cfg);
var ciphertext = encryptor.finalize(message);
var cipherCfg = encryptor.cfg;
return CipherParams.create({
ciphertext: ciphertext,
key: key2,
iv: cipherCfg.iv,
algorithm: cipher,
mode: cipherCfg.mode,
padding: cipherCfg.padding,
blockSize: cipher.blockSize,
formatter: cfg.format
});
},
decrypt: function(cipher, ciphertext, key2, cfg) {
cfg = this.cfg.extend(cfg);
ciphertext = this._parse(ciphertext, cfg.format);
var plaintext = cipher.createDecryptor(key2, cfg).finalize(ciphertext.ciphertext);
return plaintext;
},
_parse: function(ciphertext, format) {
if (typeof ciphertext == "string") {
return format.parse(ciphertext, this);
} else {
return ciphertext;
}
}
});
var C_kdf = C.kdf = {};
var OpenSSLKdf = C_kdf.OpenSSL = {
execute: function(password, keySize, ivSize, salt, hasher) {
if (!salt) {
salt = WordArray.random(64 / 8);
}
if (!hasher) {
var key2 = EvpKDF.create({
keySize: keySize + ivSize
}).compute(password, salt);
} else {
var key2 = EvpKDF.create({
keySize: keySize + ivSize,
hasher: hasher
}).compute(password, salt);
}
var iv2 = WordArray.create(key2.words.slice(keySize), ivSize * 4);
key2.sigBytes = keySize * 4;
return CipherParams.create({
key: key2,
iv: iv2,
salt: salt
});
}
};
var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
cfg: SerializableCipher.cfg.extend({
kdf: OpenSSLKdf
}),
encrypt: function(cipher, message, password, cfg) {
cfg = this.cfg.extend(cfg);
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);
cfg.iv = derivedParams.iv;
var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
ciphertext.mixIn(derivedParams);
return ciphertext;
},
decrypt: function(cipher, ciphertext, password, cfg) {
cfg = this.cfg.extend(cfg);
ciphertext = this._parse(ciphertext, cfg.format);
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);
cfg.iv = derivedParams.iv;
var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
return plaintext;
}
});
}();
});
})(cipherCore);
return cipherCore.exports;
}
(function(module, exports) {
(function(root, factory, undef) {
{
module.exports = factory(requireCore(), encBase64Exports, md5Exports, requireEvpkdf(), requireCipherCore());
}
})(commonjsGlobal, function(CryptoJS) {
(function() {
var C = CryptoJS;
var C_lib = C.lib;
var BlockCipher = C_lib.BlockCipher;
var C_algo = C.algo;
var SBOX = [];
var INV_SBOX = [];
var SUB_MIX_0 = [];
var SUB_MIX_1 = [];
var SUB_MIX_2 = [];
var SUB_MIX_3 = [];
var INV_SUB_MIX_0 = [];
var INV_SUB_MIX_1 = [];
var INV_SUB_MIX_2 = [];
var INV_SUB_MIX_3 = [];
(function() {
var d = [];
for (var i = 0; i < 256; i++) {
if (i < 128) {
d[i] = i << 1;
} else {
d[i] = i << 1 ^ 283;
}
}
var x = 0;
var xi = 0;
for (var i = 0; i < 256; i++) {
var sx = xi ^ xi << 1 ^ xi << 2 ^ xi << 3 ^ xi << 4;
sx = sx >>> 8 ^ sx & 255 ^ 99;
SBOX[x] = sx;
INV_SBOX[sx] = x;
var x2 = d[x];
var x4 = d[x2];
var x8 = d[x4];
var t = d[sx] * 257 ^ sx * 16843008;
SUB_MIX_0[x] = t << 24 | t >>> 8;
SUB_MIX_1[x] = t << 16 | t >>> 16;
SUB_MIX_2[x] = t << 8 | t >>> 24;
SUB_MIX_3[x] = t;
var t = x8 * 16843009 ^ x4 * 65537 ^ x2 * 257 ^ x * 16843008;
INV_SUB_MIX_0[sx] = t << 24 | t >>> 8;
INV_SUB_MIX_1[sx] = t << 16 | t >>> 16;
INV_SUB_MIX_2[sx] = t << 8 | t >>> 24;
INV_SUB_MIX_3[sx] = t;
if (!x) {
x = xi = 1;
} else {
x = x2 ^ d[d[d[x8 ^ x2]]];
xi ^= d[d[xi]];
}
}
})();
var RCON = [ 0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 ];
var AES2 = C_algo.AES = BlockCipher.extend({
_doReset: function() {
var t;
if (this._nRounds && this._keyPriorReset === this._key) {
return;
}
var key2 = this._keyPriorReset = this._key;
var keyWords = key2.words;
var keySize = key2.sigBytes / 4;
var nRounds = this._nRounds = keySize + 6;
var ksRows = (nRounds + 1) * 4;
var keySchedule = this._keySchedule = [];
for (var ksRow = 0; ksRow < ksRows; ksRow++) {
if (ksRow < keySize) {
keySchedule[ksRow] = keyWords[ksRow];
} else {
t = keySchedule[ksRow - 1];
if (!(ksRow % keySize)) {
t = t << 8 | t >>> 24;
t = SBOX[t >>> 24] << 24 | SBOX[t >>> 16 & 255] << 16 | SBOX[t >>> 8 & 255] << 8 | SBOX[t & 255];
t ^= RCON[ksRow / keySize | 0] << 24;
} else if (keySize > 6 && ksRow % keySize == 4) {
t = SBOX[t >>> 24] << 24 | SBOX[t >>> 16 & 255] << 16 | SBOX[t >>> 8 & 255] << 8 | SBOX[t & 255];
}
keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
}
}
var invKeySchedule = this._invKeySchedule = [];
for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
var ksRow = ksRows - invKsRow;
if (invKsRow % 4) {
var t = keySchedule[ksRow];
} else {
var t = keySchedule[ksRow - 4];
}
if (invKsRow < 4 || ksRow <= 4) {
invKeySchedule[invKsRow] = t;
} else {
invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[t >>> 16 & 255]] ^ INV_SUB_MIX_2[SBOX[t >>> 8 & 255]] ^ INV_SUB_MIX_3[SBOX[t & 255]];
}
}
},
encryptBlock: function(M, offset) {
this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
},
decryptBlock: function(M, offset) {
var t = M[offset + 1];
M[offset + 1] = M[offset + 3];
M[offset + 3] = t;
this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
var t = M[offset + 1];
M[offset + 1] = M[offset + 3];
M[offset + 3] = t;
},
_doCryptBlock: function(M, offset, keySchedule, SUB_MIX_02, SUB_MIX_12, SUB_MIX_22, SUB_MIX_32, SBOX2) {
var nRounds = this._nRounds;
var s0 = M[offset] ^ keySchedule[0];
var s1 = M[offset + 1] ^ keySchedule[1];
var s2 = M[offset + 2] ^ keySchedule[2];
var s3 = M[offset + 3] ^ keySchedule[3];
var ksRow = 4;
for (var round = 1; round < nRounds; round++) {
var t0 = SUB_MIX_02[s0 >>> 24] ^ SUB_MIX_12[s1 >>> 16 & 255] ^ SUB_MIX_22[s2 >>> 8 & 255] ^ SUB_MIX_32[s3 & 255] ^ keySchedule[ksRow++];
var t1 = SUB_MIX_02[s1 >>> 24] ^ SUB_MIX_12[s2 >>> 16 & 255] ^ SUB_MIX_22[s3 >>> 8 & 255] ^ SUB_MIX_32[s0 & 255] ^ keySchedule[ksRow++];
var t2 = SUB_MIX_02[s2 >>> 24] ^ SUB_MIX_12[s3 >>> 16 & 255] ^ SUB_MIX_22[s0 >>> 8 & 255] ^ SUB_MIX_32[s1 & 255] ^ keySchedule[ksRow++];
var t3 = SUB_MIX_02[s3 >>> 24] ^ SUB_MIX_12[s0 >>> 16 & 255] ^ SUB_MIX_22[s1 >>> 8 & 255] ^ SUB_MIX_32[s2 & 255] ^ keySchedule[ksRow++];
s0 = t0;
s1 = t1;
s2 = t2;
s3 = t3;
}
var t0 = (SBOX2[s0 >>> 24] << 24 | SBOX2[s1 >>> 16 & 255] << 16 | SBOX2[s2 >>> 8 & 255] << 8 | SBOX2[s3 & 255]) ^ keySchedule[ksRow++];
var t1 = (SBOX2[s1 >>> 24] << 24 | SBOX2[s2 >>> 16 & 255] << 16 | SBOX2[s3 >>> 8 & 255] << 8 | SBOX2[s0 & 255]) ^ keySchedule[ksRow++];
var t2 = (SBOX2[s2 >>> 24] << 24 | SBOX2[s3 >>> 16 & 255] << 16 | SBOX2[s0 >>> 8 & 255] << 8 | SBOX2[s1 & 255]) ^ keySchedule[ksRow++];
var t3 = (SBOX2[s3 >>> 24] << 24 | SBOX2[s0 >>> 16 & 255] << 16 | SBOX2[s1 >>> 8 & 255] << 8 | SBOX2[s2 & 255]) ^ keySchedule[ksRow++];
M[offset] = t0;
M[offset + 1] = t1;
M[offset + 2] = t2;
M[offset + 3] = t3;
},
keySize: 256 / 32
});
C.AES = BlockCipher._createHelper(AES2);
})();
return CryptoJS.AES;
});
})(aes);
var aesExports = aes.exports;
const AES = getDefaultExportFromCjs(aesExports);
var encHex = {
exports: {}
};
(function(module, exports) {
(function(root, factory) {
{
module.exports = factory(requireCore());
}
})(commonjsGlobal, function(CryptoJS) {
return CryptoJS.enc.Hex;
});
})(encHex);
var encHexExports = encHex.exports;
const Hex = getDefaultExportFromCjs(encHexExports);
var encUtf8 = {
exports: {}
};
(function(module, exports) {
(function(root, factory) {
{
module.exports = factory(requireCore());
}
})(commonjsGlobal, function(CryptoJS) {
return CryptoJS.enc.Utf8;
});
})(encUtf8);
var encUtf8Exports = encUtf8.exports;
const Utf8 = getDefaultExportFromCjs(encUtf8Exports);
var coreExports = requireCore();
const Core = getDefaultExportFromCjs(coreExports);
var modeCfb = {
exports: {}
};
(function(module, exports) {
(function(root, factory, undef) {
{
module.exports = factory(requireCore(), requireCipherCore());
}
})(commonjsGlobal, function(CryptoJS) {
CryptoJS.mode.CFB = function() {
var CFB2 = CryptoJS.lib.BlockCipherMode.extend();
CFB2.Encryptor = CFB2.extend({
processBlock: function(words, offset) {
var cipher = this._cipher;
var blockSize = cipher.blockSize;
generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
this._prevBlock = words.slice(offset, offset + blockSize);
}
});
CFB2.Decryptor = CFB2.extend({
processBlock: function(words, offset) {
var cipher = this._cipher;
var blockSize = cipher.blockSize;
var thisBlock = words.slice(offset, offset + blockSize);
generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
this._prevBlock = thisBlock;
}
});
function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
var keystream;
var iv2 = this._iv;
if (iv2) {
keystream = iv2.slice(0);
this._iv = void 0;
} else {
keystream = this._prevBlock;
}
cipher.encryptBlock(keystream, 0);
for (var i = 0; i < blockSize; i++) {
words[offset + i] ^= keystream[i];
}
}
return CFB2;
}();
return CryptoJS.mode.CFB;
});
})(modeCfb);
var modeCfbExports = modeCfb.exports;
const CFBMode = getDefaultExportFromCjs(modeCfbExports);
var modeEcb = {
exports: {}
};
(function(module, exports) {
(function(root, factory, undef) {
{
module.exports = factory(requireCore(), requireCipherCore());
}
})(commonjsGlobal, function(CryptoJS) {
CryptoJS.mode.ECB = function() {
var ECB2 = CryptoJS.lib.BlockCipherMode.extend();
ECB2.Encryptor = ECB2.extend({
processBlock: function(words, offset) {
this._cipher.encryptBlock(words, offset);
}
});
ECB2.Decryptor = ECB2.extend({
processBlock: function(words, offset) {
this._cipher.decryptBlock(words, offset);
}
});
return ECB2;
}();
return CryptoJS.mode.ECB;
});
})(modeEcb);
var modeEcbExports = modeEcb.exports;
const ECB = getDefaultExportFromCjs(modeEcbExports);
var padNopadding = {
exports: {}
};
(function(module, exports) {
(function(root, factory, undef) {
{
module.exports = factory(requireCore(), requireCipherCore());
}
})(commonjsGlobal, function(CryptoJS) {
CryptoJS.pad.NoPadding = {
pad: function() {},
unpad: function() {}
};
return CryptoJS.pad.NoPadding;
});
})(padNopadding);
var padNopaddingExports = padNopadding.exports;
const NoPadding = getDefaultExportFromCjs(padNopaddingExports);
var padPkcs7 = {
exports: {}
};
(function(module, exports) {
(function(root, factory, undef) {
{
module.exports = factory(requireCore(), requireCipherCore());
}
})(commonjsGlobal, function(CryptoJS) {
return CryptoJS.pad.Pkcs7;
});
})(padPkcs7);
var padPkcs7Exports = padPkcs7.exports;
const Pkcs7 = getDefaultExportFromCjs(padPkcs7Exports);
function AesDecryptCBCPKCS7(encryptedData, key2, iv2) {
const keyWordArray = Utf8.parse(key2);
const ivWordArray = Utf8.parse(iv2);
const decrypted = AES.decrypt(encryptedData, keyWordArray, {
iv: ivWordArray,
padding: Pkcs7
});
return decrypted.toString(Utf8);
}
class CFB {
constructor(key2, iv2) {
__publicField(this, "key");
__publicField(this, "iv");
this.key = Hex.parse(key2);
this.iv = Hex.parse(iv2);
}
decrypt(cipherTextHex) {
const cipherParams = Core.lib.CipherParams.create({
ciphertext: Hex.parse(cipherTextHex)
});
const decrypted = AES.decrypt(cipherParams, this.key, {
iv: this.iv,
mode: CFBMode,
padding: NoPadding
});
return decrypted.toString(Utf8);
}
}
class ECBPkcs7 {
constructor(key2) {
__publicField(this, "key");
const keyWordArray = Utf8.parse(key2);
const byteLength = keyWordArray.sigBytes;
if (byteLength !== 16 && byteLength !== 24 && byteLength !== 32) {
throw new Error(`ECBPkcs7 key length must be 16/24/32 bytes, got ${byteLength}`);
}
this.key = keyWordArray;
}
encrypt(plainText) {
const plainWordArray = Utf8.parse(plainText);
const encrypted = AES.encrypt(plainWordArray, this.key, {
mode: ECB,
padding: Pkcs7
});
return encrypted.ciphertext.toString(Base64);
}
decrypt(cipherTextBase64) {
const cipherParams = Core.lib.CipherParams.create({
ciphertext: Base64.parse(cipherTextBase64)
});
const decrypted = AES.decrypt(cipherParams, this.key, {
mode: ECB,
padding: Pkcs7
});
return decrypted.toString(Utf8);
}
}
const key = "6363383864646339333537666634363165303866303437616564656536393262";
const iv = "65383932323563666262696d676b6375";
const cfb = new CFB(key, iv);
function decryptReqData$2(reqBody) {
const dataMatch = reqBody.match(/data=([^&]+)/);
const dataValue = dataMatch ? dataMatch[1] : null;
if (!dataValue) {
return null;
}
const decrypt2 = cfb.decrypt(dataValue);
return JSON.parse(decrypt2);
}
function decryptRespData$2(respData) {
const data = JSON.parse(respData);
const decrypt2 = cfb.decrypt(data.data);
return JSON.parse(decrypt2);
}
function hook(body, respData) {
const reqData = decryptReqData$2(body);
const code = reqData.code;
const mod = reqData.mod;
let canContinue = false;
if (mod == "system" && code == "index") {
canContinue = true;
}
if (mod == "index" && code == "home") {
canContinue = true;
}
if (mod == "index" && code == "auth") {
canContinue = true;
}
if (!canContinue) {
return;
}
const resData = decryptRespData$2(respData);
let playItems = [];
if (mod == "system") {
playItems = resData.data.recommendedData;
} else {
playItems = resData.data;
}
const akPlayItems = SessionStorage.get("ak91ShortPornPlayItems") || {};
playItems.forEach(item => {
if (item.type == 1) {
const playUrlMD5 = MD5(item.playUrl).toString();
akPlayItems[playUrlMD5] = {
id: `short_${item.id}`,
title: item.title,
playURL: item.playUrl
};
}
});
SessionStorage.set("ak91ShortPornPlayItems", akPlayItems);
}
function setActivatePlayURL(playURL) {
const playUrlMD5 = MD5(playURL).toString();
SessionStorage.set("ak91ShortPornPlayMD5", playUrlMD5);
}
function Short91PornAPPInit() {
const originalXhrSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener("load", function() {
if (this.responseURL.includes("/pwa.php")) {
hook(body, this.response);
}
if (this.responseURL.includes(".m3u8")) {
setActivatePlayURL(this.responseURL);
}
});
return originalXhrSend.apply(this, arguments);
};
}
function tryToGetItemInSessionStorage() {
const activatePlayURLMd5 = SessionStorage.get("ak91ShortPornPlayMD5");
if (activatePlayURLMd5) {
const akPlayItems = SessionStorage.get("ak91ShortPornPlayItems") || {};
const item = akPlayItems[activatePlayURLMd5];
if (item) {
return {
id: item.id,
title: item.title
};
}
return null;
}
return null;
}
function Short91PornInject() {
return new Promise(resolve => {
var _a, _b, _c;
let analyzeURL = "https://short91Porn.com/";
let title = "";
let find = false;
let remindMsg = "";
if (window.location.pathname == "/home") {
const item = tryToGetItemInSessionStorage();
if (item) {
analyzeURL += item.id;
title = item.title;
find = true;
}
}
if (/\/video\/(\d+)/.test(window.location.href)) {
const videoId = (_a = window.location.href.match(/\/video\/(\d+)/)) == null ? void 0 : _a[1];
if (videoId) {
analyzeURL += `video_${videoId}`;
find = true;
}
}
if (/\/short\?id=(\d+)/.test(window.location.href)) {
const videoId = (_b = window.location.href.match(/\/short\?id=(\d+)/)) == null ? void 0 : _b[1];
if (videoId) {
analyzeURL += `short_${videoId}`;
find = true;
}
}
if (/\/cartoonDetail\/(\d+)/.test(window.location.href)) {
const videoId = (_c = window.location.href.match(/\/cartoonDetail\/(\d+)/)) == null ? void 0 : _c[1];
if (videoId) {
analyzeURL += `cartoonDetail_${videoId}`;
find = true;
}
}
if (!find) {
resolve({
analyzeURL: "",
failReason: "未捕获到视频信息",
remindMsg: ""
});
return;
}
if (title) {
remindMsg = '<p style="color: rgb(190,24,93);">请核对标题</p>';
remindMsg += `<p style="color: rgb(190,24,93);">${title}</p>`;
}
resolve({
analyzeURL: analyzeURL,
failReason: "",
remindMsg: remindMsg
});
});
}
function DecodeData(body) {
if (body instanceof Uint8Array || body instanceof ArrayBuffer) {
return new TextDecoder("utf-8").decode(body);
}
if (typeof body === "object") {
return JSON.stringify(body);
}
return body;
}
const sessionKey$2 = "91_short_app";
const aesKey$1 = "7f21f0eb260e396e";
const aesIv$1 = "6cbe8a2b687e0ffb";
const hookURLs$2 = {
mv: /https:\/\/.*\/mv\/detail/,
community: /https:\/\/.*\/community\/post_detail/
};
function decryptReqData$1(reqBody) {
const dataMatch = reqBody.match(/data=([^&]+)/);
const dataValue = dataMatch ? dataMatch[1] : null;
if (!dataValue) {
return null;
}
const decrypt2 = AesDecryptCBCPKCS7(dataValue, aesKey$1, aesIv$1);
return JSON.parse(decrypt2);
}
function decryptRespData$1(respData) {
const decrypt2 = AesDecryptCBCPKCS7(respData, aesKey$1, aesIv$1);
return JSON.parse(decrypt2);
}
function mv(body, reply) {
const reqBody = DecodeData(body);
const response = DecodeData(reply);
const reqData = decryptReqData$1(reqBody);
const respData = decryptRespData$1(JSON.parse(response).data);
if (!respData || !respData) {
return;
}
console.log("respData: ", respData);
const cacheData = {
title: respData.data.row.title,
id: reqData.id,
anaURL: "https://91short.com/mv?id=" + reqData.id,
haveVideo: true
};
SessionStorage.set(sessionKey$2, cacheData);
}
function community(body, reply) {
const reqBody = DecodeData(body);
const response = DecodeData(reply);
const reqData = decryptReqData$1(reqBody);
const respData = decryptRespData$1(JSON.parse(response).data);
if (!respData || !respData) {
return;
}
let haveVideo = false;
console.log(respData);
respData.data.detail.medias.forEach(element => {
if (element.type === 2) {
haveVideo = true;
}
});
const cacheData = {
title: respData.data.detail.title,
id: reqData.id,
anaURL: "https://91short.com/community?id=" + reqData.id,
haveVideo: haveVideo
};
SessionStorage.set(sessionKey$2, cacheData);
}
function Short91APPInit() {
SessionStorage.remove(sessionKey$2);
const originalXhrSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener("load", function() {
for (const [key2, hookURL] of Object.entries(hookURLs$2)) {
if (hookURL.test(this.responseURL)) {
console.log("Request URL:", this.responseURL);
if (key2 === "mv") {
mv(body, this.response);
} else if (key2 === "community") {
community(body, this.response);
}
}
}
});
return originalXhrSend.apply(this, arguments);
};
}
function Short91APPInject() {
return new Promise(resolve => {
const cacheData = SessionStorage.get(sessionKey$2);
if (!cacheData) {
resolve({
analyzeURL: "",
failReason: "抱歉:未检测到任何视频或暂不支持该类型"
});
return;
}
SessionStorage.remove(sessionKey$2);
if (!cacheData.haveVideo) {
resolve({
analyzeURL: "",
failReason: "您好: 当前页面不存在视频"
});
}
let remindMsg = '<p style="color: rgb(190,24,93);">请核对标题</p>';
remindMsg += `<p style="color: rgb(190,24,93);">${cacheData.title}</p>`;
remindMsg += '<p style="color: rgb(190,24,93);">若点击取消需要重新回到当前页面哦~</p>';
resolve({
analyzeURL: cacheData.anaURL,
failReason: "",
remindMsg: remindMsg
});
});
}
const sessionKey$1 = "hj_short_video";
function decrypt(data) {
const atobData1 = atob(data);
const atobData2 = atob(atobData1);
const atobData3 = atob(atobData2);
return JSON.parse(atobData3);
}
function cacheCheckCanPlayData(data, reqURL) {
console.log("response Data,", data);
const videoId = new URL(reqURL).searchParams.get("video_id");
const responseData = decrypt(JSON.parse(data).data);
const cacheData = {
videoId: videoId,
amount: responseData.amount,
anaURL: "https://v-short.haijiao.com?video_id=" + videoId
};
SessionStorage.set(sessionKey$1, cacheData);
}
function HaiJiaoInit() {
SessionStorage.remove(sessionKey$1);
const originalXhrSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener("load", function() {
if (this.responseURL.includes("checkVideoCanPlay")) {
cacheCheckCanPlayData(this.response, this.responseURL);
}
});
return originalXhrSend.apply(this, arguments);
};
}
function HaiJiaoInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
if (url.pathname !== "/post/details" && url.pathname !== "/videoplay") {
resolve({
analyzeURL: "",
failReason: "请在视频播放页或短视频播放页面使用"
});
return;
}
if (url.pathname === "/post/details") {
const buypostBtn = document.getElementsByClassName("buypost-btn");
const saleBtn = document.getElementsByClassName("sell-btn");
if (buypostBtn.length === 0 && saleBtn.length === 0) {
resolve({
analyzeURL: "",
failReason: "当前页面不包含付费视频或您已购买"
});
return;
}
const pid = url.searchParams.get("pid");
if (!pid) {
resolve({
analyzeURL: "",
failReason: "获取视频ID失败"
});
return;
}
resolve({
analyzeURL: "https://haijiao.com/post/details?pid=" + pid,
failReason: ""
});
return;
}
if (url.pathname === "/videoplay") {
const cacheData = SessionStorage.get(sessionKey$1);
let remindMsg = "";
if (cacheData.amount === 0) {
resolve({
analyzeURL: "",
failReason: "当前短视频免费, 无需解析"
});
return;
}
resolve({
analyzeURL: cacheData.anaURL,
failReason: "",
remindMsg: remindMsg
});
}
});
}
const sessionKey = "ak_hj_app";
const currentEnvKey = "ak_hj_app_current_env";
const aesKey = "b78ce48964cffd68";
const aesIv = "d82e851b5811f3a7";
const hookURLs$1 = {
community_post_detail: /api\.php\/api\/community\/post_detail$/,
mv_get_detail: /\/api\.php\/api\/mv\/getDetail$/,
vlog_play: /api.php\/api\/vlog\/play/,
vlog_like: /api.php\/api\/vlog\/like/
};
function decryptReqData(reqBody) {
const dataMatch = reqBody.match(/data=([^&]+)/);
const dataValue = dataMatch ? dataMatch[1] : null;
if (!dataValue) {
return null;
}
const decrypt2 = AesDecryptCBCPKCS7(dataValue, aesKey, aesIv);
return JSON.parse(decrypt2);
}
function decryptRespData(respData) {
const decrypt2 = AesDecryptCBCPKCS7(respData, aesKey, aesIv);
return JSON.parse(decrypt2);
}
function community_post_detail_api(body, reply) {
const reqBody = DecodeData(body);
const response = DecodeData(reply);
const reqData = decryptReqData(reqBody);
const respData = decryptRespData(JSON.parse(response).data);
if (!reqData || !respData) {
return;
}
const cacheData = {
title: respData.data.title,
id: reqData.id,
duration: 0,
videoNum: respData.data.video_num,
anaURL: `https://app-hai-jiao.fun/detail?id=${respData.data.id}`
};
SessionStorage.set(sessionKey, cacheData);
SessionStorage.set(currentEnvKey, "mv/get_detail");
}
function mvGetDetail(body, reply) {
const reqBody = DecodeData(body);
const response = DecodeData(reply);
const reqData = decryptReqData(reqBody);
const respData = decryptRespData(JSON.parse(response).data);
console.log("respData", respData);
if (!reqData || !respData) {
return;
}
const cacheData = {
title: respData.data.detail.title,
id: reqData.id,
duration: respData.data.detail.duration,
videoNum: 1,
anaURL: `https://mv-app-hai-jiao.fun/detail?id=${reqData.id}`
};
SessionStorage.set(sessionKey, cacheData);
SessionStorage.set(currentEnvKey, "community/getDetail");
}
function vlogPlay(body) {
SessionStorage.set(currentEnvKey, "vlog_play");
}
function vlogLike(body) {
const reqBody = DecodeData(body);
const reqData = decryptReqData(reqBody);
if (!reqData) {
return;
}
if (!reqData.id) {
return;
}
const cacheData = {
title: "",
id: reqData.id,
duration: 0,
videoNum: 1,
anaURL: `https://mv-app-hai-jiao.fun/detail?id=${reqData.id}`
};
SessionStorage.set(sessionKey, cacheData);
}
function HaiJiaoAPPInit() {
SessionStorage.remove(sessionKey);
const originalXhrSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener("load", function() {
for (const [key2, hookURL] of Object.entries(hookURLs$1)) {
if (hookURL.test(this.responseURL)) {
console.log("Request URL:", this.responseURL, "key", key2);
if (key2 === "community_post_detail") {
community_post_detail_api(body, this.response);
} else if (key2 === "mv_get_detail") {
mvGetDetail(body, this.response);
} else if (key2 === "vlog_play") {
vlogPlay();
} else if (key2 === "vlog_like") {
vlogLike(body);
}
}
}
});
return originalXhrSend.apply(this, arguments);
};
}
function HaiJiaoAPPInject() {
return new Promise(resolve => {
const cacheData = SessionStorage.get(sessionKey);
const currentEnv = SessionStorage.get(currentEnvKey);
SessionStorage.remove(sessionKey);
SessionStorage.remove(currentEnvKey);
if (!cacheData && currentEnv !== "vlog_play") {
resolve({
analyzeURL: "",
failReason: "抱歉:未检测到任何视频, 请重新进入播放页"
});
return;
}
if (!cacheData && currentEnv === "vlog_play") {
resolve({
analyzeURL: "",
failReason: "右侧短视频点个赞即可提取到解析地址哦~"
});
return;
}
let remindMsg = '<p style="color: rgb(190,24,93);">若点击取消需要重新"回到/操作"该视频哦~</p>';
if (cacheData.title) {
remindMsg += `<p style="color: rgb(46, 24, 190);">${cacheData.title.substring(0, 20) + "..."}</p>`;
}
resolve({
analyzeURL: cacheData.anaURL,
failReason: "",
remindMsg: remindMsg
});
});
}
function JAVHDInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!pathname.includes("/video/")) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页使用"
});
return;
}
resolve({
analyzeURL: url.href,
failReason: ""
});
});
}
function LaikanlupingInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!/\/\d+\.html/.test(pathname)) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页使用"
});
return;
}
const isFree = pathname.includes("free");
if (isFree) {
resolve({
analyzeURL: "",
failReason: "该视频免费, 无需解析"
});
return;
}
resolve({
analyzeURL: url.href,
failReason: ""
});
});
}
function LoiBusInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!/\/lois\/\d+/.test(pathname)) {
resolve({
analyzeURL: "",
failReason: "请点击任意视频"
});
return;
}
const splitPath = pathname.split("/");
const id = splitPath[splitPath.length - 1];
fetch(`https://api.moegoat.com/api/lois/${id}`, {
body: null,
method: "GET"
}).then(response => {
if (!response.ok) {
resolve({
failReason: `获取失败, 请重试或联系客服\nerr: response status not ok`
});
return;
}
return response.json();
}).then(data => {
const videoCount = data.data.video_count;
if (videoCount <= 0) {
resolve({
failReason: `当前内容不包含视频`
});
return;
}
const vipRequirement = data.data.vip_requirement;
if (vipRequirement == 4) {
resolve({
failReason: `抱歉, 当前等级视频即将支持, 先换个视频吧~`
});
}
if (data.data.online_play !== 1) {
resolve({
failReason: `视频在该站只支持下载,不支持在线播放, 换个视频吧~`
});
}
const playlist = [ ...Array(videoCount).keys() ].map(item => ({
title: `第${item + 1}部`,
url: `https://www.loiship.com/lois/${id}?index=${item}`
}));
resolve({
playlist: playlist,
failReason: ""
});
return;
}).catch(error => {
resolve({
failReason: `获取失败, 请重试或联系客服\nerr:${error}`
});
});
});
}
function ModelMediaAsiaInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!pathname.includes("/videos/")) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页使用"
});
return;
}
resolve({
analyzeURL: url.href,
failReason: "",
gotoPage: "modelmediaasia"
});
});
}
function MosoInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!pathname.includes("/video/")) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页使用"
});
return;
}
resolve({
analyzeURL: url.href,
failReason: "",
gotoPage: "moso"
});
});
}
function SLRInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!pathname.includes("/scenes/")) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页使用"
});
return;
}
resolve({
analyzeURL: url.href,
failReason: ""
});
});
}
const txVLogSessionKey = "ak_tx_vlog_app";
const hookURLs = {
doLove: /\/h5\/movie\/doLove/,
detail: /\/h5\/movie\/detail/
};
const tx_key = "fd14f9f8e38808fa";
const ecb = new ECBPkcs7(tx_key);
function getMovieID(body) {
const bodyData = JSON.parse(ecb.decrypt(body));
SessionStorage.set(txVLogSessionKey, {
id: bodyData.data.id
});
}
function TxVLogAPPInit() {
SessionStorage.remove(txVLogSessionKey);
const originalXhrSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener("load", function() {
const url = new URL(window.location.href);
const pathname = url.pathname;
for (const [key2, hookURL] of Object.entries(hookURLs)) {
if (hookURL.test(this.responseURL)) {
SessionStorage.remove(txVLogSessionKey);
console.log("Request URL:", this.responseURL);
if (key2 === "doLove" && pathname.includes("/vlog")) {
getMovieID(body);
}
if (key2 === "detail" && pathname.includes("/movie/detail/")) {
getMovieID(body);
}
}
}
});
return originalXhrSend.apply(this, arguments);
};
}
function TxVLogInject() {
return new Promise(resolve => {
const url = new URL(window.location.href);
const pathname = url.pathname;
if (!pathname.includes("/movie/detail/") && !pathname.includes("/vlog")) {
resolve({
analyzeURL: "",
failReason: "请在视频播放页/VLog专区使用"
});
return;
}
const cacheData = SessionStorage.get(txVLogSessionKey);
if (!cacheData && pathname.includes("/vlog")) {
resolve({
analyzeURL: "",
failReason: "当前 vlog 右侧点个 “赞” 即可获取视频解析地址"
});
return;
}
if (!cacheData) {
resolve({
analyzeURL: "",
failReason: "抱歉:未检测到任何视频或暂不支持该类型"
});
return;
}
const anaURL = `https://txh067.com/movie/detail/${cacheData.id}`;
SessionStorage.remove(txVLogSessionKey);
console.log("remove session success");
resolve({
analyzeURL: anaURL,
failReason: "",
remindMsg: "若点击取消需要重新操作哦~"
});
});
}
const sourceData = {
"海角社区": [ /(http|https):\/\/hj.*\./, /(http|https):\/\/.*?\.hj.*\./, /(http|https):\/\/.*?\.hai.*\./, /(http|https):\/\/hai.*\./, /(http|https):\/\/hj.*\/.*/, /(http|https):\/\/.*\.hj.*/, /(http|https):\/\/.*h.*j.*\/home/, /.*:\/\/.*\/post\/details*/, /.*:\/\/.*\/user\/userinfo\?=*/, /.*:\/\/.*\/videoplay$/ ],
"海角APP": [ /https:\/\/p1\.lsqykbvl\.com\/.*/, /https:\/\/p5\.tyhytqs\.xyz\/.*/, /https:\/\/p5\.fkdadqjju\.cc\/.*/ ],
"19JTV": [ /https:\/\/19jtv\.com\/*/ ],
JAVHD: [ /https:\/\/javhd\.com\/*/ ],
"麻豆传媒映画": [ /https:\/\/modelmediaasia\.com\/*/, /https:\/\/www\.mdav\.live\/*/ ],
"糖心VLOG": [ /https:\/\/txh\d+\.com\/.*/, /https:\/\/.*txh\d+\.com\/.*/ ],
"天美传媒": [ /https:\/\/5ktmi048\.com\/*/ ],
"91短视频": [ /https:\/\/p2.lxrzwdq.xyz\/*/ ],
sexLikeReal: [ /https:\/\/.*sexlikereal.com\/*/ ],
"萝莉巴士": [ /https:\/\/www\.loi(?:box\d+|bus(?:\d+)?|raft|ship)\.(?:top|xyz|com)\/.*/, /https:\/\/loix.org\/.*/ ],
"51风流": [ /https:\/\/.*51fengliu.com\/*/, /https:\/\/.*51fengliu3.com\/*/ ],
"91Porn短视频": [ /https:\/\/pwa3\.dsp11a\.cc\// ],
"来看录屏": [ /https:\/\/lubosp\.com\/*/ ],
"兔子先生": [ /https:\/\/moso\.monster\/*/ ]
};
function matchSource(href) {
for (const [key2, regexPatterns] of Object.entries(sourceData)) {
const match = regexPatterns.some(regex => regex.test(href));
if (match) {
return key2;
}
}
return "";
}
function PlatformInject() {
const href = window.location.href;
const source = matchSource(href);
if (source === "") {
return {
ok: false,
platform: "",
func: () => Promise.reject()
};
}
if (source === "海角社区") {
HaiJiaoInit();
return {
ok: true,
platform: source,
func: HaiJiaoInject,
platformMsg: "支持板块: 视频播放页面、短视频页面"
};
}
if (source === "海角APP") {
HaiJiaoAPPInit();
return {
ok: true,
platform: source,
func: HaiJiaoAPPInject,
platformMsg: "支持板块: 首页、原创、短视频、社区(不包括ASMR、种子下载)"
};
}
if (source === "19JTV") {
return {
ok: true,
platform: source,
func: Jtv19Inject,
platformMsg: "支持板块: 视频播放页面"
};
}
if (source === "JAVHD") {
return {
ok: true,
platform: source,
func: JAVHDInject,
platformMsg: "支持板块: 视频播放页面"
};
}
if (source === "麻豆传媒映画") {
return {
ok: true,
platform: source,
func: ModelMediaAsiaInject,
platformMsg: "支持板块: 视频播放页面"
};
}
if (source === "糖心VLOG") {
TxVLogAPPInit();
return {
ok: true,
platform: source,
func: TxVLogInject,
platformMsg: "支持板块: 视频详情页以及VLOG专区"
};
}
if (source === "天美传媒") {
return {
ok: true,
platform: source,
func: TMInject,
platformMsg: "支持板块: 视频播放页面"
};
}
if (source === "91短视频") {
Short91APPInit();
return {
ok: true,
platform: source,
func: Short91APPInject,
platformMsg: "支持板块: 首页、PORN、原创、社区"
};
}
if (source === "sexLikeReal") {
return {
ok: true,
platform: source,
func: SLRInject,
platformMsg: "支持板块: 视频播放页面"
};
}
if (source === "萝莉巴士") {
return {
ok: true,
platform: source,
func: LoiBusInject,
platformMsg: "支持板块: 视频详情弹窗"
};
}
if (source === "51风流") {
return {
ok: true,
platform: source,
func: FengLiu51Inject,
platformMsg: "支持板块: 信息、暗巷、商家",
supportUserToken: true
};
}
if (source === "91Porn短视频") {
Short91PornAPPInit();
return {
ok: true,
platform: source,
func: Short91PornInject,
platformMsg: "支持板块: 首页、热点、资源(动漫视频)、原创。该站点存在特殊性, 不建议在首页使用,可以进入作者页面找到对应的视频进行使用, 请见谅!",
platformMsgDuration: 0
};
}
if (source === "来看录屏") {
return {
ok: true,
platform: source,
func: LaikanlupingInject,
platformMsg: "支持板块: 视频播放页"
};
}
if (source === "兔子先生") {
return {
ok: true,
platform: source,
func: MosoInject,
platformMsg: "支持板块: 视频播放页"
};
}
return {
ok: false,
platform: "",
func: () => Promise.reject()
};
}
function UpdatePluginRequest() {
const reqURL = `${Config.ApiURL}/version`;
return fetch(reqURL, {
method: "POST",
headers: {
"Content-Type": "application/json"
}
}).then(response => response.json());
}
const _FloatingActions = class _FloatingActions {
constructor(root, showActivateIcon, callbacks) {
__publicField(this, "group");
__publicField(this, "updateButton");
__publicField(this, "mainButton");
__publicField(this, "dragState");
this.group = document.createElement("div");
this.group.className = "akwm-fab-group";
this.group.dataset.open = "false";
this.applyStoredPosition();
const actions = document.createElement("div");
actions.className = "akwm-fab-actions";
this.updateButton = this.createButton(syncIcon(), "检查更新", callbacks.onUpdate);
actions.appendChild(this.updateButton);
actions.appendChild(this.createButton(linkIcon(), "获取解析地址", callbacks.onAnalyze));
if (showActivateIcon) {
actions.appendChild(this.createButton(checkIcon(), "身份验证", callbacks.onActivateToken));
}
this.mainButton = this.createButton("AK", "Ak Web Master", () => this.toggleOpen());
this.mainButton.classList.add("akwm-fab-main");
this.bindDrag();
this.group.append(actions, this.mainButton);
root.appendChild(this.group);
}
setNeedUpdate(needUpdate) {
this.updateButton.classList.toggle("akwm-fab-badge", needUpdate);
}
toggleOpen() {
this.group.dataset.open = this.group.dataset.open === "true" ? "false" : "true";
}
createButton(content, title, onClick) {
const button = document.createElement("button");
button.className = "akwm-fab";
button.type = "button";
if (content.trim().startsWith("<svg")) {
button.innerHTML = content;
} else {
button.textContent = content;
}
button.title = title;
button.setAttribute("aria-label", title);
button.addEventListener("click", onClick);
return button;
}
bindDrag() {
this.mainButton.addEventListener("pointerdown", event => {
if (event.button !== 0) {
return;
}
const rect = this.group.getBoundingClientRect();
this.dragState = {
pointerId: event.pointerId,
startX: event.clientX,
startY: event.clientY,
startLeft: rect.left,
startTop: rect.top,
moved: false
};
this.mainButton.setPointerCapture(event.pointerId);
this.group.classList.add("akwm-fab-dragging");
});
this.mainButton.addEventListener("pointermove", event => {
const state = this.dragState;
if (!state || state.pointerId !== event.pointerId) {
return;
}
const dx = event.clientX - state.startX;
const dy = event.clientY - state.startY;
if (Math.abs(dx) + Math.abs(dy) > 4) {
state.moved = true;
}
this.setPosition(state.startLeft + dx, state.startTop + dy);
});
this.mainButton.addEventListener("pointerup", event => this.finishDrag(event));
this.mainButton.addEventListener("pointercancel", event => this.finishDrag(event));
this.mainButton.addEventListener("click", event => {
if (this.group.dataset.justDragged === "true") {
event.stopImmediatePropagation();
this.group.dataset.justDragged = "false";
}
}, true);
window.addEventListener("resize", () => {
const rect = this.group.getBoundingClientRect();
this.setPosition(rect.left, rect.top, true);
});
}
finishDrag(event) {
const state = this.dragState;
if (!state || state.pointerId !== event.pointerId) {
return;
}
this.mainButton.releasePointerCapture(event.pointerId);
this.group.classList.remove("akwm-fab-dragging");
this.dragState = void 0;
const rect = this.group.getBoundingClientRect();
this.savePosition(rect.left, rect.top);
if (state.moved) {
this.group.dataset.justDragged = "true";
}
}
applyStoredPosition() {
const position = readStoredPosition();
if (!position) {
return;
}
this.setPosition(position.left, position.top);
}
setPosition(left, top, skipSave = false) {
const maxLeft = Math.max(8, window.innerWidth - this.group.offsetWidth - 8);
const maxTop = Math.max(8, window.innerHeight - this.group.offsetHeight - 8);
const nextLeft = clamp(left, 8, maxLeft);
const nextTop = clamp(top, 8, maxTop);
this.group.style.left = `${nextLeft}px`;
this.group.style.top = `${nextTop}px`;
this.group.style.right = "auto";
if (!skipSave) {
this.savePosition(nextLeft, nextTop);
}
}
savePosition(left, top) {
localStorage.setItem(_FloatingActions.positionKey, JSON.stringify({
left: left,
top: top
}));
}
};
__publicField(_FloatingActions, "positionKey", "akwmFloatingPosition");
let FloatingActions = _FloatingActions;
function readStoredPosition() {
const raw = localStorage.getItem(FloatingActions.positionKey);
if (!raw) {
return null;
}
try {
const data = JSON.parse(raw);
if (typeof data.left === "number" && typeof data.top === "number") {
return data;
}
} catch {
return null;
}
return null;
}
function clamp(value, min, max) {
return Math.min(Math.max(value, min), max);
}
function icon(path) {
return `<svg class="akwm-fab-icon" viewBox="0 0 24 24" aria-hidden="true">${path}</svg>`;
}
function syncIcon() {
return icon('<path d="M21 12a9 9 0 0 0-15.4-6.4L3 8"></path><path d="M3 3v5h5"></path><path d="M3 12a9 9 0 0 0 15.4 6.4L21 16"></path><path d="M21 21v-5h-5"></path>');
}
function linkIcon() {
return icon('<path d="M10 13a5 5 0 0 0 7.1 0l2-2a5 5 0 0 0-7.1-7.1l-1.1 1.1"></path><path d="M14 11a5 5 0 0 0-7.1 0l-2 2a5 5 0 0 0 7.1 7.1l1.1-1.1"></path>');
}
function checkIcon() {
return icon('<path d="M20 6 9 17l-5-5"></path>');
}
class ModalController {
constructor(root, options) {
__publicField(this, "overlay");
__publicField(this, "body");
__publicField(this, "okButton");
__publicField(this, "cancelButton");
__publicField(this, "okLabel", "");
this.root = root;
this.overlay = document.createElement("div");
this.overlay.className = "akwm-modal-overlay";
const dialog = document.createElement("section");
dialog.className = "akwm-modal";
dialog.setAttribute("role", "dialog");
dialog.setAttribute("aria-modal", "true");
const header = document.createElement("header");
header.className = "akwm-modal-header";
header.textContent = options.title;
this.body = document.createElement("div");
this.body.className = "akwm-modal-body";
this.setBody(options.body || "");
const footer = document.createElement("footer");
footer.className = "akwm-modal-footer";
const showCancel = options.showCancel !== false;
if (showCancel) {
this.cancelButton = document.createElement("button");
this.cancelButton.className = "akwm-btn";
this.cancelButton.type = "button";
this.cancelButton.textContent = options.cancelText || "取消";
this.cancelButton.addEventListener("click", () => {
var _a;
(_a = options.onCancel) == null ? void 0 : _a.call(options);
this.close();
});
footer.appendChild(this.cancelButton);
}
const showOk = options.showOk !== false;
if (showOk) {
this.okButton = document.createElement("button");
this.okButton.className = "akwm-btn akwm-btn-primary";
this.okButton.type = "button";
this.okLabel = options.okText || "确定";
this.okButton.textContent = this.okLabel;
this.okButton.disabled = Boolean(options.okDisabled);
this.okButton.addEventListener("click", () => {
var _a;
void ((_a = options.onOk) == null ? void 0 : _a.call(options));
});
footer.appendChild(this.okButton);
}
dialog.append(header, this.body, footer);
this.overlay.appendChild(dialog);
this.root.appendChild(this.overlay);
}
setBody(content) {
this.body.replaceChildren();
if (typeof content === "string") {
const text = document.createElement("span");
text.textContent = content;
this.body.appendChild(text);
return;
}
this.body.appendChild(content);
}
setOkText(text) {
this.okLabel = text;
if (this.okButton) {
this.okButton.textContent = text;
}
}
setOkDisabled(disabled) {
if (this.okButton) {
this.okButton.disabled = disabled;
}
}
setLoading(loading) {
if (this.okButton) {
this.okButton.disabled = loading;
this.okButton.textContent = loading ? "请稍等..." : this.okLabel;
}
if (this.cancelButton) {
this.cancelButton.disabled = loading;
}
}
close() {
this.overlay.remove();
}
}
const styles = `\n:host {\n all: initial;\n}\n\n.akwm-root,\n.akwm-root * {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\n.akwm-root {\n position: fixed;\n inset: 0;\n z-index: 2147483647;\n pointer-events: none;\n color: #172033;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.akwm-root button,\n.akwm-root input {\n font: inherit;\n}\n\n.akwm-fab-group {\n position: fixed;\n right: 20px;\n top: 47vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n pointer-events: auto;\n touch-action: none;\n}\n\n.akwm-fab-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n transform: translateY(6px);\n opacity: 0;\n pointer-events: none;\n transition: opacity 160ms ease, transform 160ms ease;\n}\n\n.akwm-fab-group[data-open="true"] .akwm-fab-actions {\n transform: translateY(0);\n opacity: 1;\n pointer-events: auto;\n}\n\n.akwm-fab {\n position: relative;\n width: 38px;\n height: 38px;\n border: 0;\n border-radius: 999px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n background: #2563eb;\n box-shadow: 0 8px 20px rgba(31, 41, 55, 0.22);\n cursor: pointer;\n user-select: none;\n transition: transform 120ms ease, box-shadow 120ms ease, background 120ms ease;\n}\n\n.akwm-fab:hover {\n transform: translateY(-1px);\n background: #1d4ed8;\n box-shadow: 0 10px 24px rgba(31, 41, 55, 0.28);\n}\n\n.akwm-fab:active {\n transform: translateY(0);\n}\n\n.akwm-fab-main {\n width: 44px;\n height: 44px;\n font-size: 13px;\n font-weight: 800;\n cursor: grab;\n}\n\n.akwm-fab-dragging .akwm-fab-main {\n cursor: grabbing;\n}\n\n.akwm-fab-icon {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.akwm-fab-badge::after {\n content: "";\n position: absolute;\n top: 2px;\n right: 3px;\n width: 8px;\n height: 8px;\n border: 2px solid #fff;\n border-radius: 999px;\n background: #ef4444;\n}\n\n.akwm-toast-wrap {\n position: fixed;\n top: 22px;\n right: 22px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: min(340px, calc(100vw - 44px));\n pointer-events: auto;\n}\n\n.akwm-toast {\n border: 1px solid rgba(148, 163, 184, 0.28);\n border-radius: 8px;\n background: #fff;\n box-shadow: 0 14px 38px rgba(15, 23, 42, 0.18);\n padding: 12px 14px;\n color: #172033;\n overflow: hidden;\n}\n\n.akwm-toast-title {\n margin: 0;\n font-size: 14px;\n font-weight: 700;\n}\n\n.akwm-toast-desc {\n margin: 4px 0 0;\n color: #5b6475;\n font-size: 13px;\n word-break: break-word;\n}\n\n.akwm-toast-success {\n border-left: 4px solid #16a34a;\n}\n\n.akwm-toast-error {\n border-left: 4px solid #dc2626;\n}\n\n.akwm-toast-info {\n border-left: 4px solid #2563eb;\n}\n\n.akwm-modal-overlay {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 22px;\n background: rgba(15, 23, 42, 0.36);\n pointer-events: auto;\n}\n\n.akwm-modal {\n width: min(520px, 100%);\n max-height: min(680px, calc(100vh - 44px));\n display: flex;\n flex-direction: column;\n border: 1px solid rgba(148, 163, 184, 0.24);\n border-radius: 8px;\n background: #fff;\n box-shadow: 0 26px 70px rgba(15, 23, 42, 0.28);\n overflow: hidden;\n}\n\n.akwm-modal-header {\n padding: 18px 20px 10px;\n color: #101828;\n font-size: 16px;\n font-weight: 760;\n}\n\n.akwm-modal-body {\n padding: 10px 20px 18px;\n color: #273244;\n overflow: auto;\n word-break: break-word;\n}\n\n.akwm-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 12px 20px 16px;\n border-top: 1px solid #edf1f7;\n}\n\n.akwm-btn {\n min-width: 74px;\n height: 34px;\n border: 1px solid #d6dce8;\n border-radius: 6px;\n padding: 0 14px;\n background: #fff;\n color: #273244;\n cursor: pointer;\n text-align: center;\n user-select: none;\n}\n\n.akwm-btn:hover {\n border-color: #9fb0c8;\n color: #111827;\n}\n\n.akwm-btn-primary {\n border-color: #2563eb;\n background: #2563eb;\n color: #fff;\n}\n\n.akwm-btn-primary:hover {\n border-color: #1d4ed8;\n background: #1d4ed8;\n color: #fff;\n}\n\n.akwm-btn-link {\n border-color: transparent;\n background: transparent;\n color: #2563eb;\n min-width: auto;\n padding: 0 2px;\n}\n\n.akwm-btn-dashed {\n border-style: dashed;\n min-width: 92px;\n}\n\n.akwm-btn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.akwm-input {\n width: 100%;\n height: 40px;\n border: 1px solid #d6dce8;\n border-radius: 6px;\n padding: 0 12px;\n outline: none;\n color: #172033;\n background: #f8fafc;\n}\n\n.akwm-input:focus {\n border-color: #2563eb;\n background: #fff;\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);\n}\n\n.akwm-tag {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 30px;\n border-radius: 6px;\n padding: 5px 10px;\n color: #5b21b6;\n background: #f3e8ff;\n overflow: hidden;\n}\n\n.akwm-ellipsis {\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.akwm-center {\n text-align: center;\n}\n\n.akwm-stack {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.akwm-row {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 8px;\n}\n\n.akwm-segmented {\n display: inline-flex;\n gap: 4px;\n padding: 4px;\n border-radius: 8px;\n background: #eef2f7;\n}\n\n.akwm-segmented button {\n min-width: 54px;\n height: 30px;\n border: 0;\n border-radius: 6px;\n padding: 0 12px;\n color: #475569;\n background: transparent;\n cursor: pointer;\n}\n\n.akwm-segmented button[data-active="true"] {\n color: #172033;\n background: #fff;\n box-shadow: 0 1px 4px rgba(15, 23, 42, 0.12);\n}\n\n.akwm-remind {\n text-align: center;\n}\n\n.akwm-remind p {\n margin: 6px 0;\n}\n\n.akwm-danger {\n color: #be185d;\n}\n\n.akwm-muted {\n color: #667085;\n}\n\n@media (max-width: 520px) {\n .akwm-fab-group {\n right: 14px;\n }\n\n .akwm-modal-overlay {\n padding: 14px;\n }\n\n .akwm-modal-header {\n padding: 16px 16px 8px;\n }\n\n .akwm-modal-body {\n padding: 8px 16px 16px;\n }\n\n .akwm-modal-footer {\n padding: 12px 16px 14px;\n }\n}\n`;
class ToastCenter {
constructor(root) {
__publicField(this, "wrap");
this.wrap = document.createElement("div");
this.wrap.className = "akwm-toast-wrap";
root.appendChild(this.wrap);
}
info(message, description, duration = 5) {
this.show("info", message, description, duration);
}
success(message, description, duration = 2.4) {
this.show("success", message, description, duration);
}
error(message, description, duration = 4) {
this.show("error", message, description, duration);
}
show(kind, message, description, duration = 5) {
const item = document.createElement("div");
item.className = `akwm-toast akwm-toast-${kind}`;
const title = document.createElement("p");
title.className = "akwm-toast-title";
title.textContent = message;
item.appendChild(title);
if (description) {
const desc = document.createElement("p");
desc.className = "akwm-toast-desc";
desc.textContent = description;
item.appendChild(desc);
}
item.addEventListener("click", () => item.remove());
this.wrap.appendChild(item);
if (duration > 0) {
window.setTimeout(() => item.remove(), duration * 1e3);
}
}
}
async function copyToClipboard(text, success, toast, failure) {
try {
await navigator.clipboard.writeText(text);
toast.success(success);
} catch {
toast.error("复制解析地址失败, 请开启浏览器复制权限");
}
}
function autoSearchEncodeUrl(url) {
return btoa(url).replace(/=/g, "~").replace(/\+/g, "-").replace(/\//g, "_");
}
function gotoAkSky(searchURL, page = "") {
const url = `https://ak-sky.com/${page}#searchURL=${autoSearchEncodeUrl(searchURL)}`;
window.open(url, "_blank");
}
const newVersionPluginAddress = "https://sleazyfork.org/zh-CN/scripts/588047-akwebmasterv2";
const noopInject = async () => ({
analyzeURL: "",
failReason: "Default function - no operation",
remindMsg: "",
gotoPage: ""
});
class AkWebMasterApp {
constructor(shadowRoot) {
__publicField(this, "root");
__publicField(this, "toast");
__publicField(this, "injectFunction", noopInject);
__publicField(this, "actions");
__publicField(this, "initialized", false);
this.shadowRoot = shadowRoot;
const style = document.createElement("style");
style.textContent = styles;
this.shadowRoot.appendChild(style);
this.root = document.createElement("div");
this.root.className = "akwm-root";
this.shadowRoot.appendChild(this.root);
this.toast = new ToastCenter(this.root);
}
init() {
if (this.initialized) {
return;
}
this.initialized = true;
const platform = PlatformInject();
if (!platform.ok) {
this.toast.info("Ak Web Master", "加载失败, 请联系客服");
return;
}
this.injectFunction = platform.func;
this.actions = new FloatingActions(this.root, Boolean(platform.supportUserToken), {
onUpdate: () => this.openUpdateDialog(),
onAnalyze: () => this.openAnalyzeDialog(),
onActivateToken: () => this.openActivateDialog()
});
this.refreshUpdateBadge();
this.toast.info(`${platform.platform} 加载成功`, platform.platformMsg, platform.platformMsgDuration ?? 5);
}
refreshUpdateBadge() {
UpdatePluginRequest().then(reply => {
var _a;
if (reply.code !== 200) {
return;
}
(_a = this.actions) == null ? void 0 : _a.setNeedUpdate(reply.data.version !== getScriptVersion());
}).catch(() => {
var _a;
(_a = this.actions) == null ? void 0 : _a.setNeedUpdate(false);
});
}
openAnalyzeDialog() {
let modal;
modal = new ModalController(this.root, {
title: "您 好",
body: "是否尝试获解析地址",
okText: "获 取",
cancelText: "取 消",
onOk: async () => {
modal.setOkText("获取中");
modal.setBody("请稍等...");
modal.setLoading(true);
try {
const reply = await this.injectFunction();
if (reply.openActivateToken) {
modal.close();
this.openActivateDialog();
return;
}
if (reply.failReason) {
modal.setBody(reply.failReason);
modal.setOkText("重 试");
return;
}
this.handleAnalyzeSuccess(reply);
modal.close();
} catch {
modal.setBody("获取失败, 请重试");
modal.setOkText("获 取");
} finally {
modal.setLoading(false);
}
}
});
}
handleAnalyzeSuccess(reply) {
var _a;
if (reply.analyzeURL) {
this.openRedirectDialog(reply.analyzeURL, reply.remindMsg, reply.gotoPage);
}
if ((_a = reply.playlist) == null ? void 0 : _a.length) {
this.openPlaylistDialog(reply.playlist, reply.remindMsg, reply.playlistSubTitle);
}
if (reply.segmented) {
this.openSegmentedDialog(reply.segmented, reply.remindMsg);
}
}
openRedirectDialog(analyzeURL, remindMsg, gotoPage) {
const body = document.createElement("div");
const tag = document.createElement("div");
tag.className = "akwm-tag";
const urlText = document.createElement("span");
urlText.className = "akwm-ellipsis";
urlText.textContent = analyzeURL;
tag.appendChild(urlText);
body.appendChild(tag);
appendRemind(body, remindMsg);
let modal;
modal = new ModalController(this.root, {
title: "获取成功",
body: body,
okText: "前往Ak-Sky",
cancelText: "取消",
onOk: () => {
gotoAkSky(analyzeURL, gotoPage);
modal.close();
}
});
}
openPlaylistDialog(playlist, remindMsg, subTitle) {
const body = document.createElement("div");
body.className = "akwm-stack";
const subtitle = document.createElement("div");
subtitle.className = "akwm-center akwm-muted";
subtitle.textContent = subTitle || `本内容含有 ${playlist.length} 个视频, 请选择`;
body.appendChild(subtitle);
const row = document.createElement("div");
row.className = "akwm-row";
playlist.forEach(item => {
const button = document.createElement("button");
button.className = "akwm-btn akwm-btn-dashed";
button.type = "button";
button.textContent = item.title;
button.addEventListener("click", () => gotoAkSky(item.url));
row.appendChild(button);
});
body.appendChild(row);
appendRemind(body, remindMsg);
new ModalController(this.root, {
title: "获取成功",
body: body,
cancelText: "取消",
showOk: false
});
}
openSegmentedDialog(result, remindMsg) {
let key2 = result.options[0] || "";
const body = document.createElement("div");
body.className = "akwm-stack akwm-center";
const remind = document.createElement("div");
remind.className = "akwm-danger";
remind.textContent = remindMsg || "";
body.appendChild(remind);
const segmented = document.createElement("div");
segmented.className = "akwm-segmented";
const value = document.createElement("p");
value.textContent = result.data[key2] || "";
const renderSegments = () => {
segmented.replaceChildren();
result.options.forEach(option => {
const button = document.createElement("button");
button.type = "button";
button.textContent = option;
button.dataset.active = String(option === key2);
button.addEventListener("click", () => {
key2 = option;
value.textContent = result.data[key2] || "";
renderSegments();
});
segmented.appendChild(button);
});
};
renderSegments();
const copyButton = document.createElement("button");
copyButton.className = "akwm-btn akwm-btn-primary";
copyButton.type = "button";
copyButton.textContent = "复 制";
copyButton.addEventListener("click", () => copyToClipboard(result.data[key2] || "", "复制成功", this.toast));
body.append(segmented, value, copyButton);
new ModalController(this.root, {
title: "获取成功",
body: body,
cancelText: "关 闭",
showOk: false
});
}
openActivateDialog() {
const body = document.createElement("div");
const input = document.createElement("input");
input.className = "akwm-input";
input.placeholder = "请输入您的激活码";
input.value = LocalStorage.get("akSkyUserToken") || "";
body.appendChild(input);
const linkWrap = document.createElement("div");
linkWrap.style.display = "flex";
linkWrap.style.justifyContent = "flex-end";
linkWrap.style.marginTop = "10px";
const link = document.createElement("button");
link.className = "akwm-btn akwm-btn-link";
link.type = "button";
link.textContent = "获取激活码";
link.addEventListener("click", () => window.open("https://ak-sky.com/phoenix", "_blank"));
linkWrap.appendChild(link);
body.appendChild(linkWrap);
let modal;
modal = new ModalController(this.root, {
title: "身份验证",
body: body,
okText: "确 认",
cancelText: "取 消",
okDisabled: !input.value,
onOk: () => {
const token = input.value.trim();
if (!token) {
modal.setOkDisabled(true);
return;
}
LocalStorage.set("akSkyUserToken", token);
modal.close();
}
});
input.addEventListener("input", () => modal.setOkDisabled(!input.value.trim()));
window.setTimeout(() => input.focus(), 0);
}
openUpdateDialog() {
let okText = "检查";
let modal;
modal = new ModalController(this.root, {
title: "Ak-WebMaster",
body: "是否检查新版本?",
okText: okText,
cancelText: "取消",
onOk: async () => {
var _a, _b;
if (okText === "前往更新") {
window.open(newVersionPluginAddress, "_blank");
modal.close();
return;
}
modal.setLoading(true);
try {
const reply = await UpdatePluginRequest();
if (reply.code !== 200) {
modal.setBody("检查失败");
return;
}
if (reply.data.version !== getScriptVersion()) {
modal.setBody(`发现新版本: ${reply.data.version}`);
okText = "前往更新";
modal.setOkText(okText);
(_a = this.actions) == null ? void 0 : _a.setNeedUpdate(true);
} else {
modal.setBody("当前版本为最新版本");
(_b = this.actions) == null ? void 0 : _b.setNeedUpdate(false);
}
} catch {
modal.setBody("检查失败");
} finally {
modal.setLoading(false);
}
}
});
}
}
function appendRemind(parent, remindMsg) {
if (!remindMsg) {
return;
}
const remind = document.createElement("div");
remind.className = "akwm-remind";
remind.innerHTML = remindMsg;
parent.appendChild(remind);
}
function getScriptVersion() {
if (typeof GM_info !== "undefined") {
return GM_info.script.version;
}
return "v2.2.5";
}
function log(...args) {
console.log("%cAkWebMaster:", "color: #7c3aed; font-weight: 700", ...args);
}
function onLocationChange(callback) {
window.setTimeout(callback, 0);
const start = () => {
let oldHref = window.location.href;
const observer = new MutationObserver(() => {
if (oldHref !== window.location.href) {
oldHref = window.location.href;
callback();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
return observer;
};
if (document.body) {
return start();
}
document.addEventListener("DOMContentLoaded", start, {
once: true
});
return void 0;
}
log("script has successfully started");
function mount() {
if (!document.body) {
window.setTimeout(mount, 50);
return;
}
if (document.getElementById("akwm")) {
return;
}
const host = document.createElement("div");
host.id = "akwm";
document.body.appendChild(host);
const shadowRoot = host.attachShadow({
mode: "open"
});
const app = new AkWebMasterApp(shadowRoot);
window.__AKWM_APP__ = app;
app.init();
}
onLocationChange(() => {
try {
mount();
} catch (error) {
log(error);
}
});
})();