|
|
|
@ -1,206 +1,3 @@ |
|
|
|
|
const testPath = module.modulePath.slice(0, module.modulePath.lastIndexOf("/")) + "/"; |
|
|
|
|
const { |
|
|
|
|
gbkTool |
|
|
|
|
} = $.require(testPath + 'gbk.js'); |
|
|
|
|
const 模板 = $.require(testPath + "模板.js"); |
|
|
|
|
const pako = $.require(testPath + "pako.min.js"); |
|
|
|
|
const NODERSA = $.require(testPath + "node-rsa.js"); |
|
|
|
|
const JSEncrypt = $.require(testPath + "jsencrypt.js"); |
|
|
|
|
const JINJA = $.require(testPath+"jinja.min.js"); |
|
|
|
|
const JP = $.require(testPath+"jsonpathplus.min.js"); |
|
|
|
|
const cheerio = { |
|
|
|
|
jinja2(template, obj) { |
|
|
|
|
return JINJA.render(template, obj); |
|
|
|
|
}, |
|
|
|
|
jp(path, json) { |
|
|
|
|
return JP.JSONPath({ |
|
|
|
|
path, |
|
|
|
|
json |
|
|
|
|
})[0]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
eval(getCryptoJS()); |
|
|
|
|
|
|
|
|
|
function init_test(){ |
|
|
|
|
console.log("init_test_start"); |
|
|
|
|
console.log("当前版本号:"+VERSION); |
|
|
|
|
console.log('本地代理地址:'+getProxyUrl()); |
|
|
|
|
console.log(RKEY); |
|
|
|
|
console.log(JSON.stringify(rule)); |
|
|
|
|
console.log("init_test_end"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 验证码ocr识别的测试案例 |
|
|
|
|
*/ |
|
|
|
|
function ocr_demo_test(){ |
|
|
|
|
// 这张图片为4113的验证码
|
|
|
|
|
let img_base64 = `iVBORw0KGgoAAAANSUhEUgAAAIAAAAAoBAMAAADEX+97AAAAG1BMVEXz+/4thQTa7N6QwIFFkyNeokKozqDB3b93sWHFR+MEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABN0lEQVRIie2TQU+DQBCFt9vScvQpxR4xrcSjJCZ67JDGXsX+AdR4B3vpsSYm/m2HXaRLmuySepR3Gdidb/btDAjRq5dT96eCMlfBuzi1QLZUoZy2yz5sOvI+9iomaPEZ6nWnEtxqIyiM1RcAy44GNDhBXUjot/VVNweV1ah68FqWRyjKIOqAcyYF6rGcmpYnHzGt3fycNoMw0d3/THFu7hFSJ/8OXO6iTM8/KSg09obAzIHLO250LgQ0txOZSfgrV4Exdw98uGycJ0ErAeExZGhOmFHV9zHO6qVSj0MpLq7xZON56o++MjlsEgfVhbQWWME+xQX7J4V6zfi9A1Ly9rP1BvEXp+BbVJ/M77n+wfOIDVp51pZ4iBxvmj9AGrtvry6emwfKnVkW+ZRKd5ZNMvob36vXP9YPDmQki8QiCFAAAAAASUVORK5CYII=`; |
|
|
|
|
// 更换api-可以通过这个代码换掉默认的ocr接口
|
|
|
|
|
OcrApi.api = OCR_API; |
|
|
|
|
let code = OcrApi.classification(img_base64); |
|
|
|
|
log('测试验证码图片的ocr识别结果为:'+code); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* rsa加解密的全方位测试案例 |
|
|
|
|
*/ |
|
|
|
|
function rsa_demo_test() { |
|
|
|
|
let t1 = new Date().getTime(); |
|
|
|
|
let pkcs1_public = ` |
|
|
|
|
-----BEGIN RSA PUBLIC KEY----- |
|
|
|
|
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy |
|
|
|
|
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE= |
|
|
|
|
-----END RSA PUBLIC KEY----- |
|
|
|
|
`.trim();
|
|
|
|
|
|
|
|
|
|
let pkcs1_public_pem = ` |
|
|
|
|
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy |
|
|
|
|
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE= |
|
|
|
|
`.trim();
|
|
|
|
|
|
|
|
|
|
let pkcs8_public = ` |
|
|
|
|
-----BEGIN PUBLIC KEY----- |
|
|
|
|
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/ |
|
|
|
|
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ== |
|
|
|
|
-----END PUBLIC KEY-----`.trim();
|
|
|
|
|
|
|
|
|
|
let pkcs8_public_pem = ` |
|
|
|
|
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/ |
|
|
|
|
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ== |
|
|
|
|
`.trim();
|
|
|
|
|
|
|
|
|
|
let pkcs1_private = ` |
|
|
|
|
-----BEGIN RSA PRIVATE KEY----- |
|
|
|
|
MIIBOAIBAAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/nas61fIPGUUrkPenokm7 |
|
|
|
|
ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQI/b6OV1z65UokQaMvSeRXt |
|
|
|
|
0Yv6wiYtduQI9qpq5nzy/ytaqsbBfClNTi/HifKPKxlRouWFkc518EQI8LBxoarJ |
|
|
|
|
AiEA4DaONMplV8PQNa3TKn2F+SDEvLOCjdL0kHKdN90Ti28CIQDDZnTBaHgZwZbA |
|
|
|
|
hS7Bbf5yvwjWMhO6Y7l04/Qm7R+35QIgPuQuqXIoUSD080mp1N5WyRW++atksIF+ |
|
|
|
|
5lGv9e6GP/MCICnj8y/rl6Pd7tXDN6zcSeqLrfdNsREKhB3dKOCXgW9JAiAFYtFS |
|
|
|
|
EJNBXVRTK42SNsZ2hJ/9xLwOwnH2epT8Q43s3Q== |
|
|
|
|
-----END RSA PRIVATE KEY----- |
|
|
|
|
`.trim()
|
|
|
|
|
|
|
|
|
|
let pkcs8_private = ` |
|
|
|
|
-----BEGIN PRIVATE KEY----- |
|
|
|
|
MIIBUgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAqyNKUPxEUaSdzrtf |
|
|
|
|
dFyXnRavOOpw2D+dqzrV8g8ZRSuQ96eiSbtkcLCsMpbEPcWNMWD6UWVGSjBHke3v |
|
|
|
|
YJkTSwIDAQABAj9vo5XXPrlSiRBoy9J5Fe3Ri/rCJi125Aj2qmrmfPL/K1qqxsF8 |
|
|
|
|
KU1OL8eJ8o8rGVGi5YWRznXwRAjwsHGhqskCIQDgNo40ymVXw9A1rdMqfYX5IMS8 |
|
|
|
|
s4KN0vSQcp033ROLbwIhAMNmdMFoeBnBlsCFLsFt/nK/CNYyE7pjuXTj9CbtH7fl |
|
|
|
|
AiA+5C6pcihRIPTzSanU3lbJFb75q2SwgX7mUa/17oY/8wIgKePzL+uXo93u1cM3 |
|
|
|
|
rNxJ6out902xEQqEHd0o4JeBb0kCIAVi0VIQk0FdVFMrjZI2xnaEn/3EvA7CcfZ6 |
|
|
|
|
lPxDjezd |
|
|
|
|
-----END PRIVATE KEY----- |
|
|
|
|
`.trim()
|
|
|
|
|
|
|
|
|
|
let data = ` |
|
|
|
|
NodeRsa |
|
|
|
|
这是node-rsa 现在修改集成在drpy里使用`.trim();
|
|
|
|
|
|
|
|
|
|
let encryptedWithPublic = NODERSA.encryptRSAWithPublicKey(data, pkcs1_public, { |
|
|
|
|
// PublicFormat: "pkcs1-public-pem",
|
|
|
|
|
outputEncoding: "base64", |
|
|
|
|
options: {environment: "browser", encryptionScheme: 'pkcs1_oaep'}, |
|
|
|
|
}); |
|
|
|
|
console.log("公钥加密"); |
|
|
|
|
console.log(encryptedWithPublic); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey(encryptedWithPublic, pkcs1_private, { |
|
|
|
|
// PublicFormat: "pkcs1-private",
|
|
|
|
|
// outEncoding: "hex"
|
|
|
|
|
options: {environment: "browser", encryptionScheme: 'pkcs1_oaep'}, |
|
|
|
|
}); |
|
|
|
|
console.log("私钥解密"); |
|
|
|
|
console.log(decryptedWithPrivate); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// https://www.btool.cn/rsa-sign
|
|
|
|
|
let pkcs1_sha256_sign = NODERSA.sign("1", pkcs1_private, { |
|
|
|
|
outputEncoding: "base64", |
|
|
|
|
options: {environment: "browser", encryptionScheme: 'pkcs1', signingScheme: "pkcs1-sha256"}, |
|
|
|
|
}); |
|
|
|
|
console.log("pkcs1_sha256_sign"); |
|
|
|
|
console.log(pkcs1_sha256_sign); |
|
|
|
|
|
|
|
|
|
let pkcs1_sha256_sign_verify = NODERSA.verify("1", "Oulx2QrgeipKYBtqEDqFb2s/+ndk2cGQxO4CkhU7iBM1vyNmmvqubpsmeoUuN3waGrYZLknSEdwBkfv0tUMpFQ==", pkcs1_private, { |
|
|
|
|
options: {environment: "browser", encryptionScheme: 'pkcs1', signingScheme: "pkcs1-sha256"}, |
|
|
|
|
}); |
|
|
|
|
console.log("pkcs1_sha256_sign_verify"); |
|
|
|
|
console.log(pkcs1_sha256_sign_verify); |
|
|
|
|
|
|
|
|
|
let pkcs1_oaep_sha256 = NODERSA.encryptRSAWithPublicKey(data, `-----BEGIN RSA PUBLIC KEY-----
|
|
|
|
|
MIIBCgKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7IsT1du |
|
|
|
|
SYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7Sxhdm |
|
|
|
|
kte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy3zD8 |
|
|
|
|
PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+HP+m |
|
|
|
|
PfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEAApRb |
|
|
|
|
Dd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQAB |
|
|
|
|
-----END RSA PUBLIC KEY----- |
|
|
|
|
`, {
|
|
|
|
|
outputEncoding: "base64", |
|
|
|
|
options: { |
|
|
|
|
environment: "browser", encryptionScheme: { |
|
|
|
|
scheme: "pkcs1_oaep", |
|
|
|
|
hash: "sha256", |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
// options: { environment: "browser", encryptionScheme: 'pkcs1' },
|
|
|
|
|
}); |
|
|
|
|
console.log("pkcs1_oaep_sha256"); |
|
|
|
|
console.log(pkcs1_oaep_sha256); |
|
|
|
|
|
|
|
|
|
decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey("kSZesAAyYh2hdsQnYMdGqb6gKAzTauBKouvBzWcc4+F8RvGd0nwO6mVkUMVilPgUuNxjEauHayHiY8gI3Py45UI3+km0rSGyHrS6dHiHgCkMejXHieglYzAB0IxX3Jkm4z/66bdB/D+GFy0oct5fGCMI1UHPjEAYOsazJDa8lBFNbjiWFeb/qiZtIx3vGM7KYPAZzyRf/zPbbQ8zy9xOmRuOl5nnIxgo0Okp3KO/RIPO4GZOSBA8f2lx1UtNwwrXAMpcNavtoqHVcjJ/9lcotXYQFrn5b299pSIRf2gVm8ZJ31SK6Z8cc14nKtvgnmsgClDzIXJ1o1RcDK+knVAySg==", `-----BEGIN RSA PRIVATE KEY-----
|
|
|
|
|
MIIEpAIBAAKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7Is |
|
|
|
|
T1duSYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7S |
|
|
|
|
xhdmkte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy |
|
|
|
|
3zD8PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+ |
|
|
|
|
HP+mPfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEA |
|
|
|
|
ApRbDd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQABAoIBADZ/QGgUzInvsLp/ |
|
|
|
|
zO2WbfYm39o/uhNAvk9RbLt1TIZbMFhyOpeKynHi3Swwd9xsfWX/U9zS/lGi/m31 |
|
|
|
|
iKrhmaW4OA1G3vqpMcK7TBbFufYwUEaA+ZJX344euH8pIfdzyneMQ4z3Far2dS7l |
|
|
|
|
QsmjuilVV2kEFadveXewiYoVOWCu00w6bN8wy2SIHlQn+kIL6HQhWz12iKKflIKu |
|
|
|
|
eGRdzLHsKmBt6WbY1Wuhx7HU0fAKdlBDPxCHNlI+kybUYE9o5C2vJiaVM5wqJBgZ |
|
|
|
|
8Dz8kt1QbLJ910JoLXkLVQ8uC8NJKQwFtqQjTGPnEq0+wbgz6Ij599rKZkwW/xq9 |
|
|
|
|
l6KoUiECgYEA6Ah42tVdkNW047f03xVYXFH96RgorHRS36mR8Y+ONUq1fwKidovC |
|
|
|
|
WjwVujt4OPf3l1W6iyn/F6cu/bsmvPrSc3HTN0B1V31QK4OjgetxQ2PSbTldH02J |
|
|
|
|
NPzkt+v+cPxXpx/P5mgt7Weefw5txU547KubGrHUV5rBKFtIx9pj16MCgYEA/EF0 |
|
|
|
|
o19+D24DZAPwlDS5VbEd7FStnwY4oQ5PqbuNOSbSJLMWU0AqzXcRokp8UTyCZ0X3 |
|
|
|
|
ATkS1REq97kShCuR+npTR6a6DlY7sdpPI1SMLNajgB2tkx0EOzX+PfNIbHUd4jpJ |
|
|
|
|
I0ZMAHv/OOtkzQHDaeTWBTrzsWm6/nTiykfduNECgYEA46AMD4HpPECqKAs66e5i |
|
|
|
|
tI6q7JSKskObWVdcmQEfnSAhVOwcvPb2Ptda6UuV8S0xcwDi88rLOUUFUFzc79+P |
|
|
|
|
vTkY38cYVi/VChsluDpk7ptqv0PbGu5Rf+3n4pZdEjI7OvR2W64wAAn67uIUxc7p |
|
|
|
|
yiO/ET0K9rYWb6S9jXGtKMkCgYEA2kPAqoO7zZoBMQ7/oR0lp/HC1HRIbiqx4RlC |
|
|
|
|
8Lgpb+QZPEwA6zPAVVvLVENi4d+bbcRp/xLlKpraNNJcJSSWAMbLPFoU7sbKjA87 |
|
|
|
|
HnTPfRSTEA2d3Ibk3F7Rh8TzS3Ti0JZiJjVzGZAwu41iAMifzwaD8K6boUy80eNN |
|
|
|
|
QH2CaaECgYBUsLYvC/MiYg3w+LGOONuQongoVUXjGqnw2bjVa9RK7lwRdXPUqJ51 |
|
|
|
|
MpVO98IkoLvGSI/0sGNP3GKNhC+eMGjJAVwFyEuOn+JsmMv9Y9uStIVi5tIHIhKw |
|
|
|
|
m7mp8il0kaftHdSxTbspG3tZ2fjIiFIZkLEOmRpd7ogWumgOajzUdA== |
|
|
|
|
-----END RSA PRIVATE KEY-----`, {
|
|
|
|
|
// PublicFormat: "pkcs1-private",
|
|
|
|
|
// outEncoding: "hex"
|
|
|
|
|
options: {environment: "browser", encryptionScheme: 'pkcs1_oaep'}, |
|
|
|
|
}); |
|
|
|
|
console.log('decryptedWithPrivate'); |
|
|
|
|
console.log(decryptedWithPrivate); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(() => { |
|
|
|
|
let key = new NODERSA.NodeRSA({b: 1024}); |
|
|
|
|
key.setOptions({encryptionScheme: 'pkcs1'}) |
|
|
|
|
let text = `你好drpy node-ras`; |
|
|
|
|
let encrypted = key.encrypt(text, 'base64'); |
|
|
|
|
console.log('encrypted: ', encrypted); |
|
|
|
|
const decrypted = key.decrypt(encrypted, 'utf8'); |
|
|
|
|
console.log('decrypted: ', decrypted); |
|
|
|
|
})(); |
|
|
|
|
let t2 = new Date().getTime(); |
|
|
|
|
console.log('rsa_demo_test 测试耗时:'+(t2-t1)+'毫秒'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 执行预处理代码 |
|
|
|
|
*/ |
|
|
|
@ -223,28 +20,7 @@ function pre(){ |
|
|
|
|
|
|
|
|
|
let rule = {}; |
|
|
|
|
let vercode = typeof (pdfl) === 'function' ? 'drpy2.1' : 'drpy2'; |
|
|
|
|
const VERSION = vercode+' 3.9.50beta20 202400528'; |
|
|
|
|
/** 已知问题记录 |
|
|
|
|
* 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 (有能力解决的话尽量解决下,支持对象直接渲染字符串转义,如果加了|safe就不转义)[影魔牛逼,最新的文件发现这问题已经解决了] |
|
|
|
|
* Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 (这个大毛病需要重点排除一下) |
|
|
|
|
* 2.import es6py.js但是里面的函数没有被装载进来.比如drpy规则报错setResult2 is undefiend(合并文件了可以不管了) |
|
|
|
|
* 3.无法重复导入cheerio(怎么解决drpy和parseTag里都需要导入cheerio的问题) 无法在副文件导入cheerio (现在是全部放在drpy一个文件里了,凑合解决?) |
|
|
|
|
* 4.有个错误不知道哪儿来的 executeScript: com.quickjs.JSObject$Undefined cannot be cast to java.lang.String 在 点击选集播放打印init_test_end后面打印(貌似不影响使用) |
|
|
|
|
* 5.需要实现 stringify 函数,比起JSON.strifngify函数,它会原封不动保留中文不会编码unicode |
|
|
|
|
* 6.base64Encode,base64Decode,md5函数还没有实现 (抄影魔代码实现了) |
|
|
|
|
* 7.eval(getCryptoJS());还没有实现 (可以空实现了,以后遇到能忽略) |
|
|
|
|
* done: jsp:{pdfa,pdfh,pd},json:{pdfa,pdfh,pd},jq:{pdfa,pdfh,pd} |
|
|
|
|
* 8.req函数不支持传递字符串的data参数 {'content-type':'text/plain'} 类型数据,因此无法直接调用alist的ocr接口 |
|
|
|
|
* * 电脑看日志调试 |
|
|
|
|
adb tcpip 5555 |
|
|
|
|
adb connect 192.168.10.192 |
|
|
|
|
adb devices -l |
|
|
|
|
adb logcat -c |
|
|
|
|
adb logcat | grep -i QuickJS |
|
|
|
|
adb logcat -c -b events |
|
|
|
|
adb logcat -c -b main -b events -b radio -b system |
|
|
|
|
adb logcat > 2.log DRPY:E | grep -i QuickJS |
|
|
|
|
* **/ |
|
|
|
|
const VERSION = vercode + ' 3.9.50beta21 202400529'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*** 以下是内置变量和解析方法 **/ |
|
|
|
@ -284,93 +60,6 @@ const URLJOIN_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/; // 需 |
|
|
|
|
const SELECT_REGEX = /:eq|:lt|:gt|#/g; |
|
|
|
|
const SELECT_REGEX_A = /:eq|:lt|:gt/g; |
|
|
|
|
|
|
|
|
|
// 增加$js工具,支持$js.toString(()=>{});
|
|
|
|
|
const $js = { |
|
|
|
|
toString(func) { |
|
|
|
|
let strfun = func.toString(); |
|
|
|
|
return strfun.replace(/^\(\)(\s+)?=>(\s+)?\{/, "js:").replace(/\}$/,''); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
function window_b64(){ |
|
|
|
|
let b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
|
|
|
|
let base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); |
|
|
|
|
function btoa(str) { |
|
|
|
|
var out, i, len; |
|
|
|
|
var c1, c2, c3; |
|
|
|
|
len = str.length; |
|
|
|
|
i = 0; |
|
|
|
|
out = ""; |
|
|
|
|
while (i < len) { |
|
|
|
|
c1 = str.charCodeAt(i++) & 0xff; |
|
|
|
|
if (i == len) { |
|
|
|
|
out += b64map.charAt(c1 >> 2); |
|
|
|
|
out += b64map.charAt((c1 & 0x3) << 4); |
|
|
|
|
out += "=="; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
c2 = str.charCodeAt(i++); |
|
|
|
|
if (i == len) { |
|
|
|
|
out += b64map.charAt(c1 >> 2); |
|
|
|
|
out += b64map.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); |
|
|
|
|
out += b64map.charAt((c2 & 0xF) << 2); |
|
|
|
|
out += "="; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
c3 = str.charCodeAt(i++); |
|
|
|
|
out += b64map.charAt(c1 >> 2); |
|
|
|
|
out += b64map.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); |
|
|
|
|
out += b64map.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6)); |
|
|
|
|
out += b64map.charAt(c3 & 0x3F); |
|
|
|
|
} |
|
|
|
|
return out; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function atob(str) { |
|
|
|
|
var c1, c2, c3, c4; |
|
|
|
|
var i, len, out; |
|
|
|
|
len = str.length; |
|
|
|
|
i = 0; |
|
|
|
|
out = ""; |
|
|
|
|
while (i < len) { |
|
|
|
|
do { |
|
|
|
|
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; |
|
|
|
|
} while (i < len && c1 == -1); |
|
|
|
|
if (c1 == -1) break; |
|
|
|
|
do { |
|
|
|
|
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; |
|
|
|
|
} while (i < len && c2 == -1); |
|
|
|
|
if (c2 == -1) break; |
|
|
|
|
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); |
|
|
|
|
do { |
|
|
|
|
c3 = str.charCodeAt(i++) & 0xff; |
|
|
|
|
if (c3 == 61) return out; |
|
|
|
|
c3 = base64DecodeChars[c3]; |
|
|
|
|
} while (i < len && c3 == -1); |
|
|
|
|
if (c3 == -1) break; |
|
|
|
|
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); |
|
|
|
|
do { |
|
|
|
|
c4 = str.charCodeAt(i++) & 0xff; |
|
|
|
|
if (c4 == 61) return out; |
|
|
|
|
c4 = base64DecodeChars[c4]; |
|
|
|
|
} while (i < len && c4 == -1); |
|
|
|
|
if (c4 == -1) break; |
|
|
|
|
out += String.fromCharCode(((c3 & 0x03) << 6) | c4); |
|
|
|
|
} |
|
|
|
|
return out; |
|
|
|
|
} |
|
|
|
|
return { |
|
|
|
|
atob, |
|
|
|
|
btoa |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
/** |
|
|
|
|
es6py扩展 |
|
|
|
|
*/ |
|
|
|
|
if(typeof atob != 'function' || typeof btoa!='function'){ |
|
|
|
|
var {atob,btoa} = window_b64(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (typeof Object.assign != 'function') { |
|
|
|
|
Object.assign = function () { |
|
|
|
|
let target = arguments[0]; |
|
|
|
@ -581,84 +270,6 @@ function setHomeResult(res){ |
|
|
|
|
} |
|
|
|
|
return setResult(res.list); |
|
|
|
|
} |
|
|
|
|
// 猫了个咪
|
|
|
|
|
function rc(js) { |
|
|
|
|
if (js === 'maomi_aes.js') { |
|
|
|
|
var a = CryptoJS.enc.Utf8.parse("625222f9149e961d"); |
|
|
|
|
var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330"); |
|
|
|
|
return { |
|
|
|
|
De: function (word) { |
|
|
|
|
word = CryptoJS.enc.Hex.parse(word) |
|
|
|
|
return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, { |
|
|
|
|
iv: t, |
|
|
|
|
mode: CryptoJS.mode.CBC, |
|
|
|
|
padding: CryptoJS.pad.Pkcs7 |
|
|
|
|
}).toString(CryptoJS.enc.Utf8) |
|
|
|
|
}, |
|
|
|
|
En: function (word) { |
|
|
|
|
// print(a);
|
|
|
|
|
// print(word);
|
|
|
|
|
var Encrypted = CryptoJS.AES.encrypt(word, a, { |
|
|
|
|
iv: t, |
|
|
|
|
mode: CryptoJS.mode.CBC, |
|
|
|
|
padding: CryptoJS.pad.Pkcs7 |
|
|
|
|
}); |
|
|
|
|
return Encrypted.ciphertext.toString(); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
return {}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 千万不要用for in 推荐 forEach (for in 会打乱顺序)
|
|
|
|
|
//猫函数
|
|
|
|
|
function maoss(jxurl, ref, key) { |
|
|
|
|
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); |
|
|
|
|
eval(getCryptoJS()); |
|
|
|
|
try { |
|
|
|
|
var getVideoInfo = function (text) { |
|
|
|
|
return CryptoJS.AES.decrypt(text, key, {iv: iv, padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8); |
|
|
|
|
}; |
|
|
|
|
var token_key = key == undefined ? 'dvyYRQlnPRCMdQSe' : key; |
|
|
|
|
if (ref) { |
|
|
|
|
var html = request(jxurl, { |
|
|
|
|
headers: { |
|
|
|
|
'Referer': ref |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
var html = request(jxurl); |
|
|
|
|
} |
|
|
|
|
// print(html);
|
|
|
|
|
if (html.indexOf('&btwaf=') != -1) { |
|
|
|
|
html = request(jxurl + '&btwaf' + html.match(/&btwaf(.*?)"/)[1], { |
|
|
|
|
headers: { |
|
|
|
|
'Referer': ref |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
var token_iv = html.split('_token = "')[1].split('"')[0]; |
|
|
|
|
var key = CryptoJS.enc.Utf8.parse(token_key); |
|
|
|
|
var iv = CryptoJS.enc.Utf8.parse(token_iv); |
|
|
|
|
// log("iv:"+iv);
|
|
|
|
|
// log(html);
|
|
|
|
|
// print(key);
|
|
|
|
|
// print(iv);
|
|
|
|
|
eval(html.match(/var config = {[\s\S]*?}/)[0] + ''); |
|
|
|
|
// config.url = config.url.replace(/,/g,'');
|
|
|
|
|
// print(config.url);
|
|
|
|
|
if (!config.url.startsWith('http')) { |
|
|
|
|
//config.url = decodeURIComponent(AES(config.url, key, iv));
|
|
|
|
|
config.url = CryptoJS.AES.decrypt(config.url, key, { |
|
|
|
|
iv: iv, |
|
|
|
|
padding: CryptoJS.pad.Pkcs7 |
|
|
|
|
}).toString(CryptoJS.enc.Utf8) |
|
|
|
|
} |
|
|
|
|
return config.url; |
|
|
|
|
} catch (e) { |
|
|
|
|
return ''; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function urlencode(str) { |
|
|
|
|
str = (str + '').toString(); |
|
|
|
@ -666,196 +277,6 @@ function urlencode (str) { |
|
|
|
|
replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function base64Encode(text){ |
|
|
|
|
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text)); |
|
|
|
|
// return text
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function base64Decode(text){ |
|
|
|
|
return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text)); |
|
|
|
|
// return text
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function md5(text) { |
|
|
|
|
return CryptoJS.MD5(text).toString(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function uint8ArrayToBase64(uint8Array) { |
|
|
|
|
let binaryString = String.fromCharCode.apply(null, Array.from(uint8Array)); |
|
|
|
|
return btoa(binaryString); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function Utf8ArrayToStr(array) { |
|
|
|
|
var out, i, len, c; |
|
|
|
|
var char2, char3; |
|
|
|
|
out = ""; |
|
|
|
|
len = array.length; |
|
|
|
|
i = 0; |
|
|
|
|
while (i < len) { |
|
|
|
|
c = array[i++]; |
|
|
|
|
switch (c >> 4) { |
|
|
|
|
case 0: |
|
|
|
|
case 1: |
|
|
|
|
case 2: |
|
|
|
|
case 3: |
|
|
|
|
case 4: |
|
|
|
|
case 5: |
|
|
|
|
case 6: |
|
|
|
|
case 7: |
|
|
|
|
out += String.fromCharCode(c); |
|
|
|
|
break; |
|
|
|
|
case 12: |
|
|
|
|
case 13: |
|
|
|
|
char2 = array[i++]; |
|
|
|
|
out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f)); |
|
|
|
|
break; |
|
|
|
|
case 14: |
|
|
|
|
char2 = array[i++]; |
|
|
|
|
char3 = array[i++]; |
|
|
|
|
out += String.fromCharCode( |
|
|
|
|
((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0) |
|
|
|
|
); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return out; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* gzip压缩base64|压缩率80%+ |
|
|
|
|
* @param str |
|
|
|
|
* @returns {string} |
|
|
|
|
*/ |
|
|
|
|
function gzip(str) { |
|
|
|
|
let arr = pako.gzip(str, { |
|
|
|
|
to: 'string' |
|
|
|
|
}); |
|
|
|
|
return uint8ArrayToBase64(arr) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* gzip解压base64数据 |
|
|
|
|
* @param b64Data |
|
|
|
|
* @returns {string} |
|
|
|
|
*/ |
|
|
|
|
function ungzip(b64Data) { |
|
|
|
|
let strData = atob(b64Data); |
|
|
|
|
const charData = strData.split('').map(function(x) { |
|
|
|
|
return x.charCodeAt(0); |
|
|
|
|
}); |
|
|
|
|
const binData = new Uint8Array(charData); |
|
|
|
|
const data = pako.inflate(binData); |
|
|
|
|
return Utf8ArrayToStr(data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 字符串按指定编码 |
|
|
|
|
* @param input |
|
|
|
|
* @param encoding |
|
|
|
|
* @returns {*} |
|
|
|
|
*/ |
|
|
|
|
function encodeStr(input,encoding){ |
|
|
|
|
encoding = encoding||'gbk'; |
|
|
|
|
if(encoding.startsWith('gb')){ |
|
|
|
|
const strTool = gbkTool(); |
|
|
|
|
input = strTool.encode(input); |
|
|
|
|
} |
|
|
|
|
return input |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 字符串指定解码 |
|
|
|
|
* @param input |
|
|
|
|
* @param encoding |
|
|
|
|
* @returns {*} |
|
|
|
|
*/ |
|
|
|
|
function decodeStr(input,encoding){ |
|
|
|
|
encoding = encoding||'gbk'; |
|
|
|
|
if(encoding.startsWith('gb')){ |
|
|
|
|
const strTool = gbkTool(); |
|
|
|
|
input = strTool.decode(input); |
|
|
|
|
} |
|
|
|
|
return input |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function getCryptoJS(){ |
|
|
|
|
// return request('https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-hiker.js');
|
|
|
|
|
return 'console.log("CryptoJS已装载");' |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 封装的RSA加解密类
|
|
|
|
|
const RSA = { |
|
|
|
|
decode: function (data, key, option) { |
|
|
|
|
option = option || {}; |
|
|
|
|
if (typeof (JSEncrypt) === 'function') { |
|
|
|
|
let chunkSize = option.chunkSize || 117; // 默认分段长度为117
|
|
|
|
|
let privateKey = this.getPrivateKey(key); // 获取私钥
|
|
|
|
|
const decryptor = new JSEncrypt(); //创建解密对象实例
|
|
|
|
|
decryptor.setPrivateKey(privateKey); //设置秘钥
|
|
|
|
|
let uncrypted = ''; |
|
|
|
|
// uncrypted = decryptor.decrypt(data);
|
|
|
|
|
uncrypted = decryptor.decryptUnicodeLong(data); |
|
|
|
|
return uncrypted; |
|
|
|
|
} else { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
encode: function (data, key, option) { |
|
|
|
|
option = option || {}; |
|
|
|
|
if (typeof (JSEncrypt) === 'function') { |
|
|
|
|
let chunkSize = option.chunkSize || 117; // 默认分段长度为117
|
|
|
|
|
let publicKey = this.getPublicKey(key); // 获取公钥
|
|
|
|
|
const encryptor = new JSEncrypt(); |
|
|
|
|
encryptor.setPublicKey(publicKey); // 设置公钥
|
|
|
|
|
let encrypted = ''; // 加密结果
|
|
|
|
|
// const textLen = data.length; // 待加密文本长度
|
|
|
|
|
// let offset = 0; // 分段偏移量
|
|
|
|
|
// // 分段加密
|
|
|
|
|
// while (offset < textLen) {
|
|
|
|
|
// let chunk = data.slice(offset, chunkSize); // 提取分段数据
|
|
|
|
|
// let enc = encryptor.encrypt(chunk); // 加密分段数据
|
|
|
|
|
// encrypted += enc; // 连接加密结果
|
|
|
|
|
// offset += chunkSize; // 更新偏移量
|
|
|
|
|
// }
|
|
|
|
|
encrypted = encryptor.encryptUnicodeLong(data); |
|
|
|
|
return encrypted |
|
|
|
|
} else { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
fixKey(key, prefix, endfix) { |
|
|
|
|
if (!key.includes(prefix)) { |
|
|
|
|
key = prefix + key; |
|
|
|
|
} |
|
|
|
|
if (!key.includes(endfix)) { |
|
|
|
|
key += endfix |
|
|
|
|
} |
|
|
|
|
return key |
|
|
|
|
}, |
|
|
|
|
getPrivateKey(key) { |
|
|
|
|
let prefix = '-----BEGIN RSA PRIVATE KEY-----'; |
|
|
|
|
let endfix = '-----END RSA PRIVATE KEY-----'; |
|
|
|
|
return this.fixKey(key, prefix, endfix); |
|
|
|
|
}, |
|
|
|
|
getPublicKey(key) { |
|
|
|
|
let prefix = '-----BEGIN PUBLIC KEY-----'; |
|
|
|
|
let endfix = '-----END PUBLIC KEY-----'; |
|
|
|
|
return this.fixKey(key, prefix, endfix); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取壳子返回的代理地址 |
|
|
|
|
* @returns {string|*} |
|
|
|
|
*/ |
|
|
|
|
function getProxyUrl(){ |
|
|
|
|
if(typeof(getProxy)==='function'){//判断壳子里有getProxy函数就执行取返回结果。否则取默认的本地
|
|
|
|
|
return getProxy(true) |
|
|
|
|
}else{ |
|
|
|
|
return 'http://127.0.0.1:9978/proxy?do=js' |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 根据正则处理原始m3u8里的广告ts片段,自动修复相对链接 |
|
|
|
|
* @param m3u8_text m3u8原始文本,里面是最末级的只含ts片段的。不支持嵌套m3u8链接 |
|
|
|
@ -2859,6 +2280,51 @@ function isVideoParse(isVideoObj){ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取加密前的原始的js源文本 |
|
|
|
|
* @param js_code |
|
|
|
|
*/ |
|
|
|
|
function getOriginalJs(js_code) { |
|
|
|
|
let current_match = /var rule|rule/; |
|
|
|
|
if (current_match.test(js_code)) { |
|
|
|
|
return js_code |
|
|
|
|
} |
|
|
|
|
let rsa_private_key = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs='; |
|
|
|
|
let decode_content = ''; |
|
|
|
|
let decode_funcs = [ |
|
|
|
|
(text) => { try { return ungzip(text) } catch (e) { return '' } }, |
|
|
|
|
(text) => { try { return base64Decode(text) } catch (e) { return '' } }, |
|
|
|
|
(text) => { try { return RSA.decode(text, rsa_private_key, null) } catch (e) { return '' } }, |
|
|
|
|
// (text)=>{try {return NODERSA.decryptRSAWithPrivateKey(text, RSA.getPrivateKey(rsa_private_key).replace(/RSA /g,''), {options: {environment: "browser", encryptionScheme: 'pkcs1',b:'1024'}});} catch (e) {log(e.message);return ''}},
|
|
|
|
|
] |
|
|
|
|
let func_index = 0 |
|
|
|
|
while (!current_match.test(decode_content)) { |
|
|
|
|
decode_content = decode_funcs[func_index](js_code); |
|
|
|
|
func_index++; |
|
|
|
|
if (func_index >= decode_funcs.length) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return decode_content |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 执行main函数 |
|
|
|
|
* 示例 function main(text){return gzip(text)} |
|
|
|
|
* @param main_func_code |
|
|
|
|
* @param arg |
|
|
|
|
*/ |
|
|
|
|
function runMain(main_func_code, arg) { |
|
|
|
|
let mainFunc = function () { return '' }; |
|
|
|
|
try { |
|
|
|
|
eval(main_func_code + '\nmainFunc=main;'); |
|
|
|
|
return mainFunc(arg); |
|
|
|
|
} catch (e) { |
|
|
|
|
log(`执行main_funct发生了错误:${e.message}`); |
|
|
|
|
return '' |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* js源预处理特定返回对象中的函数 |
|
|
|
|
* @param ext |
|
|
|
@ -2870,15 +2336,6 @@ function init(ext) { |
|
|
|
|
rule_fetch_params = {}; |
|
|
|
|
fetch_params = null; |
|
|
|
|
try { |
|
|
|
|
// make shared jsContext happy muban不能import,不然会造成换源继承后变量被篡改
|
|
|
|
|
// if (typeof (globalThis.mubanJs) === 'undefined') {
|
|
|
|
|
// let mubanJs = request('https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js', { 'User-Agent': MOBILE_UA });
|
|
|
|
|
// mubanJs = mubanJs.replace('export default', '(function() {return muban;}()) // export default');
|
|
|
|
|
// // console.log(mubanJs);
|
|
|
|
|
// globalThis.mubanJs = mubanJs;
|
|
|
|
|
// }
|
|
|
|
|
// let muban = eval(globalThis.mubanJs);
|
|
|
|
|
|
|
|
|
|
let muban = 模板.getMubans(); |
|
|
|
|
// print(typeof (muban));
|
|
|
|
|
// print(muban);
|
|
|
|
@ -2889,6 +2346,7 @@ function init(ext) { |
|
|
|
|
let query = getQuery(ext); // 获取链接传参
|
|
|
|
|
let js = request(ext, { 'method': 'GET' }); |
|
|
|
|
if (js) { |
|
|
|
|
js = getOriginalJs(js); |
|
|
|
|
eval(js.replace('var rule', 'rule')); |
|
|
|
|
} |
|
|
|
|
if (query.type === 'url' && query.params) { // 指定type是链接并且传了params支持简写如 ./xx.json
|
|
|
|
@ -2897,6 +2355,7 @@ function init(ext) { |
|
|
|
|
rule.params = query.params; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
ext = getOriginalJs(ext); |
|
|
|
|
eval(ext.replace('var rule', 'rule')); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -3215,6 +2674,7 @@ function isVideo(url){ |
|
|
|
|
|
|
|
|
|
function DRPY() {//导出函数
|
|
|
|
|
return { |
|
|
|
|
runMain: runMain, |
|
|
|
|
init: init, |
|
|
|
|
home: home, |
|
|
|
|
homeVod: homeVod, |
|
|
|
@ -3232,6 +2692,7 @@ function DRPY(){//导出函数 |
|
|
|
|
|
|
|
|
|
// 导出函数对象
|
|
|
|
|
$.exports = { |
|
|
|
|
runMain, |
|
|
|
|
init, |
|
|
|
|
home, |
|
|
|
|
homeVod, |
|
|
|
|