运行 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);
})();