diff --git a/base/rules.db b/base/rules.db index 5c305b8d4e9ac00f768bd1f293aeb73d6da7b177..0c92ffce611d2f16341b2fe7a8f3ba79bca1137a 100644 Binary files a/base/rules.db and b/base/rules.db differ diff --git "a/js/360\345\275\261\350\247\206.js" "b/js/360\345\275\261\350\247\206.js" index 49ba458c3682f76cce5b7083770894fd6d975b0a..79c372d991250837052df55e95e7b9803681da22 100644 --- "a/js/360\345\275\261\350\247\206.js" +++ "b/js/360\345\275\261\350\247\206.js" @@ -22,6 +22,7 @@ var rule = { // lazy:'js:input="https://cache.json.icu/home/api?type=ys&uid=292796&key=fnoryABDEFJNPQV269&url="+input.split("?")[0];log(input);let html=JSON.parse(request(input));log(html);input=html.url||input', 推荐:'json:data;title;cover;comment;cat+ent_id;description', 一级:'json:data.movies;title;cover;pubdate;id;description', - 二级:'js:let html=JSON.parse(fetch(input,fetch_params));let data=html.data;let tilte=data.title;let img=data.cdncover;let vod_type=data.moviecategory.join(",");let area=data.area.join(",");let director=data.director.join(",");let actor=data.actor.join(",");let content=data.description;base_vod={vod_id:input,vod_name:tilte,type_name:vod_type,vod_actor:actor,vod_director:director,vod_content:content,vod_remarks:area,vod_pic:urljoin2(input,img)};let delta=200;let vod_play={};let sites=data.playlink_sites;for(let i in sites){let site=sites[i];let playList="";let vodItems=[];if(data.allupinfo){let total=parseInt(data.allupinfo[site]);for(let j=1;j0){playList=vodItems.join("#")}if(playList.length<1){continue}vod_play[site]=playList}let tabs=Object.keys(vod_play);let playUrls=[];for(let id in tabs){playUrls.push(vod_play[tabs[id]])}if(tabs.length>0){vod_play_from=tabs.join("$$$");vod_play_url=playUrls.join("$$$");base_vod.vod_play_from=vod_play_from;base_vod.vod_play_url=vod_play_url}VOD=base_vod;', + 二级:'', + 二级:'js:let html=JSON.parse(fetch(input,fetch_params));let data=html.data;let tilte=data.title;let img=data.cdncover;let vod_type=data.moviecategory.join(",");let area=data.area.join(",");let director=data.director.join(",");let actor=data.actor.join(",");let content=data.description;let base_vod={vod_id:input,vod_name:tilte,type_name:vod_type,vod_actor:actor,vod_director:director,vod_content:content,vod_remarks:area,vod_pic:urljoin2(input,img)};let delta=200;let vod_play={};let sites=data.playlink_sites;sites.forEach(function(site){let playList="";let vodItems=[];if(data.allupinfo){let total=parseInt(data.allupinfo[site]);for(let j=1;j0){playList=vodItems.join("#")}if(playList.length<1){return}vod_play[site]=playList});let tabs=Object.keys(vod_play);let playUrls=[];for(let id in tabs){print("id:"+id);playUrls.push(vod_play[tabs[id]])}if(tabs.length>0){let vod_play_from=tabs.join("$$$");let vod_play_url=playUrls.join("$$$");base_vod.vod_play_from=vod_play_from;base_vod.vod_play_url=vod_play_url}VOD=base_vod;', 搜索:'json:data.longData.rows;titleTxt||titlealias;cover;cat_name;cat_id+en_id;description', } \ No newline at end of file diff --git a/libs/drpy.js b/libs/drpy.js index 96b6e3383de11ac02a31e0f5e0f523a0470104d0..f33b9c7c2cd460e6ab98123cb85e268cdff20a25 100644 --- a/libs/drpy.js +++ b/libs/drpy.js @@ -1,6 +1,6 @@ -import 'https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/es6py.js'; +// import 'https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/es6py.js'; // import {是否正版,urlDeal,setResult,setResult2,setHomeResult,maoss,urlencode} from 'http://192.168.10.103:5705/libs/es6py.js'; -// import 'http://192.168.10.103:5705/libs/es6py.js'; +// import 'http://192.168.1.124:5705/libs/es6py.js'; import cheerio from 'https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/cheerio.min.js'; // import cheerio from 'http://192.168.10.103:5705/libs/cheerio.min.js'; @@ -12,7 +12,7 @@ import muban from 'https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/模板. // const key = 'drpy_zbk'; - +// eval(req('http://192.168.1.124:5705/libs/es6py.js').content); function init_test(){ console.log("init_test_start"); console.log(RKEY); @@ -30,10 +30,17 @@ function init_test(){ let rule = {}; /** 已知问题记录 * 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 + * 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后面打印 * todo: jsp:{pdfa,pdfh,pd},json:{pdfa,pdfh,pd},jq:{pdfa,pdfh,pd} + * * 电脑看日志调试 + adb tcpip 5555 + adb connect 192.168.10.192 + adb devices -l + adb logcat -c + adb logcat | grep -i QuickJS * **/ @@ -68,6 +75,248 @@ const DOM_CHECK_ATTR = /(url|src|href|data-original|data-src)$/; const SELECT_REGEX = /:eq|:lt|:gt|#/g; const SELECT_REGEX_A = /:eq|:lt|:gt/g; +/** +es6py扩展 + */ +if (typeof Object.assign != 'function') { + Object.assign = function () { + var target = arguments[0]; + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; +} +if (!String.prototype.includes) { + String.prototype.includes = function (search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > this.length) { + return false; + } else { + return this.indexOf(search, start) !== -1; + } + }; +} + +if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, 'includes', { + value: function (searchElement, fromIndex) { + + if (this == null) {//this是空或者未定义,抛出错误 + throw new TypeError('"this" is null or not defined'); + } + + var o = Object(this);//将this转变成对象 + var len = o.length >>> 0;//无符号右移0位,获取对象length属性,如果未定义就会变成0 + + if (len === 0) {//length为0直接返回false未找到目标值 + return false; + } + + var n = fromIndex | 0;//查找起始索引 + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);//计算正确起始索引,因为有可能是负值 + + while (k < len) {//从起始索引处开始循环 + if (o[k] === searchElement) {//如果某一位置与寻找目标相等,返回true,找到了 + return true; + } + k++; + } + return false;//未找到,返回false + } + }); +} +if (typeof String.prototype.startsWith != 'function') { + String.prototype.startsWith = function (prefix){ + return this.slice(0, prefix.length) === prefix; + }; +} +if (typeof String.prototype.endsWith != 'function') { + String.prototype.endsWith = function(suffix) { + return this.indexOf(suffix, this.length - suffix.length) !== -1; + }; +} +Object.prototype.myValues=function(obj){ + if(obj ==null) { + throw new TypeError("Cannot convert undefined or null to object"); + } + var res=[] + for(var k in obj){ + if(obj.hasOwnProperty(k)){//需判断是否是本身的属性 + res.push(obj[k]); + } + } + return res; +} +if (typeof Object.prototype.values != 'function') { + Object.prototype.values=function(obj){ + if(obj ==null) { + throw new TypeError("Cannot convert undefined or null to object"); + } + var res=[] + for(var k in obj){ + if(obj.hasOwnProperty(k)){//需判断是否是本身的属性 + res.push(obj[k]); + } + } + return res; + } +} +if (typeof Array.prototype.join != 'function') { + Array.prototype.join = function (emoji) { + // emoji = emoji||','; + emoji = emoji||''; + let self = this; + let str = ""; + let i = 0; + if (!Array.isArray(self)) {throw String(self)+'is not Array'} + if(self.length===0){return ''} + if (self.length === 1){return String(self[0])} + i = 1; + str = this[0]; + for (; i < self.length; i++) { + str += String(emoji)+String(self[i]); + } + return str; + }; +} + +String.prototype.rstrip = function (chars) { + let regex = new RegExp(chars + "$"); + return this.replace(regex, ""); +}; + +Array.prototype.append = Array.prototype.push; +String.prototype.strip = String.prototype.trim; +function 是否正版(vipUrl){ + let flag = new RegExp('qq\.com|iqiyi\.com|youku\.com|mgtv\.com|bilibili\.com|sohu\.com|ixigua\.com|pptv\.com|miguvideo\.com|le\.com|1905\.com|fun\.tv'); + return flag.test(vipUrl); +} +function urlDeal(vipUrl){ + if(!vipUrl){ + return '' + } + if(!是否正版(vipUrl)){ + return vipUrl + } + if(!/miguvideo/.test(vipUrl)){ + vipUrl=vipUrl.split('#')[0].split('?')[0]; + } + return vipUrl +} +function setResult(d){ + if(!Array.isArray(d)){ + return [] + } + VODS = []; + // console.log(JSON.stringify(d)); + d.forEach(function (it){ + let obj = { + vod_id:it.url||'', + vod_name: it.title||'', + vod_remarks: it.desc||'', + vod_content: it.content||'', + vod_pic: it.pic_url||it.img||'', + }; + let keys = Object.keys(it); + if(keys.includes('tname')){ + obj.type_name = it.tname||''; + } + if(keys.includes('tid')){ + obj.type_id = it.tid||''; + } + if(keys.includes('year')){ + obj.vod_year = it.year||''; + } + if(keys.includes('actor')){ + obj.vod_actor = it.actor||''; + } + if(keys.includes('director')){ + obj.vod_director = it.director||''; + } + if(keys.includes('area')){ + obj.vod_area = it.area||''; + } + VODS.push(obj); + }); + return VODS +} +function setResult2(res){ + VODS = res.list||[]; + return VODS +} +function setHomeResult(res){ + if(!res||typeof(res)!=='object'){ + return [] + } + return setResult(res.list); +} +// 千万不要用for in 推荐 forEach (for in 会打乱顺序) +//猫函数 +function maoss(jxurl, ref, key) { + 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(); + return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28'). + replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+'); +} +globalThis.VODS = [];// 一级或者搜索需要的数据列表 +globalThis.VOD = {};// 二级的单个数据 + + /** * url拼接 * @param fromPath 初始当前页面url @@ -100,7 +349,7 @@ function urljoin(fromPath, nowPath) { // return fromPath+nowPath // } } - +var urljoin2 = urljoin; /** * 重写pd方法-增加自动urljoin(没法重写,改个名继续骗) * @param html @@ -801,8 +1050,8 @@ function categoryParse(cateObj) { // setItem('MY_URL',MY_URL); console.log(MY_URL); p = p.trim(); + const MY_CATE = cateObj.tid; if(p.startsWith('js:')){ - const MY_CATE = cateObj.tid; var MY_FL = cateObj.extend; const TYPE = 'cate'; var input = MY_URL; @@ -829,8 +1078,13 @@ function categoryParse(cateObj) { } let list = _pdfa(html, p[0]); list.forEach(it => { + let links = p[4].split('+').map(p4=>{ + return !rule.detailUrl?_pd(p4, p[4],MY_URL):_pdfh(it, p[4]); + }); + let link = links.join('$'); + let vod_id = rule.detailUrl?MY_CATE+'$'+link:link; d.push({ - 'vod_id': _pd(it, p[4],MY_URL), + 'vod_id': vod_id, 'vod_name': _pdfh(it, p[1]).replace(/\n|\t/g,'').trim(), 'vod_pic': _pd(it, p[2],MY_URL), 'vod_remarks': _pdfh(it, p[3]).replace(/\n|\t/g,'').trim(), @@ -841,7 +1095,7 @@ function categoryParse(cateObj) { console.log(e.message); } } - + // print(d); return d.length<1?'{}':JSON.stringify({ 'page': parseInt(cateObj.pg), 'pagecount': 999, @@ -912,8 +1166,12 @@ function searchParse(searchObj) { } let list = _pdfa(html, p[0]); list.forEach(it => { + let links = p[4].split('+').map(p4=>{ + return !rule.detailUrl?_pd(it, p4,MY_URL):_pdfh(it, p4) + }); + let link = links.join('$'); let ob = { - 'vod_id': _pd(it, p[4],MY_URL), + 'vod_id': link, 'vod_name': _pdfh(it, p[1]).replace(/\n|\t/g,'').trim(), 'vod_pic': _pd(it, p[2],MY_URL), 'vod_remarks': _pdfh(it, p[3]).replace(/\n|\t/g,'').trim(), @@ -975,6 +1233,7 @@ function detailParse(detailObj){ const TYPE = 'detail'; var input = MY_URL; eval(p.trim().replace('js:','')); + vod = VOD; console.log(JSON.stringify(vod)); }else if(p&&typeof(p)==='object'){ if(!html){ diff --git a/libs/es6py.js b/libs/es6py.js index a27002f191f700dbbee0f96318ea9ce8489169eb..8cd02c6e473630b7e8d32216d83eb857ecdb782a 100644 --- a/libs/es6py.js +++ b/libs/es6py.js @@ -234,6 +234,7 @@ function urlencode (str) { replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+'); } globalThis.VODS = [];// 一级或者搜索需要的数据列表 +globalThis.VOD = {};// 二级的单个数据 globalThis.encodeUrl = urlencode; globalThis.urlencode = urlencode; globalThis.是否正版 = 是否正版; @@ -242,7 +243,7 @@ globalThis.setResult = setResult; globalThis.setResult2 = setResult2; globalThis.setHomeResult = setHomeResult; globalThis.maoss = maoss; -globalThis.urljoin2 = joinUrl; +// globalThis.urljoin2 = joinUrl; // export default { // 是否正版:是否正版, diff --git "a/py/360\344\272\214\347\272\247.js" "b/py/360\344\272\214\347\272\247.js" index 9f9ff3707b462a63845017bdc7e13872556fca6c..9c227d21da9101db51da64a6be494072a4af423a 100644 --- "a/py/360\344\272\214\347\272\247.js" +++ "b/py/360\344\272\214\347\272\247.js" @@ -17,7 +17,7 @@ let director = data.director.join(","); let actor = data.actor.join(","); // let content = jsp.pjfh(html,"data.description"); let content = data.description; -base_vod = { +let base_vod = { vod_id:input, vod_name:tilte, type_name:vod_type, @@ -28,14 +28,11 @@ base_vod = { vod_pic:urljoin2(input,img), // vod_pic:img, }; -// print(base_vod); let delta = 200; let vod_play = {}; // let sites = jsp.pjfa(html,"data.playlink_sites"); //data.playlinksdetail.#idv.quality let sites = data.playlink_sites; //data.playlinksdetail.#idv.quality -// print(sites); -for(let i in sites){ - let site = sites[i]; +sites.forEach(function (site){ let playList = ""; let vodItems = []; if(data.allupinfo){ @@ -63,8 +60,8 @@ for(let i in sites){ } } }else{ + // print(data.playlinksdetail); let item = data.playlinksdetail[site]; - // print(item); vodItems.push((item.sort||"") + "$" +urlDeal(item.default_url||"")); } if(vodItems.length > 0){ @@ -72,24 +69,25 @@ for(let i in sites){ } // print(playList); if(playList.length < 1){ - continue + return } vod_play[site]=playList; -} +}); // print(vod_play); let tabs = Object.keys(vod_play); // let playUrls = Object.values(vod_play); // 没法使用values方法和列表的join方法 let playUrls = []; for(let id in tabs){ + print('id:'+id); playUrls.push(vod_play[tabs[id]]); } // print(tabs); // print(playUrls); if(tabs.length>0){ // vod_play_from = join(tabs,"$$$"); - vod_play_from = tabs.join("$$$"); + let vod_play_from = tabs.join("$$$"); // vod_play_url = join(playUrls,"$$$"); - vod_play_url = playUrls.join("$$$"); + let vod_play_url = playUrls.join("$$$"); // print(vod_play_from); // print(vod_play_url); base_vod.vod_play_from = vod_play_from;