From 2d53df59ed0fdaf550689fa7120f485d3cf94d7d Mon Sep 17 00:00:00 2001 From: gaotianliuyun <58679624+gaotianliuyun@users.noreply.github.com> Date: Sun, 16 Oct 2022 15:44:08 +0800 Subject: [PATCH] Add files via upload --- js/69美剧.js | 23 ++++++ js/ddys.js | 20 +++-- lib/drT.js | 189 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/drpy.min.js | 2 +- lib/drpy.ym.js | 4 + lib/util.ym.js | 158 ++++++++++++++++++++++++++++++++++++++++ proxy.jar | Bin 0 -> 12938 bytes 7 files changed, 387 insertions(+), 9 deletions(-) create mode 100644 js/69美剧.js create mode 100644 lib/drT.js create mode 100644 lib/drpy.ym.js create mode 100644 lib/util.ym.js create mode 100644 proxy.jar diff --git a/js/69美剧.js b/js/69美剧.js new file mode 100644 index 00000000..2632cc45 --- /dev/null +++ b/js/69美剧.js @@ -0,0 +1,23 @@ +var rule={ + title:'69美剧', + host:'https://www.69mj.com', + // homeUrl:'/', + url:'/index.php/vod/show/by/time/id/fyclass/page/fypage/year/2022.html', + searchUrl:'/index.php/vod/search.html?wd=**', + searchable:2,//是否启用全局搜索, + quickSearch:1,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + class_parse:'.nav-menu-items&&li;a&&Text;a&&href;/(\\d+).html', + play_parse:true, + lazy:'', + limit:6, + 推荐:'.module-list;&&.module-item;a&&title;.lazyloaded&&data-src;.module-item-text&&Text;a&&href', + double:true, // 推荐内容是否双层定位 + 一级:'.module&&.module-item;a&&title;.lazyloaded&&data-src;.module-item-text&&Text;a&&href', + 二级:{"title":"h1&&Text;.tag-link&&span&&Text","img":".lazyload&&data-src","desc":".scroll-box:eq(0)&&Text;.scroll-box:eq(1)&&Text;.scroll-box:eq(2)&&Text;.scroll-box:eq(3)&&Text","content":".vod_content&&Text","tabs":".module-tab-content&&div","lists":".sort-item:eq(#id) a"}, + 搜索:'.module&&.module-search-item;h3&&Text;.lazyload&&data-src;.video-serial&&Text;a&&href', +} \ No newline at end of file diff --git a/js/ddys.js b/js/ddys.js index 2e6e0efd..5d67d286 100644 --- a/js/ddys.js +++ b/js/ddys.js @@ -2,8 +2,8 @@ var rule={ title:'ddys', host:'https://ddys.tv', // homeUrl:'/', - url:'https://ddys.tv/category/fyclass/page/fypage/', - searchUrl:'/search.html?wd=**', + url:'/fyclass/page/fypage/', + searchUrl:'/?s=**&post_type=post', searchable:2,//是否启用全局搜索, quickSearch:0,//是否启用快速搜索, filterable:0,//是否启用分类筛选, @@ -11,15 +11,19 @@ var rule={ 'User-Agent':'MOBILE_UA', // "Cookie": "searchneed=ok" }, - class_name:'电影&剧集&动画', - class_url:'movie&airing&anime', - cate_exclude:'解析|动态', + // class_name:'电影&剧集&动画', + // class_url:'movie&airing&anime', + class_parse:'#primary-menu li.menu-item;a&&Text;a&&href;\.tv/(.*)', + cate_exclude:'站长|^其他$|关于|^电影$|^剧集$|^类型$', play_parse:true, - lazy:'', + lazy:'js:let purl=input.split("|")[0];let referer=input.split("|")[1];let zm=input.split("|")[2];print("purl:"+purl);print("referer:"+referer);print("zm:"+zm);let myua="okhttp/3.15";if(/ddrkey/.test(purl)){let ret=request(purl,{Referer:referer,withHeaders:true,"User-Agent":myua});log(ret);input=purl}else{let html=request(purl,{headers:{Referer:referer,"User-Agent":myua}});print(html);try{input=JSON.parse(html).url||{}}catch(e){input=purl}}', limit:6, //推荐:'.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href', double:true, // 推荐内容是否双层定位 一级:'.post-box-list&&article;a:eq(-1)&&Text;.post-box-image&&style;a:eq(0)&&Text;a:eq(-1)&&href', - 二级:{"title":"h1&&Text;.content-rt&&p:eq(0)&&Text","img":".img&&img&&data-src","desc":".content-rt&&p:eq(1)&&Text;.content-rt&&p:eq(2)&&Text;.content-rt&&p:eq(3)&&Text;.content-rt&&p:eq(4)&&Text;.content-rt&&p:eq(5)&&Text","content":".zkjj_a&&Text","tabs":".py-tabs&&option","lists":".player:eq(#id) li"}, - 搜索:'.sr_lists&&ul&&li;h3&&Text;img&&data-src;.int&&p:eq(0)&&Text;a&&href', + 二级:{"title":".post-title&&Text;.cat-links&&Text","img":".doulist-item&&img&&data-cfsrc","desc":".published&&Text","content":".abstract&&Text","tabs":"js:TABS=['国内','海外(貌似不能播放)']", + lists:'js:log(TABS);let d=[];pdfh=jsp.pdfh;pdfa=jsp.pdfa;if(typeof play_url==="undefined"){var play_url=""}function getLists(html){let src=pdfh(html,".wp-playlist-script&&Html");src=JSON.parse(src).tracks;let list1=[];let list2=[];src.forEach(function(it){let src0=it.src0;let src1=it.src1;let src2=it.src2;let title=it.caption;let url1="https://ddys.tv/getvddr/video?id="+src1+"&dim=1080P+&type=mix";let url2="https://w.ddys.tv"+src0+"?ddrkey="+src2;let zm="https://ddys.tv/subddr/"+it.subsrc;list1.push({title:title,url:url1,desc:zm});list2.push({title:title,url:url2,desc:zm})});return{list1:list1,list2:list2}}var data=getLists(html);var list1=data.list1;var list2=data.list2;let nums=pdfa(html,"body&&.post-page-numbers");nums.forEach(function(it){let num=pdfh(it,"body&&Text");log(num);let nurl=input+num+"/";if(num==1){return}log(nurl);let html=request(nurl);let data=getLists(html);list1=list1.concat(data.list1);list2=list2.concat(data.list2)});list1=list1.map(function(item){return item.title+"$"+play_url+urlencode(item.url+"|"+input+"|"+item.desc)});list2=list2.map(function(item){return item.title+"$"+play_url+urlencode(item.url+"|"+input+"|"+item.desc)});LISTS=[list1,list2];', + }, + 搜索:'#main&&article;.post-title&&Text;;.published&&Text;a&&href', + 推荐:'*' } \ No newline at end of file diff --git a/lib/drT.js b/lib/drT.js new file mode 100644 index 00000000..8d085fba --- /dev/null +++ b/lib/drT.js @@ -0,0 +1,189 @@ +// drT.js +// 2022/09/30 write by hjdhnx +// Licensed under the MIT license. + +(function () { + "use strict"; + + var drT = { + name: "drT", + version: "1.0.0", + templateSettings: { + evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g, + interpolate: /\{\{([\s\S]+?)\}\}/g, // 变量渲染 + encode: /\{\{@([\s\S]+?)\}\}/g, // 变量自动url编码 + use: /\{\{#([\s\S]+?)\}\}/g, + useParams: /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g, + define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g, + defineParams:/^\s*([\w$]+):([\s\S]+)/, + conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, // ? if ?? else if ?? else + iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g, + varname: "fl", + strip: true, + append: true, + selfcontained: false, + doNotSkipEncoded: false + }, + template: undefined, //fn, compile template + compile: undefined, //fn, for express + log: true + }, _globals; + + drT.encodeHTMLSource = function(doNotSkipEncoded) { + var encodeHTMLRules = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/" }, + matchHTML = doNotSkipEncoded ? /[&<>"'\/]/g : /&(?!#?\w+;)|<|>|"|'|\//g; + return function(code) { + return code ? code.toString().replace(matchHTML, function(m) {return encodeHTMLRules[m] || m;}) : ""; + }; + }; + + _globals = (function(){ return this || (0,eval)("this"); }()); + + /* istanbul ignore else */ + if (typeof module !== "undefined" && module.exports) { + module.exports = drT; + } else if (typeof define === "function" && define.amd) { + define(function(){return drT;}); + } else { + _globals.drT = drT; + } + + var startend = { + append: { start: "'+(", end: ")+'", startencode: "'+encodeHTML(" }, + split: { start: "';out+=(", end: ");out+='", startencode: "';out+=encodeHTML(" } + }, skip = /$^/; + + function resolveDefs(c, block, def) { + return ((typeof block === "string") ? block : block.toString()) + .replace(c.define || skip, function(m, code, assign, value) { + if (code.indexOf("def.") === 0) { + code = code.substring(4); + } + if (!(code in def)) { + if (assign === ":") { + if (c.defineParams) value.replace(c.defineParams, function(m, param, v) { + def[code] = {arg: param, text: v}; + }); + if (!(code in def)) def[code]= value; + } else { + new Function("def", "def['"+code+"']=" + value)(def); + } + } + return ""; + }) + .replace(c.use || skip, function(m, code) { + if (c.useParams) code = code.replace(c.useParams, function(m, s, d, param) { + if (def[d] && def[d].arg && param) { + var rw = (d+":"+param).replace(/'|\\/g, "_"); + def.__exp = def.__exp || {}; + def.__exp[rw] = def[d].text.replace(new RegExp("(^|[^\\w$])" + def[d].arg + "([^\\w$])", "g"), "$1" + param + "$2"); + return s + "def.__exp['"+rw+"']"; + } + }); + var v = new Function("def", "return " + code)(def); + return v ? resolveDefs(c, v, def) : v; + }); + } + + function unescape(code) { + return code.replace(/\\('|\\)/g, "$1").replace(/[\r\t\n]/g, " "); + } + + drT.template = function(tmpl, c, def) { + c = c || drT.templateSettings; + var cse = c.append ? startend.append : startend.split, needhtmlencode, sid = 0, indv, + str = (c.use || c.define) ? resolveDefs(c, tmpl, def || {}) : tmpl; + + // console.log(str); + let beforeCode = ''; + if(str.match(c.interpolate || skip)){ + let inter_codes = str.match(c.interpolate || skip); + let inter_dict = {}; + inter_codes.forEach(item=>{ + item.replace(c.interpolate || skip,function (m,code) { + let varname = code.split('.')[0]; + if(!inter_dict.hasOwnProperty(varname)){ + let beginCode = `if(typeof(${varname})==='undefined'){${varname}={}}`; + inter_dict[varname] = beginCode; + }if(!inter_dict.hasOwnProperty(code)){ + let beginCode = `if(typeof(${code})==='undefined'){${code}=''};`; + inter_dict[code] = beginCode; + } + }); + }); + let beginCode = Object.values(inter_dict).join('\n'); + // console.log(beginCode); + beforeCode += beginCode; + } + str = beforeCode+("var out='" + (c.strip ? str.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ") + .replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""): str) + .replace(/'|\\/g, "\\$&") + .replace(c.encode || skip, function(m, code) { + needhtmlencode = true; + return cse.startencode + unescape(code) + cse.end; + }) + .replace(c.interpolate || skip, function(m, code) { + let varname = code.split('.')[0]; + // console.log(varname === code); + // console.log(`varname:${varname},code:${code}`); + if(varname === code){ + let res = cse.start + `JSON.stringify(${unescape(code)})` + cse.end; + // console.log(res); + return res + } + return cse.start + unescape(code) + cse.end; + }) + .replace(c.conditional || skip, function(m, elsecase, code) { + return elsecase ? + (code ? "';}else if(" + unescape(code) + "){out+='" : "';}else{out+='") : + (code ? "';if(" + unescape(code) + "){out+='" : "';}out+='"); + }) + .replace(c.iterate || skip, function(m, iterate, vname, iname) { + if (!iterate) return "';} } out+='"; + sid+=1; indv=iname || "i"+sid; iterate=unescape(iterate); + return "';var arr"+sid+"="+iterate+";if(arr"+sid+"){var "+vname+","+indv+"=-1,l"+sid+"=arr"+sid+".length-1;while("+indv+"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){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option)}if(result&&base_url&&DOM_CHECK_ATTR.test(option)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(!SELECT_REGEX_A.test(sp[i])&&i=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj){if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}console.log(JSON.stringify(obj.headers));if(typeof obj.headers.body!="undefined"&&obj.headers.body&&typeof obj.headers.body==="string"){let data={};obj.headers.body.split("&").forEach(it=>{data[it.split("=")[0]]=it.split("=")[1]});obj.data=data;delete obj.headers.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log("request:"+url);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}fetch=request;print=function(data){data=data||"";if(typeof data!=="string"){try{data=JSON.stringify(data)}catch(e){console.log("print:"+e.message)}}console.log(data)};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){obj.headers["Cookie"]=cookie}else if(!obj.headers){obj.headers={Cookie:cookie}}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=4){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=pdfh(it,p[2]);if(p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let p=homeVodObj.推荐;if(!p||typeof p!=="string"){return"{}"}p=p.trim();if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;const HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p[0]);for(let item of items){let items2=_pdfa(item,p[1]);for(let item2 of items2){try{let title=_pdfh(item2,p[2]);let img="";try{img=_pd(item2,p[3])}catch(e){}let desc=_pdfh(item2,p[4]);let links=[];for(let p5 of p[5].split("+")){let link=!homeVodObj.detailUrl?_pd(item2,p5,MY_URL):_pdfh(item2,p5);links.push(link)}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_id:links.join("$")};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p[0]);for(let item of items){try{let title=_pdfh(item,p[1]);let img="";try{img=_pd(item,p[2],MY_URL)}catch(e){}let desc=_pdfh(item,p[3]);let links=[];for(let p5 of p[4].split("+")){let link=!homeVodObj.detailUrl?_pd(item,p5,MY_URL):_pdfh(item,p5);links.push(link)}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_id:links.join("$")};d.push(vod)}catch(e){}}}}catch(e){}}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}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 vod_id=rule.detailUrl?MY_CATE+"$"+link:link;d.push({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()})})}}catch(e){console.log(e.message)}}return d.length<1?"{}":JSON.stringify({page:parseInt(cateObj.pg),pagecount:999,limit:20,total:999,list:d})}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let url=searchObj.searchUrl.replaceAll("**",searchObj.wd).replaceAll("fypage",searchObj.pg);MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}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: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()};if(p.length>5&&p[5]){ob.vod_content=_pdfh(it,p[5])}d.push(ob)})}}catch(e){return"{}"}}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let vod={vod_id:detailObj.orId,vod_name:"片名",vod_pic:"",type_name:"剧情",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;console.log(MY_URL);if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL}else if(typeof p==="string"&&p.trim().startsWith("js:")){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){html=getHtml(MY_URL)}let _impJQP=true;let _ps;if(p.is_json){_ps=parseTags.json;html=dealJson(html);_impJQP=false}else if(p.is_jsp){_ps=parseTags.jsp}else if(p.is_jq){_ps=parseTags.jq}else{_ps=parseTags.jq}if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){let p_tab=p.tabs.split(";")[0];console.log(p_tab);let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);for(let v of vHeader){let v_title=_pdfh(v,"body&&Text");console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}playFrom.push(v_title)}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){for(let i=0;i1?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);console.log(p1);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);vodList.forEach(it=>{new_vod_list.push(_pdfh(it,"body&&Text")+"$"+_pd(it,"a&&href",MY_URL))});let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}}vod.vod_play_url=vod_tab_list.join(vod_play_url)}return JSON.stringify({list:[vod]})}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:1,url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{if(typeof globalThis.mubanJs==="undefined"){let mubanJs=request("https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/模板.js",{"User-Agent":MOBILE_UA});mubanJs=mubanJs.replace("export default","(function() {return muban;}()) // export default");globalThis.mubanJs=mubanJs}let muban=eval(globalThis.mubanJs);if(typeof ext=="object"){rule=ext;if(rule.template){rule=Object.assign(muban[rule.template],rule)}}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}}else{eval(ext.replace("var rule","rule"))}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url;let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file +import cheerio from"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/cheerio.min.js";import"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/crypto-js.js";import"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/drT.js";function init_test(){console.log("init_test_start");console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}let rule={};const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|APP|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://cms.nokia.press/parse/ocr";if(typeof MY_URL==="undefined"){var MY_URL}var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;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;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.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){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option);if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(!SELECT_REGEX_A.test(sp[i])&&i=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.headers.body!="undefined"&&obj.headers.body&&typeof obj.headers.body==="string"){let data={};obj.headers.body.split("&").forEach(it=>{data[it.split("=")[0]]=it.split("=")[1]});obj.data=data;delete obj.headers.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}fetch=request;print=function(data){data=data||"";if(typeof data!=="string"){try{data=JSON.stringify(data)}catch(e){console.log("print:"+e.message)}}console.log(data)};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){obj.headers["Cookie"]=cookie}else if(!obj.headers){obj.headers={Cookie:cookie}}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let p=homeVodObj.推荐;if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;const HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p[0]);for(let item of items){let items2=_pdfa(item,p[1]);for(let item2 of items2){try{let title=_pdfh(item2,p[2]);let img="";try{img=_pd(item2,p[3])}catch(e){}let desc=_pdfh(item2,p[4]);let links=[];for(let p5 of p[5].split("+")){let link=!homeVodObj.detailUrl?_pd(item2,p5,MY_URL):_pdfh(item2,p5);links.push(link)}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_id:links.join("$")};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p[0]);for(let item of items){try{let title=_pdfh(item,p[1]);let img="";try{img=_pd(item,p[2],MY_URL)}catch(e){}let desc=_pdfh(item,p[3]);let links=[];for(let p5 of p[4].split("+")){let link=!homeVodObj.detailUrl?_pd(item,p5,MY_URL):_pdfh(item,p5);links.push(link)}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_id:links.join("$")};d.push(vod)}catch(e){}}}}catch(e){}}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}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 vod_id=rule.detailUrl?MY_CATE+"$"+link:link;d.push({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()})})}}catch(e){console.log(e.message)}}return d.length<1?"{}":JSON.stringify({page:parseInt(cateObj.pg),pagecount:999,limit:20,total:999,list:d})}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let url=searchObj.searchUrl.replaceAll("**",searchObj.wd).replaceAll("fypage",searchObj.pg);MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}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: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()};if(p.length>5&&p[5]){ob.vod_content=_pdfh(it,p[5])}d.push(ob)})}}catch(e){return"{}"}}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let vod={vod_id:detailObj.orId,vod_name:"片名",vod_pic:"",type_name:"剧情",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;console.log(MY_URL);if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL}else if(typeof p==="string"&&p.trim().startsWith("js:")){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){html=getHtml(MY_URL)}let _impJQP=true;let _ps;if(p.is_json){_ps=parseTags.json;html=dealJson(html);_impJQP=false}else if(p.is_jsp){_ps=parseTags.jsp}else if(p.is_jq){_ps=parseTags.jq}else{_ps=parseTags.jq}if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);if(html&&typeof html!=="string"){html=html.rr(html.ele).toString()}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];console.log(p_tab);let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);for(let v of vHeader){let v_title=_pdfh(v,"body&&Text").trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);if(html&&typeof html!=="string"){html=html.rr(html.ele).toString()}var input=MY_URL;eval(p.lists.replace("js:",""));vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}else{for(let i=0;i1?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);console.log(p1);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);vodList.forEach(it=>{new_vod_list.push(_pdfh(it,"body&&Text").trim()+"$"+_pd(it,"a&&href",MY_URL))});let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}return JSON.stringify({list:[vod]})}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{if(typeof globalThis.mubanJs==="undefined"){let mubanJs=request("https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/模板.js",{"User-Agent":MOBILE_UA});mubanJs=mubanJs.replace("export default","(function() {return muban;}()) // export default");globalThis.mubanJs=mubanJs}let muban=eval(globalThis.mubanJs);if(typeof ext=="object"){rule=ext;if(rule.template){rule=Object.assign(muban[rule.template],rule)}}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}}else{eval(ext.replace("var rule","rule"))}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url;let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file diff --git a/lib/drpy.ym.js b/lib/drpy.ym.js new file mode 100644 index 00000000..1b367091 --- /dev/null +++ b/lib/drpy.ym.js @@ -0,0 +1,4 @@ +import './util.ym.js' +import dr from './drpy.min.js' + +__JS_SPIDER__ = dr.DRPY() \ No newline at end of file diff --git a/lib/util.ym.js b/lib/util.ym.js new file mode 100644 index 00000000..5ce441a5 --- /dev/null +++ b/lib/util.ym.js @@ -0,0 +1,158 @@ +import 'assets://js/lib/uri.min.js' +import cheerio from 'assets://js/lib/cheerio.min.js'; +import 'assets://js/lib/crypto-js.js' + +var charStr = 'abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789'; +export function randIndex(min, max, i) { + let index = Math.floor(Math.random() * (max - min + 1) + min), + numStart = charStr.length - 10; + if (i == 0 && index >= numStart) { + index = randIndex(min, max, i); + } + return index; +} + +export function randomStr(len) { + let min = 0, max = charStr.length - 1, _str = ''; + len = len || 15; + for (var i = 0, index; i < len; i++) { + index = randIndex(min, max, i); + _str += charStr[index]; + } + return _str; +} + +export function urljoin(base, url) { + base = base || ''; + url = url || ''; + let baseU = new Uri(base.trim().rstrip('/')); + url = url.trim().rstrip('/'); + let u = undefined; + if (url.startsWith('http://') || url.startsWith('https://')) { + u = new Uri(url); + } else if (url.startsWith('://')) { + u = new Uri(baseU.protocol() + url); + } else if (url.startsWith('//')) { + u = new Uri(baseU.protocol() + ':' + url); + } else { + u = new Uri(baseU.protocol() + '://' + baseU.host() + (baseU.port() ? ':' + baseU.port() : '') + '/' + url); + } + if ((!u.path() || u.path().trim().length === 0) && baseU.path()) + u.path(baseU.path()); + if (!u.query() && baseU.query()) + u.query(baseU.query()); + return u.toString(); +} + +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; + +export function pdfh(html, parse, base_url) { + if (!parse || !parse.trim()) { + return '' + } + let eleFind = typeof html === 'object'; + let option = undefined; + if (eleFind && parse.startsWith('body&&')) { + parse = parse.substr(6); + if (parse.indexOf('&&') < 0) { + option = parse.trim(); + parse = '*=*'; + } + } + if (parse.indexOf('&&') > -1) { + let sp = parse.split('&&'); + option = sp[sp.length - 1]; + sp.splice(sp.length - 1); + if (sp.length > 1) { + for (let i in sp) { + if (!SELECT_REGEX.test(sp[i])) { + sp[i] = sp[i] + ':eq(0)'; + } + } + } else { + if (!SELECT_REGEX.test(sp[0])) { + sp[0] = sp[0] + ':eq(0)'; + } + } + parse = sp.join(' '); + } + let result = ''; + const $ = eleFind ? html.rr : cheerio.load(html); + let ret = eleFind ? ((parse === '*=*' || $(html.ele).is(parse)) ? html.ele : $(html.ele).find(parse)) : $(parse); + if (option) { + if (option === 'Text') { + result = $(ret).text(); + } + else if (option === 'Html') { + result = $(ret).html(); + } + else { + result = $(ret).attr(option); + } + if (result && base_url && DOM_CHECK_ATTR.test(option)) { + if (/http/.test(result)) { + result = result.substr(result.indexOf('http')); + } else { + result = urljoin(base_url, result) + } + } + } else { + result = $(ret).toString(); + } + return result; +} + +export function pdfa(html, parse) { + if (!parse || !parse.trim()) { + return []; + } + let eleFind = typeof html === 'object'; + if (parse.indexOf('&&') > -1) { + let sp = parse.split('&&'); + for (let i in sp) { + if (!SELECT_REGEX_A.test(sp[i]) && i < sp.length - 1) { + sp[i] = sp[i] + ':eq(0)'; + } + } + parse = sp.join(' '); + } + const $ = eleFind ? html.rr : cheerio.load(html); + let ret = eleFind ? ($(html.ele).is(parse) ? html.ele : $(html.ele).find(parse)) : $(parse); + let result = []; + if (ret) { + ret.each(function (idx, ele) { + result.push({ rr: $, ele: ele }); + }); + } + return result; +} + +const defaultParser = { + pdfh:pdfh, + pdfa:pdfa, + pd(html,parse,uri){ + let ret = this.pdfh(html,parse); + if(typeof(uri)==='undefined'||!uri){ + uri = ''; + } + if(DOM_CHECK_ATTR.test(parse)){ + if(/http/.test(ret)){ + ret = ret.substr(ret.indexOf('http')); + }else{ + ret = urljoin(MY_URL,ret) + } + } + return ret + }, +}; + +globalThis.randIndex = randIndex; +globalThis.randomStr = randomStr; +globalThis.urljoin = urljoin; +globalThis.joinUrl = urljoin; +globalThis.defaultParser = defaultParser; +globalThis.pdfa = defaultParser.pdfa; +globalThis.pdfh = defaultParser.pdfh; +globalThis.pd = defaultParser.pd; \ No newline at end of file diff --git a/proxy.jar b/proxy.jar new file mode 100644 index 0000000000000000000000000000000000000000..bc9c9fde9cd2ba43dc4516f64192df74c1388786 GIT binary patch literal 12938 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 n2=dAS(CCUGmfwCMd+<$sOeZD@Q|EJG>5D@