运行 userscript/from 控制台时未定义函数
Function not defined when running userscript/from console
我试图从 url http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170(特定页面)中提取 link 运行 从
http://kissasian.sh/Drama/My-Mister(一般页面)。但是,该网站对我尝试访问的 link 进行了加密。
运行以下代码
var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var msg = $.ajax({type: "GET", url: url, async: false}).responseText;
console.log(msg);
在 $kissenc.decrypt()
函数的响应文本中提供加密视频 link。
当运行从特定页面上的控制台调用此函数时,返回解密后的link;但是,此函数未在我的脚本 运行 所在的通用页面上定义,如下面的代码所示。
var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var decrypted = "";
var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
$.support.cors = true;
$.ajax({type: "GET", url:url, async: false, crossDomain: true}).done(function(){decrypted = $kissenc.decrypt(msg)});
alert(decrypted);
我不熟悉 CORS,我不确定这是否会在尝试 运行 函数时造成问题。
同样,我无法通过在通用或特定页面上合并来自 kissasian.sh 域的脚本来 运行 $kissenc.decrypt()
功能:
var rootUrl = "http://kissasian.sh/Scripts/";
$.ajaxSetup({async:false});
var jsS = [
"common.js",
"aes.js",
"sha256.min.js",
"subo.min.js?v=3.19"
];
console.log('Loading scripts ...');
for (var i=0; i < jsS.length; i++){
console.log(jsS[i]);
$.getScript(rootUrl + jsS[i]);
}
var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
var decrypted = $kissenc.decrypt(msg);
alert(decrypted);
这两种方法都依赖于解密函数的成功执行。以下代码在不使用 $kissenc.decrypt()
:
的情况下在更具体的页面上执行
$.ajax({
url: "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170",
success: function(result) {
var msg = document.getElementById('containerRoot').outerHTML;
console.log(msg);
},
crossDomain: true,
async: false,
script: true
});
但是,当我尝试通过从一般页面检索元素来查找 link 时,代码再次无法正确 运行。我希望 document.getElementById
从特定页面提供正确的 containerRoot,但它却为执行它的一般页面提供了一个。
在这三种不同的场景中,我需要一个来工作,我不确定是什么导致了问题。任何帮助将不胜感激!
有点复杂。 $kissenc
对象在 subo.min
脚本中定义,该脚本被混淆 并且 取决于已经加载的其他四个脚本, 包括 jquery.allofthelights-min.js
。将这些脚本放在一个数组中,就像您正在做的那样,然后 eval
它们。
在那之后,window.$kissenc
被定义,因此可以与之交互。但是还有另一个问题:其decrypt
方法的结果不仅取决于传入的参数,而且还取决于先前对$kissenc
的属性调用。 $kissenc
也 取决于在 subo
脚本 运行 之前执行的剧集页面顶部的某个内联脚本标记,否则 decrypt
将 return 空字符串。因此,eval
在加载外部脚本之前首先内联 <script>
标记。
然后,页面上有一堆other混淆的内联脚本标签。你需要先 eval
他们中的每一个,直到你到达调用 decrypt
的那个 - 然后,你可以调用 decrypt
你自己 和得到你正在寻找的输出。
var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
var rootUrl = "http://kissasian.sh/Scripts/";
var jsS = [
"common.js?v=3",
'jquery.allofthelights-min.js?v=3', // this was missing from your original code
"aes.js",
"sha256.min.js",
"subo.min.js?v=3.19"
];
console.log('Loading scripts ...');
(async () => {
const resp = await fetch(url);
const text = await resp.text();
const doc = new DOMParser().parseFromString(text, 'text/html');
// Get all inline script tags
const [first, ...inlineScripts] = doc.querySelectorAll('script:not([src])');
// we'll eval the inlineScripts later, after the subo script runs (defines $kissenc)
// but the first must be evaled before subo runs
eval(first.textContent);
// load the 5 external scripts
for (let i = 0; i < jsS.length; i++) {
const resp = await fetch(rootUrl + jsS[i]);
const text = await resp.text();
eval(text);
}
// window.$kissenc is now defined,
// now we can iterate through the inlineScripts that look obfuscated and eval them:
let textToDecode;
for (const { textContent } of inlineScripts) {
if (textContent.includes('decrypt')) {
// we've gotten to the script that decrypts;
// don't run it, instead call decrypt ourselves,
// and break out of the loop:
const match = textContent.match(/decrypt\('([^']+).+/);
textToDecode = match[1];
break;
} else if (textContent.includes('\x') || /^\s+_/.test(textContent)) {
eval(textContent);
}
}
console.log('Decrpyting ', textToDecode);
var decrypted = $kissenc.decrypt(textToDecode);
console.log(decrypted);
})();
我试图从 url http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170(特定页面)中提取 link 运行 从 http://kissasian.sh/Drama/My-Mister(一般页面)。但是,该网站对我尝试访问的 link 进行了加密。
运行以下代码
var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var msg = $.ajax({type: "GET", url: url, async: false}).responseText;
console.log(msg);
在 $kissenc.decrypt()
函数的响应文本中提供加密视频 link。
当运行从特定页面上的控制台调用此函数时,返回解密后的link;但是,此函数未在我的脚本 运行 所在的通用页面上定义,如下面的代码所示。
var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var decrypted = "";
var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
$.support.cors = true;
$.ajax({type: "GET", url:url, async: false, crossDomain: true}).done(function(){decrypted = $kissenc.decrypt(msg)});
alert(decrypted);
我不熟悉 CORS,我不确定这是否会在尝试 运行 函数时造成问题。
同样,我无法通过在通用或特定页面上合并来自 kissasian.sh 域的脚本来 运行 $kissenc.decrypt()
功能:
var rootUrl = "http://kissasian.sh/Scripts/";
$.ajaxSetup({async:false});
var jsS = [
"common.js",
"aes.js",
"sha256.min.js",
"subo.min.js?v=3.19"
];
console.log('Loading scripts ...');
for (var i=0; i < jsS.length; i++){
console.log(jsS[i]);
$.getScript(rootUrl + jsS[i]);
}
var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
var decrypted = $kissenc.decrypt(msg);
alert(decrypted);
这两种方法都依赖于解密函数的成功执行。以下代码在不使用 $kissenc.decrypt()
:
$.ajax({
url: "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170",
success: function(result) {
var msg = document.getElementById('containerRoot').outerHTML;
console.log(msg);
},
crossDomain: true,
async: false,
script: true
});
但是,当我尝试通过从一般页面检索元素来查找 link 时,代码再次无法正确 运行。我希望 document.getElementById
从特定页面提供正确的 containerRoot,但它却为执行它的一般页面提供了一个。
在这三种不同的场景中,我需要一个来工作,我不确定是什么导致了问题。任何帮助将不胜感激!
有点复杂。 $kissenc
对象在 subo.min
脚本中定义,该脚本被混淆 并且 取决于已经加载的其他四个脚本, 包括 jquery.allofthelights-min.js
。将这些脚本放在一个数组中,就像您正在做的那样,然后 eval
它们。
在那之后,window.$kissenc
被定义,因此可以与之交互。但是还有另一个问题:其decrypt
方法的结果不仅取决于传入的参数,而且还取决于先前对$kissenc
的属性调用。 $kissenc
也 取决于在 subo
脚本 运行 之前执行的剧集页面顶部的某个内联脚本标记,否则 decrypt
将 return 空字符串。因此,eval
在加载外部脚本之前首先内联 <script>
标记。
然后,页面上有一堆other混淆的内联脚本标签。你需要先 eval
他们中的每一个,直到你到达调用 decrypt
的那个 - 然后,你可以调用 decrypt
你自己 和得到你正在寻找的输出。
var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
var rootUrl = "http://kissasian.sh/Scripts/";
var jsS = [
"common.js?v=3",
'jquery.allofthelights-min.js?v=3', // this was missing from your original code
"aes.js",
"sha256.min.js",
"subo.min.js?v=3.19"
];
console.log('Loading scripts ...');
(async () => {
const resp = await fetch(url);
const text = await resp.text();
const doc = new DOMParser().parseFromString(text, 'text/html');
// Get all inline script tags
const [first, ...inlineScripts] = doc.querySelectorAll('script:not([src])');
// we'll eval the inlineScripts later, after the subo script runs (defines $kissenc)
// but the first must be evaled before subo runs
eval(first.textContent);
// load the 5 external scripts
for (let i = 0; i < jsS.length; i++) {
const resp = await fetch(rootUrl + jsS[i]);
const text = await resp.text();
eval(text);
}
// window.$kissenc is now defined,
// now we can iterate through the inlineScripts that look obfuscated and eval them:
let textToDecode;
for (const { textContent } of inlineScripts) {
if (textContent.includes('decrypt')) {
// we've gotten to the script that decrypts;
// don't run it, instead call decrypt ourselves,
// and break out of the loop:
const match = textContent.match(/decrypt\('([^']+).+/);
textToDecode = match[1];
break;
} else if (textContent.includes('\x') || /^\s+_/.test(textContent)) {
eval(textContent);
}
}
console.log('Decrpyting ', textToDecode);
var decrypted = $kissenc.decrypt(textToDecode);
console.log(decrypted);
})();