Sync all projects
This commit is contained in:
Vendored
+1
@@ -0,0 +1 @@
|
||||
import{distance}from"./mod.js";import{sortListByCN}from"./sortName.js";String.prototype.rstrip=function(chars){let regex=new RegExp(chars+"$");return this.replace(regex,"")};var showMode="single";var searchDriver="";var limit_search_show=200;var search_type="";var detail_order="name";var playRaw=1;const request_timeout=5e3;const VERSION="alist v2/v3 20221223";const UA="Mozilla/5.0";function print(any){any=any||"";if(typeof any=="object"&&Object.keys(any).length>0){try{any=JSON.stringify(any);console.log(any)}catch(e){console.log(typeof any+":"+any.length)}}else if(typeof any=="object"&&Object.keys(any).length<1){console.log("null object")}else{console.log(any)}}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}const http=function(url,options={}){if(options.method==="POST"&&options.data){options.body=JSON.stringify(options.data);options.headers=Object.assign({"content-type":"application/json"},options.headers)}options.timeout=request_timeout;if(!options.headers){options.headers={}}let keys=Object.keys(options.headers).map(it=>it.toLowerCase());if(!keys.includes("referer")){options.headers["Referer"]=getHome(url)}if(!keys.includes("user-agent")){options.headers["User-Agent"]=UA}try{const res=req(url,options);res.json=()=>res&&res.content?JSON.parse(res.content):null;res.text=()=>res&&res.content?res.content:"";return res}catch(e){return{json(){return null},text(){return""}}}};["get","post"].forEach(method=>{http[method]=function(url,options={}){return http(url,Object.assign(options,{method:method.toUpperCase()}))}});const __drives={};function isMedia(file){return/\.(dff|dsf|mp3|aac|wav|wma|cda|flac|m4a|mid|mka|mp2|mpa|mpc|ape|ofr|ogg|ra|wv|tta|ac3|dts|tak|webm|wmv|mpeg|mov|ram|swf|mp4|avi|rm|rmvb|flv|mpg|mkv|m3u8|ts|3gp|asf)$/.test(file.toLowerCase())}function get_drives_path(tid){const index=tid.indexOf("$");const name=tid.substring(0,index);const path=tid.substring(index+1);return{drives:get_drives(name),path:path}}function get_drives(name){const{settings,api,server}=__drives[name];if(settings.v3==null){settings.v3=false;const data=http.get(server+"/api/public/settings").json().data;if(Array.isArray(data)){settings.title=data.find(x=>x.key==="title")?.value;settings.v3=false;settings.version=data.find(x=>x.key==="version")?.value;settings.enableSearch=data.find(x=>x.key==="enable search")?.value==="true"}else{settings.title=data.title;settings.v3=true;settings.version=data.version;settings.enableSearch=false}api.path=settings.v3?"/api/fs/list":"/api/public/path";api.file=settings.v3?"/api/fs/get":"/api/public/path";api.search=settings.v3?"/api/public/search":"/api/public/search"}return __drives[name]}function init(ext){console.log("当前版本号:"+VERSION);let data;if(typeof ext=="object"){data=ext;print("alist ext:object")}else if(typeof ext=="string"){if(ext.startsWith("http")){let alist_data=ext.split(";");let alist_data_url=alist_data[0];limit_search_show=alist_data.length>1?Number(alist_data[1])||limit_search_show:limit_search_show;search_type=alist_data.length>2?alist_data[2]:search_type;print(alist_data_url);data=http.get(alist_data_url).json()}else{print("alist ext:json string");data=JSON.parse(ext)}}let drives=[];if(Array.isArray(data)&&data.length>0&&data[0].hasOwnProperty("server")&&data[0].hasOwnProperty("name")){drives=data}else if(!Array.isArray(data)&&data.hasOwnProperty("drives")&&Array.isArray(data.drives)){drives=data.drives.filter(it=>it.type&&it.type==="alist"||!it.type)}print(drives);searchDriver=(drives.find(x=>x.search)||{}).name||"";if(!searchDriver&&drives.length>0){searchDriver=drives[0].name}print(searchDriver);drives.forEach(item=>{let _path_param=[];if(item.params){_path_param=Object.keys(item.params);_path_param.sort((a,b)=>a.length-b.length)}if(item.password){let pwdObj={password:item.password};if(!item.params){item.params={"/":pwdObj}}else{item.params["/"]=pwdObj}_path_param.unshift("/")}__drives[item.name]={name:item.name,server:item.server.endsWith("/")?item.server.rstrip("/"):item.server,startPage:item.startPage||"/",showAll:item.showAll===true,search:!!item.search,params:item.params||{},_path_param:_path_param,settings:{},api:{},getParams(path){const key=this._path_param.find(x=>path.startsWith(x));return Object.assign({},this.params[key],{path:path})},getPath(path){const res=http.post(this.server+this.api.path,{data:this.getParams(path)}).json();return this.settings.v3?res.data.content:res.data.files},getFile(path){let raw_url=this.server+"/d"+path;raw_url=encodeURI(raw_url);let data={raw_url:raw_url,raw_url1:raw_url};if(playRaw===1){try{const res=http.post(this.server+this.api.file,{data:this.getParams(path)}).json();data=this.settings.v3?res.data:res.data.files[0];if(!this.settings.v3){data.raw_url=data.url}data.raw_url1=raw_url;return data}catch(e){return data}}else{return data}},isFolder(data){return data.type===1},isVideo(data){return this.settings.v3?data.type===2||data.type===0||data.type===3:data.type===3||data.type===0||data.type===4},is_subt(data){if(data.type===1){return false}const ext=/\.(srt|ass|scc|stl|ttml)$/;return ext.test(data.name)},getPic(data){let pic=this.settings.v3?data.thumb:data.thumbnail;return pic||(this.isFolder(data)?"http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png":"")},getTime(data,isStandard){isStandard=isStandard||false;try{let tTime=data.updated_at||data.time_str||data.modified||"";let date="";if(tTime){tTime=tTime.split("T");date=tTime[0];if(isStandard){date=date.replace(/-/g,"/")}tTime=tTime[1].split(/Z|\./);date+=" "+tTime[0]}return date}catch(e){return""}}}});print("init执行完毕")}function home(filter){let classes=Object.keys(__drives).map(key=>({type_id:`${key}$${__drives[key].startPage}`,type_name:key,type_flag:"1"}));let filter_dict={};let filters=[{key:"order",name:"排序",value:[{n:"名称⬆️",v:"vod_name_asc"},{n:"名称⬇️",v:"vod_name_desc"},{n:"中英⬆️",v:"vod_cn_asc"},{n:"中英⬇️",v:"vod_cn_desc"},{n:"时间⬆️",v:"vod_time_asc"},{n:"时间⬇️",v:"vod_time_desc"},{n:"大小⬆️",v:"vod_size_asc"},{n:"大小⬇️",v:"vod_size_desc"},{n:"无",v:"none"}]},{key:"show",name:"播放展示",value:[{n:"单集",v:"single"},{n:"全集",v:"all"}]}];classes.forEach(it=>{filter_dict[it.type_id]=filters});print("----home----");print(classes);return JSON.stringify({class:classes,filters:filter_dict})}function homeVod(params){let _post_data={pageNum:0,pageSize:100};let _post_url="https://pbaccess.video.qq.com/trpc.videosearch.hot_rank.HotRankServantHttp/HotRankHttp";let data=http.post(_post_url,{data:_post_data}).json();let _list=[];try{data=data["data"]["navItemList"][0]["hotRankResult"]["rankItemList"];data.forEach(it=>{_list.push({vod_name:it.title,vod_id:"msearch:"+it.title,vod_pic:"https://avatars.githubusercontent.com/u/97389433?s=120&v=4",vod_remarks:it.changeOrder})})}catch(e){print("Alist获取首页推荐发送错误:"+e.message)}return JSON.stringify({list:_list})}function category(tid,pg,filter,extend){let orid=tid.replace(/#all#|#search#/g,"");let{drives,path}=get_drives_path(orid);const id=orid.endsWith("/")?orid:orid+"/";const list=drives.getPath(path);let subList=[];let vodFiles=[];let allList=[];let fl=filter?extend:{};if(fl.show){showMode=fl.show}list.forEach(item=>{if(drives.is_subt(item)){subList.push(item.name)}if(!drives.showAll&&!drives.isFolder(item)&&!drives.isVideo(item)){return}let vod_time=drives.getTime(item);let vod_size=get_size(item.size);let remark=vod_time.split(" ")[0].substr(3)+"\t"+vod_size;let vod_id=id+item.name+(drives.isFolder(item)?"/":"");if(showMode==="all"){vod_id+="#all#"}print(vod_id);const vod={vod_id:vod_id,vod_name:item.name.replaceAll("$","").replaceAll("#",""),vod_pic:drives.getPic(item),vod_time:vod_time,vod_size:item.size,vod_tag:drives.isFolder(item)?"folder":"file",vod_remarks:drives.isFolder(item)?remark+" 文件夹":remark};if(drives.isVideo(item)){vodFiles.push(vod)}allList.push(vod)});if(vodFiles.length===1&&subList.length>0){let sub;if(subList.length===1){sub=subList[0]}else{let subs=JSON.parse(JSON.stringify(subList));subs.sort((a,b)=>{let a_similar=(a.includes("chs")?100:0)+levenshteinDistance(a,vodFiles[0].vod_name);let b_similar=(b.includes("chs")?100:0)+levenshteinDistance(b,vodFiles[0].vod_name);if(a_similar>b_similar){return 1}else{return-1}});sub=subs.slice(-1)[0]}vodFiles[0].vod_id+="@@@"+sub;vodFiles[0].vod_remarks+="🏷️"}else{vodFiles.forEach(item=>{const lh=0;let sub;subList.forEach(s=>{const l=levenshteinDistance(s,item.vod_name);if(l>60&&l>lh){sub=s}});if(sub){item.vod_id+="@@@"+sub;item.vod_remarks+="🏷️"}})}if(fl.order){let key=fl.order.split("_").slice(0,-1).join("_");let order=fl.order.split("_").slice(-1)[0];print(`排序key:${key},排序order:${order}`);if(key.includes("name")){detail_order="name";allList=sortListByName(allList,key,order)}else if(key.includes("cn")){detail_order="cn";allList=sortListByCN(allList,"vod_name",order)}else if(key.includes("time")){detail_order="time";allList=sortListByTime(allList,key,order)}else if(key.includes("size")){detail_order="size";allList=sortListBySize(allList,key,order)}else if(fl.order.includes("none")){detail_order="none";print("不排序")}}else{if(detail_order!=="none"){allList=sortListByName(allList,"vod_name","asc")}}print("----category----"+`tid:${tid},detail_order:${detail_order},showMode:${showMode}`);return JSON.stringify({page:1,pagecount:1,limit:allList.length,total:allList.length,list:allList})}function getAll(otid,tid,drives,path){try{const content=category(tid,null,false,null);const isFile=isMedia(otid.replace(/#all#|#search#/g,"").split("@@@")[0]);const{list}=JSON.parse(content);let vod_play_url=[];list.forEach(x=>{if(x.vod_tag==="file"){let vid=x.vod_id.replace(/#all#|#search#/g,"");vod_play_url.push(`${x.vod_name}$${vid.substring(vid.indexOf("$")+1)}`)}});const pl=path.split("/").filter(it=>it);let vod_name=pl[pl.length-1]||drives.name;if(vod_name===drives.name){print(pl)}if(otid.includes("#search#")){vod_name+="[搜]"}let vod={vod_id:otid,vod_name:vod_name,type_name:"文件夹",vod_pic:"https://avatars.githubusercontent.com/u/97389433?s=120&v=4",vod_content:tid,vod_tag:"folder",vod_play_from:drives.name,vod_play_url:vod_play_url.join("#"),vod_remarks:drives.settings.title};print("----detail1----");print(vod);return JSON.stringify({list:[vod]})}catch(e){print(e.message);let list=[{vod_name:"无数据,防无限请求",type_name:"文件夹",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.com/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg",vod_actor:e.message,vod_director:tid,vod_content:otid}];return JSON.stringify({list:list})}}function detail(tid){let isSearch=tid.includes("#search#");let isAll=tid.includes("#all#");let otid=tid;tid=tid.replace(/#all#|#search#/g,"");let isFile=isMedia(tid.split("@@@")[0]);print(`isFile:${tid}?${isFile}`);let{drives,path}=get_drives_path(tid);print(`drives:${drives},path:${path},`);if(path.endsWith("/")){return getAll(otid,tid,drives,path)}else{if(isSearch&&!isFile){return getAll(otid,tid,drives,path)}else if(isAll){let new_tid;if(isFile){new_tid=tid.split("/").slice(0,-1).join("/")+"/"}else{new_tid=tid}print(`全集模式 tid:${tid}=>tid:${new_tid}`);let{drives,path}=get_drives_path(new_tid);return getAll(otid,new_tid,drives,path)}else if(isFile){let paths=path.split("@@@");let vod_name=paths[0].substring(paths[0].lastIndexOf("/")+1);let vod_title=vod_name;if(otid.includes("#search#")){vod_title+="[搜]"}let vod={vod_id:otid,vod_name:vod_title,type_name:"文件",vod_pic:"https://avatars.githubusercontent.com/u/97389433?s=120&v=4",vod_content:tid,vod_play_from:drives.name,vod_play_url:vod_name+"$"+path,vod_remarks:drives.settings.title};print("----detail2----");print(vod);return JSON.stringify({list:[vod]})}else{return JSON.stringify({list:[]})}}}function play(flag,id,flags){const drives=get_drives(flag);const urls=id.split("@@@");let vod={parse:0,playUrl:"",url:drives.getFile(urls[0]).raw_url};if(urls.length>=2){const path=urls[0].substring(0,urls[0].lastIndexOf("/")+1);vod.subt=drives.getFile(path+urls[1]).raw_url1}print("----play----");print(vod);return JSON.stringify(vod)}function search(wd,quick){print(__drives);print("可搜索的alist驱动:"+searchDriver);if(!searchDriver||!wd){return JSON.stringify({list:[]})}else{let driver=__drives[searchDriver];wd=wd.split(" ").filter(it=>it.trim()).join("+");print(driver);let surl=driver.server+"/search?box="+wd+"&url=";if(search_type){surl+="&type="+search_type}print("搜索链接:"+surl);let html=http.get(surl).text();let lists=[];try{lists=pdfa(html,"div&&ul&&a")}catch(e){}print(`搜索结果数:${lists.length},搜索结果显示数量限制:${limit_search_show}`);let vods=[];let excludeReg=/\.(pdf|epub|mobi|txt|doc|lrc)$/;let cnt=0;lists.forEach(it=>{let vhref=pdfh(it,"a&&href");if(vhref){vhref=unescape(vhref)}if(excludeReg.test(vhref)){return}if(cnt<limit_search_show){print(vhref)}cnt++;let vid=searchDriver+"$"+vhref+"#search#";if(showMode==="all"){vid+="#all#"}vods.push({vod_name:pdfh(it,"a&&Text"),vod_id:vid,vod_tag:isMedia(vhref)?"file":"folder",vod_pic:"http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png",vod_remarks:searchDriver})});vods=vods.slice(0,limit_search_show);print(vods);return JSON.stringify({list:vods})}}function get_size(sz){if(sz<=0){return""}let filesize="";if(sz>1024*1024*1024*1024){sz/=1024*1024*1024*1024;filesize="TB"}else if(sz>1024*1024*1024){sz/=1024*1024*1024;filesize="GB"}else if(sz>1024*1024){sz/=1024*1024;filesize="MB"}else if(sz>1024){sz/=1024;filesize="KB"}else{filesize="B"}let sizeStr=sz.toFixed(2)+filesize,index=sizeStr.indexOf("."),dou=sizeStr.substr(index+1,2);if(dou==="00"){return sizeStr.substring(0,index)+sizeStr.substr(index+3,2)}else{return sizeStr}}function levenshteinDistance(str1,str2){return 100-100*distance(str1,str2)/Math.max(str1.length,str2.length)}function naturalSort(options){if(!options){options={}}return function(a,b){if(options.key){a=a[options.key];b=b[options.key]}var EQUAL=0;var GREATER=options.order==="desc"?-1:1;var SMALLER=-GREATER;var re=/(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi;var sre=/(^[ ]*|[ ]*$)/g;var dre=/(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/;var hre=/^0x[0-9a-f]+$/i;var ore=/^0/;var normalize=function normalize(value){var string=""+value;return options.caseSensitive?string:string.toLowerCase()};var x=normalize(a).replace(sre,"")||"";var y=normalize(b).replace(sre,"")||"";var xN=x.replace(re,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0");var yN=y.replace(re,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0");if(!x&&!y)return EQUAL;if(!x&&y)return GREATER;if(x&&!y)return SMALLER;var xD=parseInt(x.match(hre))||xN.length!=1&&x.match(dre)&&Date.parse(x);var yD=parseInt(y.match(hre))||xD&&y.match(dre)&&Date.parse(y)||null;var oFxNcL,oFyNcL;if(yD){if(xD<yD)return SMALLER;else if(xD>yD)return GREATER}for(var cLoc=0,numS=Math.max(xN.length,yN.length);cLoc<numS;cLoc++){oFxNcL=!(xN[cLoc]||"").match(ore)&&parseFloat(xN[cLoc])||xN[cLoc]||0;oFyNcL=!(yN[cLoc]||"").match(ore)&&parseFloat(yN[cLoc])||yN[cLoc]||0;if(isNaN(oFxNcL)!==isNaN(oFyNcL))return isNaN(oFxNcL)?GREATER:SMALLER;else if(typeof oFxNcL!==typeof oFyNcL){oFxNcL+="";oFyNcL+=""}if(oFxNcL<oFyNcL)return SMALLER;if(oFxNcL>oFyNcL)return GREATER}return EQUAL}}const sortListByName=(vodList,key,order)=>{if(!key){return vodList}order=order||"asc";return vodList.sort(naturalSort({key:key,order:order,caseSensitive:true}))};const getTimeInt=timeStr=>{return new Date(timeStr).getTime()};const sortListByTime=(vodList,key,order)=>{if(!key){return vodList}let ASCarr=vodList.sort((a,b)=>{a=a[key];b=b[key];return getTimeInt(a)-getTimeInt(b)});if(order==="desc"){ASCarr.reverse()}return ASCarr};const sortListBySize=(vodList,key,order)=>{if(!key){return vodList}let ASCarr=vodList.sort((a,b)=>{a=a[key];b=b[key];return(Number(a)||0)-(Number(b)||0)});if(order==="desc"){ASCarr.reverse()}return ASCarr};export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search};
|
||||
@@ -0,0 +1,2637 @@
|
||||
// import 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/es6py.js';
|
||||
// import {是否正版,urlDeal,setResult,setResult2,setHomeResult,maoss,urlencode} from 'http://192.168.10.103:5705/libs/es6py.js';
|
||||
// import 'http://192.168.1.124:5705/libs/es6py.js';
|
||||
import cheerio from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js';
|
||||
// import cheerio from 'http://192.168.10.103:5705/libs/cheerio.min.js';
|
||||
import 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js';
|
||||
import 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drT.js';
|
||||
import 模板 from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js';
|
||||
import {gbkTool} from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js'
|
||||
// import 'http://192.168.10.103:5705/libs/drT.js';
|
||||
// import muban from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js';
|
||||
// import muban from 'http://192.168.10.103:5705/admin/view/模板.js';
|
||||
|
||||
// const key = 'drpy_zbk';
|
||||
// eval(req('http://192.168.1.124:5705/libs/es6py.js').content);
|
||||
function init_test(){
|
||||
// console.log(typeof(CryptoJS));
|
||||
console.log("init_test_start");
|
||||
console.log("当前版本号:"+VERSION);
|
||||
console.log(RKEY);
|
||||
console.log(JSON.stringify(rule));
|
||||
// console.log('123456的md5值是:'+md5('123456'));
|
||||
// let aa = base64Encode('编码测试一下')
|
||||
// log(aa);
|
||||
// let bb = base64Decode(aa);
|
||||
// log('bb:'+bb);
|
||||
// clearItem(RULE_CK);
|
||||
// console.log(JSON.stringify(rule));
|
||||
// console.log(request('https://www.baidu.com',{withHeaders:true}));
|
||||
// console.log(request('https://www.baidu.com/favicon.ico',{toBase64:true}));
|
||||
// require('http://192.168.10.99:5705/txt/pluto/drT.js');
|
||||
// console.log(typeof(drT));
|
||||
// console.log(drT.renderText('{{fl.cate}},hi, {{fl}}哈哈.{{fl}}',{sort: 1,cate:'movie'},'fl'));
|
||||
console.log("init_test_end");
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行预处理代码
|
||||
*/
|
||||
function pre(){
|
||||
if(typeof(rule.预处理) === 'string' && rule.预处理 && rule.预处理.trim()){
|
||||
let code = rule.预处理.trim();
|
||||
console.log("执行预处理代码:"+code);
|
||||
if(code.startsWith('js:')){
|
||||
code = code.replace('js:','');
|
||||
}
|
||||
try {
|
||||
// code里可以进行get 或者 post请求cookie并改变rule.headers 里的cookie
|
||||
// 直接操作 rule_fetch_params 这个变量 .headers.Cookie
|
||||
eval(code);
|
||||
}catch (e) {
|
||||
console.log('预处理执行失败:'+e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let rule = {};
|
||||
const VERSION = 'drpy1 3.9.48beta16 20231011';
|
||||
/** 已知问题记录
|
||||
* 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.stringify函数,它会原封不动保留中文不会编码unicode
|
||||
* 6.base64Encode,base64Decode,md5函数还没有实现 (抄影魔代码实现了)
|
||||
* 7.eval(getCryptoJS());还没有实现 (可以空实现了,以后遇到能忽略)
|
||||
* done: 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
|
||||
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 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'; // 源cookie的key值
|
||||
// const KEY = typeof(key)!=='undefined'&&key?key:'drpy_' + (rule.title || rule.host); // 源的唯一标识
|
||||
const CATE_EXCLUDE = '首页|留言|APP|下载|资讯|新闻|动态';
|
||||
const TAB_EXCLUDE = '猜你|喜欢|下载|剧情|热播';
|
||||
const OCR_RETRY = 3;//ocr验证重试次数
|
||||
// const OCR_API = 'http://dm.mudery.com:10000';//ocr在线识别接口
|
||||
// const OCR_API = 'http://192.168.3.239:5705/parse/ocr';//ocr在线识别接口
|
||||
// const OCR_API = 'http://cms.nokia.press/parse/ocr';//ocr在线识别接口
|
||||
// const OCR_API = 'http://cms.nokia.press:5707/parse/ocr';//ocr在线识别接口
|
||||
const OCR_API = 'http://drpy.nokia.press:8028/ocr/drpy/text';//ocr在线识别接口
|
||||
if(typeof(MY_URL)==='undefined'){
|
||||
var MY_URL; // 全局注入变量,pd函数需要
|
||||
}
|
||||
var HOST;
|
||||
var RKEY; // 源的唯一标识
|
||||
var fetch;
|
||||
var print;
|
||||
var log;
|
||||
var rule_fetch_params;
|
||||
var fetch_params; // 每个位置单独的
|
||||
var oheaders;
|
||||
// var play_url; // 二级详情页注入变量,为了适配js模式0 (不在这里定义了,直接二级里定义了个空字符串)
|
||||
var _pdfh;
|
||||
var _pdfa;
|
||||
var _pd;
|
||||
// const DOM_CHECK_ATTR = ['url', 'src', 'href', 'data-original', 'data-src'];
|
||||
const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/;
|
||||
// 过滤特殊链接,不走urlJoin
|
||||
const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/;
|
||||
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 = [];
|
||||
// print(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);
|
||||
}
|
||||
// 猫了个咪
|
||||
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();
|
||||
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串按指定编码
|
||||
* @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 = {
|
||||
encode:function (data,key,option){
|
||||
// log('encode');
|
||||
if(typeof(rsaEncrypt)==='function'){
|
||||
if(!option||typeof(option)!=='object'){
|
||||
return rsaEncrypt(data,key);
|
||||
}else{
|
||||
return rsaEncrypt(data,key,option);
|
||||
}
|
||||
}else{
|
||||
return false
|
||||
}
|
||||
},
|
||||
decode:function (data,key,option){
|
||||
// log('decode');
|
||||
if(typeof(rsaDecrypt)==='function'){
|
||||
if(!option||typeof(option)!=='object'){
|
||||
return rsaDecrypt(data,key);
|
||||
}else{
|
||||
return rsaDecrypt(data,key,option);
|
||||
}
|
||||
}else{
|
||||
return false
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取壳子返回的代理地址
|
||||
* @returns {string|*}
|
||||
*/
|
||||
function getProxyUrl(){
|
||||
if(typeof(getProxy)==='function'){//判断壳子里有getProxy函数就执行取返回结果。否则取默认的本地
|
||||
return getProxy(true)
|
||||
}else{
|
||||
return 'http://127.0.0.1:9978/proxy?do=js'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 强制正序算法
|
||||
* @param lists 待正序列表
|
||||
* @param key 正序键
|
||||
* @param option 单个元素处理函数
|
||||
* @returns {*}
|
||||
*/
|
||||
function forceOrder(lists,key,option){
|
||||
let start = Math.floor(lists.length/2);
|
||||
let end = Math.min(lists.length-1,start+1);
|
||||
if(start >= end){
|
||||
return lists;
|
||||
}
|
||||
let first = lists[start];
|
||||
let second = lists[end];
|
||||
if(key){
|
||||
try {
|
||||
first = first[key];
|
||||
second = second[key];
|
||||
}catch (e) {}
|
||||
}
|
||||
if(option && typeof(option)==='function'){
|
||||
try {
|
||||
first = option(first);
|
||||
second = option(second);
|
||||
}catch (e) {}
|
||||
}
|
||||
first+='';
|
||||
second+='';
|
||||
// console.log(first,second);
|
||||
if(first.match(/(\d+)/)&&second.match(/(\d+)/)){
|
||||
let num1 = Number(first.match(/(\d+)/)[1]);
|
||||
let num2 = Number(second.match(/(\d+)/)[1]);
|
||||
if (num1 > num2){
|
||||
lists.reverse();
|
||||
}
|
||||
}
|
||||
return lists
|
||||
}
|
||||
|
||||
|
||||
let VODS = [];// 一级或者搜索需要的数据列表
|
||||
let VOD = {};// 二级的单个数据
|
||||
let TABS = [];// 二级的自定义线路列表 如: TABS=['道长在线','道长在线2']
|
||||
let LISTS = [];// 二级的自定义选集播放列表 如: LISTS=[['第1集$http://1.mp4','第2集$http://2.mp4'],['第3集$http://1.mp4','第4集$http://2.mp4']]
|
||||
globalThis.encodeUrl = urlencode;
|
||||
globalThis.urlencode = urlencode;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* url拼接
|
||||
* @param fromPath 初始当前页面url
|
||||
* @param nowPath 相对当前页面url
|
||||
* @returns {*}
|
||||
*/
|
||||
function urljoin(fromPath, nowPath) {
|
||||
fromPath = fromPath||'';
|
||||
nowPath = nowPath||'';
|
||||
return joinUrl(fromPath, nowPath);
|
||||
// try {
|
||||
// // import Uri from './uri.min.js';
|
||||
// // var Uri = require('./uri.min.js');
|
||||
// // eval(request('https://cdn.bootcdn.net/ajax/libs/URI.js/1.19.11/URI.min.js'));
|
||||
// // let new_uri = URI(nowPath, fromPath);
|
||||
|
||||
// let new_uri = Uri(nowPath, fromPath);
|
||||
// new_uri = new_uri.toString();
|
||||
// // console.log(new_uri);
|
||||
// // return fromPath + nowPath
|
||||
// return new_uri
|
||||
// }
|
||||
// catch (e) {
|
||||
// console.log('urljoin发生错误:'+e.message);
|
||||
// if(nowPath.startsWith('http')){
|
||||
// return nowPath
|
||||
// }if(nowPath.startsWith('/')){
|
||||
// return getHome(fromPath)+nowPath
|
||||
// }
|
||||
// return fromPath+nowPath
|
||||
// }
|
||||
}
|
||||
var urljoin2 = urljoin;
|
||||
|
||||
// 内置 pdfh,pdfa,pd
|
||||
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) && !SPECIAL_URL.test(ret)){
|
||||
if(/http/.test(ret)){
|
||||
ret = ret.substr(ret.indexOf('http'));
|
||||
}else{
|
||||
ret = urljoin(MY_URL,ret)
|
||||
}
|
||||
}
|
||||
return ret
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* pdfh原版优化,能取style属性里的图片链接
|
||||
* @param html 源码
|
||||
* @param parse 解析表达式
|
||||
* @returns {string|*}
|
||||
*/
|
||||
function pdfh2(html,parse){
|
||||
let html2 = html;
|
||||
try {
|
||||
if(typeof(html)!=='string'){
|
||||
html2 = html.rr(html.ele).toString();
|
||||
}
|
||||
}catch (e) {
|
||||
print('html对象转文本发生了错误:'+e.message);
|
||||
}
|
||||
let result = defaultParser.pdfh(html2,parse);
|
||||
let option = parse.includes('&&')?parse.split('&&').slice(-1)[0]:parse.split(' ').slice(-1)[0];
|
||||
if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){
|
||||
try {
|
||||
result = result.match(/url\((.*?)\)/)[1];
|
||||
// 2023/07/28新增 style取内部链接自动去除首尾单双引号
|
||||
result = result.replace(/^['|"](.*)['|"]$/, "$1");
|
||||
}catch (e) {}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* pdfa原版优化,可以转换jq的html对象
|
||||
* @param html
|
||||
* @param parse
|
||||
* @returns {*}
|
||||
*/
|
||||
function pdfa2(html,parse){
|
||||
let html2 = html;
|
||||
try {
|
||||
if(typeof(html)!=='string'){
|
||||
html2 = html.rr(html.ele).toString();
|
||||
}
|
||||
}catch (e) {
|
||||
print('html对象转文本发生了错误:'+e.message);
|
||||
}
|
||||
return defaultParser.pdfa(html2,parse);
|
||||
}
|
||||
|
||||
/**
|
||||
* pd原版方法重写-增加自动urljoin
|
||||
* @param html
|
||||
* @param parse
|
||||
* @param uri
|
||||
* @returns {*}
|
||||
*/
|
||||
function pd2(html,parse,uri){
|
||||
let ret = pdfh2(html,parse);
|
||||
if(typeof(uri)==='undefined'||!uri){
|
||||
uri = '';
|
||||
}
|
||||
if(DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)){
|
||||
if(/http/.test(ret)){
|
||||
ret = ret.substr(ret.indexOf('http'));
|
||||
}else{
|
||||
ret = urljoin(MY_URL,ret)
|
||||
}
|
||||
}
|
||||
// MY_URL = getItem('MY_URL',MY_URL);
|
||||
// console.log(`规则${RKEY}打印MY_URL:${MY_URL},uri:${uri}`);
|
||||
return ret
|
||||
}
|
||||
|
||||
const parseTags = {
|
||||
jsp:{
|
||||
pdfh:pdfh2,
|
||||
pdfa:pdfa2,
|
||||
pd:pd2,
|
||||
},
|
||||
json:{
|
||||
pdfh(html, parse) {
|
||||
if (!parse || !parse.trim()){
|
||||
return '';
|
||||
}
|
||||
if (typeof(html) === 'string'){
|
||||
// print('jsonpath:pdfh字符串转dict');
|
||||
html = JSON.parse(html);
|
||||
}
|
||||
parse = parse.trim();
|
||||
if (!parse.startsWith('$.')){
|
||||
parse = '$.' + parse;
|
||||
}
|
||||
parse = parse.split('||');
|
||||
for (let ps of parse) {
|
||||
let ret = cheerio.jp(ps, html);
|
||||
if (Array.isArray(ret)){
|
||||
ret = ret[0] || '';
|
||||
} else{
|
||||
ret = ret || ''
|
||||
}
|
||||
if (ret && typeof (ret) !== 'string'){
|
||||
ret = ret.toString();
|
||||
}
|
||||
if(ret){
|
||||
return ret
|
||||
}
|
||||
}
|
||||
return '';
|
||||
},
|
||||
pdfa(html, parse) {
|
||||
if (!parse || !parse.trim()){
|
||||
return '';
|
||||
}
|
||||
if (typeof(html) === 'string'){
|
||||
// print('jsonpath:pdfa字符串转dict');
|
||||
html = JSON.parse(html);
|
||||
}
|
||||
parse = parse.trim()
|
||||
if (!parse.startsWith('$.')){
|
||||
parse = '$.' + parse;
|
||||
}
|
||||
let ret = cheerio.jp(parse, html);
|
||||
if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1){
|
||||
return ret[0] || []
|
||||
}
|
||||
return ret || []
|
||||
},
|
||||
pd(html,parse){
|
||||
let ret = parseTags.json.pdfh(html,parse);
|
||||
if(ret){
|
||||
return urljoin(MY_URL,ret);
|
||||
}
|
||||
return ret
|
||||
},
|
||||
},
|
||||
jq:{
|
||||
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) {
|
||||
//Javascript自定义Array.prototype干扰for-in循环
|
||||
if(sp.hasOwnProperty(i)){
|
||||
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];
|
||||
// 2023/07/28新增 style取内部链接自动去除首尾单双引号
|
||||
result = result.replace(/^['|"](.*)['|"]$/, "$1");
|
||||
}catch (e) {}
|
||||
}
|
||||
}
|
||||
if (result && base_url && DOM_CHECK_ATTR.test(option) && !SPECIAL_URL.test(result)) {
|
||||
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()) {
|
||||
print('!parse');
|
||||
return [];
|
||||
}
|
||||
let eleFind = typeof html === 'object';
|
||||
// print('parse前:'+parse);
|
||||
if (parse.indexOf('&&') > -1) {
|
||||
let sp = parse.split('&&');
|
||||
for (let i in sp) {
|
||||
if(sp.hasOwnProperty(i)){
|
||||
if (!SELECT_REGEX_A.test(sp[i]) && i < sp.length - 1) {
|
||||
if(sp[i]!=='body'){
|
||||
// sp[i] = sp[i] + ':eq(0)';
|
||||
sp[i] = sp[i] + ':first';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
parse = sp.join(' ');
|
||||
}
|
||||
// print('parse后:'+parse);
|
||||
const $ = eleFind ? html.rr : cheerio.load(html);
|
||||
let ret = eleFind ? ($(html.ele).is(parse) ? html.ele : $(html.ele).find(parse)) : $(parse);
|
||||
let result = [];
|
||||
// print('outerHTML:');
|
||||
// print($(ret[0]).prop("outerHTML"));
|
||||
if (ret) {
|
||||
ret.each(function (idx, ele) {
|
||||
result.push({ rr: $, ele: ele });
|
||||
// result.push({ rr: $, ele: $(ele).prop("outerHTML")}); // 性能贼差
|
||||
});
|
||||
}
|
||||
return result;
|
||||
},
|
||||
pd(html,parse,uri){
|
||||
return parseTags.jq.pdfh(html, parse, MY_URL);
|
||||
},
|
||||
},
|
||||
getParse(p0){//非js开头的情况自动获取解析标签
|
||||
if(p0.startsWith('jsp:')){
|
||||
return this.jsp
|
||||
}else if(p0.startsWith('json:')){
|
||||
return this.json
|
||||
}else if(p0.startsWith('jq:')){
|
||||
return this.jq
|
||||
}else {
|
||||
return this.jq
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const stringify = JSON.stringify;
|
||||
const jsp = parseTags.jsp;
|
||||
const jq = parseTags.jq;
|
||||
|
||||
/*** 后台需要实现的java方法并注入到js中 ***/
|
||||
|
||||
/**
|
||||
* 读取本地文件->应用程序目录
|
||||
* @param filePath
|
||||
* @returns {string}
|
||||
*/
|
||||
function readFile(filePath){
|
||||
filePath = filePath||'./uri.min.js';
|
||||
var fd = os.open(filePath);
|
||||
var buffer = new ArrayBuffer(1024);
|
||||
var len = os.read(fd, buffer, 0, 1024);
|
||||
console.log(len);
|
||||
let text = String.fromCharCode.apply(null, new Uint8Array(buffer));
|
||||
console.log(text);
|
||||
return text
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理返回的json数据
|
||||
* @param html
|
||||
* @returns {*}
|
||||
*/
|
||||
function dealJson(html) {
|
||||
try {
|
||||
// html = html.match(/[\w|\W|\s|\S]*?(\{[\w|\W|\s|\S]*\})/).group[1];
|
||||
html = html.trim();
|
||||
if(!((html.startsWith('{') && html.endsWith('}'))||(html.startsWith('[') && html.endsWith(']')))){
|
||||
html = '{'+html.match(/.*?\{(.*)\}/m)[1]+'}';
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
try {
|
||||
html = JSON.parse(html);
|
||||
}catch (e) {}
|
||||
// console.log(typeof(html));
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证码识别逻辑,需要java实现(js没有bytes类型,无法调用后端的传递图片二进制获取验证码文本的接口)
|
||||
* @type {{api: string, classification: (function(*=): string)}}
|
||||
*/
|
||||
var OcrApi={
|
||||
api:OCR_API,
|
||||
classification:function (img){ // img是byte类型,这里不方便搞啊
|
||||
let code = '';
|
||||
try {
|
||||
// let html = request(this.api,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
|
||||
// html = JSON.parse(html);
|
||||
// code = html.url||'';
|
||||
log('通过drpy_ocr验证码接口过验证...');
|
||||
let html = request(OCR_API,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
|
||||
code = html||'';
|
||||
}catch (e) {}
|
||||
return code
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 验证码识别,暂未实现
|
||||
* @param url 验证码图片链接
|
||||
* @returns {string} 验证成功后的cookie
|
||||
*/
|
||||
function verifyCode(url){
|
||||
let cnt = 0;
|
||||
let host = getHome(url);
|
||||
let cookie = '';
|
||||
while (cnt < OCR_RETRY){
|
||||
try{
|
||||
// let obj = {headers:headers,timeout:timeout};
|
||||
let yzm_url = `${host}/index.php/verify/index.html`;
|
||||
console.log(`验证码链接:${yzm_url}`);
|
||||
let hhtml = request(yzm_url,{withHeaders:true,toBase64:true},true);
|
||||
let json = JSON.parse(hhtml);
|
||||
if(!cookie){
|
||||
// print(json);
|
||||
let setCk = Object.keys(json).find(it=>it.toLowerCase()==='set-cookie');
|
||||
// cookie = json['set-cookie']?json['set-cookie'].split(';')[0]:'';
|
||||
cookie = setCk?json[setCk].split(';')[0]:'';
|
||||
}
|
||||
// console.log(hhtml);
|
||||
console.log('cookie:'+cookie);
|
||||
let img = json.body;
|
||||
// console.log(img);
|
||||
let code = OcrApi.classification(img);
|
||||
console.log(`第${cnt+1}次验证码识别结果:${code}`);
|
||||
let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`;
|
||||
console.log(submit_url);
|
||||
let html = request(submit_url,{headers:{Cookie:cookie,'User-Agent':MOBILE_UA},'method':'POST'});
|
||||
// console.log(html);
|
||||
html = JSON.parse(html);
|
||||
if(html.msg === 'ok'){
|
||||
console.log(`第${cnt+1}次验证码提交成功`);
|
||||
return cookie // 需要返回cookie
|
||||
}else if(html.msg!=='ok'&&cnt+1>=OCR_RETRY){
|
||||
cookie = ''; // 需要清空返回cookie
|
||||
}
|
||||
}catch (e) {
|
||||
console.log(`第${cnt+1}次验证码提交失败:${e.message}`);
|
||||
if(cnt+1>=OCR_RETRY){
|
||||
cookie = '';
|
||||
}
|
||||
}
|
||||
cnt+=1
|
||||
}
|
||||
return cookie
|
||||
}
|
||||
|
||||
/**
|
||||
* 存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
*/
|
||||
function setItem(k,v){
|
||||
local.set(RKEY,k,v);
|
||||
console.log(`规则${RKEY}设置${k} => ${v}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库配置表对应的key字段的value,没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
* @returns {*}
|
||||
*/
|
||||
function getItem(k,v){
|
||||
return local.get(RKEY,k) || v;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据库key对应的一条数据,并清除此key对应的内存缓存
|
||||
* @param k
|
||||
*/
|
||||
function clearItem(k){
|
||||
local.delete(RKEY,k);
|
||||
}
|
||||
|
||||
/*** js自封装的方法 ***/
|
||||
|
||||
/**
|
||||
* 获取链接的host(带http协议的完整链接)
|
||||
* @param url 任意一个正常完整的Url,自动提取根
|
||||
* @returns {string}
|
||||
*/
|
||||
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
|
||||
}
|
||||
|
||||
/**
|
||||
* get参数编译链接,类似python params字典自动拼接
|
||||
* @param url 访问链接
|
||||
* @param obj 参数字典
|
||||
* @returns {*}
|
||||
*/
|
||||
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
|
||||
}
|
||||
|
||||
/**
|
||||
* 远程依赖执行函数
|
||||
* @param url 远程js地址
|
||||
*/
|
||||
function require(url){
|
||||
eval(request(url));
|
||||
}
|
||||
/**
|
||||
* 海阔网页请求函数完整封装
|
||||
* @param url 请求链接
|
||||
* @param obj 请求对象 {headers:{},method:'',timeout:5000,body:'',withHeaders:false}
|
||||
* @param ocr_flag 标识此flag是用于请求ocr识别的,自动过滤content-type指定编码
|
||||
* @returns {string|string|DocumentFragment|*}
|
||||
*/
|
||||
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);
|
||||
}
|
||||
if(!fetch_params){
|
||||
fetch_params = {};
|
||||
}
|
||||
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.hasOwnProperty('content-type')){ // 手动指定了就不管
|
||||
obj.headers["Content-Type"] = 'text/html; charset='+rule.encoding;
|
||||
}
|
||||
}
|
||||
if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='string'){
|
||||
// let data = {};
|
||||
// obj.body.split('&').forEach(it=>{
|
||||
// data[it.split('=')[0]] = it.split('=')[1]
|
||||
// });
|
||||
// obj.data = data;
|
||||
// delete obj.body
|
||||
|
||||
// 传body加 "Content-Type":"application/x-www-form-urlencoded;" 即可post form
|
||||
if(!obj.headers.hasOwnProperty('Content-Type')&&!obj.headers.hasOwnProperty('content-type')){ // 手动指定了就不管
|
||||
obj.headers["Content-Type"] = 'application/x-www-form-urlencoded; charset='+rule.encoding;
|
||||
}
|
||||
}else if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='object'){
|
||||
obj.data = obj.body;
|
||||
delete obj.body
|
||||
}
|
||||
if(!url){
|
||||
return obj.withHeaders?'{}':''
|
||||
}
|
||||
if(obj.toBase64){ // 返回base64,用于请求图片
|
||||
obj.buffer = 2;
|
||||
delete obj.toBase64
|
||||
}
|
||||
console.log(JSON.stringify(obj.headers));
|
||||
// console.log('request:'+url+' obj:'+JSON.stringify(obj));
|
||||
console.log('request:'+url+`|method:${obj.method||'GET'}|body:${obj.body||''}`);
|
||||
let res = req(url, obj);
|
||||
let html = res.content||'';
|
||||
// console.log(html);
|
||||
if(obj.withHeaders){
|
||||
let htmlWithHeaders = res.headers;
|
||||
htmlWithHeaders.body = html;
|
||||
return JSON.stringify(htmlWithHeaders);
|
||||
}else{
|
||||
return html
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 快捷post请求
|
||||
* @param url 地址
|
||||
* @param obj 对象
|
||||
* @returns {string|DocumentFragment|*}
|
||||
*/
|
||||
function post(url,obj){
|
||||
obj.method = 'POST';
|
||||
return request(url,obj);
|
||||
}
|
||||
|
||||
fetch = request;
|
||||
print = function (data){
|
||||
data = data||'';
|
||||
if(typeof(data)=='object'&&Object.keys(data).length>0){
|
||||
try {
|
||||
data = JSON.stringify(data);
|
||||
console.log(data);
|
||||
}catch (e) {
|
||||
// console.log('print:'+e.message);
|
||||
console.log(typeof(data)+':'+data.length);
|
||||
return
|
||||
}
|
||||
}else if(typeof(data)=='object'&&Object.keys(data).length<1){
|
||||
console.log('null object');
|
||||
}else{
|
||||
console.log(data);
|
||||
}
|
||||
}
|
||||
log = print;
|
||||
/**
|
||||
* 检查宝塔验证并自动跳过获取正确源码
|
||||
* @param html 之前获取的html
|
||||
* @param url 之前的来源url
|
||||
* @param obj 来源obj
|
||||
* @returns {string|DocumentFragment|*}
|
||||
*/
|
||||
function checkHtml(html,url,obj){
|
||||
if(/\?btwaf=/.test(html)){
|
||||
let btwaf = html.match(/btwaf(.*?)"/)[1];
|
||||
url = url.split('#')[0]+'?btwaf'+btwaf;
|
||||
print('宝塔验证访问链接:'+url);
|
||||
html = request(url,obj);
|
||||
}
|
||||
return html
|
||||
}
|
||||
|
||||
/**
|
||||
* 带一次宝塔验证的源码获取
|
||||
* @param url 请求链接
|
||||
* @param obj 请求参数
|
||||
* @returns {string|DocumentFragment}
|
||||
*/
|
||||
function getCode(url,obj){
|
||||
let html = request(url,obj);
|
||||
html = checkHtml(html,url,obj);
|
||||
return html
|
||||
}
|
||||
|
||||
/**
|
||||
* 源rule专用的请求方法,自动注入cookie
|
||||
* @param url 请求链接
|
||||
* @returns {string|DocumentFragment}
|
||||
*/
|
||||
function getHtml(url){
|
||||
let obj = {};
|
||||
if(rule.headers){
|
||||
obj.headers = rule.headers;
|
||||
}
|
||||
let cookie = getItem(RULE_CK,'');
|
||||
if(cookie){
|
||||
// log('有cookie:'+cookie);
|
||||
if(obj.headers && ! Object.keys(obj.headers).map(it=>it.toLowerCase()).includes('cookie')){
|
||||
log('历史无cookie,新增过验证后的cookie');
|
||||
obj.headers['Cookie'] = cookie;
|
||||
}else if(obj.headers && obj.headers.cookie && obj.headers.cookie!==cookie){
|
||||
obj.headers['Cookie'] = cookie;
|
||||
log('历史有小写过期的cookie,更新过验证后的cookie');
|
||||
}else if(obj.headers && obj.headers.Cookie && obj.headers.Cookie!==cookie){
|
||||
obj.headers['Cookie'] = cookie;
|
||||
log('历史有大写过期的cookie,更新过验证后的cookie');
|
||||
}else if(!obj.headers){
|
||||
obj.headers = {Cookie:cookie};
|
||||
log('历史无headers,更新过验证后的含cookie的headers');
|
||||
}
|
||||
}
|
||||
let html = getCode(url,obj);
|
||||
return html
|
||||
}
|
||||
|
||||
/**
|
||||
* 首页分类解析,筛选暂未实现
|
||||
* @param homeObj 首页传参对象
|
||||
* @returns {string}
|
||||
*/
|
||||
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 < cnt; i++) {
|
||||
classes.push({
|
||||
'type_id': urls[i],
|
||||
'type_name': names[i]
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (homeObj.class_parse) {
|
||||
let p = homeObj.class_parse.split(';');
|
||||
let _ps = parseTags.getParse(p[0]);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
MY_URL = rule.url;
|
||||
if (p.length >= 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 = pdfh(it, p[2]);
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 推荐和搜索单字段继承一级
|
||||
* @param p 推荐或搜索的解析分割;列表
|
||||
* @param pn 自身列表序号
|
||||
* @param pp 一级解析分割;列表
|
||||
* @param ppn 继承一级序号
|
||||
* @returns {*}
|
||||
*/
|
||||
function getPP(p, pn, pp, ppn){
|
||||
try {
|
||||
let ps = p[pn] === '*' && pp.length > ppn ?pp[ppn]:p[pn]
|
||||
return ps
|
||||
}catch (e) {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 首页推荐列表解析
|
||||
* @param homeVodObj
|
||||
* @returns {string}
|
||||
*/
|
||||
function homeVodParse(homeVodObj){
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let d = [];
|
||||
MY_URL = homeVodObj.homeUrl;
|
||||
// setItem('MY_URL',MY_URL);
|
||||
console.log(MY_URL);
|
||||
let t1 = (new Date()).getTime();
|
||||
let p = homeVodObj.推荐;
|
||||
print('p:'+p);
|
||||
if(p==='*' && rule.一级){
|
||||
p = rule.一级;
|
||||
homeVodObj.double = false;
|
||||
}
|
||||
if(!p||typeof(p)!=='string'){
|
||||
return '{}'
|
||||
}
|
||||
p = p.trim();
|
||||
let pp = rule.一级.split(';');
|
||||
if(p.startsWith('js:')){
|
||||
const TYPE = 'home';
|
||||
var input = MY_URL;
|
||||
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 p0 = getPP(p,0,pp,0)
|
||||
let _ps = parseTags.getParse(p0);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
let is_json = p0.startsWith('json:');
|
||||
p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
|
||||
// print(p[0]);
|
||||
let html = homeHtmlCache || getHtml(MY_URL);
|
||||
homeHtmlCache = undefined;
|
||||
if(is_json){
|
||||
// print('是json,开始处理');
|
||||
html = dealJson(html);
|
||||
}
|
||||
try {
|
||||
console.log('double:' + homeVodObj.double);
|
||||
if (homeVodObj.double) {
|
||||
let items = _pdfa(html, p0);
|
||||
// console.log(items.length);
|
||||
let p1 = getPP(p,1,pp,0);
|
||||
let p2 = getPP(p,2,pp,1);
|
||||
let p3 = getPP(p,3,pp,2);
|
||||
let p4 = getPP(p,4,pp,3);
|
||||
let p5 = getPP(p,5,pp,4);
|
||||
let p6 = getPP(p,6,pp,5);
|
||||
for (let item of items) {
|
||||
// console.log(p[1]);
|
||||
let items2 = _pdfa(item, p1);
|
||||
// console.log(items2.length);
|
||||
for (let item2 of items2) {
|
||||
try {
|
||||
let title = _pdfh(item2, p2);
|
||||
let img = '';
|
||||
try {
|
||||
img = _pd(item2, p3);
|
||||
} catch (e) {}
|
||||
let desc = '';
|
||||
try {
|
||||
desc = _pdfh(item2, p4);
|
||||
}catch (e) {}
|
||||
let links = [];
|
||||
for (let _p5 of p5.split('+')) {
|
||||
let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5);
|
||||
links.push(link);
|
||||
}
|
||||
let content;
|
||||
if(p.length > 6 && p[6]){
|
||||
content = _pdfh(item2, p6);
|
||||
} else{
|
||||
content = '';
|
||||
}
|
||||
let vid = links.join('$');
|
||||
if(rule.二级==='*'){
|
||||
vid = vid+'@@'+title+'@@'+img;
|
||||
}
|
||||
let vod = {
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: desc,
|
||||
vod_content: content,
|
||||
vod_id: vid
|
||||
};
|
||||
// print(vod);
|
||||
d.push(vod);
|
||||
} catch (e) {
|
||||
console.log('首页列表处理发生错误:'+e.message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
let items = _pdfa(html, p0);
|
||||
let p1 = getPP(p,1,pp,1);
|
||||
let p2 = getPP(p,2,pp,2);
|
||||
let p3 = getPP(p,3,pp,3);
|
||||
let p4 = getPP(p,4,pp,4);
|
||||
let p5 = getPP(p,5,pp,5);
|
||||
for (let item of items) {
|
||||
try {
|
||||
let title = _pdfh(item, p1);
|
||||
let img = '';
|
||||
try {
|
||||
img = _pd(item, p2, MY_URL);
|
||||
} catch (e) {}
|
||||
let desc = '';
|
||||
try {
|
||||
desc = _pdfh(item, p3);
|
||||
}catch (e) {}
|
||||
let links = [];
|
||||
for (let _p5 of p4.split('+')) {
|
||||
let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5);
|
||||
links.push(link);
|
||||
}
|
||||
let content;
|
||||
if(p.length > 5 && p[5]){
|
||||
content = _pdfh(item, p5);
|
||||
}else{
|
||||
content = ''
|
||||
}
|
||||
let vid = links.join('$');
|
||||
if(rule.二级==='*'){
|
||||
vid = vid+'@@'+title+'@@'+img;
|
||||
}
|
||||
let vod = {
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: desc,
|
||||
vod_content: content,
|
||||
vod_id: vid
|
||||
};
|
||||
d.push(vod);
|
||||
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
let t2 = (new Date()).getTime();
|
||||
console.log('加载首页推荐耗时:'+(t2-t1)+'毫秒');
|
||||
// console.log(JSON.stringify(d));
|
||||
if(rule.图片来源){
|
||||
d.forEach(it=>{
|
||||
if(it.vod_pic&&it.vod_pic.startsWith('http')){
|
||||
it.vod_pic = it.vod_pic + rule.图片来源;
|
||||
}
|
||||
});
|
||||
}
|
||||
if(d.length>0){
|
||||
print(d.slice(0,2));
|
||||
}
|
||||
return JSON.stringify({
|
||||
list:d
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 一级分类页数据解析
|
||||
* @param cateObj
|
||||
* @returns {string}
|
||||
*/
|
||||
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).replaceAll('fypage', cateObj.pg);
|
||||
let url = cateObj.url.replaceAll('fyclass', cateObj.tid);
|
||||
if(cateObj.pg === 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[1].split(']')[0];
|
||||
}else if(cateObj.pg > 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[0];
|
||||
}
|
||||
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);
|
||||
}
|
||||
// console.log('filter:'+cateObj.filter);
|
||||
let fl = cateObj.filter?cateObj.extend:{};
|
||||
// 自动合并 不同分类对应的默认筛选
|
||||
if(rule.filter_def && typeof(rule.filter_def)==='object'){
|
||||
try {
|
||||
if(Object.keys(rule.filter_def).length>0 && rule.filter_def.hasOwnProperty(cateObj.tid)){
|
||||
let self_fl_def = rule.filter_def[cateObj.tid];
|
||||
if(self_fl_def && typeof(self_fl_def)==='object'){
|
||||
// 引用传递转值传递,避免污染self变量
|
||||
let fl_def = JSON.parse(JSON.stringify(self_fl_def));
|
||||
fl = Object.assign(fl_def,fl);
|
||||
}
|
||||
}
|
||||
}catch (e) {
|
||||
print('合并不同分类对应的默认筛选出错:'+e.message);
|
||||
}
|
||||
}
|
||||
let new_url;
|
||||
new_url = cheerio.jinja2(url,{fl:fl});
|
||||
// console.log('jinjia2执行后的new_url类型为:'+typeof(new_url));
|
||||
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];
|
||||
// console.log(url_rep);
|
||||
let cnt_page = url_rep.replaceAll('fypage', cateObj.pg);
|
||||
// console.log(cnt_page);
|
||||
let cnt_pg = eval(cnt_page);
|
||||
// console.log(cnt_pg);
|
||||
url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
|
||||
}else{
|
||||
url = url.replaceAll('fypage',cateObj.pg);
|
||||
}
|
||||
}
|
||||
|
||||
MY_URL = url;
|
||||
// setItem('MY_URL',MY_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;
|
||||
|
||||
let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g,'').trim();
|
||||
let vod_pic = _pd(it, p[2],MY_URL);
|
||||
|
||||
if(rule.二级==='*'){
|
||||
vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
|
||||
}
|
||||
d.push({
|
||||
'vod_id': vod_id,
|
||||
'vod_name': vod_name,
|
||||
'vod_pic': vod_pic,
|
||||
'vod_remarks': _pdfh(it, p[3]).replace(/\n|\t/g,'').trim(),
|
||||
});
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e.message);
|
||||
}
|
||||
}
|
||||
if(rule.图片来源){
|
||||
d.forEach(it=>{
|
||||
if(it.vod_pic&&it.vod_pic.startsWith('http')){
|
||||
it.vod_pic = it.vod_pic + rule.图片来源;
|
||||
}
|
||||
});
|
||||
}
|
||||
// print(d);
|
||||
if(d.length>0){
|
||||
print(d.slice(0,2));
|
||||
}
|
||||
let pagecount = 0;
|
||||
if(rule.pagecount && typeof(rule.pagecount) === 'object' && rule.pagecount.hasOwnProperty(MY_CATE)){
|
||||
print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);
|
||||
pagecount = parseInt(rule.pagecount[MY_CATE]);
|
||||
}
|
||||
let nodata = {
|
||||
list:[{vod_name:'无数据,防无限请求',vod_id:'no_data',vod_remarks:'不要点,会崩的',vod_pic:'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg'}],
|
||||
total:1,pagecount:1,page:1,limit:1
|
||||
};
|
||||
let vod = d.length<1?JSON.stringify(nodata):JSON.stringify({
|
||||
'page': parseInt(cateObj.pg),
|
||||
'pagecount': pagecount||999,
|
||||
'limit': 20,
|
||||
'total': 999,
|
||||
'list': d,
|
||||
});
|
||||
// print(vod);
|
||||
return vod
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索列表数据解析
|
||||
* @param searchObj
|
||||
* @returns {string}
|
||||
*/
|
||||
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 pp = rule.一级.split(';');
|
||||
let url = searchObj.searchUrl.replaceAll('**', searchObj.wd);
|
||||
if(searchObj.pg === 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[1].split(']')[0];
|
||||
}else if(searchObj.pg > 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[0];
|
||||
}
|
||||
if(/fypage/.test(url)){
|
||||
if(url.includes('(')&&url.includes(')')){
|
||||
let url_rep = url.match(/.*?\((.*)\)/)[1];
|
||||
// console.log(url_rep);
|
||||
let cnt_page = url_rep.replaceAll('fypage', searchObj.pg);
|
||||
// console.log(cnt_page);
|
||||
let cnt_pg = eval(cnt_page);
|
||||
// console.log(cnt_pg);
|
||||
url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
|
||||
}else{
|
||||
url = url.replaceAll('fypage',searchObj.pg);
|
||||
}
|
||||
}
|
||||
|
||||
MY_URL = url;
|
||||
console.log(MY_URL);
|
||||
// log(searchObj.搜索);
|
||||
// setItem('MY_URL',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 p0 = getPP(p,0,pp,0);
|
||||
let _ps = parseTags.getParse(p0);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
let is_json = p0.startsWith('json:');
|
||||
p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
|
||||
// print('1381 p0:'+p0);
|
||||
try {
|
||||
let req_method = MY_URL.split(';').length>1?MY_URL.split(';')[1].toLowerCase():'get';
|
||||
let html;
|
||||
if(req_method==='post'){
|
||||
let rurls = MY_URL.split(';')[0].split('#')
|
||||
let rurl = rurls[0]
|
||||
let params = rurls.length > 1 ?rurls[1]:'';
|
||||
print(`post=》rurl:${rurl},params:${params}`);
|
||||
// let new_dict = {};
|
||||
// let new_tmp = params.split('&');
|
||||
// new_tmp.forEach(i=>{
|
||||
// new_dict[i.split('=')[0]] = i.split('=')[1];
|
||||
// });
|
||||
// html = post(rurl,{body:new_dict});
|
||||
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let postData = {body:params};
|
||||
Object.assign(_fetch_params,postData);
|
||||
html = post(rurl,_fetch_params);
|
||||
}else if(req_method==='postjson'){
|
||||
let rurls = MY_URL.split(';')[0].split('#')
|
||||
let rurl = rurls[0]
|
||||
let params = rurls.length > 1 ?rurls[1]:'';
|
||||
print(`postjson-》rurl:${rurl},params:${params}`);
|
||||
try{
|
||||
params = JSON.parse(params);
|
||||
}catch (e) {
|
||||
params = '{}'
|
||||
}
|
||||
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let postData = {body:params};
|
||||
Object.assign(_fetch_params,postData);
|
||||
html = post(rurl,_fetch_params);
|
||||
}else{
|
||||
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}`);
|
||||
}
|
||||
// obj.headers['Cookie'] = cookie;
|
||||
html = getHtml(MY_URL);
|
||||
}
|
||||
if(!html.includes(searchObj.wd)){
|
||||
console.log('搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码');
|
||||
console.log(html);
|
||||
}
|
||||
if(is_json){
|
||||
// console.log(html);
|
||||
html = dealJson(html);
|
||||
// console.log(JSON.stringify(html));
|
||||
}
|
||||
// console.log(html);
|
||||
let list = _pdfa(html, p0);
|
||||
// print(list.length);
|
||||
// print(list);
|
||||
let p1 = getPP(p, 1, pp, 1);
|
||||
let p2 = getPP(p, 2, pp, 2);
|
||||
let p3 = getPP(p, 3, pp, 3);
|
||||
let p4 = getPP(p, 4, pp, 4);
|
||||
let p5 = getPP(p,5,pp,5);
|
||||
list.forEach(it => {
|
||||
let links = p4.split('+').map(_p4=>{
|
||||
return !rule.detailUrl?_pd(it, _p4,MY_URL):_pdfh(it, _p4)
|
||||
});
|
||||
let link = links.join('$');
|
||||
let content;
|
||||
if(p.length > 5 && p[5]){
|
||||
content = _pdfh(it, p5);
|
||||
}else{
|
||||
content = '';
|
||||
}
|
||||
let vod_id = link;
|
||||
let vod_name = _pdfh(it, p1).replace(/\n|\t/g,'').trim();
|
||||
let vod_pic = _pd(it, p2,MY_URL);
|
||||
if(rule.二级==='*'){
|
||||
vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
|
||||
}
|
||||
let ob = {
|
||||
'vod_id': vod_id,
|
||||
'vod_name': vod_name,
|
||||
'vod_pic': vod_pic,
|
||||
'vod_remarks': _pdfh(it, p3).replace(/\n|\t/g,'').trim(),
|
||||
'vod_content': content.replace(/\n|\t/g,'').trim(),
|
||||
};
|
||||
d.push(ob);
|
||||
});
|
||||
|
||||
}
|
||||
} catch (e) {
|
||||
print('搜索发生错误:'+e.message);
|
||||
return '{}'
|
||||
}
|
||||
}
|
||||
if(rule.图片来源){
|
||||
d.forEach(it=>{
|
||||
if(it.vod_pic&&it.vod_pic.startsWith('http')){
|
||||
it.vod_pic = it.vod_pic + rule.图片来源;
|
||||
}
|
||||
});
|
||||
}
|
||||
// print(d);
|
||||
return JSON.stringify({
|
||||
'page': parseInt(searchObj.pg),
|
||||
'pagecount': 10,
|
||||
'limit': 20,
|
||||
'total': 100,
|
||||
'list': d,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 二级详情页数据解析
|
||||
* @param detailObj
|
||||
* @returns {string}
|
||||
*/
|
||||
function detailParse(detailObj){
|
||||
let t1 = (new Date()).getTime();
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let orId = detailObj.orId;
|
||||
let vod_name = '片名';
|
||||
let vod_pic = '';
|
||||
let vod_id = orId;
|
||||
if(rule.二级==='*'){
|
||||
// vod_id = orId.split('@@')[0]; // 千万不能分割
|
||||
let extra = orId.split('@@');
|
||||
vod_name = extra.length>1?extra[1]:vod_name;
|
||||
vod_pic = extra.length>2?extra[2]:vod_pic;
|
||||
}
|
||||
// print(vod_pic);
|
||||
let vod = {
|
||||
vod_id: vod_id, //"id",
|
||||
vod_name: vod_name,
|
||||
vod_pic: 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;
|
||||
if(detailObj.二级访问前){
|
||||
try {
|
||||
print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);
|
||||
eval(detailObj.二级访问前.trim().replace('js:',''));
|
||||
}catch (e) {
|
||||
print(`二级访问前执行代码出现错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
// console.log(MY_URL);
|
||||
// setItem('MY_URL',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.split('@@')[0];
|
||||
}else if(typeof(p)==='string'&&p.trim().startsWith('js:')){
|
||||
const TYPE = 'detail';
|
||||
var input = MY_URL;
|
||||
var play_url = '';
|
||||
eval(p.trim().replace('js:',''));
|
||||
vod = VOD;
|
||||
console.log(JSON.stringify(vod));
|
||||
}else if(p&&typeof(p)==='object'){
|
||||
let tt1 = (new Date()).getTime();
|
||||
if(!html){
|
||||
html = getHtml(MY_URL);
|
||||
}
|
||||
print(`二级${MY_URL}仅获取源码耗时:${(new Date()).getTime()-tt1}毫秒`);
|
||||
let _impJQP = false;
|
||||
let _ps;
|
||||
if(p.is_json){
|
||||
print('二级是json');
|
||||
_ps = parseTags.json;
|
||||
html = dealJson(html);
|
||||
}else if(p.is_jsp){
|
||||
print('二级是jsp');
|
||||
_ps = parseTags.jsp;
|
||||
}else if(p.is_jq){
|
||||
print('二级是jq');
|
||||
_ps = parseTags.jq;
|
||||
}else{
|
||||
print('二级默认jq');
|
||||
_ps = parseTags.jq;
|
||||
// print('二级默认jsp');
|
||||
// _ps = parseTags.jsp;
|
||||
}
|
||||
if(_ps === parseTags.jq){ // jquery解析提前load(html)
|
||||
_impJQP = true;
|
||||
}
|
||||
if (_impJQP) {
|
||||
let ttt1 = (new Date()).getTime();
|
||||
let c$ = cheerio.load(html);
|
||||
// print(`二级${MY_URL}仅c$源码耗时:${(new Date()).getTime()-ttt1}毫秒`);
|
||||
html = { rr: c$, ele: c$('html')[0] };
|
||||
print(`二级${MY_URL}仅cheerio.load源码耗时:${(new Date()).getTime()-ttt1}毫秒`);
|
||||
}
|
||||
let tt2 = (new Date()).getTime();
|
||||
print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);
|
||||
_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]).replaceAll('\n', ' ').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] }
|
||||
}
|
||||
}
|
||||
|
||||
// console.log(2);
|
||||
if(p.tabs){
|
||||
if(p.tabs.startsWith('js:')){
|
||||
print('开始执行tabs代码:'+p.tabs);
|
||||
if(html&&_impJQP&&typeof (html)!=='string'){
|
||||
try { // 假装是jq的对象拿来转换一下字符串,try为了防止json的情况报错
|
||||
html = html.rr(html.ele).toString();
|
||||
}catch (e) {}
|
||||
}
|
||||
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);
|
||||
let tab_text = p.tab_text||'body&&Text';
|
||||
// print('tab_text:'+tab_text);
|
||||
let new_map = {};
|
||||
for(let v of vHeader){
|
||||
let v_title = _pdfh(v,tab_text).trim();
|
||||
console.log(v_title);
|
||||
if(tab_exclude&& (new RegExp(tab_exclude)).test(v_title)){
|
||||
continue;
|
||||
}
|
||||
if(!new_map.hasOwnProperty(v_title)){
|
||||
new_map[v_title] = 1;
|
||||
}else{
|
||||
new_map[v_title] += 1;
|
||||
}
|
||||
if(new_map[v_title]>1){
|
||||
v_title+=Number(new_map[v_title]-1);
|
||||
}
|
||||
playFrom.push(v_title);
|
||||
}
|
||||
}
|
||||
console.log(JSON.stringify(playFrom));
|
||||
}else{
|
||||
playFrom = ['道长在线']
|
||||
}
|
||||
vod.vod_play_from = playFrom.join(vod_play_from);
|
||||
|
||||
// console.log(3);
|
||||
let vod_play_url = '$$$';
|
||||
let vod_tab_list = [];
|
||||
if(p.lists){
|
||||
if(p.lists.startsWith('js:')){
|
||||
print('开始执行lists代码:'+p.lists);
|
||||
try {
|
||||
if(html&&_impJQP&&typeof (html)!=='string'){
|
||||
// 假装是jq的对象拿来转换一下字符串,try为了防止json的情况报错
|
||||
try {
|
||||
html = html.rr(html.ele).toString();
|
||||
}catch (e) {}
|
||||
}
|
||||
var input = MY_URL;
|
||||
var play_url = '';
|
||||
eval(p.lists.replace('js:',''));
|
||||
for(let i in LISTS){
|
||||
if(LISTS.hasOwnProperty(i)){
|
||||
// print(i);
|
||||
try {
|
||||
LISTS[i] = LISTS[i].map(it=>it.split('$').slice(0,2).join('$'));
|
||||
}catch (e) {
|
||||
print('格式化LISTS发生错误:'+e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
vod_play_url = LISTS.map(it=>it.join('#')).join(vod_play_url);
|
||||
}catch (e) {
|
||||
print('js执行lists: 发生错误:'+e.message);
|
||||
}
|
||||
|
||||
}else{
|
||||
let list_text = p.list_text||'body&&Text';
|
||||
let list_url = p.list_url||'a&&href';
|
||||
// print('list_text:'+list_text);
|
||||
// print('list_url:'+list_url);
|
||||
// print('list_parse:'+p.lists);
|
||||
let is_tab_js = p.tabs.trim().startsWith('js:');
|
||||
for(let i=0;i<playFrom.length;i++){
|
||||
let tab_name = playFrom[i];
|
||||
let tab_ext = p.tabs.split(';').length > 1 && !is_tab_js ? 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);
|
||||
// 测试jsp提速
|
||||
// console.log(p1);
|
||||
// p1 = p1.replace(':eq(0)',',0').replace(' ','&&');
|
||||
// console.log(p1);
|
||||
// console.log(html);
|
||||
let vodList = [];
|
||||
try {
|
||||
vodList = _pdfa(html, p1);
|
||||
console.log('len(vodList):'+vodList.length);
|
||||
}catch (e) {
|
||||
// console.log(e.message);
|
||||
}
|
||||
let new_vod_list = [];
|
||||
// print('tab_ext:'+tab_ext);
|
||||
let tabName = tab_ext?_pdfh(html, tab_ext):tab_name;
|
||||
console.log(tabName);
|
||||
// console.log('cheerio解析Text');
|
||||
// 此处存在性能问题: pt版2000集需要650毫秒,俊版1300毫秒 特么的优化不动 主要后面定位url的我拿他没法
|
||||
// 主要性能问题在于 _pd(it, list_url, MY_URL)
|
||||
let tt1 = (new Date()).getTime();
|
||||
// vodList.forEach((it,idex)=>{
|
||||
// // 请注意,这里要固定pdfh解析body&&Text,不需要下划线,没写错
|
||||
// // new_vod_list.push(pdfh(it,'body&&Text')+'$'+_pd(it,'a&&href',MY_URL));
|
||||
// // new_vod_list.push(cheerio.load(it).text()+'$'+_pd(it,'a&&href',MY_URL));
|
||||
// // new_vod_list.push(_pdfh(it, list_text).trim() + '$' + _pd(it, list_url, MY_URL));
|
||||
// // new_vod_list.push(_pdfh(it, list_text).trim() + '$' +idex);
|
||||
// // new_vod_list.push(idex + '$' +_pdfh(it, list_url));
|
||||
// new_vod_list.push(_pdfh(it, list_text).trim() + '$' +_pd(it, list_url,MY_URL));
|
||||
// });
|
||||
if(vodList.length>0){
|
||||
for(let i=0;i<vodList.length;i++){
|
||||
let it = vodList[i];
|
||||
new_vod_list.push(_pdfh(it, list_text).trim() + '$' +_pd(it, list_url,MY_URL));
|
||||
}
|
||||
new_vod_list = forceOrder(new_vod_list,'',x=>x.split('$')[0]);
|
||||
console.log(`drpy影响性能代码共计列表数循环次数:${vodList.length},耗时:${(new Date()).getTime()-tt1}毫秒`);
|
||||
}
|
||||
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;
|
||||
}
|
||||
if(rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith('http')){
|
||||
vod.vod_pic = vod.vod_pic + rule.图片来源;
|
||||
}
|
||||
if(!vod.vod_id||(vod_id.includes('$')&&vod.vod_id!==vod_id)){
|
||||
vod.vod_id = vod_id;
|
||||
}
|
||||
let t2 = (new Date()).getTime();
|
||||
console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);
|
||||
// print(vod);
|
||||
vod = vodDeal(vod);
|
||||
// print(vod);
|
||||
return JSON.stringify({
|
||||
list: [vod]
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取二级待返回的播放线路没处理时的索引关系
|
||||
* @param vod
|
||||
* @returns {{}}
|
||||
*/
|
||||
function get_tab_index(vod){
|
||||
let obj = {};
|
||||
vod.vod_play_from.split('$$$').forEach((it,index)=>{
|
||||
obj[it] = index;
|
||||
});
|
||||
return obj
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理待返回的vod数据|线路去除,排序,重命名
|
||||
* @param vod
|
||||
* @returns {*}
|
||||
*/
|
||||
function vodDeal(vod){
|
||||
let vod_play_from = vod.vod_play_from.split('$$$');
|
||||
let vod_play_url = vod.vod_play_url.split('$$$');
|
||||
|
||||
// 移除指定线路后的列表
|
||||
let tab_removed_list = vod_play_from;
|
||||
// 排序后的线路列表
|
||||
let tab_ordered_list = vod_play_from;
|
||||
// 线路重命名后的列表
|
||||
let tab_renamed_list = vod_play_from;
|
||||
// 定义实际要返回线路
|
||||
let tab_list = vod_play_from;
|
||||
// 选集列表根据线路排序
|
||||
let play_ordered_list = vod_play_url;
|
||||
|
||||
// 判断有移除线路或者线路排序
|
||||
if((rule.tab_remove&&rule.tab_remove.length>0)||(rule.tab_order&&rule.tab_order.length>0)){
|
||||
// 获取原来线路的索引下标
|
||||
let tab_index_dict = get_tab_index(vod);
|
||||
|
||||
if(rule.tab_remove&&rule.tab_remove.length>0){
|
||||
tab_removed_list = vod_play_from.filter(it=>!rule.tab_remove.includes(it));
|
||||
tab_list = tab_removed_list;
|
||||
}
|
||||
|
||||
if(rule.tab_order&&rule.tab_order.length>0){
|
||||
let tab_order = rule.tab_order;
|
||||
tab_ordered_list = tab_removed_list.sort((a, b) => {
|
||||
return (tab_order.indexOf(a)===-1?9999:tab_order.indexOf(a)) - (tab_order.indexOf(b)===-1?9999:tab_order.indexOf(b))
|
||||
});
|
||||
tab_list = tab_ordered_list;
|
||||
}
|
||||
play_ordered_list = tab_list.map(it=>vod_play_url[tab_index_dict[it]]);
|
||||
}
|
||||
|
||||
if(rule.tab_rename&&typeof(rule.tab_rename)==='object'&Object.keys(rule.tab_rename).length>0){
|
||||
tab_renamed_list = tab_list.map(it=>rule.tab_rename[it]||it);
|
||||
tab_list = tab_renamed_list;
|
||||
}
|
||||
vod.vod_play_from = tab_list.join('$$$');
|
||||
vod.vod_play_url = play_ordered_list.join('$$$');
|
||||
return vod
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否需要解析
|
||||
* @param url
|
||||
* @returns {number|number}
|
||||
*/
|
||||
function tellIsJx(url){
|
||||
try {
|
||||
let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split('?')[0]) && 是否正版(url);
|
||||
return is_vip?1:0
|
||||
}catch (e) {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 选集播放点击事件解析
|
||||
* @param playObj
|
||||
* @returns {string}
|
||||
*/
|
||||
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;//注入给免嗅js
|
||||
let common_play = {
|
||||
parse:1,
|
||||
url:input,
|
||||
// url:urlencode(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;
|
||||
}
|
||||
// print('play_json:'+typeof(rule.play_json));
|
||||
// console.log(Array.isArray(rule.play_json));
|
||||
if(Array.isArray(rule.play_json) && rule.play_json.length >0){ // 数组情况判断长度大于0
|
||||
let web_url = lazy_play.url;
|
||||
for(let pjson of rule.play_json){
|
||||
if(pjson.re && (pjson.re==='*'||web_url.match(new RegExp(pjson.re)))){
|
||||
if(pjson.json && typeof(pjson.json)==='object'){
|
||||
let base_json = pjson.json;
|
||||
// print('开始合并:');
|
||||
// print(base_json);
|
||||
lazy_play = Object.assign(lazy_play,base_json);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}else if(rule.play_json && !Array.isArray(rule.play_json)){ // 其他情况 非[] 判断true/false
|
||||
let base_json = {
|
||||
jx:1,
|
||||
parse:1,
|
||||
};
|
||||
lazy_play = Object.assign(lazy_play,base_json);
|
||||
}else if(!rule.play_json){ // 不解析传0
|
||||
let base_json = {
|
||||
jx:0,
|
||||
parse:1,
|
||||
};
|
||||
lazy_play = Object.assign(lazy_play,base_json);
|
||||
}
|
||||
console.log(JSON.stringify(lazy_play));
|
||||
return JSON.stringify(lazy_play);
|
||||
}
|
||||
|
||||
/**
|
||||
* 本地代理解析规则
|
||||
* @param params
|
||||
*/
|
||||
function proxyParse(proxyObj){
|
||||
var input = proxyObj.params;
|
||||
if(proxyObj.proxy_rule){
|
||||
log('准备执行本地代理规则:\n'+proxyObj.proxy_rule);
|
||||
try {
|
||||
eval(proxyObj.proxy_rule);
|
||||
if(input && input!== proxyObj.params && Array.isArray(input) &&input.length===3){
|
||||
return input
|
||||
}else{
|
||||
return [404,'text/plain','Not Found']
|
||||
}
|
||||
}catch (e) {
|
||||
return [500,'text/plain','代理规则错误:'+e.message]
|
||||
}
|
||||
|
||||
}else{
|
||||
return [404,'text/plain','Not Found']
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 辅助嗅探解析规则
|
||||
* @param isVideoObj
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isVideoParse(isVideoObj){
|
||||
var input = isVideoObj.url;
|
||||
if(!isVideoObj.t){ // t为假代表默认传的正则字符串
|
||||
let re_matcher = new RegExp(isVideoObj.isVideo,'i'); // /g匹配多个,/i不区分大小写,/m匹配多行
|
||||
return re_matcher.test(input);
|
||||
}else{
|
||||
// 执行js
|
||||
try {
|
||||
eval(isVideoObj.isVideo);
|
||||
if(typeof(input)==='boolean'){
|
||||
return input
|
||||
}else{
|
||||
return false
|
||||
}
|
||||
}catch (e) {
|
||||
log('执行嗅探规则发生错误:'+e.message);
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* js源预处理特定返回对象中的函数
|
||||
* @param ext
|
||||
*/
|
||||
function init(ext) {
|
||||
console.log('init');
|
||||
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();
|
||||
if (typeof ext == 'object'){
|
||||
rule = ext;
|
||||
} 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'));
|
||||
}
|
||||
}
|
||||
if (rule.模板 && muban.hasOwnProperty(rule.模板)) {
|
||||
print('继承模板:'+rule.模板);
|
||||
rule = Object.assign(muban[rule.模板], 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('/');
|
||||
HOST = rule.host;
|
||||
if(rule.hostJs){
|
||||
console.log(`检测到hostJs,准备执行...`);
|
||||
try {
|
||||
eval(rule.hostJs);
|
||||
rule.host = HOST.rstrip('/');
|
||||
}catch (e) {
|
||||
console.log(`执行${rule.hostJs}获取host发生错误:`+e.message);
|
||||
}
|
||||
}
|
||||
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;
|
||||
rule.二级访问前 = rule.二级访问前||'';
|
||||
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;
|
||||
}
|
||||
|
||||
if(rule.searchUrl.includes('[')&&rule.searchUrl.includes(']')){
|
||||
let u1 = rule.searchUrl.split('[')[0]
|
||||
let u2 = rule.searchUrl.split('[')[1].split(']')[0]
|
||||
rule.searchUrl = rule.host && rule.searchUrl?urljoin(rule.host,u1)+'['+urljoin(rule.host,u2)+']':rule.searchUrl;
|
||||
}else{
|
||||
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host,rule.searchUrl) : rule.searchUrl;
|
||||
}
|
||||
|
||||
rule.timeout = rule.timeout||5000;
|
||||
rule.encoding = rule.编码||rule.encoding||'utf-8';
|
||||
rule.search_encoding = rule.搜索编码||rule.search_encoding||'';
|
||||
rule.图片来源 = rule.图片来源||'';
|
||||
rule.play_json = rule.hasOwnProperty('play_json')?rule.play_json:[];
|
||||
rule.pagecount = rule.hasOwnProperty('pagecount')?rule.pagecount:{};
|
||||
rule.proxy_rule = rule.hasOwnProperty('proxy_rule')?rule.proxy_rule:'';
|
||||
rule.sniffer = rule.hasOwnProperty('sniffer')?rule.sniffer:'';
|
||||
rule.sniffer = !!(rule.sniffer && rule.sniffer!=='0' && rule.sniffer!=='false');
|
||||
|
||||
rule.isVideo = rule.hasOwnProperty('isVideo')?rule.isVideo:'';
|
||||
|
||||
rule.tab_remove = rule.hasOwnProperty('tab_remove')?rule.tab_remove:[];
|
||||
rule.tab_order = rule.hasOwnProperty('tab_order')?rule.tab_order:[];
|
||||
rule.tab_rename = rule.hasOwnProperty('tab_rename')?rule.tab_rename:{};
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
// print(rule.headers);
|
||||
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);
|
||||
pre(); // 预处理
|
||||
init_test();
|
||||
}catch (e) {
|
||||
console.log('init_test发生错误:'+e.message);
|
||||
}
|
||||
}
|
||||
|
||||
let homeHtmlCache = undefined;
|
||||
|
||||
/**
|
||||
* js源获取首页分类和筛选特定返回对象中的函数
|
||||
* @param filter 筛选条件字典对象
|
||||
* @returns {string}
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* js源获取首页推荐数据列表特定返回对象中的函数
|
||||
* @param params
|
||||
* @returns {string}
|
||||
*/
|
||||
function homeVod(params) {
|
||||
console.log("homeVod");
|
||||
let homeVodObj = {
|
||||
推荐:rule.推荐,
|
||||
double:rule.double,
|
||||
homeUrl:rule.homeUrl,
|
||||
detailUrl:rule.detailUrl
|
||||
};
|
||||
return homeVodParse(homeVodObj)
|
||||
// return "{}";
|
||||
}
|
||||
|
||||
/**
|
||||
* js源获取分类页一级数据列表特定返回对象中的函数
|
||||
* @param tid 分类id
|
||||
* @param pg 页数
|
||||
* @param filter 当前选中的筛选条件
|
||||
* @param extend 扩展
|
||||
* @returns {string}
|
||||
*/
|
||||
function category(tid, pg, filter, extend) {
|
||||
let cateObj = {
|
||||
url: rule.url,
|
||||
一级: rule.一级,
|
||||
tid: tid,
|
||||
pg: parseInt(pg),
|
||||
filter: filter,
|
||||
extend: extend
|
||||
};
|
||||
// console.log(JSON.stringify(extend));
|
||||
return categoryParse(cateObj)
|
||||
}
|
||||
|
||||
/**
|
||||
* js源获取二级详情页数据特定返回对象中的函数
|
||||
* @param vod_url 一级列表中的vod_id或者是带分类的自拼接 vod_id 如 fyclass$vod_id
|
||||
* @returns {string}
|
||||
*/
|
||||
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.split('@@')[0];
|
||||
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.二级,
|
||||
二级访问前:rule.二级访问前,
|
||||
detailUrl:detailUrl,
|
||||
fyclass:fyclass,
|
||||
tab_exclude:rule.tab_exclude,
|
||||
}
|
||||
return detailParse(detailObj)
|
||||
}
|
||||
|
||||
/**
|
||||
* js源选集按钮播放点击事件特定返回对象中的函数
|
||||
* @param flag 线路名
|
||||
* @param id 播放按钮的链接
|
||||
* @param flags 全局配置的flags是否需要解析的标识列表
|
||||
* @returns {string}
|
||||
*/
|
||||
function play(flag, id, flags) {
|
||||
let playObj = {
|
||||
url:id,
|
||||
flag:flag,
|
||||
flags:flags
|
||||
}
|
||||
return playParse(playObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* js源搜索返回的数据列表特定返回对象中的函数
|
||||
* @param wd 搜索关键字
|
||||
* @param quick 是否来自快速搜索
|
||||
* @returns {string}
|
||||
*/
|
||||
function search(wd, quick, pg) {
|
||||
if(rule.search_encoding){
|
||||
if(rule.search_encoding.toLowerCase()!=='utf-8'){
|
||||
// 按搜索编码进行编码
|
||||
wd = encodeStr(wd,rule.search_encoding);
|
||||
}
|
||||
}else if(rule.encoding && rule.encoding.toLowerCase()!=='utf-8'){
|
||||
// 按全局编码进行编码
|
||||
wd = encodeStr(wd,rule.encoding);
|
||||
}
|
||||
let searchObj = {
|
||||
searchUrl: rule.searchUrl,
|
||||
搜索: rule.搜索,
|
||||
wd: wd,
|
||||
//pg: pg,
|
||||
pg: pg||1,
|
||||
quick: quick,
|
||||
};
|
||||
// console.log(JSON.stringify(searchObj));
|
||||
return searchParse(searchObj)
|
||||
}
|
||||
|
||||
/**
|
||||
* js源本地代理返回的数据列表特定返回对象中的函数
|
||||
* @param params 代理链接参数比如 /proxy?do=js&url=https://wwww.baidu.com => params就是 {do:'js','url':'https://wwww.baidu.com'}
|
||||
* @returns {*}
|
||||
*/
|
||||
function proxy(params){
|
||||
if(rule.proxy_rule&&rule.proxy_rule.trim()){
|
||||
rule.proxy_rule = rule.proxy_rule.trim();
|
||||
}
|
||||
if(rule.proxy_rule.startsWith('js:')){
|
||||
rule.proxy_rule = rule.proxy_rule.replace('js:','');
|
||||
}
|
||||
let proxyObj = {
|
||||
params:params,
|
||||
proxy_rule:rule.proxy_rule
|
||||
};
|
||||
return proxyParse(proxyObj)
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否启用辅助嗅探功能,启用后可以根据isVideo函数进行手动识别为视频的链接地址。默认为false
|
||||
* @returns {*|boolean|boolean}
|
||||
*/
|
||||
function sniffer(){
|
||||
let enable_sniffer = rule.sniffer || false;
|
||||
if(enable_sniffer){
|
||||
// log('准备执行辅助嗅探代理规则:\n'+rule.isVideo);
|
||||
log('开始执行辅助嗅探代理规则...');
|
||||
}
|
||||
return enable_sniffer
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用辅助嗅探功能后根据次函数返回的值识别地址是否为视频,返回true/false
|
||||
* @param url
|
||||
*/
|
||||
function isVideo(url){
|
||||
let t = 0;
|
||||
let is_video;
|
||||
if(rule.isVideo &&rule.isVideo.trim()){
|
||||
is_video = rule.isVideo.trim();
|
||||
}
|
||||
if(is_video.startsWith('js:')){
|
||||
is_video = is_video.replace('js:','');
|
||||
t = 1;
|
||||
}
|
||||
let isVideoObj = {
|
||||
url:url,
|
||||
isVideo:is_video,
|
||||
t:t,
|
||||
};
|
||||
let result = isVideoParse(isVideoObj);
|
||||
if(result){
|
||||
log('成功执行辅助嗅探规则并检测到视频地址:\n'+rule.isVideo);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function DRPY(){//导出函数
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
proxy:proxy,
|
||||
sniffer:sniffer,
|
||||
isVideo:isVideo
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出函数无法简写成下面的形式:
|
||||
|
||||
export default {
|
||||
...DRPY,
|
||||
DRPY
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// 导出函数对象
|
||||
export default {
|
||||
init,
|
||||
home,
|
||||
homeVod,
|
||||
category,
|
||||
detail,
|
||||
play,
|
||||
search,
|
||||
proxy,
|
||||
sniffer,
|
||||
isVideo,
|
||||
DRPY,
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
import cheerio from"assets://js/lib/cheerio.min.js";import"assets://js/lib/crypto-js.js";import 模板 from"./模板.js";import{gbkTool}from"./gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};const VERSION="drpy1 3.9.49beta2 20231122";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="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;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|-original|-src|-play|-url|style)$/;const SPECIAL_URL=/^(ftp|magnet|thunder|ws):/;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;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){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<len){if(o[k]===searchElement){return true}k++}return 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||"";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=[];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)}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){var Encrypted=CryptoJS.AES.encrypt(word,a,{iv:t,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});return Encrypted.ciphertext.toString()}}}return{}}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)}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);eval(html.match(/var config = {[\s\S]*?}/)[0]+"");if(!config.url.startsWith("http")){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,"+")}function base64Encode(text){return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text))}function base64Decode(text){return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text))}function md5(text){return CryptoJS.MD5(text).toString()}function encodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){const strTool=gbkTool();input=strTool.encode(input)}return input}function decodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){const strTool=gbkTool();input=strTool.decode(input)}return input}function getCryptoJS(){return'console.log("CryptoJS已装载");'}const RSA={encode:function(data,key,option){if(typeof rsaEncrypt==="function"){if(!option||typeof option!=="object"){return rsaEncrypt(data,key)}else{return rsaEncrypt(data,key,option)}}else{return false}},decode:function(data,key,option){if(typeof rsaDecrypt==="function"){if(!option||typeof option!=="object"){return rsaDecrypt(data,key)}else{return rsaDecrypt(data,key,option)}}else{return false}}};function getProxyUrl(){if(typeof getProxy==="function"){return getProxy(true)}else{return"http://127.0.0.1:9978/proxy?do=js"}}function forceOrder(lists,key,option){let start=Math.floor(lists.length/2);let end=Math.min(lists.length-1,start+1);if(start>=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;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)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{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(sp.hasOwnProperty(i)){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];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)&&!SPECIAL_URL.test(result)){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()){print("!parse");return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX_A.test(sp[i])&&i<sp.length-1){if(sp[i]!=="body"){sp[i]=sp[i]+":first"}}}}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},pd(html,parse,uri){return parseTags.jq.pdfh(html,parse,MY_URL)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html=request(OCR_API,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true);code=html||""}catch(e){}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cnt<OCR_RETRY){try{let yzm_url=`${host}/index.php/verify/index.html`;console.log(`验证码链接:${yzm_url}`);let hhtml=request(yzm_url,{withHeaders:true,toBase64:true},true);let json=JSON.parse(hhtml);if(!cookie){let setCk=Object.keys(json).find(it=>it.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=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)}if(!fetch_params){fetch_params={}}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.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.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+`|method:${obj.method||"GET"}|body:${obj.body||""}`);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}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{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;print("宝塔验证访问链接:"+url);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")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}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<cnt;i++){classes.push({type_id:urls[i],type_name:names[i]})}}if(homeObj.class_parse){let p=homeObj.class_parse.split(";");let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;MY_URL=rule.url;if(p.length>=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 getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;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 p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.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,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}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(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}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:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}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)}}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;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}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 pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd);if(searchObj.pg===1&&url.includes("[")&&url.includes("]")&&!url.includes("#")){url=url.split("[")[1].split("]")[0]}else if(searchObj.pg>1&&url.includes("[")&&url.includes("]")&&!url.includes("#")){url=url.split("[")[0]}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",searchObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.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 p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{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,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic: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;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _impJQP=false;let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}if(_ps===parseTags.jq){_impJQP=true}if(_impJQP){let ttt1=(new Date).getTime();let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]};print(`二级${MY_URL}仅cheerio.load源码耗时:${(new Date).getTime()-ttt1}毫秒`)}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_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&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}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);try{if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i<playFrom.length;i++){let tab_name=playFrom[i];let tab_ext=p.tabs.split(";").length>1&&!is_tab_js?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);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);let tt1=(new Date).getTime();if(vodList.length>0){for(let i=0;i<vodList.length;i++){let it=vodList[i];new_vod_list.push(_pdfh(it,list_text).trim()+"$"+_pd(it,list_url,MY_URL))}new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${vodList.length},耗时:${(new Date).getTime()-tt1}毫秒`)}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}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);vod=vodDeal(vod);return JSON.stringify({list:[vod]})}function get_tab_index(vod){let obj={};vod.vod_play_from.split("$$$").forEach((it,index)=>{obj[it]=index});return obj}function vodDeal(vod){let vod_play_from=vod.vod_play_from.split("$$$");let vod_play_url=vod.vod_play_url.split("$$$");let tab_removed_list=vod_play_from;let tab_ordered_list=vod_play_from;let tab_renamed_list=vod_play_from;let tab_list=vod_play_from;let play_ordered_list=vod_play_url;if(rule.tab_remove&&rule.tab_remove.length>0||rule.tab_order&&rule.tab_order.length>0){let tab_index_dict=get_tab_index(vod);if(rule.tab_remove&&rule.tab_remove.length>0){tab_removed_list=vod_play_from.filter(it=>!rule.tab_remove.includes(it));tab_list=tab_removed_list}if(rule.tab_order&&rule.tab_order.length>0){let tab_order=rule.tab_order;tab_ordered_list=tab_removed_list.sort((a,b)=>{return(tab_order.indexOf(a)===-1?9999:tab_order.indexOf(a))-(tab_order.indexOf(b)===-1?9999:tab_order.indexOf(b))});tab_list=tab_ordered_list}play_ordered_list=tab_list.map(it=>vod_play_url[tab_index_dict[it]])}if(rule.tab_rename&&typeof rule.tab_rename==="object"&Object.keys(rule.tab_rename).length>0){tab_renamed_list=tab_list.map(it=>rule.tab_rename[it]||it);tab_list=tab_renamed_list}vod.vod_play_from=tab_list.join("$$$");vod.vod_play_url=play_ordered_list.join("$$$");return 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}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length===3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log("执行嗅探规则发生错误:"+e.message);return false}}}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}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"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[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("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}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;rule.二级访问前=rule.二级访问前||"";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}if(rule.searchUrl.includes("[")&&rule.searchUrl.includes("]")&&!rule.searchUrl.includes("#")){let u1=rule.searchUrl.split("[")[0];let u2=rule.searchUrl.split("[")[1].split("]")[0];rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.searchUrl}else{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";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";rule.tab_remove=rule.hasOwnProperty("tab_remove")?rule.tab_remove:[];rule.tab_order=rule.hasOwnProperty("tab_order")?rule.tab_order:[];rule.tab_rename=rule.hasOwnProperty("tab_rename")?rule.tab_rename:{};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);pre();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){console.log("homeVod");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.split("@@")[0];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.二级,"二级访问前":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,pg){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:pg||1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith("js:")){rule.proxy_rule=rule.proxy_rule.replace("js:","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("开始执行辅助嗅探代理规则...")}return enable_sniffer}function isVideo(url){let t=0;let is_video;if(rule.isVideo&&rule.isVideo.trim()){is_video=rule.isVideo.trim()}if(is_video.startsWith("js:")){is_video=is_video.replace("js:","");t=1}let isVideoObj={url:url,isVideo:is_video,t:t};let result=isVideoParse(isVideoObj);if(result){log("成功执行辅助嗅探规则并检测到视频地址:\n"+rule.isVideo)}return result}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,DRPY:DRPY};
|
||||
@@ -0,0 +1,2542 @@
|
||||
import cheerio from 'assets://js/lib/cheerio.min.js';
|
||||
import 'assets://js/lib/crypto-js.js';
|
||||
import 模板 from"../js/模板.js"
|
||||
import {gbkTool} from './gbk.js'
|
||||
// import './rsa.js'
|
||||
|
||||
// import cheerio from "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js";
|
||||
// import "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js";
|
||||
// import 模板 from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js";
|
||||
// import {gbkTool} from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js'
|
||||
|
||||
function init_test(){
|
||||
// console.log(typeof(CryptoJS));
|
||||
console.log("init_test_start");
|
||||
// print(模板);
|
||||
// print(typeof(模板.getMubans));
|
||||
console.log("当前版本号:"+VERSION);
|
||||
console.log(RKEY);
|
||||
console.log(JSON.stringify(rule));
|
||||
console.log("init_test_end");
|
||||
|
||||
// console.log(typeof (CryptoJS));
|
||||
// console.log(typeof (JSEncrypt));
|
||||
// var publicKey = "-----BEGIN PUBLIC KEY-----\n" +
|
||||
// "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTTt5d1LYtIxiW9ekKFBVonFOT\n" +
|
||||
// "XJHv4PY4xCDLPYbHWRKa/mRO7J11OJX+cR7bqzNq6uxH1W339wV\n" +
|
||||
// "lLP/x3Rl1RBh4prj0eYOEIsDVTvLTJONKazRtQrZ7yzSZ69o/3CQv\n" +
|
||||
// "ex6kb4js+9zho4U9fwIDAQAB\n" +
|
||||
// "-----END PUBLIC KEY-----";
|
||||
// var text = '你好';
|
||||
// const encryptor = new JSEncrypt();
|
||||
// console.log(typeof (encryptor.setPublicKey));
|
||||
// console.log(typeof (encryptor.encrypt));
|
||||
// encryptor.setPublicKey(publicKey) // 设置公钥
|
||||
// var str = encryptor.encrypt(text) // 对数据进行加密
|
||||
// console.log("加密数据:" + str);
|
||||
// log('rsax:'+typeof(rsax));
|
||||
// log('rsaX:'+typeof(rsaX));
|
||||
// let data = base64Encode('你好');
|
||||
// let publicKey = 'dzyyds';
|
||||
// console.log(typeof (RSA.encode));
|
||||
// let encryptBase64Data = RSA.encode(data,publicKey);
|
||||
// log('encryptBase64Data:'+encryptBase64Data);
|
||||
// let str = RSA.decode(data,publicKey);
|
||||
// log('str:'+str);
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行预处理代码
|
||||
*/
|
||||
function pre(){
|
||||
if(typeof(rule.预处理) === 'string' && rule.预处理 && rule.预处理.trim()){
|
||||
let code = rule.预处理.trim();
|
||||
console.log("执行预处理代码:"+code);
|
||||
if(code.startsWith('js:')){
|
||||
code = code.replace('js:','');
|
||||
}
|
||||
try {
|
||||
// code里可以进行get 或者 post请求cookie并改变rule.headers 里的cookie
|
||||
// 直接操作 rule_fetch_params 这个变量 .headers.Cookie
|
||||
eval(code);
|
||||
}catch (e) {
|
||||
console.log('预处理执行失败:'+e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let rule = {};
|
||||
let vercode = typeof(pdfl) ==='function'?'drpy2.1':'drpy2';
|
||||
const VERSION = vercode+' 3.9.48beta16 20231011';
|
||||
/** 已知问题记录
|
||||
* 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 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'; // 源cookie的key值
|
||||
// const KEY = typeof(key)!=='undefined'&&key?key:'drpy_' + (rule.title || rule.host); // 源的唯一标识
|
||||
const CATE_EXCLUDE = '首页|留言|APP|下载|资讯|新闻|动态';
|
||||
const TAB_EXCLUDE = '猜你|喜欢|下载|剧情|热播';
|
||||
const OCR_RETRY = 3;//ocr验证重试次数
|
||||
// const OCR_API = 'http://dm.mudery.com:10000';//ocr在线识别接口
|
||||
// const OCR_API = 'http://192.168.3.239:5705/parse/ocr';//ocr在线识别接口
|
||||
// const OCR_API = 'http://cms.nokia.press/parse/ocr';//ocr在线识别接口
|
||||
// const OCR_API = 'http://cms.nokia.press:5707/parse/ocr';//ocr在线识别接口
|
||||
const OCR_API = 'http://drpy.nokia.press:8028/ocr/drpy/text';//ocr在线识别接口
|
||||
if(typeof(MY_URL)==='undefined'){
|
||||
var MY_URL; // 全局注入变量,pd函数需要
|
||||
}
|
||||
var HOST;
|
||||
var RKEY; // 源的唯一标识
|
||||
var fetch;
|
||||
var print;
|
||||
var log;
|
||||
var rule_fetch_params;
|
||||
var fetch_params; // 每个位置单独的
|
||||
var oheaders;
|
||||
// var play_url; // 二级详情页注入变量,为了适配js模式0 (不在这里定义了,直接二级里定义了个空字符串)
|
||||
var _pdfh;
|
||||
var _pdfa;
|
||||
var _pd;
|
||||
// const DOM_CHECK_ATTR = ['url', 'src', 'href', 'data-original', 'data-src'];
|
||||
const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/;
|
||||
// 过滤特殊链接,不走urlJoin
|
||||
const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/;
|
||||
const NOADD_INDEX = /:eq|:lt|:gt|:first|:last|^body$|^#/; // 不自动加eq下标索引
|
||||
const URLJOIN_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/; // 需要自动urljoin的属性
|
||||
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 = [];
|
||||
// print(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);
|
||||
}
|
||||
// 猫了个咪
|
||||
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();
|
||||
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串按指定编码
|
||||
* @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 = {
|
||||
encode:function (data,key,option){
|
||||
// log('encode');
|
||||
if(typeof(rsaEncrypt)==='function'){
|
||||
if(!option||typeof(option)!=='object'){
|
||||
return rsaEncrypt(data,key);
|
||||
}else{
|
||||
return rsaEncrypt(data,key,option);
|
||||
}
|
||||
}else{
|
||||
return false
|
||||
}
|
||||
},
|
||||
decode:function (data,key,option){
|
||||
// log('decode');
|
||||
if(typeof(rsaDecrypt)==='function'){
|
||||
if(!option||typeof(option)!=='object'){
|
||||
return rsaDecrypt(data,key);
|
||||
}else{
|
||||
return rsaDecrypt(data,key,option);
|
||||
}
|
||||
}else{
|
||||
return false
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取壳子返回的代理地址
|
||||
* @returns {string|*}
|
||||
*/
|
||||
function getProxyUrl(){
|
||||
if(typeof(getProxy)==='function'){//判断壳子里有getProxy函数就执行取返回结果。否则取默认的本地
|
||||
return getProxy(true)
|
||||
}else{
|
||||
return 'http://127.0.0.1:9978/proxy?do=js'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 强制正序算法
|
||||
* @param lists 待正序列表
|
||||
* @param key 正序键
|
||||
* @param option 单个元素处理函数
|
||||
* @returns {*}
|
||||
*/
|
||||
function forceOrder(lists,key,option){
|
||||
let start = Math.floor(lists.length/2);
|
||||
let end = Math.min(lists.length-1,start+1);
|
||||
if(start >= end){
|
||||
return lists;
|
||||
}
|
||||
let first = lists[start];
|
||||
let second = lists[end];
|
||||
if(key){
|
||||
try {
|
||||
first = first[key];
|
||||
second = second[key];
|
||||
}catch (e) {}
|
||||
}
|
||||
if(option && typeof(option)==='function'){
|
||||
try {
|
||||
first = option(first);
|
||||
second = option(second);
|
||||
}catch (e) {}
|
||||
}
|
||||
first+='';
|
||||
second+='';
|
||||
// console.log(first,second);
|
||||
if(first.match(/(\d+)/)&&second.match(/(\d+)/)){
|
||||
let num1 = Number(first.match(/(\d+)/)[1]);
|
||||
let num2 = Number(second.match(/(\d+)/)[1]);
|
||||
if (num1 > num2){
|
||||
lists.reverse();
|
||||
}
|
||||
}
|
||||
return lists
|
||||
}
|
||||
|
||||
let VODS = [];// 一级或者搜索需要的数据列表
|
||||
let VOD = {};// 二级的单个数据
|
||||
let TABS = [];// 二级的自定义线路列表 如: TABS=['道长在线','道长在线2']
|
||||
let LISTS = [];// 二级的自定义选集播放列表 如: LISTS=[['第1集$http://1.mp4','第2集$http://2.mp4'],['第3集$http://1.mp4','第4集$http://2.mp4']]
|
||||
globalThis.encodeUrl = urlencode;
|
||||
globalThis.urlencode = urlencode;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* url拼接
|
||||
* @param fromPath 初始当前页面url
|
||||
* @param nowPath 相对当前页面url
|
||||
* @returns {*}
|
||||
*/
|
||||
function urljoin(fromPath, nowPath) {
|
||||
fromPath = fromPath||'';
|
||||
nowPath = nowPath||'';
|
||||
return joinUrl(fromPath, nowPath);
|
||||
// try {
|
||||
// // import Uri from './uri.min.js';
|
||||
// // var Uri = require('./uri.min.js');
|
||||
// // eval(request('https://cdn.bootcdn.net/ajax/libs/URI.js/1.19.11/URI.min.js'));
|
||||
// // let new_uri = URI(nowPath, fromPath);
|
||||
|
||||
// let new_uri = Uri(nowPath, fromPath);
|
||||
// new_uri = new_uri.toString();
|
||||
// // console.log(new_uri);
|
||||
// // return fromPath + nowPath
|
||||
// return new_uri
|
||||
// }
|
||||
// catch (e) {
|
||||
// console.log('urljoin发生错误:'+e.message);
|
||||
// if(nowPath.startsWith('http')){
|
||||
// return nowPath
|
||||
// }if(nowPath.startsWith('/')){
|
||||
// return getHome(fromPath)+nowPath
|
||||
// }
|
||||
// return fromPath+nowPath
|
||||
// }
|
||||
}
|
||||
var urljoin2 = urljoin;
|
||||
|
||||
// 内置 pdfh,pdfa,pd
|
||||
const defaultParser = {
|
||||
pdfh:pdfh,
|
||||
pdfa:pdfa,
|
||||
pd:pd,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* pdfh原版优化,能取style属性里的图片链接
|
||||
* @param html 源码
|
||||
* @param parse 解析表达式
|
||||
* @returns {string|*}
|
||||
*/
|
||||
function pdfh2(html,parse){
|
||||
let html2 = html;
|
||||
try {
|
||||
if(typeof(html)!=='string'){
|
||||
html2 = html.rr(html.ele).toString();
|
||||
}
|
||||
}catch (e) {
|
||||
print('html对象转文本发生了错误:'+e.message);
|
||||
}
|
||||
let result = defaultParser.pdfh(html2,parse);
|
||||
let option = parse.includes('&&')?parse.split('&&').slice(-1)[0]:parse.split(' ').slice(-1)[0];
|
||||
if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){
|
||||
try {
|
||||
result = result.match(/url\((.*?)\)/)[1];
|
||||
// 2023/07/28新增 style取内部链接自动去除首尾单双引号
|
||||
result = result.replace(/^['|"](.*)['|"]$/, "$1");
|
||||
}catch (e) {}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* pdfa原版优化,可以转换jq的html对象
|
||||
* @param html
|
||||
* @param parse
|
||||
* @returns {*}
|
||||
*/
|
||||
function pdfa2(html,parse){
|
||||
let html2 = html;
|
||||
try {
|
||||
if(typeof(html)!=='string'){
|
||||
html2 = html.rr(html.ele).toString();
|
||||
}
|
||||
}catch (e) {
|
||||
print('html对象转文本发生了错误:'+e.message);
|
||||
}
|
||||
return defaultParser.pdfa(html2,parse);
|
||||
}
|
||||
|
||||
/**
|
||||
* pd原版方法重写-增加自动urljoin
|
||||
* @param html
|
||||
* @param parse
|
||||
* @param uri
|
||||
* @returns {*}
|
||||
*/
|
||||
function pd2(html,parse,uri){
|
||||
let ret = pdfh2(html,parse);
|
||||
if(typeof(uri)==='undefined'||!uri){
|
||||
uri = '';
|
||||
}
|
||||
if(DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)){
|
||||
if(/http/.test(ret)){
|
||||
ret = ret.substr(ret.indexOf('http'));
|
||||
}else{
|
||||
ret = urljoin(MY_URL,ret)
|
||||
}
|
||||
}
|
||||
// MY_URL = getItem('MY_URL',MY_URL);
|
||||
// console.log(`规则${RKEY}打印MY_URL:${MY_URL},uri:${uri}`);
|
||||
return ret
|
||||
}
|
||||
|
||||
const parseTags = {
|
||||
jsp:{
|
||||
pdfh:pdfh2,
|
||||
pdfa:pdfa2,
|
||||
pd:pd2,
|
||||
},
|
||||
json:{
|
||||
pdfh(html, parse) {
|
||||
if (!parse || !parse.trim()){
|
||||
return '';
|
||||
}
|
||||
if (typeof(html) === 'string'){
|
||||
// print('jsonpath:pdfh字符串转dict');
|
||||
html = JSON.parse(html);
|
||||
}
|
||||
parse = parse.trim();
|
||||
if (!parse.startsWith('$.')){
|
||||
parse = '$.' + parse;
|
||||
}
|
||||
parse = parse.split('||');
|
||||
for (let ps of parse) {
|
||||
let ret = cheerio.jp(ps, html);
|
||||
if (Array.isArray(ret)){
|
||||
ret = ret[0] || '';
|
||||
} else{
|
||||
ret = ret || ''
|
||||
}
|
||||
if (ret && typeof (ret) !== 'string'){
|
||||
ret = ret.toString();
|
||||
}
|
||||
if(ret){
|
||||
return ret
|
||||
}
|
||||
}
|
||||
return '';
|
||||
},
|
||||
pdfa(html, parse) {
|
||||
if (!parse || !parse.trim()){
|
||||
return '';
|
||||
}
|
||||
if (typeof(html) === 'string'){
|
||||
// print('jsonpath:pdfa字符串转dict');
|
||||
html = JSON.parse(html);
|
||||
}
|
||||
parse = parse.trim()
|
||||
if (!parse.startsWith('$.')){
|
||||
parse = '$.' + parse;
|
||||
}
|
||||
let ret = cheerio.jp(parse, html);
|
||||
if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1){
|
||||
return ret[0] || []
|
||||
}
|
||||
return ret || []
|
||||
},
|
||||
pd(html,parse){
|
||||
let ret = parseTags.json.pdfh(html,parse);
|
||||
if(ret){
|
||||
return urljoin(MY_URL,ret);
|
||||
}
|
||||
return ret
|
||||
},
|
||||
},
|
||||
jq:{
|
||||
pdfh(html, parse) {
|
||||
if (!html||!parse || !parse.trim()) {
|
||||
return ''
|
||||
}
|
||||
parse = parse.trim();
|
||||
let result = defaultParser.pdfh(html,parse);
|
||||
// print(`pdfh解析${parse}=>${result}`);
|
||||
return result;
|
||||
},
|
||||
pdfa(html, parse) {
|
||||
if (!html||!parse || !parse.trim()) {
|
||||
return [];
|
||||
}
|
||||
parse = parse.trim();
|
||||
let result = defaultParser.pdfa(html,parse);
|
||||
// print(result);
|
||||
print(`pdfa解析${parse}=>${result.length}`);
|
||||
return result;
|
||||
},
|
||||
pd(html,parse,base_url){
|
||||
if (!html||!parse || !parse.trim()) {
|
||||
return ''
|
||||
}
|
||||
parse = parse.trim();
|
||||
base_url = base_url||MY_URL;
|
||||
return defaultParser.pd(html, parse, base_url);
|
||||
},
|
||||
},
|
||||
getParse(p0){//非js开头的情况自动获取解析标签
|
||||
if(p0.startsWith('jsp:')){
|
||||
return this.jsp
|
||||
}else if(p0.startsWith('json:')){
|
||||
return this.json
|
||||
}else if(p0.startsWith('jq:')){
|
||||
return this.jq
|
||||
}else {
|
||||
return this.jq
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const stringify = JSON.stringify;
|
||||
const jsp = parseTags.jsp;
|
||||
const jq = parseTags.jq;
|
||||
|
||||
/*** 后台需要实现的java方法并注入到js中 ***/
|
||||
|
||||
/**
|
||||
* 读取本地文件->应用程序目录
|
||||
* @param filePath
|
||||
* @returns {string}
|
||||
*/
|
||||
function readFile(filePath){
|
||||
filePath = filePath||'./uri.min.js';
|
||||
var fd = os.open(filePath);
|
||||
var buffer = new ArrayBuffer(1024);
|
||||
var len = os.read(fd, buffer, 0, 1024);
|
||||
console.log(len);
|
||||
let text = String.fromCharCode.apply(null, new Uint8Array(buffer));
|
||||
console.log(text);
|
||||
return text
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理返回的json数据
|
||||
* @param html
|
||||
* @returns {*}
|
||||
*/
|
||||
function dealJson(html) {
|
||||
try {
|
||||
// html = html.match(/[\w|\W|\s|\S]*?(\{[\w|\W|\s|\S]*\})/).group[1];
|
||||
html = html.trim();
|
||||
if(!((html.startsWith('{') && html.endsWith('}'))||(html.startsWith('[') && html.endsWith(']')))){
|
||||
html = '{'+html.match(/.*?\{(.*)\}/m)[1]+'}';
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
try {
|
||||
html = JSON.parse(html);
|
||||
}catch (e) {}
|
||||
// console.log(typeof(html));
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证码识别逻辑,需要java实现(js没有bytes类型,无法调用后端的传递图片二进制获取验证码文本的接口)
|
||||
* @type {{api: string, classification: (function(*=): string)}}
|
||||
*/
|
||||
var OcrApi={
|
||||
api:OCR_API,
|
||||
classification:function (img){ // img是byte类型,这里不方便搞啊
|
||||
let code = '';
|
||||
try {
|
||||
// let html = request(this.api,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
|
||||
// html = JSON.parse(html);
|
||||
// code = html.url||'';
|
||||
log('通过drpy_ocr验证码接口过验证...');
|
||||
let html = request(OCR_API,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
|
||||
code = html||'';
|
||||
}catch (e) {
|
||||
log(`OCR识别验证码发生错误:${e.message}`)
|
||||
}
|
||||
return code
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 验证码识别,暂未实现
|
||||
* @param url 验证码图片链接
|
||||
* @returns {string} 验证成功后的cookie
|
||||
*/
|
||||
function verifyCode(url){
|
||||
let cnt = 0;
|
||||
let host = getHome(url);
|
||||
let cookie = '';
|
||||
while (cnt < OCR_RETRY){
|
||||
try{
|
||||
// let obj = {headers:headers,timeout:timeout};
|
||||
let yzm_url = `${host}/index.php/verify/index.html`;
|
||||
console.log(`验证码链接:${yzm_url}`);
|
||||
let hhtml = request(yzm_url,{withHeaders:true,toBase64:true},true);
|
||||
let json = JSON.parse(hhtml);
|
||||
if(!cookie){
|
||||
// print(json);
|
||||
let setCk = Object.keys(json).find(it=>it.toLowerCase()==='set-cookie');
|
||||
// cookie = json['set-cookie']?json['set-cookie'].split(';')[0]:'';
|
||||
cookie = setCk?json[setCk].split(';')[0]:'';
|
||||
}
|
||||
// console.log(hhtml);
|
||||
console.log('cookie:'+cookie);
|
||||
let img = json.body;
|
||||
// console.log(img);
|
||||
let code = OcrApi.classification(img);
|
||||
console.log(`第${cnt+1}次验证码识别结果:${code}`);
|
||||
let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`;
|
||||
console.log(submit_url);
|
||||
let html = request(submit_url,{headers:{Cookie:cookie,'User-Agent':MOBILE_UA},'method':'POST'});
|
||||
// console.log(html);
|
||||
html = JSON.parse(html);
|
||||
if(html.msg === 'ok'){
|
||||
console.log(`第${cnt+1}次验证码提交成功`);
|
||||
return cookie // 需要返回cookie
|
||||
}else if(html.msg!=='ok'&&cnt+1>=OCR_RETRY){
|
||||
cookie = ''; // 需要清空返回cookie
|
||||
}
|
||||
}catch (e) {
|
||||
console.log(`第${cnt+1}次验证码提交失败:${e.message}`);
|
||||
if(cnt+1>=OCR_RETRY){
|
||||
cookie = '';
|
||||
}
|
||||
}
|
||||
cnt+=1
|
||||
}
|
||||
return cookie
|
||||
}
|
||||
|
||||
/**
|
||||
* 存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
*/
|
||||
function setItem(k,v){
|
||||
local.set(RKEY,k,v);
|
||||
console.log(`规则${RKEY}设置${k} => ${v}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库配置表对应的key字段的value,没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
* @returns {*}
|
||||
*/
|
||||
function getItem(k,v){
|
||||
return local.get(RKEY,k) || v;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据库key对应的一条数据,并清除此key对应的内存缓存
|
||||
* @param k
|
||||
*/
|
||||
function clearItem(k){
|
||||
local.delete(RKEY,k);
|
||||
}
|
||||
|
||||
/*** js自封装的方法 ***/
|
||||
|
||||
/**
|
||||
* 获取链接的host(带http协议的完整链接)
|
||||
* @param url 任意一个正常完整的Url,自动提取根
|
||||
* @returns {string}
|
||||
*/
|
||||
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
|
||||
}
|
||||
|
||||
/**
|
||||
* get参数编译链接,类似python params字典自动拼接
|
||||
* @param url 访问链接
|
||||
* @param obj 参数字典
|
||||
* @returns {*}
|
||||
*/
|
||||
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
|
||||
}
|
||||
|
||||
/**
|
||||
* 远程依赖执行函数
|
||||
* @param url 远程js地址
|
||||
*/
|
||||
function require(url){
|
||||
eval(request(url));
|
||||
}
|
||||
/**
|
||||
* 海阔网页请求函数完整封装
|
||||
* @param url 请求链接
|
||||
* @param obj 请求对象 {headers:{},method:'',timeout:5000,body:'',withHeaders:false}
|
||||
* @param ocr_flag 标识此flag是用于请求ocr识别的,自动过滤content-type指定编码
|
||||
* @returns {string|string|DocumentFragment|*}
|
||||
*/
|
||||
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);
|
||||
}
|
||||
if(!fetch_params){
|
||||
fetch_params = {};
|
||||
}
|
||||
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.hasOwnProperty('content-type')){ // 手动指定了就不管
|
||||
obj.headers["Content-Type"] = 'text/html; charset='+rule.encoding;
|
||||
}
|
||||
}
|
||||
if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='string'){
|
||||
// let data = {};
|
||||
// obj.body.split('&').forEach(it=>{
|
||||
// data[it.split('=')[0]] = it.split('=')[1]
|
||||
// });
|
||||
// obj.data = data;
|
||||
// delete obj.body
|
||||
|
||||
// 传body加 "Content-Type":"application/x-www-form-urlencoded;" 即可post form
|
||||
if(!obj.headers.hasOwnProperty('Content-Type')&&!obj.headers.hasOwnProperty('content-type')){ // 手动指定了就不管
|
||||
obj.headers["Content-Type"] = 'application/x-www-form-urlencoded; charset='+rule.encoding;
|
||||
}
|
||||
}else if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='object'){
|
||||
obj.data = obj.body;
|
||||
delete obj.body
|
||||
}
|
||||
if(!url){
|
||||
return obj.withHeaders?'{}':''
|
||||
}
|
||||
if(obj.toBase64){ // 返回base64,用于请求图片
|
||||
obj.buffer = 2;
|
||||
delete obj.toBase64
|
||||
}
|
||||
console.log(JSON.stringify(obj.headers));
|
||||
// console.log('request:'+url+' obj:'+JSON.stringify(obj));
|
||||
console.log('request:'+url+`|method:${obj.method||'GET'}|body:${obj.body||''}`);
|
||||
let res = req(url, obj);
|
||||
let html = res.content||'';
|
||||
// console.log(html);
|
||||
if(obj.withHeaders){
|
||||
let htmlWithHeaders = res.headers;
|
||||
htmlWithHeaders.body = html;
|
||||
return JSON.stringify(htmlWithHeaders);
|
||||
}else{
|
||||
return html
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 快捷post请求
|
||||
* @param url 地址
|
||||
* @param obj 对象
|
||||
* @returns {string|DocumentFragment|*}
|
||||
*/
|
||||
function post(url,obj){
|
||||
obj.method = 'POST';
|
||||
return request(url,obj);
|
||||
}
|
||||
|
||||
fetch = request;
|
||||
print = function (data){
|
||||
data = data||'';
|
||||
if(typeof(data)=='object'&&Object.keys(data).length>0){
|
||||
try {
|
||||
data = JSON.stringify(data);
|
||||
console.log(data);
|
||||
}catch (e) {
|
||||
// console.log('print:'+e.message);
|
||||
console.log(typeof(data)+':'+data.length);
|
||||
return
|
||||
}
|
||||
}else if(typeof(data)=='object'&&Object.keys(data).length<1){
|
||||
console.log('null object');
|
||||
}else{
|
||||
console.log(data);
|
||||
}
|
||||
}
|
||||
log = print;
|
||||
/**
|
||||
* 检查宝塔验证并自动跳过获取正确源码
|
||||
* @param html 之前获取的html
|
||||
* @param url 之前的来源url
|
||||
* @param obj 来源obj
|
||||
* @returns {string|DocumentFragment|*}
|
||||
*/
|
||||
function checkHtml(html,url,obj){
|
||||
if(/\?btwaf=/.test(html)){
|
||||
let btwaf = html.match(/btwaf(.*?)"/)[1];
|
||||
url = url.split('#')[0]+'?btwaf'+btwaf;
|
||||
print('宝塔验证访问链接:'+url);
|
||||
html = request(url,obj);
|
||||
}
|
||||
return html
|
||||
}
|
||||
|
||||
/**
|
||||
* 带一次宝塔验证的源码获取
|
||||
* @param url 请求链接
|
||||
* @param obj 请求参数
|
||||
* @returns {string|DocumentFragment}
|
||||
*/
|
||||
function getCode(url,obj){
|
||||
let html = request(url,obj);
|
||||
html = checkHtml(html,url,obj);
|
||||
return html
|
||||
}
|
||||
|
||||
/**
|
||||
* 源rule专用的请求方法,自动注入cookie
|
||||
* @param url 请求链接
|
||||
* @returns {string|DocumentFragment}
|
||||
*/
|
||||
function getHtml(url){
|
||||
let obj = {};
|
||||
if(rule.headers){
|
||||
obj.headers = rule.headers;
|
||||
}
|
||||
let cookie = getItem(RULE_CK,'');
|
||||
if(cookie){
|
||||
// log('有cookie:'+cookie);
|
||||
if(obj.headers && ! Object.keys(obj.headers).map(it=>it.toLowerCase()).includes('cookie')){
|
||||
log('历史无cookie,新增过验证后的cookie');
|
||||
obj.headers['Cookie'] = cookie;
|
||||
}else if(obj.headers && obj.headers.cookie && obj.headers.cookie!==cookie){
|
||||
obj.headers['Cookie'] = cookie;
|
||||
log('历史有小写过期的cookie,更新过验证后的cookie');
|
||||
}else if(obj.headers && obj.headers.Cookie && obj.headers.Cookie!==cookie){
|
||||
obj.headers['Cookie'] = cookie;
|
||||
log('历史有大写过期的cookie,更新过验证后的cookie');
|
||||
}else if(!obj.headers){
|
||||
obj.headers = {Cookie:cookie};
|
||||
log('历史无headers,更新过验证后的含cookie的headers');
|
||||
}
|
||||
}
|
||||
let html = getCode(url,obj);
|
||||
return html
|
||||
}
|
||||
|
||||
/**
|
||||
* 首页分类解析,筛选暂未实现
|
||||
* @param homeObj 首页传参对象
|
||||
* @returns {string}
|
||||
*/
|
||||
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 < cnt; i++) {
|
||||
classes.push({
|
||||
'type_id': urls[i],
|
||||
'type_name': names[i]
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (homeObj.class_parse) {
|
||||
let p = homeObj.class_parse.split(';');
|
||||
let _ps = parseTags.getParse(p[0]);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
MY_URL = rule.url;
|
||||
if (p.length >= 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 = pdfh(it, p[2]);
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 推荐和搜索单字段继承一级
|
||||
* @param p 推荐或搜索的解析分割;列表
|
||||
* @param pn 自身列表序号
|
||||
* @param pp 一级解析分割;列表
|
||||
* @param ppn 继承一级序号
|
||||
* @returns {*}
|
||||
*/
|
||||
function getPP(p, pn, pp, ppn){
|
||||
try {
|
||||
let ps = p[pn] === '*' && pp.length > ppn ?pp[ppn]:p[pn]
|
||||
return ps
|
||||
}catch (e) {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 首页推荐列表解析
|
||||
* @param homeVodObj
|
||||
* @returns {string}
|
||||
*/
|
||||
function homeVodParse(homeVodObj){
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let d = [];
|
||||
MY_URL = homeVodObj.homeUrl;
|
||||
// setItem('MY_URL',MY_URL);
|
||||
console.log(MY_URL);
|
||||
let t1 = (new Date()).getTime();
|
||||
let p = homeVodObj.推荐;
|
||||
print('p:'+p);
|
||||
if(p==='*' && rule.一级){
|
||||
p = rule.一级;
|
||||
homeVodObj.double = false;
|
||||
}
|
||||
if(!p||typeof(p)!=='string'){
|
||||
return '{}'
|
||||
}
|
||||
p = p.trim();
|
||||
let pp = rule.一级.split(';');
|
||||
if(p.startsWith('js:')){
|
||||
const TYPE = 'home';
|
||||
var input = MY_URL;
|
||||
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 p0 = getPP(p,0,pp,0)
|
||||
let _ps = parseTags.getParse(p0);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
let is_json = p0.startsWith('json:');
|
||||
p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
|
||||
// print(p[0]);
|
||||
let html = homeHtmlCache || getHtml(MY_URL);
|
||||
homeHtmlCache = undefined;
|
||||
if(is_json){
|
||||
// print('是json,开始处理');
|
||||
html = dealJson(html);
|
||||
}
|
||||
try {
|
||||
console.log('double:' + homeVodObj.double);
|
||||
if (homeVodObj.double) {
|
||||
let items = _pdfa(html, p0);
|
||||
// console.log(items.length);
|
||||
let p1 = getPP(p,1,pp,0);
|
||||
let p2 = getPP(p,2,pp,1);
|
||||
let p3 = getPP(p,3,pp,2);
|
||||
let p4 = getPP(p,4,pp,3);
|
||||
let p5 = getPP(p,5,pp,4);
|
||||
let p6 = getPP(p,6,pp,5);
|
||||
for (let item of items) {
|
||||
// console.log(p[1]);
|
||||
let items2 = _pdfa(item, p1);
|
||||
// console.log(items2.length);
|
||||
for (let item2 of items2) {
|
||||
try {
|
||||
let title = _pdfh(item2, p2);
|
||||
let img = '';
|
||||
try {
|
||||
img = _pd(item2, p3);
|
||||
} catch (e) {}
|
||||
let desc = '';
|
||||
try {
|
||||
desc = _pdfh(item2, p4);
|
||||
}catch (e) {}
|
||||
let links = [];
|
||||
for (let _p5 of p5.split('+')) {
|
||||
let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5);
|
||||
links.push(link);
|
||||
}
|
||||
let content;
|
||||
if(p.length > 6 && p[6]){
|
||||
content = _pdfh(item2, p6);
|
||||
} else{
|
||||
content = '';
|
||||
}
|
||||
let vid = links.join('$');
|
||||
if(rule.二级==='*'){
|
||||
vid = vid+'@@'+title+'@@'+img;
|
||||
}
|
||||
let vod = {
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: desc,
|
||||
vod_content: content,
|
||||
vod_id: vid
|
||||
};
|
||||
// print(vod);
|
||||
d.push(vod);
|
||||
} catch (e) {
|
||||
console.log('首页列表双层定位处理发生错误:'+e.message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
let items = _pdfa(html, p0);
|
||||
let p1 = getPP(p,1,pp,1);
|
||||
let p2 = getPP(p,2,pp,2);
|
||||
let p3 = getPP(p,3,pp,3);
|
||||
let p4 = getPP(p,4,pp,4);
|
||||
let p5 = getPP(p,5,pp,5);
|
||||
|
||||
for (let item of items) {
|
||||
try {
|
||||
let title = _pdfh(item, p1);
|
||||
let img = '';
|
||||
try {
|
||||
img = _pd(item, p2, MY_URL);
|
||||
} catch (e) {}
|
||||
let desc = '';
|
||||
try {
|
||||
desc = _pdfh(item, p3);
|
||||
}catch (e) {}
|
||||
let links = [];
|
||||
for (let _p5 of p4.split('+')) {
|
||||
let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5);
|
||||
links.push(link);
|
||||
}
|
||||
let content;
|
||||
if(p.length > 5 && p[5]){
|
||||
content = _pdfh(item, p5);
|
||||
}else{
|
||||
content = ''
|
||||
}
|
||||
let vid = links.join('$');
|
||||
if(rule.二级==='*'){
|
||||
vid = vid+'@@'+title+'@@'+img;
|
||||
}
|
||||
let vod = {
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: desc,
|
||||
vod_content: content,
|
||||
vod_id: vid
|
||||
};
|
||||
d.push(vod);
|
||||
|
||||
} catch (e) {
|
||||
console.log('首页列表单层定位处理发生错误:'+e.message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
let t2 = (new Date()).getTime();
|
||||
console.log('加载首页推荐耗时:'+(t2-t1)+'毫秒');
|
||||
// console.log(JSON.stringify(d));
|
||||
if(rule.图片来源){
|
||||
d.forEach(it=>{
|
||||
if(it.vod_pic&&it.vod_pic.startsWith('http')){
|
||||
it.vod_pic = it.vod_pic + rule.图片来源;
|
||||
}
|
||||
});
|
||||
}
|
||||
if(d.length>0){
|
||||
print(d.slice(0,2));
|
||||
}
|
||||
return JSON.stringify({
|
||||
list:d
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 一级分类页数据解析
|
||||
* @param cateObj
|
||||
* @returns {string}
|
||||
*/
|
||||
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).replaceAll('fypage', cateObj.pg);
|
||||
let url = cateObj.url.replaceAll('fyclass', cateObj.tid);
|
||||
if(cateObj.pg === 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[1].split(']')[0];
|
||||
}else if(cateObj.pg > 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[0];
|
||||
}
|
||||
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);
|
||||
}
|
||||
// console.log('filter:'+cateObj.filter);
|
||||
let fl = cateObj.filter?cateObj.extend:{};
|
||||
// 自动合并 不同分类对应的默认筛选
|
||||
if(rule.filter_def && typeof(rule.filter_def)==='object'){
|
||||
try {
|
||||
if(Object.keys(rule.filter_def).length>0 && rule.filter_def.hasOwnProperty(cateObj.tid)){
|
||||
let self_fl_def = rule.filter_def[cateObj.tid];
|
||||
if(self_fl_def && typeof(self_fl_def)==='object'){
|
||||
// 引用传递转值传递,避免污染self变量
|
||||
let fl_def = JSON.parse(JSON.stringify(self_fl_def));
|
||||
fl = Object.assign(fl_def,fl);
|
||||
}
|
||||
}
|
||||
}catch (e) {
|
||||
print('合并不同分类对应的默认筛选出错:'+e.message);
|
||||
}
|
||||
}
|
||||
let new_url;
|
||||
new_url = cheerio.jinja2(url,{fl:fl});
|
||||
// console.log('jinjia2执行后的new_url类型为:'+typeof(new_url));
|
||||
url = new_url;
|
||||
}
|
||||
if(/fypage/.test(url)){
|
||||
if(url.includes('(')&&url.includes(')')){
|
||||
let url_rep = url.match(/.*?\((.*)\)/)[1];
|
||||
// console.log(url_rep);
|
||||
let cnt_page = url_rep.replaceAll('fypage', cateObj.pg);
|
||||
// console.log(cnt_page);
|
||||
let cnt_pg = eval(cnt_page);
|
||||
// console.log(cnt_pg);
|
||||
url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
|
||||
}else{
|
||||
url = url.replaceAll('fypage',cateObj.pg);
|
||||
}
|
||||
}
|
||||
|
||||
MY_URL = url;
|
||||
// setItem('MY_URL',MY_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;
|
||||
|
||||
let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g,'').trim();
|
||||
let vod_pic = _pd(it, p[2],MY_URL);
|
||||
|
||||
if(rule.二级==='*'){
|
||||
vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
|
||||
}
|
||||
d.push({
|
||||
'vod_id': vod_id,
|
||||
'vod_name': vod_name,
|
||||
'vod_pic': vod_pic,
|
||||
'vod_remarks': _pdfh(it, p[3]).replace(/\n|\t/g,'').trim(),
|
||||
});
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e.message);
|
||||
}
|
||||
}
|
||||
if(rule.图片来源){
|
||||
d.forEach(it=>{
|
||||
if(it.vod_pic&&it.vod_pic.startsWith('http')){
|
||||
it.vod_pic = it.vod_pic + rule.图片来源;
|
||||
}
|
||||
});
|
||||
}
|
||||
// print(d);
|
||||
if(d.length>0){
|
||||
print(d.slice(0,2));
|
||||
}
|
||||
let pagecount = 0;
|
||||
if(rule.pagecount && typeof(rule.pagecount) === 'object' && rule.pagecount.hasOwnProperty(MY_CATE)){
|
||||
print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);
|
||||
pagecount = parseInt(rule.pagecount[MY_CATE]);
|
||||
}
|
||||
let nodata = {
|
||||
list:[{vod_name:'无数据,防无限请求',vod_id:'no_data',vod_remarks:'不要点,会崩的',vod_pic:'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg'}],
|
||||
total:1,pagecount:1,page:1,limit:1
|
||||
};
|
||||
let vod = d.length<1?JSON.stringify(nodata):JSON.stringify({
|
||||
'page': parseInt(cateObj.pg),
|
||||
'pagecount': pagecount||999,
|
||||
'limit': 20,
|
||||
'total': 999,
|
||||
'list': d,
|
||||
});
|
||||
// print(vod);
|
||||
return vod
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索列表数据解析
|
||||
* @param searchObj
|
||||
* @returns {string}
|
||||
*/
|
||||
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 pp = rule.一级.split(';');
|
||||
let url = searchObj.searchUrl.replaceAll('**', searchObj.wd);
|
||||
if(searchObj.pg === 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[1].split(']')[0];
|
||||
}else if(searchObj.pg > 1 && url.includes('[')&&url.includes(']')){
|
||||
url = url.split('[')[0];
|
||||
}
|
||||
|
||||
if(/fypage/.test(url)){
|
||||
if(url.includes('(')&&url.includes(')')){
|
||||
let url_rep = url.match(/.*?\((.*)\)/)[1];
|
||||
// console.log(url_rep);
|
||||
let cnt_page = url_rep.replaceAll('fypage', searchObj.pg);
|
||||
// console.log(cnt_page);
|
||||
let cnt_pg = eval(cnt_page);
|
||||
// console.log(cnt_pg);
|
||||
url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
|
||||
}else{
|
||||
url = url.replaceAll('fypage',searchObj.pg);
|
||||
}
|
||||
}
|
||||
|
||||
MY_URL = url;
|
||||
console.log(MY_URL);
|
||||
// log(searchObj.搜索);
|
||||
// setItem('MY_URL',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 p0 = getPP(p,0,pp,0);
|
||||
let _ps = parseTags.getParse(p0);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
let is_json = p0.startsWith('json:');
|
||||
p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
|
||||
// print('1381 p0:'+p0);
|
||||
try {
|
||||
let req_method = MY_URL.split(';').length>1?MY_URL.split(';')[1].toLowerCase():'get';
|
||||
let html;
|
||||
if(req_method==='post'){
|
||||
let rurls = MY_URL.split(';')[0].split('#')
|
||||
let rurl = rurls[0]
|
||||
let params = rurls.length > 1 ?rurls[1]:'';
|
||||
print(`post=》rurl:${rurl},params:${params}`);
|
||||
// let new_dict = {};
|
||||
// let new_tmp = params.split('&');
|
||||
// new_tmp.forEach(i=>{
|
||||
// new_dict[i.split('=')[0]] = i.split('=')[1];
|
||||
// });
|
||||
// html = post(rurl,{body:new_dict});
|
||||
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let postData = {body:params};
|
||||
Object.assign(_fetch_params,postData);
|
||||
html = post(rurl,_fetch_params);
|
||||
}else if(req_method==='postjson'){
|
||||
let rurls = MY_URL.split(';')[0].split('#')
|
||||
let rurl = rurls[0]
|
||||
let params = rurls.length > 1 ?rurls[1]:'';
|
||||
print(`postjson-》rurl:${rurl},params:${params}`);
|
||||
try{
|
||||
params = JSON.parse(params);
|
||||
}catch (e) {
|
||||
params = '{}'
|
||||
}
|
||||
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let postData = {body:params};
|
||||
Object.assign(_fetch_params,postData);
|
||||
html = post(rurl,_fetch_params);
|
||||
}else{
|
||||
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}`);
|
||||
}
|
||||
// obj.headers['Cookie'] = cookie;
|
||||
html = getHtml(MY_URL);
|
||||
}
|
||||
if(!html.includes(searchObj.wd)){
|
||||
console.log('搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码');
|
||||
console.log(html);
|
||||
}
|
||||
if(is_json){
|
||||
// console.log(html);
|
||||
html = dealJson(html);
|
||||
// console.log(JSON.stringify(html));
|
||||
}
|
||||
// console.log(html);
|
||||
let list = _pdfa(html, p0);
|
||||
// print(list.length);
|
||||
// print(list);
|
||||
let p1 = getPP(p, 1, pp, 1);
|
||||
let p2 = getPP(p, 2, pp, 2);
|
||||
let p3 = getPP(p, 3, pp, 3);
|
||||
let p4 = getPP(p, 4, pp, 4);
|
||||
let p5 = getPP(p,5,pp,5);
|
||||
list.forEach(it => {
|
||||
let links = p4.split('+').map(_p4=>{
|
||||
return !rule.detailUrl?_pd(it, _p4,MY_URL):_pdfh(it, _p4)
|
||||
});
|
||||
let link = links.join('$');
|
||||
let content;
|
||||
if(p.length > 5 && p[5]){
|
||||
content = _pdfh(it, p5);
|
||||
}else{
|
||||
content = '';
|
||||
}
|
||||
let vod_id = link;
|
||||
let vod_name = _pdfh(it, p1).replace(/\n|\t/g,'').trim();
|
||||
let vod_pic = _pd(it, p2,MY_URL);
|
||||
if(rule.二级==='*'){
|
||||
vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
|
||||
}
|
||||
let ob = {
|
||||
'vod_id': vod_id,
|
||||
'vod_name': vod_name,
|
||||
'vod_pic': vod_pic,
|
||||
'vod_remarks': _pdfh(it, p3).replace(/\n|\t/g,'').trim(),
|
||||
'vod_content': content.replace(/\n|\t/g,'').trim(),
|
||||
};
|
||||
d.push(ob);
|
||||
});
|
||||
|
||||
}
|
||||
} catch (e) {
|
||||
print('搜索发生错误:'+e.message);
|
||||
return '{}'
|
||||
}
|
||||
}
|
||||
if(rule.图片来源){
|
||||
d.forEach(it=>{
|
||||
if(it.vod_pic&&it.vod_pic.startsWith('http')){
|
||||
it.vod_pic = it.vod_pic + rule.图片来源;
|
||||
}
|
||||
});
|
||||
}
|
||||
// print(d);
|
||||
return JSON.stringify({
|
||||
'page': parseInt(searchObj.pg),
|
||||
'pagecount': 10,
|
||||
'limit': 20,
|
||||
'total': 100,
|
||||
'list': d,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 二级详情页数据解析
|
||||
* @param detailObj
|
||||
* @returns {string}
|
||||
*/
|
||||
function detailParse(detailObj){
|
||||
let t1 = (new Date()).getTime();
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let orId = detailObj.orId;
|
||||
let vod_name = '片名';
|
||||
let vod_pic = '';
|
||||
let vod_id = orId;
|
||||
if(rule.二级==='*'){
|
||||
// vod_id = orId.split('@@')[0]; // 千万不能分割
|
||||
let extra = orId.split('@@');
|
||||
vod_name = extra.length>1?extra[1]:vod_name;
|
||||
vod_pic = extra.length>2?extra[2]:vod_pic;
|
||||
}
|
||||
// print(vod_pic);
|
||||
let vod = {
|
||||
vod_id: vod_id, //"id",
|
||||
vod_name: vod_name,
|
||||
vod_pic: 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;
|
||||
if(detailObj.二级访问前){
|
||||
try {
|
||||
print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);
|
||||
eval(detailObj.二级访问前.trim().replace('js:',''));
|
||||
}catch (e) {
|
||||
print(`二级访问前执行代码出现错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
// console.log(MY_URL);
|
||||
// setItem('MY_URL',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.split('@@')[0];
|
||||
}else if(typeof(p)==='string'&&p.trim().startsWith('js:')){
|
||||
const TYPE = 'detail';
|
||||
var input = MY_URL;
|
||||
var play_url = '';
|
||||
eval(p.trim().replace('js:',''));
|
||||
vod = VOD;
|
||||
console.log(JSON.stringify(vod));
|
||||
}else if(p&&typeof(p)==='object'){
|
||||
let tt1 = (new Date()).getTime();
|
||||
if(!html){
|
||||
html = getHtml(MY_URL);
|
||||
}
|
||||
print(`二级${MY_URL}仅获取源码耗时:${(new Date()).getTime()-tt1}毫秒`);
|
||||
let _ps;
|
||||
if(p.is_json){
|
||||
print('二级是json');
|
||||
_ps = parseTags.json;
|
||||
html = dealJson(html);
|
||||
}else if(p.is_jsp){
|
||||
print('二级是jsp');
|
||||
_ps = parseTags.jsp;
|
||||
}else if(p.is_jq){
|
||||
print('二级是jq');
|
||||
_ps = parseTags.jq;
|
||||
}else{
|
||||
print('二级默认jq');
|
||||
_ps = parseTags.jq;
|
||||
// print('二级默认jsp');
|
||||
// _ps = parseTags.jsp;
|
||||
}
|
||||
let tt2 = (new Date()).getTime();
|
||||
print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);
|
||||
_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]).replaceAll('\n', ' ').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:',''));
|
||||
}
|
||||
|
||||
// console.log(2);
|
||||
if(p.tabs){
|
||||
if(p.tabs.startsWith('js:')){
|
||||
print('开始执行tabs代码:'+p.tabs);
|
||||
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);
|
||||
let tab_text = p.tab_text||'body&&Text';
|
||||
// print('tab_text:'+tab_text);
|
||||
let new_map = {};
|
||||
for(let v of vHeader){
|
||||
let v_title = _pdfh(v,tab_text).trim();
|
||||
console.log(v_title);
|
||||
if(tab_exclude&& (new RegExp(tab_exclude)).test(v_title)){
|
||||
continue;
|
||||
}
|
||||
if(!new_map.hasOwnProperty(v_title)){
|
||||
new_map[v_title] = 1;
|
||||
}else{
|
||||
new_map[v_title] += 1;
|
||||
}
|
||||
if(new_map[v_title]>1){
|
||||
v_title+=Number(new_map[v_title]-1);
|
||||
}
|
||||
playFrom.push(v_title);
|
||||
}
|
||||
}
|
||||
console.log(JSON.stringify(playFrom));
|
||||
}else{
|
||||
playFrom = ['道长在线']
|
||||
}
|
||||
vod.vod_play_from = playFrom.join(vod_play_from);
|
||||
|
||||
// console.log(3);
|
||||
let vod_play_url = '$$$';
|
||||
let vod_tab_list = [];
|
||||
if(p.lists){
|
||||
if(p.lists.startsWith('js:')){
|
||||
print('开始执行lists代码:'+p.lists);
|
||||
try {
|
||||
var input = MY_URL;
|
||||
var play_url = '';
|
||||
eval(p.lists.replace('js:',''));
|
||||
for(let i in LISTS){
|
||||
if(LISTS.hasOwnProperty(i)){
|
||||
// print(i);
|
||||
try {
|
||||
LISTS[i] = LISTS[i].map(it=>it.split('$').slice(0,2).join('$'));
|
||||
}catch (e) {
|
||||
print('格式化LISTS发生错误:'+e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
vod_play_url = LISTS.map(it=>it.join('#')).join(vod_play_url);
|
||||
}catch (e) {
|
||||
print('js执行lists: 发生错误:'+e.message);
|
||||
}
|
||||
|
||||
}else{
|
||||
let list_text = p.list_text||'body&&Text';
|
||||
let list_url = p.list_url||'a&&href';
|
||||
// print('list_text:'+list_text);
|
||||
// print('list_url:'+list_url);
|
||||
// print('list_parse:'+p.lists);
|
||||
let is_tab_js = p.tabs.trim().startsWith('js:');
|
||||
for(let i=0;i<playFrom.length;i++){
|
||||
let tab_name = playFrom[i];
|
||||
let tab_ext = p.tabs.split(';').length > 1 && !is_tab_js ? 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);
|
||||
let tabName = tab_ext?_pdfh(html, tab_ext):tab_name;
|
||||
console.log(tabName);
|
||||
// print('tab_ext:'+tab_ext);
|
||||
let new_vod_list = [];
|
||||
let tt1 = (new Date()).getTime();
|
||||
// print('pdfl:'+typeof (pdfl));
|
||||
if(typeof (pdfl) ==='function'){
|
||||
new_vod_list = pdfl(html, p1, list_text, list_url, MY_URL);
|
||||
}else {
|
||||
let vodList = [];
|
||||
try {
|
||||
vodList = _pdfa(html, p1);
|
||||
console.log('len(vodList):'+vodList.length);
|
||||
}catch (e) {
|
||||
// console.log(e.message);
|
||||
}
|
||||
for (let i = 0; i < vodList.length; i++) {
|
||||
let it = vodList[i];
|
||||
new_vod_list.push(_pdfh(it, list_text).trim() + '$' + _pd(it, list_url, MY_URL));
|
||||
}
|
||||
}
|
||||
if(new_vod_list.length>0){
|
||||
new_vod_list = forceOrder(new_vod_list,'',x=>x.split('$')[0]);
|
||||
console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date()).getTime()-tt1}毫秒`);
|
||||
}
|
||||
// print(new_vod_list);
|
||||
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;
|
||||
}
|
||||
if(rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith('http')){
|
||||
vod.vod_pic = vod.vod_pic + rule.图片来源;
|
||||
}
|
||||
if(!vod.vod_id||(vod_id.includes('$')&&vod.vod_id!==vod_id)){
|
||||
vod.vod_id = vod_id;
|
||||
}
|
||||
let t2 = (new Date()).getTime();
|
||||
console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);
|
||||
// print(vod);
|
||||
vod = vodDeal(vod);
|
||||
// print(vod);
|
||||
return JSON.stringify({
|
||||
list: [vod]
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取二级待返回的播放线路没处理时的索引关系
|
||||
* @param vod
|
||||
* @returns {{}}
|
||||
*/
|
||||
function get_tab_index(vod){
|
||||
let obj = {};
|
||||
vod.vod_play_from.split('$$$').forEach((it,index)=>{
|
||||
obj[it] = index;
|
||||
});
|
||||
return obj
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理待返回的vod数据|线路去除,排序,重命名
|
||||
* @param vod
|
||||
* @returns {*}
|
||||
*/
|
||||
function vodDeal(vod){
|
||||
let vod_play_from = vod.vod_play_from.split('$$$');
|
||||
let vod_play_url = vod.vod_play_url.split('$$$');
|
||||
|
||||
// 移除指定线路后的列表
|
||||
let tab_removed_list = vod_play_from;
|
||||
// 排序后的线路列表
|
||||
let tab_ordered_list = vod_play_from;
|
||||
// 线路重命名后的列表
|
||||
let tab_renamed_list = vod_play_from;
|
||||
// 定义实际要返回线路
|
||||
let tab_list = vod_play_from;
|
||||
// 选集列表根据线路排序
|
||||
let play_ordered_list = vod_play_url;
|
||||
|
||||
// 判断有移除线路或者线路排序
|
||||
if((rule.tab_remove&&rule.tab_remove.length>0)||(rule.tab_order&&rule.tab_order.length>0)){
|
||||
// 获取原来线路的索引下标
|
||||
let tab_index_dict = get_tab_index(vod);
|
||||
|
||||
if(rule.tab_remove&&rule.tab_remove.length>0){
|
||||
tab_removed_list = vod_play_from.filter(it=>!rule.tab_remove.includes(it));
|
||||
tab_list = tab_removed_list;
|
||||
}
|
||||
|
||||
if(rule.tab_order&&rule.tab_order.length>0){
|
||||
let tab_order = rule.tab_order;
|
||||
tab_ordered_list = tab_removed_list.sort((a, b) => {
|
||||
return (tab_order.indexOf(a)===-1?9999:tab_order.indexOf(a)) - (tab_order.indexOf(b)===-1?9999:tab_order.indexOf(b))
|
||||
});
|
||||
tab_list = tab_ordered_list;
|
||||
}
|
||||
play_ordered_list = tab_list.map(it=>vod_play_url[tab_index_dict[it]]);
|
||||
}
|
||||
|
||||
if(rule.tab_rename&&typeof(rule.tab_rename)==='object'&Object.keys(rule.tab_rename).length>0){
|
||||
tab_renamed_list = tab_list.map(it=>rule.tab_rename[it]||it);
|
||||
tab_list = tab_renamed_list;
|
||||
}
|
||||
vod.vod_play_from = tab_list.join('$$$');
|
||||
vod.vod_play_url = play_ordered_list.join('$$$');
|
||||
return vod
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否需要解析
|
||||
* @param url
|
||||
* @returns {number|number}
|
||||
*/
|
||||
function tellIsJx(url){
|
||||
try {
|
||||
let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split('?')[0]) && 是否正版(url);
|
||||
return is_vip?1:0
|
||||
}catch (e) {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 选集播放点击事件解析
|
||||
* @param playObj
|
||||
* @returns {string}
|
||||
*/
|
||||
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;//注入给免嗅js
|
||||
let common_play = {
|
||||
parse:1,
|
||||
url:input,
|
||||
// url:urlencode(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;
|
||||
}
|
||||
// print('play_json:'+typeof(rule.play_json));
|
||||
// console.log(Array.isArray(rule.play_json));
|
||||
if(Array.isArray(rule.play_json) && rule.play_json.length >0){ // 数组情况判断长度大于0
|
||||
let web_url = lazy_play.url;
|
||||
for(let pjson of rule.play_json){
|
||||
if(pjson.re && (pjson.re==='*'||web_url.match(new RegExp(pjson.re)))){
|
||||
if(pjson.json && typeof(pjson.json)==='object'){
|
||||
let base_json = pjson.json;
|
||||
// print('开始合并:');
|
||||
// print(base_json);
|
||||
lazy_play = Object.assign(lazy_play,base_json);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}else if(rule.play_json && !Array.isArray(rule.play_json)){ // 其他情况 非[] 判断true/false
|
||||
let base_json = {
|
||||
jx:1,
|
||||
parse:1,
|
||||
};
|
||||
lazy_play = Object.assign(lazy_play,base_json);
|
||||
}else if(!rule.play_json){ // 不解析传0
|
||||
let base_json = {
|
||||
jx:0,
|
||||
parse:1,
|
||||
};
|
||||
lazy_play = Object.assign(lazy_play,base_json);
|
||||
}
|
||||
console.log(JSON.stringify(lazy_play));
|
||||
return JSON.stringify(lazy_play);
|
||||
}
|
||||
|
||||
/**
|
||||
* 本地代理解析规则
|
||||
* @param params
|
||||
*/
|
||||
function proxyParse(proxyObj){
|
||||
var input = proxyObj.params;
|
||||
if(proxyObj.proxy_rule){
|
||||
log('准备执行本地代理规则:\n'+proxyObj.proxy_rule);
|
||||
try {
|
||||
eval(proxyObj.proxy_rule);
|
||||
if(input && input!== proxyObj.params && Array.isArray(input) &&input.length===3){
|
||||
return input
|
||||
}else{
|
||||
return [404,'text/plain','Not Found']
|
||||
}
|
||||
}catch (e) {
|
||||
return [500,'text/plain','代理规则错误:'+e.message]
|
||||
}
|
||||
|
||||
}else{
|
||||
return [404,'text/plain','Not Found']
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 辅助嗅探解析规则
|
||||
* @param isVideoObj
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isVideoParse(isVideoObj){
|
||||
var input = isVideoObj.url;
|
||||
if(!isVideoObj.t){ // t为假代表默认传的正则字符串
|
||||
let re_matcher = new RegExp(isVideoObj.isVideo,'i'); // /g匹配多个,/i不区分大小写,/m匹配多行
|
||||
return re_matcher.test(input);
|
||||
}else{
|
||||
// 执行js
|
||||
try {
|
||||
eval(isVideoObj.isVideo);
|
||||
if(typeof(input)==='boolean'){
|
||||
return input
|
||||
}else{
|
||||
return false
|
||||
}
|
||||
}catch (e) {
|
||||
log('执行嗅探规则发生错误:'+e.message);
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* js源预处理特定返回对象中的函数
|
||||
* @param ext
|
||||
*/
|
||||
function init(ext) {
|
||||
console.log('init');
|
||||
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);
|
||||
if (typeof ext == 'object'){
|
||||
rule = ext;
|
||||
} 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'));
|
||||
}
|
||||
}
|
||||
if (rule.模板 && muban.hasOwnProperty(rule.模板)) {
|
||||
print('继承模板:'+rule.模板);
|
||||
rule = Object.assign(muban[rule.模板], 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('/');
|
||||
HOST = rule.host;
|
||||
if(rule.hostJs){
|
||||
console.log(`检测到hostJs,准备执行...`);
|
||||
try {
|
||||
eval(rule.hostJs);
|
||||
rule.host = HOST.rstrip('/');
|
||||
}catch (e) {
|
||||
console.log(`执行${rule.hostJs}获取host发生错误:`+e.message);
|
||||
}
|
||||
}
|
||||
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;
|
||||
rule.二级访问前 = rule.二级访问前||'';
|
||||
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;
|
||||
}
|
||||
if(rule.searchUrl.includes('[')&&rule.searchUrl.includes(']')){
|
||||
let u1 = rule.searchUrl.split('[')[0]
|
||||
let u2 = rule.searchUrl.split('[')[1].split(']')[0]
|
||||
rule.searchUrl = rule.host && rule.searchUrl?urljoin(rule.host,u1)+'['+urljoin(rule.host,u2)+']':rule.searchUrl;
|
||||
}else{
|
||||
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host,rule.searchUrl) : rule.searchUrl;
|
||||
}
|
||||
|
||||
rule.timeout = rule.timeout||5000;
|
||||
rule.encoding = rule.编码||rule.encoding||'utf-8';
|
||||
rule.search_encoding = rule.搜索编码||rule.search_encoding||'';
|
||||
rule.图片来源 = rule.图片来源||'';
|
||||
rule.play_json = rule.hasOwnProperty('play_json')?rule.play_json:[];
|
||||
rule.pagecount = rule.hasOwnProperty('pagecount')?rule.pagecount:{};
|
||||
rule.proxy_rule = rule.hasOwnProperty('proxy_rule')?rule.proxy_rule:'';
|
||||
rule.sniffer = rule.hasOwnProperty('sniffer')?rule.sniffer:'';
|
||||
rule.sniffer = !!(rule.sniffer && rule.sniffer!=='0' && rule.sniffer!=='false');
|
||||
|
||||
rule.isVideo = rule.hasOwnProperty('isVideo')?rule.isVideo:'';
|
||||
|
||||
rule.tab_remove = rule.hasOwnProperty('tab_remove')?rule.tab_remove:[];
|
||||
rule.tab_order = rule.hasOwnProperty('tab_order')?rule.tab_order:[];
|
||||
rule.tab_rename = rule.hasOwnProperty('tab_rename')?rule.tab_rename:{};
|
||||
|
||||
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);
|
||||
}
|
||||
}else if(k.toLowerCase() === 'cookie'){
|
||||
let v = rule.headers[k];
|
||||
if(v && v.startsWith('http')){
|
||||
console.log(v);
|
||||
try {
|
||||
v = fetch(v);
|
||||
console.log(v);
|
||||
rule.headers[k] = v;
|
||||
}catch (e) {
|
||||
console.log(`从${v}获取cookie发生错误:`+e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch (e) {
|
||||
console.log('处理headers发生错误:'+e.message);
|
||||
}
|
||||
}
|
||||
// print(rule.headers);
|
||||
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);
|
||||
pre(); // 预处理
|
||||
init_test();
|
||||
}catch (e) {
|
||||
console.log('init_test发生错误:'+e.message);
|
||||
}
|
||||
}
|
||||
|
||||
let homeHtmlCache = undefined;
|
||||
|
||||
/**
|
||||
* js源获取首页分类和筛选特定返回对象中的函数
|
||||
* @param filter 筛选条件字典对象
|
||||
* @returns {string}
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* js源获取首页推荐数据列表特定返回对象中的函数
|
||||
* @param params
|
||||
* @returns {string}
|
||||
*/
|
||||
function homeVod(params) {
|
||||
console.log("homeVod");
|
||||
let homeVodObj = {
|
||||
推荐:rule.推荐,
|
||||
double:rule.double,
|
||||
homeUrl:rule.homeUrl,
|
||||
detailUrl:rule.detailUrl
|
||||
};
|
||||
return homeVodParse(homeVodObj)
|
||||
// return "{}";
|
||||
}
|
||||
|
||||
/**
|
||||
* js源获取分类页一级数据列表特定返回对象中的函数
|
||||
* @param tid 分类id
|
||||
* @param pg 页数
|
||||
* @param filter 当前选中的筛选条件
|
||||
* @param extend 扩展
|
||||
* @returns {string}
|
||||
*/
|
||||
function category(tid, pg, filter, extend) {
|
||||
let cateObj = {
|
||||
url: rule.url,
|
||||
一级: rule.一级,
|
||||
tid: tid,
|
||||
pg: parseInt(pg),
|
||||
filter: filter,
|
||||
extend: extend
|
||||
};
|
||||
// console.log(JSON.stringify(extend));
|
||||
return categoryParse(cateObj)
|
||||
}
|
||||
|
||||
/**
|
||||
* js源获取二级详情页数据特定返回对象中的函数
|
||||
* @param vod_url 一级列表中的vod_id或者是带分类的自拼接 vod_id 如 fyclass$vod_id
|
||||
* @returns {string}
|
||||
*/
|
||||
function detail(vod_url) {
|
||||
let orId = vod_url;
|
||||
let fyclass = '';
|
||||
log('orId:'+orId);
|
||||
if(vod_url.indexOf('$')>-1){
|
||||
let tmp = vod_url.split('$');
|
||||
fyclass = tmp[0];
|
||||
vod_url = tmp[1];
|
||||
}
|
||||
let detailUrl = vod_url.split('@@')[0];
|
||||
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.二级,
|
||||
二级访问前:rule.二级访问前,
|
||||
detailUrl:detailUrl,
|
||||
fyclass:fyclass,
|
||||
tab_exclude:rule.tab_exclude,
|
||||
}
|
||||
return detailParse(detailObj)
|
||||
}
|
||||
|
||||
/**
|
||||
* js源选集按钮播放点击事件特定返回对象中的函数
|
||||
* @param flag 线路名
|
||||
* @param id 播放按钮的链接
|
||||
* @param flags 全局配置的flags是否需要解析的标识列表
|
||||
* @returns {string}
|
||||
*/
|
||||
function play(flag, id, flags) {
|
||||
let playObj = {
|
||||
url:id,
|
||||
flag:flag,
|
||||
flags:flags
|
||||
}
|
||||
return playParse(playObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* js源搜索返回的数据列表特定返回对象中的函数
|
||||
* @param wd 搜索关键字
|
||||
* @param quick 是否来自快速搜索
|
||||
* @returns {string}
|
||||
*/
|
||||
function search(wd, quick, pg) {
|
||||
if(rule.search_encoding){
|
||||
if(rule.search_encoding.toLowerCase()!=='utf-8'){
|
||||
// 按搜索编码进行编码
|
||||
wd = encodeStr(wd,rule.search_encoding);
|
||||
}
|
||||
}else if(rule.encoding && rule.encoding.toLowerCase()!=='utf-8'){
|
||||
// 按全局编码进行编码
|
||||
wd = encodeStr(wd,rule.encoding);
|
||||
}
|
||||
let searchObj = {
|
||||
searchUrl: rule.searchUrl,
|
||||
搜索: rule.搜索,
|
||||
wd: wd,
|
||||
//pg: pg,
|
||||
pg: pg||1,
|
||||
quick: quick,
|
||||
};
|
||||
// console.log(JSON.stringify(searchObj));
|
||||
return searchParse(searchObj)
|
||||
}
|
||||
|
||||
/**
|
||||
* js源本地代理返回的数据列表特定返回对象中的函数
|
||||
* @param params 代理链接参数比如 /proxy?do=js&url=https://wwww.baidu.com => params就是 {do:'js','url':'https://wwww.baidu.com'}
|
||||
* @returns {*}
|
||||
*/
|
||||
function proxy(params){
|
||||
if(rule.proxy_rule&&rule.proxy_rule.trim()){
|
||||
rule.proxy_rule = rule.proxy_rule.trim();
|
||||
}
|
||||
if(rule.proxy_rule.startsWith('js:')){
|
||||
rule.proxy_rule = rule.proxy_rule.replace('js:','');
|
||||
}
|
||||
let proxyObj = {
|
||||
params:params,
|
||||
proxy_rule:rule.proxy_rule
|
||||
};
|
||||
return proxyParse(proxyObj)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 是否启用辅助嗅探功能,启用后可以根据isVideo函数进行手动识别为视频的链接地址。默认为false
|
||||
* @returns {*|boolean|boolean}
|
||||
*/
|
||||
function sniffer(){
|
||||
let enable_sniffer = rule.sniffer || false;
|
||||
if(enable_sniffer){
|
||||
// log('准备执行辅助嗅探代理规则:\n'+rule.isVideo);
|
||||
log('开始执行辅助嗅探代理规则...');
|
||||
}
|
||||
return enable_sniffer
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用辅助嗅探功能后根据次函数返回的值识别地址是否为视频,返回true/false
|
||||
* @param url
|
||||
*/
|
||||
function isVideo(url){
|
||||
let t = 0;
|
||||
let is_video;
|
||||
if(rule.isVideo &&rule.isVideo.trim()){
|
||||
is_video = rule.isVideo.trim();
|
||||
}
|
||||
if(is_video.startsWith('js:')){
|
||||
is_video = is_video.replace('js:','');
|
||||
t = 1;
|
||||
}
|
||||
let isVideoObj = {
|
||||
url:url,
|
||||
isVideo:is_video,
|
||||
t:t,
|
||||
};
|
||||
let result = isVideoParse(isVideoObj);
|
||||
if(result){
|
||||
log('成功执行辅助嗅探规则并检测到视频地址:\n'+rule.isVideo);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function DRPY(){//导出函数
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
proxy:proxy,
|
||||
sniffer:sniffer,
|
||||
isVideo:isVideo
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出函数无法简写成下面的形式:
|
||||
|
||||
export default {
|
||||
...DRPY,
|
||||
DRPY
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// 导出函数对象
|
||||
export default {
|
||||
init,
|
||||
home,
|
||||
homeVod,
|
||||
category,
|
||||
detail,
|
||||
play,
|
||||
search,
|
||||
proxy,
|
||||
sniffer,
|
||||
isVideo,
|
||||
DRPY,
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
import cheerio from"assets://js/lib/cheerio.min.js";import"assets://js/lib/crypto-js.js";import 模板 from"./模板.js";import{gbkTool}from"./gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};let vercode=typeof pdfl==="function"?"drpy2.1":"drpy2";const VERSION=vercode+" 3.9.49beta2 20231122";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="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;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|-original|-src|-play|-url|style)$/;const SPECIAL_URL=/^(ftp|magnet|thunder|ws):/;const NOADD_INDEX=/:eq|:lt|:gt|:first|:last|^body$|^#/;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;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){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<len){if(o[k]===searchElement){return true}k++}return 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||"";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=[];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)}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){var Encrypted=CryptoJS.AES.encrypt(word,a,{iv:t,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});return Encrypted.ciphertext.toString()}}}return{}}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)}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);eval(html.match(/var config = {[\s\S]*?}/)[0]+"");if(!config.url.startsWith("http")){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,"+")}function base64Encode(text){return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text))}function base64Decode(text){return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text))}function md5(text){return CryptoJS.MD5(text).toString()}function encodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){const strTool=gbkTool();input=strTool.encode(input)}return input}function decodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){const strTool=gbkTool();input=strTool.decode(input)}return input}function getCryptoJS(){return'console.log("CryptoJS已装载");'}const RSA={encode:function(data,key,option){if(typeof rsaEncrypt==="function"){if(!option||typeof option!=="object"){return rsaEncrypt(data,key)}else{return rsaEncrypt(data,key,option)}}else{return false}},decode:function(data,key,option){if(typeof rsaDecrypt==="function"){if(!option||typeof option!=="object"){return rsaDecrypt(data,key)}else{return rsaDecrypt(data,key,option)}}else{return false}}};function getProxyUrl(){if(typeof getProxy==="function"){return getProxy(true)}else{return"http://127.0.0.1:9978/proxy?do=js"}}function forceOrder(lists,key,option){let start=Math.floor(lists.length/2);let end=Math.min(lists.length-1,start+1);if(start>=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd:pd};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();let result=defaultParser.pdfh(html,parse);return result},pdfa(html,parse){if(!html||!parse||!parse.trim()){return[]}parse=parse.trim();let result=defaultParser.pdfa(html,parse);print(`pdfa解析${parse}=>${result.length}`);return result},pd(html,parse,base_url){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();base_url=base_url||MY_URL;return defaultParser.pd(html,parse,base_url)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html=request(OCR_API,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true);code=html||""}catch(e){log(`OCR识别验证码发生错误:${e.message}`)}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cnt<OCR_RETRY){try{let yzm_url=`${host}/index.php/verify/index.html`;console.log(`验证码链接:${yzm_url}`);let hhtml=request(yzm_url,{withHeaders:true,toBase64:true},true);let json=JSON.parse(hhtml);if(!cookie){let setCk=Object.keys(json).find(it=>it.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=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)}if(!fetch_params){fetch_params={}}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.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.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+`|method:${obj.method||"GET"}|body:${obj.body||""}`);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}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{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;print("宝塔验证访问链接:"+url);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")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}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<cnt;i++){classes.push({type_id:urls[i],type_name:names[i]})}}if(homeObj.class_parse){let p=homeObj.class_parse.split(";");let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;MY_URL=rule.url;if(p.length>=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 getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;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 p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.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,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表双层定位处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表单层定位处理发生错误:"+e.message)}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}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(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}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:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl: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)}}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;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}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 pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd);if(searchObj.pg===1&&url.includes("[")&&url.includes("]")&&!url.includes("#")){url=url.split("[")[1].split("]")[0]}else if(searchObj.pg>1&&url.includes("[")&&url.includes("]")&&!url.includes("#")){url=url.split("[")[0]}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",searchObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.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 p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{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,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic: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;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_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(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}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);try{var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i<playFrom.length;i++){let tab_name=playFrom[i];let tab_ext=p.tabs.split(";").length>1&&!is_tab_js?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);let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let new_vod_list=[];let tt1=(new Date).getTime();if(typeof pdfl==="function"){new_vod_list=pdfl(html,p1,list_text,list_url,MY_URL)}else{let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}for(let i=0;i<vodList.length;i++){let it=vodList[i];new_vod_list.push(_pdfh(it,list_text).trim()+"$"+_pd(it,list_url,MY_URL))}}if(new_vod_list.length>0){new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)}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}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);vod=vodDeal(vod);return JSON.stringify({list:[vod]})}function get_tab_index(vod){let obj={};vod.vod_play_from.split("$$$").forEach((it,index)=>{obj[it]=index});return obj}function vodDeal(vod){let vod_play_from=vod.vod_play_from.split("$$$");let vod_play_url=vod.vod_play_url.split("$$$");let tab_removed_list=vod_play_from;let tab_ordered_list=vod_play_from;let tab_renamed_list=vod_play_from;let tab_list=vod_play_from;let play_ordered_list=vod_play_url;if(rule.tab_remove&&rule.tab_remove.length>0||rule.tab_order&&rule.tab_order.length>0){let tab_index_dict=get_tab_index(vod);if(rule.tab_remove&&rule.tab_remove.length>0){tab_removed_list=vod_play_from.filter(it=>!rule.tab_remove.includes(it));tab_list=tab_removed_list}if(rule.tab_order&&rule.tab_order.length>0){let tab_order=rule.tab_order;tab_ordered_list=tab_removed_list.sort((a,b)=>{return(tab_order.indexOf(a)===-1?9999:tab_order.indexOf(a))-(tab_order.indexOf(b)===-1?9999:tab_order.indexOf(b))});tab_list=tab_ordered_list}play_ordered_list=tab_list.map(it=>vod_play_url[tab_index_dict[it]])}if(rule.tab_rename&&typeof rule.tab_rename==="object"&Object.keys(rule.tab_rename).length>0){tab_renamed_list=tab_list.map(it=>rule.tab_rename[it]||it);tab_list=tab_renamed_list}vod.vod_play_from=tab_list.join("$$$");vod.vod_play_url=play_ordered_list.join("$$$");return 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}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length===3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log("执行嗅探规则发生错误:"+e.message);return false}}}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}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"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[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("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}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;rule.二级访问前=rule.二级访问前||"";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}if(rule.searchUrl.includes("[")&&rule.searchUrl.includes("]")&&!rule.searchUrl.includes("#")){let u1=rule.searchUrl.split("[")[0];let u2=rule.searchUrl.split("[")[1].split("]")[0];rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.searchUrl}else{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";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";rule.tab_remove=rule.hasOwnProperty("tab_remove")?rule.tab_remove:[];rule.tab_order=rule.hasOwnProperty("tab_order")?rule.tab_order:[];rule.tab_rename=rule.hasOwnProperty("tab_rename")?rule.tab_rename:{};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)}}else if(k.toLowerCase()==="cookie"){let v=rule.headers[k];if(v&&v.startsWith("http")){console.log(v);try{v=fetch(v);console.log(v);rule.headers[k]=v}catch(e){console.log(`从${v}获取cookie发生错误:`+e.message)}}}}}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);pre();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){console.log("homeVod");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="";log("orId:"+orId);if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];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.二级,"二级访问前":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,pg){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:pg||1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith("js:")){rule.proxy_rule=rule.proxy_rule.replace("js:","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("开始执行辅助嗅探代理规则...")}return enable_sniffer}function isVideo(url){let t=0;let is_video;if(rule.isVideo&&rule.isVideo.trim()){is_video=rule.isVideo.trim()}if(is_video.startsWith("js:")){is_video=is_video.replace("js:","");t=1}let isVideoObj={url:url,isVideo:is_video,t:t};let result=isVideoParse(isVideoObj);if(result){log("成功执行辅助嗅探规则并检测到视频地址:\n"+rule.isVideo)}return result}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,DRPY:DRPY};
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
import cheerio from"assets://js/lib/cheerio.min.js";import"assets://js/lib/crypto-js.js";import 模板 from"./模板.js";import{gbkTool}from"./gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};let vercode=typeof pdfl==="function"?"drpy2.1":"drpy2";const VERSION=vercode+" 3.9.47beta1 20230711";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="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;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|-original|-src|-play|-url)$/;const NOADD_INDEX=/:eq|:lt|:gt|:first|:last|^body$|^#/;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;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){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<len){if(o[k]===searchElement){return true}k++}return 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||"";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=[];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)}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){var Encrypted=CryptoJS.AES.encrypt(word,a,{iv:t,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});return Encrypted.ciphertext.toString()}}}return{}}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)}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);eval(html.match(/var config = {[\s\S]*?}/)[0]+"");if(!config.url.startsWith("http")){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,"+")}function base64Encode(text){return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text))}function base64Decode(text){return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text))}function md5(text){return CryptoJS.MD5(text).toString()}function encodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){const strTool=gbkTool();input=strTool.encode(input)}return input}function decodeStr(input,encoding){encoding=encoding||"gbk";if(encoding.startsWith("gb")){const strTool=gbkTool();input=strTool.decode(input)}return input}function getCryptoJS(){return'console.log("CryptoJS已装载");'}function getProxyUrl(){if(typeof getProxy==="function"){return getProxy(true)}else{return"http://127.0.0.1:9978/proxy?do=js"}}function forceOrder(lists,key,option){let start=Math.floor(lists.length/2);let end=Math.min(lists.length-1,start+1);if(start>=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd:pd};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(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}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();let result=defaultParser.pdfh(html,parse);return result},pdfa(html,parse){if(!html||!parse||!parse.trim()){return[]}parse=parse.trim();let result=defaultParser.pdfa(html,parse);print(`pdfa解析${parse}=>${result.length}`);return result},pd(html,parse,base_url){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();base_url=base_url||MY_URL;return defaultParser.pd(html,parse,base_url)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html=request(OCR_API,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true);code=html||""}catch(e){log(`OCR识别验证码发生错误:${e.message}`)}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cnt<OCR_RETRY){try{let yzm_url=`${host}/index.php/verify/index.html`;console.log(`验证码链接:${yzm_url}`);let hhtml=request(yzm_url,{withHeaders:true,toBase64:true},true);let json=JSON.parse(hhtml);if(!cookie){let setCk=Object.keys(json).find(it=>it.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=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)}if(!fetch_params){fetch_params={}}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.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.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+`|method:${obj.method||"GET"}|body:${obj.body||""}`);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}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{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;print("宝塔验证访问链接:"+url);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")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}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<cnt;i++){classes.push({type_id:urls[i],type_name:names[i]})}}if(homeObj.class_parse){let p=homeObj.class_parse.split(";");let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;MY_URL=rule.url;if(p.length>=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 getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;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 p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.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,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表双层定位处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表单层定位处理发生错误:"+e.message)}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}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(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}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:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl: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)}}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;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}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 pp=rule.一级.split(";");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 p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{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,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic: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;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_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(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}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);try{var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i<playFrom.length;i++){let tab_name=playFrom[i];let tab_ext=p.tabs.split(";").length>1&&!is_tab_js?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);let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let new_vod_list=[];let tt1=(new Date).getTime();if(typeof pdfl==="function"){new_vod_list=pdfl(html,p1,list_text,list_url,MY_URL)}else{let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}for(let i=0;i<vodList.length;i++){let it=vodList[i];new_vod_list.push(_pdfh(it,list_text).trim()+"$"+_pd(it,list_url,MY_URL))}}if(new_vod_list.length>0){new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)}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}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);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}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length===3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log("执行嗅探规则发生错误:"+e.message);return false}}}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}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"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[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("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}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;rule.二级访问前=rule.二级访问前||"";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";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";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)}}else if(k.toLowerCase()==="cookie"){let v=rule.headers[k];if(v&&v.startsWith("http")){console.log(v);try{v=fetch(v);console.log(v);rule.headers[k]=v}catch(e){console.log(`从${v}获取cookie发生错误:`+e.message)}}}}}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);pre();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){console.log("homeVod");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="";log("orId:"+orId);if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];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.二级,"二级访问前":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){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith(":js")){rule.proxy_rule=rule.proxy_rule.replace(":js","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("准备执行辅助嗅探代理规则:\n"+rule.isVideo)}return enable_sniffer}function isVideo(url){let t=0;if(rule.isVideo&&rule.isVideo.trim()){rule.isVideo=rule.isVideo.trim()}if(rule.isVideo.startsWith(":js")){rule.isVideo=rule.isVideo.replace(":js","");t=1}let isVideoObj={url:url,isVideo:rule.isVideo,t:t};return isVideoParse(isVideoObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,DRPY:DRPY};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,19 @@
|
||||
#订阅名
|
||||
地址(支持m3u订阅、tvbox配置文件中live选项的直播地址订阅)
|
||||
|
||||
相对路径说明
|
||||
以./开头,相对位置是本订阅文件
|
||||
以/开头,存储卡的根目录
|
||||
|
||||
#IPTV
|
||||
1
|
||||
#16万MV
|
||||
https://qu.ax/gxhY.txt
|
||||
#MTV曲库
|
||||
https://go.owen10086.repl.co/upload/TVBox/点歌/MTV曲库.txt
|
||||
#太阳
|
||||
http://111.67.196.181/zhibo.txt
|
||||
#骚0
|
||||
https://xhdwc.tk/tvlive.txt
|
||||
#玩偶
|
||||
https://github.com/YanG-1989/m3u/blob/main/Adult.m3u
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
const _0x5bf905=_0x1538;(function(_0x3ade05,_0x439ad4){const _0x104653=_0x1538,_0x20f0a5=_0x3ade05();while(!![]){try{const _0x2cb555=parseInt(_0x104653(0x118))/0x1*(parseInt(_0x104653(0xb3))/0x2)+parseInt(_0x104653(0xbd))/0x3*(-parseInt(_0x104653(0xba))/0x4)+parseInt(_0x104653(0xda))/0x5+-parseInt(_0x104653(0x9a))/0x6+-parseInt(_0x104653(0xcd))/0x7*(parseInt(_0x104653(0xea))/0x8)+-parseInt(_0x104653(0x98))/0x9+parseInt(_0x104653(0xae))/0xa;if(_0x2cb555===_0x439ad4)break;else _0x20f0a5['push'](_0x20f0a5['shift']());}catch(_0x5b5636){_0x20f0a5['push'](_0x20f0a5['shift']());}}}(_0x731b,0x93958));import _0x588c83 from'assets://js/lib/cheerio.min.js';import'assets://js/lib/crypto-js.js';const config={'epgtw_flag':![],'fetch_interval':0x1388,'iptv_flag':!![],'xjj_flag':![],'search_flag':!![],'cacheSubDB':{},'cacheDetailDB':{},'groupDB':[],'channelDB':{},'classes':[],'player':{},'filter':{},'pics':{},'defaultPicUrl':_0x5bf905(0x110),'headers':{'user-agent':'okhttp/3.12.10'},'headers2':{'user-agent':_0x5bf905(0x101)}};function _0x731b(){const _0x13dbc4=['cacheDetailDB','charAt','push','Mozilla/5.0\x20(iPhone;\x20CPU\x20iPhone\x20OS\x209_2\x20like\x20Mac\x20OS\x20X)\x20AppleWebKit/601.1\x20(KHTML,\x20like\x20Gecko)\x20CriOS/47.0.2526.107\x20Mobile/13C75\x20Safari/601.1.46','lastIndexOf','indexOf','480p','headers2','toArray','未分组','\x5c[localdb\x5c]','streamingData','epgtw_flag','exec','section\x20tbody\x20tr','each','$$$https://epg.pw','www.histar.tv','https://img2.baidu.com/it/u=651971012,3800349450&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500','formats','links','vod_play_from','pop','\x5c[epwdr\x5c]','epg.pw','1080p','22nAGixW','https://www.y2mate.com/mates/convertV2/index','download','xjj_flag','XJJ','name','?quality=','gname','IPTV','360p','parse','length','filter','csrfmiddlewaretoke=pUq0NQiiWg7EpSuU0w1Fif4q8bo0RnPe&channel_search=','###',';m_js_1=string;','format_note','defaultPicUrl','&search_type=s','&k_page=home&hl=en&q_auto=0','/parse','join','qualityLabel','订阅名','[epwdr]','10549485mLIFjE','token=123','3156930GZBCaE','sname','application/x-www-form-urlencoded','includes','resolution','$$$[localdb]','#EXTM3U','$c_end','val','filters','$$$','k_query=','iptv807','&p=','groupDB','&k=','token=','href','https://deturl.com/?url=','youtube.com','27606580totrVe','log','http://m.iptv807.com/?act=home','当前的TVBox壳子不支持异步!建议使用蜂蜜大佬的影视最新版!','piped.video','47266STJzXy','stringify','fromCharCode','slice','section:eq(2)\x20a','线路1','https://10downloader.com/download?v=','12lSPnFG','.downloadBtn','class','471999vVGwzb','attr','小姐姐','charCodeAt','select\x20option','&lang=en&type=video','concat','body\x20script:eq(1)','td:eq(4)\x20a','match','.table-container\x20tbody\x20tr','#genre#','vod_play_url','load','classes','split','147PTlGbF','type_id','720p','https://getyoutubehd.com/api/info?v=','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=','Web_EPG','iptv_flag','POST','replace','map','IPTV_','url','$$$[epwdr]','2982960gyKluv','td\x20a','pics','fetch_interval','[localdb]','iptv.com','lastIndex','$$$线路','https://www.cunshao.com/666666/api/web.php','vpf','http://127.0.0.1:9978/file/','surl','channelDB','cacheSubDB','type_name','getyoutubehd.com','419944IIeRpl','hlsManifestUrl','text','var\x20ytInitialPlayerResponse\x20=\x20','.downloadsTable:eq(0)\x20tbody\x20tr','forEach','okhttp/3.12.10','vpu','m_hken=gghken;m_hkens=gghkens;m_token=ggtoken;','td:eq(0)','index','http://m.iptv807.com/','dlink','search_flag','content','startsWith','headers','mp4','https://epg.pw/search/channel/?lang=zh-hant','$$$$$$'];_0x731b=function(){return _0x13dbc4;};return _0x731b();}function init(_0x3e726a){const _0x3a2a18=_0x5bf905;console[_0x3a2a18(0xaf)]('路飞开始调试了!!!'),parseSub(_0x3e726a);try{config['search_flag']&&async_local_db();}catch(_0x97d44e){config['search_flag']=!![],console[_0x3a2a18(0xaf)](_0x3a2a18(0xb1));}}function home(_0xb0e3e){const _0x2ccbee=_0x5bf905;let _0x592ba7={};return _0xb0e3e&&(_0x592ba7[_0x2ccbee(0xa3)]=config[_0x2ccbee(0x8b)]),_0x592ba7[_0x2ccbee(0xbc)]=config[_0x2ccbee(0xcb)],JSON[_0x2ccbee(0xb4)](_0x592ba7);}function homeVod(){const _0x54c633=_0x5bf905;let _0x4ea5fa={},_0x49fe91=[];if(config['iptv_flag']){let _0x2a72db=req(_0x54c633(0xb0),{'headers':config[_0x54c633(0x105)]})[_0x54c633(0xf8)],_0x2d3e48=_0x588c83[_0x54c633(0xca)](_0x2a72db),_0x282e95=_0x2d3e48('ul[data-role=\x22listview\x22]\x20li');_0x282e95[_0x54c633(0x10d)](function(_0x2eef2f){const _0x3858d2=_0x54c633;_0x2d3e48('a',this)[_0x3858d2(0xec)]()!=''&&_0x49fe91[_0x3858d2(0x100)]({'vod_id':_0x3858d2(0xd7)+_0x2d3e48('a',this)[_0x3858d2(0xec)]()+_0x3858d2(0xa4)+_0x2d3e48('a',this)[_0x3858d2(0xbe)](_0x3858d2(0xab)),'vod_name':_0x2d3e48('a',this)[_0x3858d2(0xec)](),'vod_pic':config[_0x3858d2(0x90)],'vod_remarks':''});}),config[_0x54c633(0x82)]&&_0x49fe91['unshift']({'vod_id':_0x54c633(0x83)+_0x54c633(0xa4)+_0x54c633(0xe2),'vod_name':_0x54c633(0xbf),'vod_pic':config[_0x54c633(0x90)],'vod_remarks':''}),_0x4ea5fa={'list':_0x49fe91};}return JSON[_0x54c633(0xb4)](_0x4ea5fa);}function category(_0x569c44,_0x49e44f,_0x5f109c,_0x20195a){const _0x5de76f=_0x5bf905;let _0x3b3354={},_0x168cec=[],_0xd0d814='',_0x2e4754=[],_0x26631e=[];_0x49e44f=parseInt(_0x49e44f);if(_0x49e44f>=0x2)return JSON[_0x5de76f(0xb4)]({});if(_0x569c44==_0x5de76f(0x10f)){}else{if(_0x569c44=='myIPTV'){}else{let _0x237178=cache_sub_db(_0x569c44);if(_0x237178[_0x5de76f(0x103)](_0x5de76f(0xa0))==0x0){let _0xbebc72=/(.*),(.*)\s*?((?:http|rtmp|mitv)[^#\s]*)/gm;while((_0x26631e=_0xbebc72['exec'](_0x237178))!==null){_0x26631e[_0x5de76f(0xf4)]===_0xbebc72['lastIndex']&&_0xbebc72[_0x5de76f(0xe0)]++;let _0x577c57='未分组';_0x577c57=(_0x26631e[0x1]['match'](/group-title="(.*?)"/)||[null,_0x577c57])[0x1],_0x2e4754[_0x5de76f(0x103)](_0x577c57)==-0x1&&(_0x2e4754[_0x5de76f(0x100)](_0x577c57),_0x168cec['push']({'vod_id':_0x577c57+_0x5de76f(0xa4)+_0x569c44,'vod_name':_0x577c57[_0x5de76f(0xd5)](/\/parse$/,''),'vod_pic':config['pics'][_0x569c44],'vod_remarks':''}));}}else{let _0x6ba0be=/()(?:\B\$c_start|\B#{1,2})?(.*?),?(##|头#|\$c_end|,?#genre#|(?:http|rtmp|mitv)[^\s]*)/gm;while((_0x26631e=_0x6ba0be[_0x5de76f(0x10b)](_0x237178))!==null){_0x26631e[_0x5de76f(0xf4)]===_0x6ba0be['lastIndex']&&_0x6ba0be[_0x5de76f(0xe0)]++;if([_0x5de76f(0xc8),'##','头#','$c_end'][_0x5de76f(0x9d)](_0x26631e[0x3])){let _0xbf9ae7=_0x26631e[0x2];_0x2e4754[_0x5de76f(0x103)](_0xbf9ae7)==-0x1&&(_0x2e4754[_0x5de76f(0x100)](_0xbf9ae7),_0x168cec[_0x5de76f(0x100)]({'vod_id':_0xbf9ae7+_0x5de76f(0xa4)+_0x569c44,'vod_name':_0xbf9ae7['replace'](/\/parse$/,''),'vod_pic':config['pics'][_0x569c44],'vod_remarks':''}));}}}}}return _0x3b3354={'list':_0x168cec,'page':_0x49e44f,'pagecount':0x1,'limit':0x64,'total':0x3e7},JSON[_0x5de76f(0xb4)](_0x3b3354);}function search(_0x150015,_0x2eac0f){const _0x489d8c=_0x5bf905;let _0x409375={},_0x10db4d=[];config[_0x489d8c(0xf7)]&&sync_local_db();if(config['epgtw_flag']){let _0x12300b=req('https://epg.pw/search/channel/?lang=zh-hant',{'headers':{'Content-Type':'application/x-www-form-urlencoded','user-agent':_0x489d8c(0xf0)},'method':'POST','body':_0x489d8c(0x8c)+_0x150015+'&search_type=c'})[_0x489d8c(0xf8)],_0xba6de3=_0x588c83[_0x489d8c(0xca)](_0x12300b),_0x299027=_0xba6de3(_0x489d8c(0xb7));if(_0x299027[_0x489d8c(0x8a)]===0x0){let _0x4addae=req(_0x489d8c(0xfc),{'headers':{'Content-Type':'application/x-www-form-urlencoded','user-agent':_0x489d8c(0xf0)},'method':'POST','body':_0x489d8c(0x8c)+_0x150015+_0x489d8c(0x91)})[_0x489d8c(0xf8)],_0x4c9370=_0x588c83[_0x489d8c(0xca)](_0x4addae),_0x4c7696=_0x4c9370(_0x489d8c(0xc7)),_0xc0a5d4={};_0x4c7696[_0x489d8c(0x10d)](function(_0xc20539){const _0x339f0c=_0x489d8c;let _0x448aae=_0x4c9370('td',this)['eq'](0x0)['text']()[_0x339f0c(0xd5)](/@@\d+$/,'')[_0x339f0c(0xd5)]('台','')[_0x339f0c(0xd5)]('衛視','卫视');_0xc0a5d4[_0x448aae]?_0xc0a5d4[_0x448aae][_0x339f0c(0x100)](_0x4c9370('td:eq(4)\x20a',this)['attr'](_0x339f0c(0xab))):_0xc0a5d4[_0x448aae]=[_0x4c9370(_0x339f0c(0xc5),this)[_0x339f0c(0xbe)](_0x339f0c(0xab))];});for(let _0x171693 in _0xc0a5d4){_0x10db4d[_0x489d8c(0x100)]({'vod_id':_0x171693+_0x489d8c(0xd9)+_0xc0a5d4[_0x171693][_0x489d8c(0x94)](_0x489d8c(0x8d)),'vod_name':_0x171693,'vod_pic':config[_0x489d8c(0x90)],'vod_remarks':_0x489d8c(0xd2)});}}else _0x299027['each'](function(_0x1b6f06){const _0x22c51e=_0x489d8c;_0x10db4d[_0x22c51e(0x100)]({'vod_id':_0xba6de3(this,this)['text']()+_0x22c51e(0x10e)+_0xba6de3(this,this)[_0x22c51e(0xbe)](_0x22c51e(0xab)),'vod_name':_0xba6de3(this,this)[_0x22c51e(0xec)](),'vod_pic':config['defaultPicUrl'],'vod_remarks':'Web_EPG'});});}return _0x10db4d=_0x10db4d[_0x489d8c(0xc3)](local_db_gsearch(_0x150015)),_0x10db4d=_0x10db4d['concat'](local_db_csearch(_0x150015)),_0x409375={'list':_0x10db4d},JSON[_0x489d8c(0xb4)](_0x409375);}function detail(_0x2aed5c){const _0x5248c9=_0x5bf905;let _0x5b1300={},_0x4a2fc1={},_0x66bd2f=[],_0x13404d=_0x2aed5c[_0x5248c9(0xcc)](_0x5248c9(0xa4))[0x1];_0x2aed5c=_0x2aed5c[_0x5248c9(0xcc)]('$$$')[0x0];_0x2aed5c['startsWith'](_0x5248c9(0x87))&&(_0x13404d='http://m.iptv807.com/'+_0x13404d);let _0x3979d7={'vod_id':_0x2aed5c,'vod_name':_0x2aed5c['replace'](/\/parse$/,''),'vod_pic':config[_0x5248c9(0x90)],'type_name':'','vod_year':'','vod_area':'','vod_remarks':'','vod_actor':'','vod_director':'','vod_content':'','vod_play_from':'','vod_play_url':''};if(_0x2aed5c[_0x5248c9(0xf9)]('XJJ')){let _0x4b6bf0=_0x5248c9(0xb8),_0x28f37a='';for(let _0x14c8a6=0x0;_0x14c8a6<0x63;_0x14c8a6++){_0x28f37a=_0x28f37a+_0x5248c9(0xbf)+_0x14c8a6+'$'+_0x13404d+'?t='+_0x14c8a6+'#';}_0x3979d7['vod_play_from']=_0x4b6bf0,_0x3979d7[_0x5248c9(0xc9)]=_0x28f37a[_0x5248c9(0xd5)](/#$/,'');}else{if(_0x13404d[_0x5248c9(0xc6)](_0x5248c9(0x115))&&config[_0x5248c9(0x10a)]){let _0x95e6f3='',_0x666580='';_0x13404d=_0x13404d['replace'](_0x5248c9(0x97),''),_0x13404d=_0x13404d[_0x5248c9(0xcc)](_0x5248c9(0x8d));for(let _0x4e6598=0x0;_0x4e6598<_0x13404d[_0x5248c9(0x8a)];_0x4e6598++){_0x95e6f3=_0x95e6f3+_0x5248c9(0xe1)+_0x4e6598,_0x666580=_0x666580+_0x5248c9(0xa4)+_0x2aed5c+'$'+_0x13404d[_0x4e6598];}_0x3979d7[_0x5248c9(0x113)]=_0x95e6f3[_0x5248c9(0xd5)](/^\$\$\$/,''),_0x3979d7['vod_play_url']=_0x666580[_0x5248c9(0xd5)](/^\$\$\$/,'');}else{if(_0x13404d['match'](_0x5248c9(0x116))&&config['epgtw_flag']){let _0x4f6df1='',_0x200bc5='',_0x7d9999=0x0,_0x5c3aa7=req(_0x13404d,{'headers':config['headers']})['content'],_0x46c399=_0x588c83[_0x5248c9(0xca)](_0x5c3aa7),_0x3eb13f=_0x46c399(_0x5248c9(0x10c));_0x3eb13f['each'](function(_0x3142de){const _0x4c6de1=_0x5248c9;_0x4f6df1=_0x4f6df1+_0x4c6de1(0xe1)+_0x7d9999,_0x200bc5=_0x200bc5+_0x4c6de1(0xa4)+_0x2aed5c+'$'+_0x46c399(_0x4c6de1(0xdb),this)['eq'](0x0)[_0x4c6de1(0xbe)](_0x4c6de1(0xab)),_0x7d9999++;}),_0x3979d7[_0x5248c9(0x113)]=_0x4f6df1[_0x5248c9(0xd5)](/^\$\$\$/,''),_0x3979d7[_0x5248c9(0xc9)]=_0x200bc5[_0x5248c9(0xd5)](/^\$\$\$/,'');}else{if(config[_0x5248c9(0xfe)][_0x2aed5c])_0x3979d7[_0x5248c9(0x113)]=config['cacheDetailDB'][_0x2aed5c][_0x5248c9(0xe3)],_0x3979d7['vod_play_url']=config[_0x5248c9(0xfe)][_0x2aed5c][_0x5248c9(0xf1)];else{if(_0x13404d[_0x5248c9(0xc6)](_0x5248c9(0x108))){let _0x1840dd='',_0x2a958f='';_0x13404d=_0x13404d['replace'](_0x5248c9(0xde),''),_0x13404d=_0x13404d[_0x5248c9(0xcc)](_0x5248c9(0x8d));for(let _0x259038=0x0;_0x259038<_0x13404d['length'];_0x259038++){_0x1840dd=_0x1840dd+_0x5248c9(0xe1)+_0x259038,_0x2a958f=_0x2a958f+'$$$'+_0x2aed5c+'$'+_0x13404d[_0x259038];}_0x3979d7['vod_play_from']=_0x1840dd[_0x5248c9(0xd5)](/^\$\$\$/,''),_0x3979d7[_0x5248c9(0xc9)]=_0x2a958f[_0x5248c9(0xd5)](/^\$\$\$/,''),cache_detail_db(_0x2aed5c,_0x3979d7[_0x5248c9(0x113)],_0x3979d7['vod_play_url']);}else{if(_0x13404d=='www.histar.tv'){}else{if(_0x2aed5c['startsWith']('IPTV')){let _0x204bb5='',_0x40706e='',_0x5b8b36=cache_sub_db(_0x13404d),_0x11a361=_0x588c83[_0x5248c9(0xca)](_0x5b8b36),_0x4d6451=_0x11a361('ul[data-role=\x22listview\x22]\x20li');for(let _0x810aa=0x1;_0x810aa<0xb;_0x810aa++){_0x204bb5=_0x204bb5+_0x5248c9(0xa4)+'线路'+_0x810aa,_0x4d6451['each'](function(_0x4920a1){const _0x51a10e=_0x5248c9;_0x11a361('a',this)['text']()!=''&&(_0x40706e=_0x40706e+'#'+_0x11a361('a',this)['text']()+'$'+_0x51a10e(0xf5)+_0x11a361('a',this)[_0x51a10e(0xbe)](_0x51a10e(0xab))+'&p='+(_0x810aa-0x1));}),_0x40706e=_0x40706e[_0x5248c9(0xd5)](/^#/,''),_0x40706e=_0x40706e+_0x5248c9(0xa4);}_0x3979d7[_0x5248c9(0x113)]=_0x204bb5['replace'](/^\$\$\$/,''),_0x3979d7['vod_play_url']=_0x40706e[_0x5248c9(0xd5)](/\$\$\$#/g,_0x5248c9(0xfd)),cache_detail_db(_0x2aed5c,_0x3979d7['vod_play_from'],_0x3979d7['vod_play_url']);}else{let _0xd3c038=cache_sub_db(_0x13404d);if(_0xd3c038[_0x5248c9(0x103)](_0x5248c9(0xa0))==0x0){let _0x571e25=/(.*),(.*)\s*?((?:http|rtmp|mitv)[^#\s]*)/gm;while((_0x66bd2f=_0x571e25[_0x5248c9(0x10b)](_0xd3c038))!==null){_0x66bd2f[_0x5248c9(0xf4)]===_0x571e25[_0x5248c9(0xe0)]&&_0x571e25['lastIndex']++;let _0x48a2ae=_0x5248c9(0x107);_0x48a2ae=(_0x66bd2f[0x1][_0x5248c9(0xc6)](/group-title="(.*?)"/)||[null,_0x48a2ae])[0x1];if(_0x48a2ae==_0x2aed5c){_0x2aed5c['match'](/\/parse$/)&&(_0x66bd2f[0x3]=_0x66bd2f[0x3][_0x5248c9(0xd5)](/\/$/,''),!_0x66bd2f[0x3]['match'](/\/parse$/)&&(_0x66bd2f[0x3]=_0x66bd2f[0x3]+_0x5248c9(0x93)));if(_0x66bd2f[0x3][_0x5248c9(0x103)](_0x5248c9(0xad))!=-0x1||_0x66bd2f[0x3][_0x5248c9(0x103)](_0x5248c9(0xb2))!=-0x1){_0x66bd2f[0x3]=_0x66bd2f[0x3][_0x5248c9(0xd5)](/\/parse$/,'');!_0x4a2fc1[_0x66bd2f[0x2]]&&(_0x4a2fc1[_0x66bd2f[0x2]]=[]);let _0x4df370=['1080p','720p',_0x5248c9(0x104),_0x5248c9(0x88)];for(let _0x4ede93=0x1;_0x4ede93<=0x4;_0x4ede93++){_0x4a2fc1[_0x66bd2f[0x2]]['push']({'name':'线路'+_0x4ede93,'url':_0x66bd2f[0x3]+'/'+_0x4df370[_0x4ede93-0x1]});}}else{if(_0x4a2fc1[_0x66bd2f[0x2]]){let _0x5bbdf8='线路'+(_0x4a2fc1[_0x66bd2f[0x2]]['length']+0x1);_0x4a2fc1[_0x66bd2f[0x2]][_0x5248c9(0x100)]({'name':_0x5bbdf8,'url':_0x66bd2f[0x3]});}else{_0x4a2fc1[_0x66bd2f[0x2]]=[];let _0x44a4f3=_0x5248c9(0xb8);_0x4a2fc1[_0x66bd2f[0x2]][_0x5248c9(0x100)]({'name':_0x44a4f3,'url':_0x66bd2f[0x3]});}}}}}else{let _0x182a0f=/()(?:\B\$c_start|\B#{1,2})?(.*?),?(##|头#|\$c_end|,?#genre#|(?:http|rtmp|mitv)[^\s]*)/gm,_0x2c7465=!![];while((_0x66bd2f=_0x182a0f[_0x5248c9(0x10b)](_0xd3c038))!==null){_0x66bd2f[_0x5248c9(0xf4)]===_0x182a0f[_0x5248c9(0xe0)]&&_0x182a0f['lastIndex']++;if([_0x5248c9(0xc8),'##','头#','$c_end'][_0x5248c9(0x9d)](_0x66bd2f[0x3])){if(_0x66bd2f[0x2]==_0x2aed5c){_0x2c7465=![];continue;}else{if(!_0x2c7465)break;}}if(_0x2c7465)continue;_0x2aed5c['match'](/\/parse$/)&&(_0x66bd2f[0x3]=_0x66bd2f[0x3][_0x5248c9(0xd5)](/\/$/,''),!_0x66bd2f[0x3]['match'](/\/parse$/)&&(_0x66bd2f[0x3]=_0x66bd2f[0x3]+'/parse'));if(_0x66bd2f[0x3]['indexOf'](_0x5248c9(0xad))!=-0x1||_0x66bd2f[0x3][_0x5248c9(0x103)](_0x5248c9(0xb2))!=-0x1){_0x66bd2f[0x3]=_0x66bd2f[0x3][_0x5248c9(0xd5)](/\/parse$/,'');!_0x4a2fc1[_0x66bd2f[0x2]]&&(_0x4a2fc1[_0x66bd2f[0x2]]=[]);let _0x11fedd=[_0x5248c9(0x117),_0x5248c9(0xcf),_0x5248c9(0x104),_0x5248c9(0x88)];for(let _0x32c0b8=0x1;_0x32c0b8<=0x4;_0x32c0b8++){_0x4a2fc1[_0x66bd2f[0x2]][_0x5248c9(0x100)]({'name':'线路'+_0x32c0b8,'url':_0x66bd2f[0x3]+'/'+_0x11fedd[_0x32c0b8-0x1]});}}else{if(_0x4a2fc1[_0x66bd2f[0x2]]){let _0x429150='线路'+(_0x4a2fc1[_0x66bd2f[0x2]][_0x5248c9(0x8a)]+0x1);_0x4a2fc1[_0x66bd2f[0x2]][_0x5248c9(0x100)]({'name':_0x429150,'url':_0x66bd2f[0x3]});}else{_0x4a2fc1[_0x66bd2f[0x2]]=[];let _0x397f2d=_0x5248c9(0xb8);_0x4a2fc1[_0x66bd2f[0x2]][_0x5248c9(0x100)]({'name':_0x397f2d,'url':_0x66bd2f[0x3]});}}}}let _0x34d540=0x0;for(let _0x15d456 in _0x4a2fc1){_0x4a2fc1[_0x15d456][_0x5248c9(0x8a)]>_0x34d540&&(_0x34d540=_0x4a2fc1[_0x15d456][_0x5248c9(0x8a)]);}let _0x4b6b02={};for(let _0x154ef6=0x1;_0x154ef6<=_0x34d540;_0x154ef6++){_0x4b6b02['线路'+_0x154ef6]=[];for(let _0x4e632f in _0x4a2fc1){let _0x210d96='';_0x154ef6<=_0x4a2fc1[_0x4e632f][_0x5248c9(0x8a)]?_0x210d96=_0x4a2fc1[_0x4e632f][_0x154ef6-0x1][_0x5248c9(0xd8)]:_0x210d96=_0x4a2fc1[_0x4e632f][_0x4a2fc1[_0x4e632f][_0x5248c9(0x8a)]-0x1][_0x5248c9(0xd8)],_0x4b6b02['线路'+_0x154ef6][_0x5248c9(0x100)]({'name':_0x4e632f,'url':_0x210d96});}}let _0x4dcd8d=make_detail_videos(_0x4b6b02);_0x3979d7[_0x5248c9(0x113)]=_0x4dcd8d[_0x5248c9(0x113)],_0x3979d7[_0x5248c9(0xc9)]=_0x4dcd8d[_0x5248c9(0xc9)];}}}cache_detail_db(_0x2aed5c,_0x3979d7[_0x5248c9(0x113)],_0x3979d7['vod_play_url']);}}}}return _0x5b1300={'list':[_0x3979d7]},JSON[_0x5248c9(0xb4)](_0x5b1300);}function play(_0x45fe1a,_0x20028b,_0x770038){const _0x316242=_0x5bf905;let _0x2f38c3={},_0x29ea87='0',_0xf07001='0';if(_0x20028b[_0x316242(0x103)](_0x316242(0xa6))!=-0x1)_0x20028b=m_parse_url(_0x20028b);else{if(_0x20028b['match'](/youtube\.com/m))_0x20028b=direct_play_youtube3(_0x20028b);else{if(_0x20028b['match'](/piped\.video/m)){let _0x8762a9=_0x20028b['slice'](0x0,_0x20028b[_0x316242(0x102)]('/')),_0x10dabe=_0x20028b[_0x316242(0xb6)](_0x20028b[_0x316242(0x102)]('/')+0x1)[_0x316242(0xd5)]('p','');_0x20028b=_0x8762a9+_0x316242(0x85)+_0x10dabe,_0x29ea87='1';}else{if(_0x20028b[_0x316242(0xc6)](/\/parse$/))_0x20028b=_0x20028b[_0x316242(0xd5)](/\/parse$/,''),_0x29ea87='1';else _0x20028b[_0x316242(0xc6)](/cunshao\.com\/666666\/api\/web.php/)&&(_0x29ea87='1');}}}return console['log'](_0x20028b),_0x2f38c3={'parse':_0x29ea87,'jx':_0xf07001,'headers':'','playUrl':'','url':_0x20028b},JSON['stringify'](_0x2f38c3);}function computer_last_path(_0x21ad92,_0xa9e098){const _0x51d585=_0x5bf905;let _0x56b0ec=_0x51d585(0xe4),_0x209ad8=_0xa9e098[_0x51d585(0xb6)](0x0,_0xa9e098[_0x51d585(0x102)]('/')+0x1);_0x21ad92[_0x51d585(0xc6)](/^(\/)/)&&(_0x209ad8=_0x56b0ec);let _0x39b4f0=_0x21ad92[_0x51d585(0xcc)]('/')[_0x51d585(0xb6)](0x0,-0x1),_0x448c9d=_0x21ad92[_0x51d585(0xcc)]('/')[_0x51d585(0x114)]();for(let _0x474b9e=0x0;_0x474b9e<_0x39b4f0['length'];_0x474b9e++){if(_0x39b4f0[_0x474b9e]=='.'){}else{if(_0x39b4f0[_0x474b9e]=='..')_0x209ad8!=_0x56b0ec&&(_0x209ad8=_0x209ad8[_0x51d585(0xd5)](/[^\/]*\/$/,''));else{if(_0x39b4f0[_0x474b9e]==''){}else _0x209ad8=_0x209ad8+_0x39b4f0[_0x474b9e]+'/';}}}return _0x209ad8+_0x448c9d;}function parseSub(_0x499bc7){const _0x3e6fe3=_0x5bf905,_0x58701a=/^#([^#\n]*?)\n([^#\n]+)/gm;let _0x3b6efa='',_0x35837b='',_0x32646f=req(_0x499bc7,{'headers':config[_0x3e6fe3(0xfa)]})[_0x3e6fe3(0xf8)];while((_0x3b6efa=_0x58701a[_0x3e6fe3(0x10b)](_0x32646f))!==null){_0x3b6efa[_0x3e6fe3(0xf4)]===_0x58701a[_0x3e6fe3(0xe0)]&&_0x58701a[_0x3e6fe3(0xe0)]++;if(_0x3b6efa[0x1]==_0x3e6fe3(0x96))continue;if(_0x3b6efa[0x1][_0x3e6fe3(0xc6)](/iptv/i)){_0x3b6efa[0x2]=='1'?config[_0x3e6fe3(0xd3)]=!![]:config['iptv_flag']=![];continue;}if(_0x3b6efa[0x1]['match'](/xjj/i)){_0x3b6efa[0x2]=='1'?config[_0x3e6fe3(0x82)]=!![]:config[_0x3e6fe3(0x82)]=![];continue;}let _0x15952b=_0x3b6efa[0x1],_0x1aa6d2=config['defaultPicUrl'];if(_0x3b6efa[0x1][_0x3e6fe3(0x103)]('(')!=-0x1){let _0x595e01=_0x3b6efa[0x1][_0x3e6fe3(0xc6)](/(.*?)\((.*?)\)/);_0x15952b=_0x595e01[0x1],_0x1aa6d2[_0x3e6fe3(0xc6)](/https?/)?_0x1aa6d2=_0x595e01[0x2]:_0x1aa6d2=computer_last_path(_0x595e01[0x2],_0x499bc7);}_0x3b6efa[0x2]['match'](/https?/)?_0x35837b=_0x3b6efa[0x2]:_0x35837b=computer_last_path(_0x3b6efa[0x2],_0x499bc7),config[_0x3e6fe3(0xdc)][_0x35837b]=_0x1aa6d2,config[_0x3e6fe3(0xdc)][_0x15952b]=_0x1aa6d2,config['classes'][_0x3e6fe3(0x100)]({'type_id':_0x35837b,'type_name':_0x15952b});}}function make_detail_videos(_0x20c9a0){const _0x33f41f=_0x5bf905;let _0x1f8581=[],_0x2384dc='',_0x3c97c9='';for(let _0x54126e in _0x20c9a0){_0x2384dc=_0x2384dc+_0x33f41f(0xa4)+_0x54126e;}for(let _0x5745e1 in _0x20c9a0){_0x3c97c9=_0x3c97c9+'$$$',_0x20c9a0[_0x5745e1][_0x33f41f(0xef)](_0x52dc32=>{const _0x5e21a4=_0x33f41f;_0x3c97c9=_0x3c97c9+_0x52dc32[_0x5e21a4(0x84)]+'$'+_0x52dc32['url']+'#';}),_0x3c97c9=_0x3c97c9[_0x33f41f(0xd5)](/#$/m,'');}return _0x1f8581[_0x33f41f(0x113)]=_0x2384dc[_0x33f41f(0xd5)](/^\$\$\$/,''),_0x1f8581[_0x33f41f(0xc9)]=_0x3c97c9[_0x33f41f(0xd5)](/^\$\$\$/,''),_0x1f8581;}function sync_local_db(){const _0x18d734=_0x5bf905;config[_0x18d734(0xf7)]=![];let _0x2fe48f=[],_0x57e684=[],_0x235509='';for(let _0x5c5b22=0x0;_0x5c5b22<config[_0x18d734(0xcb)][_0x18d734(0x8a)];_0x5c5b22++){let _0xa79c1b=config[_0x18d734(0xcb)][_0x5c5b22][_0x18d734(0xce)],_0x25f1b4=config[_0x18d734(0xcb)][_0x5c5b22][_0x18d734(0xe8)],_0x413695=cache_sub_db(_0xa79c1b);if(_0x413695[_0x18d734(0x103)](_0x18d734(0xa0))==0x0){let _0x496e13=/(.*),(.*)\s*?((?:http|rtmp|mitv)[^#\s]*)/gm;while((_0x2fe48f=_0x496e13[_0x18d734(0x10b)](_0x413695))!==null){_0x2fe48f[_0x18d734(0xf4)]===_0x496e13[_0x18d734(0xe0)]&&_0x496e13['lastIndex']++;let _0x28547c=_0x18d734(0x107);_0x28547c=(_0x2fe48f[0x1][_0x18d734(0xc6)](/group-title="(.*?)"/)||[null,_0x28547c])[0x1];_0x57e684[_0x18d734(0x103)](_0x28547c)==-0x1&&(_0x57e684[_0x18d734(0x100)](_0x28547c),config[_0x18d734(0xa8)]['push']({'sname':_0x25f1b4,'surl':_0xa79c1b,'gname':_0x28547c}));!config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x28547c]&&(config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x28547c]={});if(_0x2fe48f[0x3][_0x18d734(0x103)](_0x18d734(0xad))!=-0x1||_0x2fe48f[0x3][_0x18d734(0x103)](_0x18d734(0xb2))!=-0x1){_0x2fe48f[0x3]=_0x2fe48f[0x3][_0x18d734(0xd5)](/\/parse$/,'');!config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x28547c][_0x2fe48f[0x2]]&&(config['channelDB'][_0x25f1b4+'-'+_0x28547c][_0x2fe48f[0x2]]=[]);let _0x32672c=[_0x18d734(0x117),_0x18d734(0xcf),_0x18d734(0x104),'360p'];for(let _0x574115=0x1;_0x574115<=0x4;_0x574115++){config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x28547c][_0x2fe48f[0x2]][_0x18d734(0x100)](_0x2fe48f[0x3]+'/'+_0x32672c[_0x574115-0x1]);}}else _0x28547c[_0x18d734(0xc6)](/\/parse$/)&&(_0x2fe48f[0x3]=_0x2fe48f[0x3][_0x18d734(0xd5)](/\/$/,''),!_0x2fe48f[0x3]['match'](/\/parse$/)&&(_0x2fe48f[0x3]=_0x2fe48f[0x3]+'/parse')),config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x28547c][_0x2fe48f[0x2]]?config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x28547c][_0x2fe48f[0x2]][_0x18d734(0x100)](_0x2fe48f[0x3]):(config['channelDB'][_0x25f1b4+'-'+_0x28547c][_0x2fe48f[0x2]]=[],config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x28547c][_0x2fe48f[0x2]][_0x18d734(0x100)](_0x2fe48f[0x3]));}}else{let _0x37e7e=/()(?:\B\$c_start|\B#{1,2})?(.*?),?(##|头#|\$c_end|,?#genre#|(?:http|rtmp|mitv)[^\s]*)/gm;while((_0x2fe48f=_0x37e7e['exec'](_0x413695))!==null){_0x2fe48f[_0x18d734(0xf4)]===_0x37e7e[_0x18d734(0xe0)]&&_0x37e7e[_0x18d734(0xe0)]++;if(['#genre#','##','头#',_0x18d734(0xa1)]['includes'](_0x2fe48f[0x3]))_0x235509=_0x2fe48f[0x2],config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509]={},config[_0x18d734(0xa8)][_0x18d734(0x100)]({'sname':_0x25f1b4,'surl':_0xa79c1b,'gname':_0x2fe48f[0x2]});else{if(_0x2fe48f[0x3][_0x18d734(0x103)](_0x18d734(0xad))!=-0x1||_0x2fe48f[0x3][_0x18d734(0x103)](_0x18d734(0xb2))!=-0x1){_0x2fe48f[0x3]=_0x2fe48f[0x3][_0x18d734(0xd5)](/\/parse$/,'');!config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509][_0x2fe48f[0x2]]&&(config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509][_0x2fe48f[0x2]]=[]);let _0xe4e9f9=['1080p',_0x18d734(0xcf),_0x18d734(0x104),_0x18d734(0x88)];for(let _0x3ccf4f=0x1;_0x3ccf4f<=0x4;_0x3ccf4f++){config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509][_0x2fe48f[0x2]][_0x18d734(0x100)](_0x2fe48f[0x3]+'/'+_0xe4e9f9[_0x3ccf4f-0x1]);}}else _0x235509['match'](/\/parse$/)&&(_0x2fe48f[0x3]=_0x2fe48f[0x3][_0x18d734(0xd5)](/\/$/,''),!_0x2fe48f[0x3][_0x18d734(0xc6)](/\/parse$/)&&(_0x2fe48f[0x3]=_0x2fe48f[0x3]+_0x18d734(0x93))),config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509][_0x2fe48f[0x2]]?config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509][_0x2fe48f[0x2]][_0x18d734(0x100)](_0x2fe48f[0x3]):(config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509][_0x2fe48f[0x2]]=[],config[_0x18d734(0xe6)][_0x25f1b4+'-'+_0x235509][_0x2fe48f[0x2]][_0x18d734(0x100)](_0x2fe48f[0x3]));}}}}}function async_local_db(){const _0x18d7d3=_0x5bf905;for(let _0x5b4288=0x0;_0x5b4288<config['classes']['length'];_0x5b4288++){config[_0x18d7d3(0xdd)]=config[_0x18d7d3(0xdd)]+0x3e8,setTimeout(()=>{const _0x24cd06=_0x18d7d3;config[_0x24cd06(0xf7)]=![];let _0x4e30e5=config[_0x24cd06(0xcb)][_0x5b4288][_0x24cd06(0xce)],_0x5922be=config[_0x24cd06(0xcb)][_0x5b4288][_0x24cd06(0xe8)],_0x1f1116=[],_0x26b75c=[],_0x48357c='',_0x136e24=cache_sub_db(_0x4e30e5);if(_0x136e24[_0x24cd06(0x103)](_0x24cd06(0xa0))==0x0){let _0x3112e5=/(.*),(.*)\s*?((?:http|rtmp|mitv)[^#\s]*)/gm;while((_0x1f1116=_0x3112e5['exec'](_0x136e24))!==null){_0x1f1116[_0x24cd06(0xf4)]===_0x3112e5[_0x24cd06(0xe0)]&&_0x3112e5[_0x24cd06(0xe0)]++;let _0x2e6cf3=_0x24cd06(0x107);_0x2e6cf3=(_0x1f1116[0x1][_0x24cd06(0xc6)](/group-title="(.*?)"/)||[null,_0x2e6cf3])[0x1];_0x26b75c['indexOf'](_0x2e6cf3)==-0x1&&(_0x26b75c[_0x24cd06(0x100)](_0x2e6cf3),config['groupDB'][_0x24cd06(0x100)]({'sname':_0x5922be,'surl':_0x4e30e5,'gname':_0x2e6cf3}));!config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3]&&(config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3]={});if(_0x1f1116[0x3][_0x24cd06(0x103)](_0x24cd06(0xad))!=-0x1||_0x1f1116[0x3]['indexOf'](_0x24cd06(0xb2))!=-0x1){_0x1f1116[0x3]=_0x1f1116[0x3]['replace'](/\/parse$/,'');!config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3][_0x1f1116[0x2]]&&(config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3][_0x1f1116[0x2]]=[]);let _0x3cae47=[_0x24cd06(0x117),_0x24cd06(0xcf),'480p',_0x24cd06(0x88)];for(let _0x57848f=0x1;_0x57848f<=0x4;_0x57848f++){config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3][_0x1f1116[0x2]][_0x24cd06(0x100)](_0x1f1116[0x3]+'/'+_0x3cae47[_0x57848f-0x1]);}}else _0x2e6cf3[_0x24cd06(0xc6)](/\/parse$/)&&(_0x1f1116[0x3]=_0x1f1116[0x3][_0x24cd06(0xd5)](/\/$/,''),!_0x1f1116[0x3][_0x24cd06(0xc6)](/\/parse$/)&&(_0x1f1116[0x3]=_0x1f1116[0x3]+'/parse')),config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3][_0x1f1116[0x2]]?config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3][_0x1f1116[0x2]][_0x24cd06(0x100)](_0x1f1116[0x3]):(config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3][_0x1f1116[0x2]]=[],config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x2e6cf3][_0x1f1116[0x2]]['push'](_0x1f1116[0x3]));}}else{let _0x3992d7=/()(?:\B\$c_start|\B#{1,2})?(.*?),?(##|头#|\$c_end|,?#genre#|(?:http|rtmp|mitv)[^\s]*)/gm;while((_0x1f1116=_0x3992d7[_0x24cd06(0x10b)](_0x136e24))!==null){_0x1f1116['index']===_0x3992d7[_0x24cd06(0xe0)]&&_0x3992d7[_0x24cd06(0xe0)]++;if([_0x24cd06(0xc8),'##','头#',_0x24cd06(0xa1)][_0x24cd06(0x9d)](_0x1f1116[0x3]))_0x48357c=_0x1f1116[0x2],config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x48357c]={},config[_0x24cd06(0xa8)][_0x24cd06(0x100)]({'sname':_0x5922be,'surl':_0x4e30e5,'gname':_0x1f1116[0x2]});else{if(_0x1f1116[0x3][_0x24cd06(0x103)](_0x24cd06(0xad))!=-0x1||_0x1f1116[0x3][_0x24cd06(0x103)](_0x24cd06(0xb2))!=-0x1){_0x1f1116[0x3]=_0x1f1116[0x3][_0x24cd06(0xd5)](/\/parse$/,'');!config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x48357c][_0x1f1116[0x2]]&&(config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x48357c][_0x1f1116[0x2]]=[]);let _0x34690f=[_0x24cd06(0x117),'720p',_0x24cd06(0x104),_0x24cd06(0x88)];for(let _0x49399c=0x1;_0x49399c<=0x4;_0x49399c++){config['channelDB'][_0x5922be+'-'+_0x48357c][_0x1f1116[0x2]][_0x24cd06(0x100)](_0x1f1116[0x3]+'/'+_0x34690f[_0x49399c-0x1]);}}else _0x48357c[_0x24cd06(0xc6)](/\/parse$/)&&(_0x1f1116[0x3]=_0x1f1116[0x3]['replace'](/\/$/,''),!_0x1f1116[0x3][_0x24cd06(0xc6)](/\/parse$/)&&(_0x1f1116[0x3]=_0x1f1116[0x3]+_0x24cd06(0x93))),config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x48357c][_0x1f1116[0x2]]?config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x48357c][_0x1f1116[0x2]][_0x24cd06(0x100)](_0x1f1116[0x3]):(config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x48357c][_0x1f1116[0x2]]=[],config[_0x24cd06(0xe6)][_0x5922be+'-'+_0x48357c][_0x1f1116[0x2]]['push'](_0x1f1116[0x3]));}}}},config['fetch_interval']);}}function local_db_gsearch(_0xcfc681){const _0xefdd6d=_0x5bf905;let _0x5f2ddb=[],_0x1a59ee=new RegExp(_0xcfc681,'i');for(let _0x2f6cc4=0x0;_0x2f6cc4<config['groupDB'][_0xefdd6d(0x8a)];_0x2f6cc4++){config[_0xefdd6d(0xa8)][_0x2f6cc4][_0xefdd6d(0x86)][_0xefdd6d(0xc6)](_0x1a59ee)&&_0x5f2ddb[_0xefdd6d(0x100)]({'vod_id':config['groupDB'][_0x2f6cc4]['gname']+_0xefdd6d(0xa4)+config[_0xefdd6d(0xa8)][_0x2f6cc4][_0xefdd6d(0xe5)],'vod_name':config[_0xefdd6d(0xa8)][_0x2f6cc4][_0xefdd6d(0x86)][_0xefdd6d(0xd5)](/\/parse$/,''),'vod_pic':config['pics'][config[_0xefdd6d(0xa8)][_0x2f6cc4][_0xefdd6d(0x9b)]],'vod_remarks':config[_0xefdd6d(0xa8)][_0x2f6cc4][_0xefdd6d(0x9b)]});}return _0x5f2ddb;}function _0x1538(_0x585f5f,_0x77d97d){const _0x731b56=_0x731b();return _0x1538=function(_0x1538ee,_0x1188ac){_0x1538ee=_0x1538ee-0x80;let _0xa975b6=_0x731b56[_0x1538ee];return _0xa975b6;},_0x1538(_0x585f5f,_0x77d97d);}function local_db_csearch(_0x399f7e){const _0x444724=_0x5bf905;let _0x3f1848=[],_0x3d21ef=new RegExp(_0x399f7e,'i');for(let _0x51f39f in config[_0x444724(0xe6)]){for(let _0x48df3a in config[_0x444724(0xe6)][_0x51f39f]){_0x48df3a[_0x444724(0xc6)](_0x3d21ef)&&_0x3f1848[_0x444724(0x100)]({'vod_id':_0x48df3a+_0x444724(0x9f)+config[_0x444724(0xe6)][_0x51f39f][_0x48df3a][_0x444724(0x94)](_0x444724(0x8d)),'vod_name':_0x48df3a,'vod_pic':config['pics'][_0x51f39f[_0x444724(0xcc)]('-')[0x0]],'vod_remarks':_0x51f39f[_0x444724(0xd5)](/\/parse$/,'')});}}return _0x3f1848;}function cache_sub_db(_0x482243){const _0x3ca6ff=_0x5bf905;let _0xdbfbf5=config[_0x3ca6ff(0xfa)];_0x482243[_0x3ca6ff(0xc6)](/(gitcode.net\/ygbh66|iptv807)/)&&(_0xdbfbf5=config['headers2']);if(config[_0x3ca6ff(0xe7)][_0x482243])return config[_0x3ca6ff(0xe7)][_0x482243];let _0x299b9d=req(_0x482243,{'headers':_0xdbfbf5})['content'];return _0x299b9d&&(config[_0x3ca6ff(0xe7)][_0x482243]=_0x299b9d),_0x299b9d;}function cache_detail_db(_0xea9c31,_0x5d26a7,_0x42f948){const _0x590690=_0x5bf905;_0x5d26a7&&_0x42f948&&(config[_0x590690(0xfe)][_0xea9c31]={'vpf':_0x5d26a7,'vpu':_0x42f948});}function direct_play_youtube0(_0x40a38f){const _0x7358e7=_0x5bf905;let _0x10341f='',_0x374184='',_0x225190=req(_0x7358e7(0xac)+_0x40a38f,{'headers':config[_0x7358e7(0xfa)]})[_0x7358e7(0xf8)],_0x2bbb10=_0x588c83['load'](_0x225190),_0x45b889=_0x2bbb10('.download\x20.line:eq(0)\x20a');_0x45b889[_0x7358e7(0x10d)](function(_0x27557b){const _0xd6eb4d=_0x7358e7;let _0x66af16=_0x2bbb10(this,this)[_0xd6eb4d(0xbe)]('href');_0x66af16[_0xd6eb4d(0xc6)](_0xd6eb4d(0xe9))&&(_0x374184=_0x66af16[_0xd6eb4d(0xc6)](/https:\/\/getyoutubehd.com\/v\/(.*)/m)[0x1]);});let _0x81534f=_0x7358e7(0xd0)+_0x374184;_0x225190=req(_0x81534f,{'headers':config['headers']})['content'],_0x45b889=JSON['parse'](_0x225190),_0x45b889=_0x45b889[_0x7358e7(0x111)];for(let _0x44e89f=0x0;_0x44e89f<_0x45b889[_0x7358e7(0x8a)];_0x44e89f++){_0x45b889[_0x44e89f]['format_note']=='360p'&&(_0x10341f=_0x45b889[_0x44e89f][_0x7358e7(0xd8)]),_0x45b889[_0x44e89f][_0x7358e7(0x8f)]==_0x7358e7(0xcf)&&(_0x10341f=_0x45b889[_0x44e89f][_0x7358e7(0xd8)]);}return _0x10341f;}function direct_play_youtube1(_0x14c183){const _0x170c5b=_0x5bf905;let _0xf35ee9=_0x14c183['slice'](0x0,_0x14c183[_0x170c5b(0x102)]('/')),_0x5e1b77=_0x14c183['slice'](_0x14c183[_0x170c5b(0x102)]('/')+0x1),_0x472392='',_0x286b87=config[_0x170c5b(0xfa)];_0xf35ee9[_0x170c5b(0xc6)](/gitcode.net\/ygbh66/)&&(_0x286b87=config['headers2']);let _0x4764bd=req(_0xf35ee9,{'headers':_0x286b87})[_0x170c5b(0xf8)],_0x23a595=_0x588c83[_0x170c5b(0xca)](_0x4764bd),_0x5175f0=JSON['parse'](_0x23a595(_0x170c5b(0xc4))[_0x170c5b(0xec)]()[_0x170c5b(0xd5)]('var\x20ytInitialPlayerResponse\x20=\x20','')['replace'](/;$/,'')),_0x461c6e=_0x5175f0[_0x170c5b(0x109)]['adaptiveFormats'];return _0x461c6e['forEach'](_0x3d4f1f=>{const _0x2f09de=_0x170c5b;_0x3d4f1f['mimeType'][_0x2f09de(0xc6)](/video\/mp4/)&&(_0x3d4f1f[_0x2f09de(0x95)]==_0x5e1b77&&(_0x472392=_0x3d4f1f[_0x2f09de(0xd8)]));}),_0x472392;}function direct_play_youtube2(_0x34bb1c){const _0x25064a=_0x5bf905;let _0x2a3667=_0x34bb1c['slice'](0x0,_0x34bb1c['lastIndexOf']('/')),_0x4a3960=_0x34bb1c['slice'](_0x34bb1c[_0x25064a(0x102)]('/')+0x1),_0x2865da='',_0x44bcd6=req(_0x25064a(0xb9)+_0x2a3667+_0x25064a(0xc2),{'headers':config[_0x25064a(0xfa)]})['content'],_0x274b94=_0x588c83[_0x25064a(0xca)](_0x44bcd6),_0x3fd590=_0x274b94(_0x25064a(0xee))[_0x25064a(0xd6)](function(){const _0x1a176d=_0x25064a;return{'title':_0x274b94(_0x1a176d(0xbb),this)['attr'](_0x1a176d(0x81)),'resolution':_0x274b94(_0x1a176d(0xf3),this)[_0x1a176d(0xec)](),'url':_0x274b94(_0x1a176d(0xbb),this)['attr']('href')};})[_0x25064a(0x106)]();for(let _0x101736=0x0;_0x101736<_0x3fd590[_0x25064a(0x8a)];_0x101736++){if(_0x3fd590[_0x101736][_0x25064a(0x9e)]==_0x4a3960){_0x2865da=_0x3fd590[_0x101736][_0x25064a(0xd8)];break;}}return _0x2865da=_0x2865da[_0x25064a(0xd5)](/&title=.*/,''),_0x2865da;}function direct_play_youtube3(_0x49265d){const _0x2a5206=_0x5bf905;let _0x4a32bc=_0x49265d[_0x2a5206(0xb6)](0x0,_0x49265d[_0x2a5206(0x102)]('/')),_0x233136=_0x49265d['slice'](_0x49265d[_0x2a5206(0x102)]('/')+0x1),_0x235d09=_0x4a32bc[_0x2a5206(0xc6)](/v=(.*?)(&|$)/m)[0x1],_0x287e9d='',_0x1be557={},_0x45bf37=[],_0x40c106='',_0x40d69f=req(_0x4a32bc,{'headers':config[_0x2a5206(0xfa)]})[_0x2a5206(0xf8)];if(_0x40d69f['match'](/hlsManifestUrl/)){let _0x1096c9=_0x588c83['load'](_0x40d69f),_0x4ea075=JSON['parse'](_0x1096c9(_0x2a5206(0xc4))[_0x2a5206(0xec)]()['replace'](_0x2a5206(0xed),'')['replace'](/;$/,''));_0x40c106=_0x4ea075[_0x2a5206(0x109)][_0x2a5206(0xeb)];}else{_0x40d69f=req('https://www.y2mate.com/mates/analyzeV2/ajax',{'headers':{'Content-Type':_0x2a5206(0x9c),'user-agent':_0x2a5206(0xf0)},'method':_0x2a5206(0xd4),'body':_0x2a5206(0xa5)+_0x4a32bc+_0x2a5206(0x92)})[_0x2a5206(0xf8)],_0x40d69f=JSON[_0x2a5206(0x89)](_0x40d69f),_0x1be557=_0x40d69f[_0x2a5206(0x112)][_0x2a5206(0xfb)],_0x287e9d='';for(let _0x60a8fd in _0x1be557){if(_0x233136==_0x1be557[_0x60a8fd]['q']){_0x287e9d=_0x1be557[_0x60a8fd]['k'];break;}}_0x40d69f=req(_0x2a5206(0x80),{'headers':{'Content-Type':'application/x-www-form-urlencoded','user-agent':'okhttp/3.12.10'},'method':_0x2a5206(0xd4),'body':'vid='+_0x235d09+_0x2a5206(0xa9)+_0x287e9d})['content'],_0x40d69f=JSON['parse'](_0x40d69f),_0x40c106=_0x40d69f[_0x2a5206(0xf6)];}return console[_0x2a5206(0xaf)](_0x40c106),_0x40c106;}var m_js_1='',m_hken='',m_hkens='',m_token='';function m_decode(_0x51dd82){const _0x588952=_0x5bf905;var _0x2f7d4a=_0x588952(0xd1),_0x1f341a,_0x4693b7,_0x21e52f,_0x3ae5ca,_0x16980c,_0x14c158,_0x57a3cd,_0x2b8068,_0x162e31=0x0,_0x27ee98=0x0,_0x29c0fc='',_0x18bd20=[];if(!_0x51dd82)return _0x51dd82;_0x51dd82+='';do{_0x3ae5ca=_0x2f7d4a['indexOf'](_0x51dd82[_0x588952(0xff)](_0x162e31++)),_0x16980c=_0x2f7d4a['indexOf'](_0x51dd82[_0x588952(0xff)](_0x162e31++)),_0x14c158=_0x2f7d4a[_0x588952(0x103)](_0x51dd82[_0x588952(0xff)](_0x162e31++)),_0x57a3cd=_0x2f7d4a[_0x588952(0x103)](_0x51dd82[_0x588952(0xff)](_0x162e31++)),_0x2b8068=_0x3ae5ca<<0x12|_0x16980c<<0xc|_0x14c158<<0x6|_0x57a3cd,_0x1f341a=_0x2b8068>>0x10&0xff,_0x4693b7=_0x2b8068>>0x8&0xff,_0x21e52f=_0x2b8068&0xff,_0x14c158==0x40?_0x18bd20[_0x27ee98++]=String[_0x588952(0xb5)](_0x1f341a):_0x57a3cd==0x40?_0x18bd20[_0x27ee98++]=String['fromCharCode'](_0x1f341a,_0x4693b7):_0x18bd20[_0x27ee98++]=String[_0x588952(0xb5)](_0x1f341a,_0x4693b7,_0x21e52f);}while(_0x162e31<_0x51dd82[_0x588952(0x8a)]);return _0x29c0fc=_0x18bd20[_0x588952(0x94)](''),_0x29c0fc;}function startPlayer(_0x1db4b2,_0x2dbc45,_0x1a0dc2,_0x76a43e){const _0x4abaa6=_0x5bf905;function _0x321056(_0x3b5f76,_0x2a7d5e){const _0x30e72b=_0x1538;let _0x52dc5b=_0x9cf245(_0x3b5f76),_0x548996=_0x2a7d5e['length'],_0x18e822='';for(let _0x6421d=0x0;_0x6421d<_0x52dc5b['length'];_0x6421d++){let _0x3df938=_0x6421d%_0x548996;_0x18e822+=String[_0x30e72b(0xb5)](_0x52dc5b[_0x30e72b(0xc0)](_0x6421d)^_0x2a7d5e['charCodeAt'](_0x3df938));}let _0xc7a8d1=_0x9cf245(_0x18e822);return _0xc7a8d1;}function _0x9cf245(_0x15ee5b){const _0x422ce8=_0x1538;var _0xf5dc50=_0x422ce8(0xd1),_0x2bb610,_0x55b872,_0xbdb248,_0x37c8dd,_0x1f8357,_0x206fe9,_0x4231e5,_0x21cbb3,_0x43bbeb=0x0,_0x12fdc9=0x0,_0x2aa357='',_0x49b429=[];if(!_0x15ee5b)return _0x15ee5b;_0x15ee5b+='';do{_0x37c8dd=_0xf5dc50['indexOf'](_0x15ee5b[_0x422ce8(0xff)](_0x43bbeb++)),_0x1f8357=_0xf5dc50[_0x422ce8(0x103)](_0x15ee5b[_0x422ce8(0xff)](_0x43bbeb++)),_0x206fe9=_0xf5dc50[_0x422ce8(0x103)](_0x15ee5b[_0x422ce8(0xff)](_0x43bbeb++)),_0x4231e5=_0xf5dc50['indexOf'](_0x15ee5b[_0x422ce8(0xff)](_0x43bbeb++)),_0x21cbb3=_0x37c8dd<<0x12|_0x1f8357<<0xc|_0x206fe9<<0x6|_0x4231e5,_0x2bb610=_0x21cbb3>>0x10&0xff,_0x55b872=_0x21cbb3>>0x8&0xff,_0xbdb248=_0x21cbb3&0xff;if(_0x206fe9==0x40)_0x49b429[_0x12fdc9++]=String[_0x422ce8(0xb5)](_0x2bb610);else _0x4231e5==0x40?_0x49b429[_0x12fdc9++]=String[_0x422ce8(0xb5)](_0x2bb610,_0x55b872):_0x49b429[_0x12fdc9++]=String[_0x422ce8(0xb5)](_0x2bb610,_0x55b872,_0xbdb248);}while(_0x43bbeb<_0x15ee5b[_0x422ce8(0x8a)]);return _0x2aa357=_0x49b429[_0x422ce8(0x94)](''),_0x2aa357;}return _0x1db4b2=_0x1db4b2[_0x4abaa6(0xcc)]('')['reverse']()['join'](''),_0x1db4b2=_0x321056(_0x1db4b2,_0x2dbc45),_0x1db4b2=_0x1db4b2[_0x4abaa6(0xd5)](_0x4abaa6(0x99),'token='+_0x76a43e),_0x1db4b2=_0x1db4b2[_0x4abaa6(0xd5)](_0x4abaa6(0xaa)+_0x1a0dc2,_0x4abaa6(0xaa)+_0x76a43e),_0x1db4b2=_0x1db4b2[_0x4abaa6(0xd5)](_0x2dbc45,''),_0x1db4b2;}function m_parse_url(_0x15bb51){const _0x5a2fd0=_0x5bf905;let _0xd4463c=_0x15bb51['split'](_0x5a2fd0(0xa7))[0x0],_0x1118e5=_0x15bb51[_0x5a2fd0(0xcc)](_0x5a2fd0(0xa7))[0x1],_0x69fbd0=req(_0xd4463c,{'headers':config[_0x5a2fd0(0x105)]})[_0x5a2fd0(0xf8)],_0x409c33=_0x588c83[_0x5a2fd0(0xca)](_0x69fbd0);if(_0x1118e5>=_0x409c33(_0x5a2fd0(0xc1))[_0x5a2fd0(0x8a)])return'';let _0x2c13d0=_0x409c33(_0x5a2fd0(0xc1))['eq'](_0x1118e5)[_0x5a2fd0(0xa2)](),_0x34a5fb=_0x69fbd0[_0x5a2fd0(0xc6)](/<script>(.*?var string.*?)<\/script>/);eval(_0x34a5fb[0x1][_0x5a2fd0(0xd5)](/$/gm,_0x5a2fd0(0x8e)));var _0x470228=_0x5a2fd0(0xdf);m_js_1=m_decode(m_js_1);let _0x3799e5=_0x470228[_0x5a2fd0(0x8a)],_0x2a1356='';for(let _0x32d53d=0x0;_0x32d53d<m_js_1[_0x5a2fd0(0x8a)];_0x32d53d++){let _0x26de2c=_0x32d53d%_0x3799e5;_0x2a1356+=String[_0x5a2fd0(0xb5)](m_js_1['charCodeAt'](_0x32d53d)^_0x470228[_0x5a2fd0(0xc0)](_0x26de2c));}var _0x4c66f7=m_decode(_0x2a1356);_0x4c66f7=unescape(_0x4c66f7),_0x4c66f7=_0x4c66f7[_0x5a2fd0(0xc6)](/<script>(var.*?)<\/script>/)[0x1],_0x4c66f7=_0x4c66f7['replace'](/$/gm,_0x5a2fd0(0xf2)),eval(_0x4c66f7);let _0x6a4fd4=startPlayer(_0x2c13d0,m_hken,m_hkens,m_token);return _0x6a4fd4;}__JS_SPIDER__={'init':init,'home':home,'homeVod':homeVod,'category':category,'detail':detail,'play':play,'search':search};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,534 @@
|
||||
/**
|
||||
* live2cms.js
|
||||
* 配置设置 {"key":"Live2CMS","name":"直播转点播V2","type":3,"api":"{{host}}/libs/live2cms.js","searchable":2,"quickSearch":0,"filterable":0,"ext":"{{host}}/txt/json/live2mv_data.json"}
|
||||
* live2mv_data.json
|
||||
* 支持m3u类直播,支持线路归并。支持筛选切换显示模式
|
||||
[
|
||||
{"name": "甜蜜", "url": "http://zdir.kebedd69.repl.co/public/live.txt"},
|
||||
{"name": "俊于", "url": "http://home.jundie.top:81/Cat/tv/live.txt"},
|
||||
{"name": "菜妮丝", "url": "http://xn--ihqu10cn4c.xn--z7x900a.love:63/TV/tvzb.txt"},
|
||||
{"name": "布里m3u", "url": "http://jiexi.bulisite.top/m3u.php"},
|
||||
{"name": "吾爱", "url": "http://52bsj.vip:81/api/v3/file/get/763/live.txt?sign=87BTGT1_6AOry7FPwy_uuxFTv2Wcb9aDMj46rDdRTD8%3D%3A0"},
|
||||
{"name": "饭太硬", "url": "http://ftyyy.tk/live.txt"}
|
||||
]
|
||||
|
||||
* 提示 ext文件格式为json列表,name,url参数
|
||||
* 取消加密,减少性能问题
|
||||
*/
|
||||
String.prototype.rstrip = function (chars) {
|
||||
let regex = new RegExp(chars + "$");
|
||||
return this.replace(regex, "");
|
||||
};
|
||||
const request_timeout = 5000;
|
||||
const RKEY = 'live2cms'; // 源的唯一标识
|
||||
const VERSION = 'live2cms 20230619';
|
||||
const UA = 'Mozilla/5.0'; //默认请求ua
|
||||
const __ext = {data_dict:{}};
|
||||
const tips = `\n道长直播转点播js-当前版本${VERSION}`;
|
||||
const def_pic = 'https://avatars.githubusercontent.com/u/97389433?s=120&v=4';
|
||||
|
||||
/**
|
||||
* 存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
*/
|
||||
function setItem(k,v){
|
||||
local.set(RKEY,k,v);
|
||||
console.log(`规则${RKEY}设置${k} => ${v}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库配置表对应的key字段的value,没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
* @returns {*}
|
||||
*/
|
||||
function getItem(k,v){
|
||||
return local.get(RKEY,k) || v;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据库key对应的一条数据,并清除此key对应的内存缓存
|
||||
* @param k
|
||||
*/
|
||||
function clearItem(k){
|
||||
local.delete(RKEY,k);
|
||||
}
|
||||
|
||||
var showMode = getItem('showMode','groups'); // groups按组分类显示 all全部一条线路展示
|
||||
var groupDict = JSON.parse(getItem('groupDict','{}')); // 搜索分组字典
|
||||
|
||||
/**
|
||||
* 打印日志
|
||||
* @param any 任意变量
|
||||
*/
|
||||
function print(any){
|
||||
any = any||'';
|
||||
if(typeof(any)=='object'&&Object.keys(any).length>0){
|
||||
try {
|
||||
any = JSON.stringify(any);
|
||||
console.log(any);
|
||||
}catch (e) {
|
||||
// console.log('print:'+e.message);
|
||||
console.log(typeof(any)+':'+any.length);
|
||||
}
|
||||
}else if(typeof(any)=='object'&&Object.keys(any).length<1){
|
||||
console.log('null object');
|
||||
}else{
|
||||
console.log(any);
|
||||
}
|
||||
}
|
||||
|
||||
/*** js自封装的方法 ***/
|
||||
|
||||
/**
|
||||
* 获取链接的host(带http协议的完整链接)
|
||||
* @param url 任意一个正常完整的Url,自动提取根
|
||||
* @returns {string}
|
||||
*/
|
||||
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
|
||||
}
|
||||
|
||||
/**
|
||||
* m3u直播格式转一般直播格式
|
||||
* @param m3u
|
||||
* @returns {string}
|
||||
*/
|
||||
function convertM3uToNormal(m3u) {
|
||||
try {
|
||||
const lines = m3u.split('\n');
|
||||
let result = '';
|
||||
let TV='';
|
||||
// let flag='#genre#';
|
||||
let flag='#m3u#';
|
||||
let currentGroupTitle = '';
|
||||
lines.forEach((line) => {
|
||||
if (line.startsWith('#EXTINF:')) {
|
||||
const groupTitle = line.split('"')[1].trim();
|
||||
TV= line.split('"')[2].substring(1);
|
||||
if (currentGroupTitle !== groupTitle) {
|
||||
currentGroupTitle = groupTitle;
|
||||
result += `\n${currentGroupTitle},${flag}\n`;
|
||||
}
|
||||
} else if (line.startsWith('http')) {
|
||||
const splitLine = line.split(',');
|
||||
result += `${TV}\,${splitLine[0]}\n`;
|
||||
}
|
||||
});
|
||||
return result.trim();
|
||||
}catch (e) {
|
||||
print(`m3u直播转普通直播发生错误:${e.message}`);
|
||||
return m3u
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 线路归类
|
||||
* @param arr
|
||||
* @returns {*[][]}
|
||||
*/
|
||||
function merge(arr) {
|
||||
var parse = arguments[1] ? arguments[1] : '';
|
||||
var p = [];
|
||||
if (parse !== '' && typeof(parse)=="function") {
|
||||
p = arr.map(parse);
|
||||
}
|
||||
const createEmptyArrays = (length) => Array.from({
|
||||
length
|
||||
}, () => []);
|
||||
let lists = createEmptyArrays(arr.length);
|
||||
let sl = createEmptyArrays(arr.length);
|
||||
(p.length ? p : arr).forEach((k, index) => {
|
||||
var i = 0;
|
||||
while (sl[i].includes(k)) {
|
||||
i = i + 1
|
||||
}
|
||||
sl[i].push(k);
|
||||
lists[i].push(arr[index]);
|
||||
})
|
||||
lists=lists.filter(x=>x.some(k=>k.length));
|
||||
return lists
|
||||
}
|
||||
|
||||
/**
|
||||
* 线路归类/小棉袄算法
|
||||
* @param arr 数组
|
||||
* @param parse 解析式
|
||||
* @returns {[[*]]}
|
||||
*/
|
||||
function splitArray(arr,parse) {
|
||||
parse = parse&&typeof(parse)=='function'?parse:'';
|
||||
let result = [[arr[0]]];
|
||||
for (let i = 1; i < arr.length; i++) {
|
||||
let index = -1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
if (parse&&result[j].map(parse).includes(parse(arr[i]))) {
|
||||
index = j;
|
||||
}else if((!parse) && result[j].includes(arr[i])){
|
||||
index = j;
|
||||
}
|
||||
}
|
||||
if (index >= result.length - 1) {
|
||||
result.push([]);
|
||||
result[result.length - 1].push(arr[i]);
|
||||
} else {
|
||||
result[index + 1].push(arr[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 搜索结果生成分组字典
|
||||
* @param arr
|
||||
* @param parse x=>x.split(',')[0]
|
||||
* @returns {{}}
|
||||
*/
|
||||
function gen_group_dict(arr,parse){
|
||||
let dict = {};
|
||||
arr.forEach((it)=>{
|
||||
let k = it.split(',')[0];
|
||||
if(parse && typeof(parse)==='function'){
|
||||
k = parse(k);
|
||||
}
|
||||
if(!dict[k]){
|
||||
dict[k] = [it]
|
||||
}else{
|
||||
dict[k].push(it);
|
||||
}
|
||||
});
|
||||
return dict
|
||||
}
|
||||
|
||||
const http = function (url, options = {}) {
|
||||
if(options.method ==='POST' && options.data){
|
||||
options.body = JSON.stringify(options.data);
|
||||
options.headers = Object.assign({'content-type':'application/json'}, options.headers);
|
||||
}
|
||||
options.timeout = request_timeout;
|
||||
if(!options.headers){
|
||||
options.headers = {};
|
||||
}
|
||||
let keys = Object.keys(options.headers).map(it=>it.toLowerCase());
|
||||
if(!keys.includes('referer')){
|
||||
options.headers['Referer'] = getHome(url);
|
||||
}
|
||||
if(!keys.includes('user-agent')){
|
||||
options.headers['User-Agent'] = UA;
|
||||
}
|
||||
console.log(JSON.stringify(options.headers));
|
||||
try {
|
||||
const res = req(url, options);
|
||||
// if(options.headers['Authorization']){
|
||||
// console.log(res.content);
|
||||
// }
|
||||
res.json = () => res&&res.content ? JSON.parse(res.content) : null;
|
||||
res.text = () => res&&res.content ? res.content:'';
|
||||
return res
|
||||
}catch (e) {
|
||||
return {
|
||||
json() {
|
||||
return null
|
||||
}, text() {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
["get", "post"].forEach(method => {
|
||||
http[method] = function (url, options = {}) {
|
||||
return http(url, Object.assign(options, {method: method.toUpperCase()}));
|
||||
}
|
||||
});
|
||||
|
||||
function init(ext) {
|
||||
console.log("当前版本号:"+VERSION);
|
||||
let data;
|
||||
if (typeof ext == 'object'){
|
||||
data = ext;
|
||||
print('live ext:object');
|
||||
} else if (typeof ext == 'string') {
|
||||
if (ext.startsWith('http')) {
|
||||
let ext_paramas = ext.split(';');
|
||||
let data_url = ext_paramas[0];
|
||||
print(data_url);
|
||||
data = http.get(data_url).json();
|
||||
}
|
||||
}
|
||||
print(data);
|
||||
__ext.data = data;
|
||||
print('init执行完毕');
|
||||
}
|
||||
|
||||
function home(filter) {
|
||||
let classes = __ext.data.map(it => ({
|
||||
type_id: it.url,
|
||||
type_name: it.name,
|
||||
}));
|
||||
print("----home----");
|
||||
let filter_dict = {};
|
||||
let filters = [
|
||||
{'key': 'show', 'name': '播放展示', 'value': [{'n': '多线路分组', 'v': 'groups'},{'n': '单线路', 'v': 'all'}]}
|
||||
];
|
||||
classes.forEach(it=>{
|
||||
filter_dict[it.type_id] = filters;
|
||||
});
|
||||
print(classes);
|
||||
return JSON.stringify({ 'class': classes,'filters': filter_dict});
|
||||
}
|
||||
|
||||
function homeVod(params) {
|
||||
let _get_url = __ext.data[0].url;
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
// let arr = html.match(/.*?,#[\s\S].*?#/g);
|
||||
let arr = html.match(/.*?[,,]#[\s\S].*?#/g); // 可能存在中文逗号
|
||||
let _list = [];
|
||||
try {
|
||||
arr.forEach(it=>{
|
||||
let vname = it.split(/[,,]/)[0];
|
||||
let vtab = it.match(/#(.*?)#/)[0];
|
||||
_list.push({
|
||||
vod_name:vname,
|
||||
vod_id:_get_url+'$'+vname,
|
||||
vod_pic:def_pic,
|
||||
vod_remarks:vtab,
|
||||
});
|
||||
});
|
||||
}catch (e) {
|
||||
print('Live2cms获取首页推荐发送错误:'+e.message);
|
||||
}
|
||||
return JSON.stringify({ 'list': _list });
|
||||
}
|
||||
|
||||
function category(tid, pg, filter, extend) {
|
||||
let fl = filter?extend:{};
|
||||
if(fl.show){
|
||||
showMode = fl.show;
|
||||
setItem('showMode',showMode);
|
||||
}
|
||||
if(parseInt(pg)>1){
|
||||
return JSON.stringify({
|
||||
'list': [],
|
||||
});
|
||||
}
|
||||
let _get_url = tid;
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
// let arr = html.match(/.*?[,,]#[\s\S].*?#/g);
|
||||
let arr = html.match(/.*?[,,]#[\s\S].*?#/g); // 可能存在中文逗号
|
||||
let _list = [];
|
||||
try {
|
||||
arr.forEach(it=>{
|
||||
let vname = it.split(/[,,]/)[0];
|
||||
let vtab = it.match(/#(.*?)#/)[0];
|
||||
_list.push({
|
||||
// vod_name:it.split(',')[0],
|
||||
vod_name:vname,
|
||||
vod_id:_get_url+'$'+vname,
|
||||
vod_pic:def_pic,
|
||||
vod_remarks:vtab,
|
||||
});
|
||||
});
|
||||
}catch (e) {
|
||||
print('Live2cms获取一级分类页发生错误:'+e.message);
|
||||
}
|
||||
|
||||
return JSON.stringify({
|
||||
'page': 1,
|
||||
'pagecount': 1,
|
||||
'limit': _list.length,
|
||||
'total': _list.length,
|
||||
'list': _list,
|
||||
});
|
||||
}
|
||||
|
||||
function detail(tid) { // ⛵ 港•澳•台
|
||||
let _get_url = tid.split('$')[0];
|
||||
let _tab = tid.split('$')[1];
|
||||
if(tid.includes('#search#')){
|
||||
let vod_name = _tab.replace('#search#','');
|
||||
let vod_play_from = '来自搜索';
|
||||
vod_play_from+=`:${_get_url}`;
|
||||
|
||||
// let vod_play_url = vod_name+'$'+_get_url;
|
||||
// print(vod_play_url);
|
||||
|
||||
let vod_play_url = groupDict[_get_url].map(x=>x.replace(',','$')).join('#');
|
||||
|
||||
return JSON.stringify({
|
||||
list: [{
|
||||
vod_id: tid,
|
||||
vod_name: '搜索:'+vod_name,
|
||||
type_name: "直播列表",
|
||||
vod_pic: def_pic,
|
||||
vod_content: tid,
|
||||
vod_play_from: vod_play_from,
|
||||
vod_play_url: vod_play_url,
|
||||
vod_director: tips,
|
||||
vod_remarks: `道长直播转点播js-当前版本${VERSION}`,
|
||||
}]
|
||||
});
|
||||
}
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
// let a = new RegExp(`.*?${_tab},#[\\s\\S].*?#`);
|
||||
let a = new RegExp(`.*?${_tab.replace('(','\\(').replace(')','\\)')}[,,]#[\\s\\S].*?#`);
|
||||
let b = html.match(a)[0];
|
||||
let c = html.split(b)[1];
|
||||
if(c.match(/.*?[,,]#[\s\S].*?#/)){
|
||||
let d = c.match(/.*?[,,]#[\s\S].*?#/)[0];
|
||||
c = c.split(d)[0];
|
||||
}
|
||||
let arr = c.trim().split('\n');
|
||||
let _list = [];
|
||||
arr.forEach((it)=>{
|
||||
if(it.trim()){
|
||||
let t = it.trim().split(',')[0];
|
||||
let u = it.trim().split(',')[1];
|
||||
_list.push(t+'$'+u);
|
||||
}
|
||||
});
|
||||
|
||||
let vod_name = __ext.data.find(x=>x.url===_get_url).name;
|
||||
let vod_play_url;
|
||||
let vod_play_from;
|
||||
|
||||
if(showMode==='groups'){
|
||||
let groups = splitArray(_list,x=>x.split('$')[0]);
|
||||
let tabs = [];
|
||||
for(let i=0;i<groups.length;i++){
|
||||
if(i===0){
|
||||
tabs.push(vod_name+'1')
|
||||
}else{
|
||||
tabs.push(` ${i+1} `)
|
||||
}
|
||||
}
|
||||
vod_play_url = groups.map(it=>it.join('#')).join('$$$');
|
||||
vod_play_from = tabs.join('$$$');
|
||||
}else{
|
||||
vod_play_url = _list.join('#');
|
||||
vod_play_from = vod_name;
|
||||
}
|
||||
let vod = {
|
||||
vod_id: tid,
|
||||
vod_name: vod_name+'|'+_tab,
|
||||
type_name: "直播列表",
|
||||
vod_pic: def_pic,
|
||||
vod_content: tid,
|
||||
vod_play_from: vod_play_from,
|
||||
vod_play_url: vod_play_url,
|
||||
vod_director: tips,
|
||||
vod_remarks: `道长直播转点播js-当前版本${VERSION}`,
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
list: [vod]
|
||||
});
|
||||
}
|
||||
|
||||
function play(flag, id, flags) {
|
||||
let vod = {
|
||||
'parse': /m3u8/.test(id)?0:1,
|
||||
'playUrl': '',
|
||||
'url': id
|
||||
};
|
||||
print(vod);
|
||||
return JSON.stringify(vod);
|
||||
}
|
||||
|
||||
function search(wd, quick) {
|
||||
let _get_url = __ext.data[0].url;
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
let str='';
|
||||
Object.keys(__ext.data_dict).forEach(()=>{
|
||||
str+=__ext.data_dict[_get_url];
|
||||
});
|
||||
let links = str.split('\n').filter(it=>it.trim() && it.includes(',') && it.split(',')[1].trim().startsWith('http'));
|
||||
links = links.map(it=>it.trim());
|
||||
let plays = Array.from(new Set(links));
|
||||
print('搜索关键词:'+wd);
|
||||
print('过滤前:'+plays.length);
|
||||
plays = plays.filter(it=>it.includes(wd));
|
||||
print('过滤后:'+plays.length);
|
||||
print(plays);
|
||||
let new_group = gen_group_dict(plays);
|
||||
groupDict = Object.assign(groupDict,new_group);
|
||||
// 搜索分组结果存至本地方便二级调用
|
||||
setItem('groupDict',JSON.stringify(groupDict));
|
||||
let _list = [];
|
||||
|
||||
|
||||
// plays.forEach((it)=>{
|
||||
// _list.push({
|
||||
// 'vod_name':it.split(',')[0],
|
||||
// 'vod_id':it.split(',')[1].trim()+'$'+it.split(',')[0].trim()+'#search#',
|
||||
// 'vod_pic':def_pic,
|
||||
// })
|
||||
// });
|
||||
|
||||
Object.keys(groupDict).forEach((it)=>{
|
||||
_list.push({
|
||||
'vod_name':it,
|
||||
'vod_id':it+'$'+wd+'#search#',
|
||||
'vod_pic':def_pic,
|
||||
});
|
||||
});
|
||||
return JSON.stringify({
|
||||
'list': _list
|
||||
});
|
||||
}
|
||||
|
||||
// 导出函数对象
|
||||
export default {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{"name":"太阳","url":"http://111.67.196.181/zhibo.txt"},
|
||||
{"name":"直播","url":"https://qu.ax/bGLO.txt"},
|
||||
{"name":"000","url":"https://xhdwc.tk/tvlive.txt"},
|
||||
{"name":"微笑","url":"https://agit.ai/Yoursmile7/TVBox/raw/branch/master/live.txt"}
|
||||
]
|
||||
@@ -0,0 +1,138 @@
|
||||
const peq = new Uint32Array(0x10000);
|
||||
const myers_32 = (a, b) => {
|
||||
const n = a.length;
|
||||
const m = b.length;
|
||||
const lst = 1 << (n - 1);
|
||||
let pv = -1;
|
||||
let mv = 0;
|
||||
let sc = n;
|
||||
let i = n;
|
||||
while (i--) {
|
||||
peq[a.charCodeAt(i)] |= 1 << i;
|
||||
}
|
||||
for (i = 0; i < m; i++) {
|
||||
let eq = peq[b.charCodeAt(i)];
|
||||
const xv = eq | mv;
|
||||
eq |= ((eq & pv) + pv) ^ pv;
|
||||
mv |= ~(eq | pv);
|
||||
pv &= eq;
|
||||
if (mv & lst) {
|
||||
sc++;
|
||||
}
|
||||
if (pv & lst) {
|
||||
sc--;
|
||||
}
|
||||
mv = (mv << 1) | 1;
|
||||
pv = (pv << 1) | ~(xv | mv);
|
||||
mv &= xv;
|
||||
}
|
||||
i = n;
|
||||
while (i--) {
|
||||
peq[a.charCodeAt(i)] = 0;
|
||||
}
|
||||
return sc;
|
||||
};
|
||||
const myers_x = (b, a) => {
|
||||
const n = a.length;
|
||||
const m = b.length;
|
||||
const mhc = [];
|
||||
const phc = [];
|
||||
const hsize = Math.ceil(n / 32);
|
||||
const vsize = Math.ceil(m / 32);
|
||||
for (let i = 0; i < hsize; i++) {
|
||||
phc[i] = -1;
|
||||
mhc[i] = 0;
|
||||
}
|
||||
let j = 0;
|
||||
for (; j < vsize - 1; j++) {
|
||||
let mv = 0;
|
||||
let pv = -1;
|
||||
const start = j * 32;
|
||||
const vlen = Math.min(32, m) + start;
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] |= 1 << k;
|
||||
}
|
||||
for (let i = 0; i < n; i++) {
|
||||
const eq = peq[a.charCodeAt(i)];
|
||||
const pb = (phc[(i / 32) | 0] >>> i) & 1;
|
||||
const mb = (mhc[(i / 32) | 0] >>> i) & 1;
|
||||
const xv = eq | mv;
|
||||
const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
|
||||
let ph = mv | ~(xh | pv);
|
||||
let mh = pv & xh;
|
||||
if ((ph >>> 31) ^ pb) {
|
||||
phc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
if ((mh >>> 31) ^ mb) {
|
||||
mhc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
ph = (ph << 1) | pb;
|
||||
mh = (mh << 1) | mb;
|
||||
pv = mh | ~(xv | ph);
|
||||
mv = ph & xv;
|
||||
}
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] = 0;
|
||||
}
|
||||
}
|
||||
let mv = 0;
|
||||
let pv = -1;
|
||||
const start = j * 32;
|
||||
const vlen = Math.min(32, m - start) + start;
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] |= 1 << k;
|
||||
}
|
||||
let score = m;
|
||||
for (let i = 0; i < n; i++) {
|
||||
const eq = peq[a.charCodeAt(i)];
|
||||
const pb = (phc[(i / 32) | 0] >>> i) & 1;
|
||||
const mb = (mhc[(i / 32) | 0] >>> i) & 1;
|
||||
const xv = eq | mv;
|
||||
const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
|
||||
let ph = mv | ~(xh | pv);
|
||||
let mh = pv & xh;
|
||||
score += (ph >>> (m - 1)) & 1;
|
||||
score -= (mh >>> (m - 1)) & 1;
|
||||
if ((ph >>> 31) ^ pb) {
|
||||
phc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
if ((mh >>> 31) ^ mb) {
|
||||
mhc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
ph = (ph << 1) | pb;
|
||||
mh = (mh << 1) | mb;
|
||||
pv = mh | ~(xv | ph);
|
||||
mv = ph & xv;
|
||||
}
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] = 0;
|
||||
}
|
||||
return score;
|
||||
};
|
||||
const distance = (a, b) => {
|
||||
if (a.length < b.length) {
|
||||
const tmp = b;
|
||||
b = a;
|
||||
a = tmp;
|
||||
}
|
||||
if (b.length === 0) {
|
||||
return a.length;
|
||||
}
|
||||
if (a.length <= 32) {
|
||||
return myers_32(a, b);
|
||||
}
|
||||
return myers_x(a, b);
|
||||
};
|
||||
const closest = (str, arr) => {
|
||||
let min_distance = Infinity;
|
||||
let min_index = 0;
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
const dist = distance(str, arr[i]);
|
||||
if (dist < min_distance) {
|
||||
min_distance = dist;
|
||||
min_index = i;
|
||||
}
|
||||
}
|
||||
return arr[min_index];
|
||||
};
|
||||
export { closest, distance };
|
||||
@@ -0,0 +1,178 @@
|
||||
var strChineseFirstPY = "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY";
|
||||
//此处收录了375个多音字
|
||||
var oMultiDiff = { "19969": "DZ", "19975": "WM", "19988": "QJ", "20048": "YL", "20056": "SC", "20060": "NM", "20094": "QG", "20127": "QJ", "20167": "QC", "20193": "YG", "20250": "KH", "20256": "ZC", "20282": "SC", "20285": "QJG", "20291": "TD", "20314": "YD", "20340": "NE", "20375": "TD", "20389": "YJ", "20391": "CZ", "20415": "PB", "20446": "YS", "20447": "SQ", "20504": "TC", "20608": "KG", "20854": "QJ", "20857": "ZC", "20911": "PF", "20504": "TC", "20608": "KG", "20854": "QJ", "20857": "ZC", "20911": "PF", "20985": "AW", "21032": "PB", "21048": "XQ", "21049": "SC", "21089": "YS", "21119": "JC", "21242": "SB", "21273": "SC", "21305": "YP", "21306": "QO", "21330": "ZC", "21333": "SDC", "21345": "QK", "21378": "CA", "21397": "SC", "21414": "XS", "21442": "SC", "21477": "JG", "21480": "TD", "21484": "ZS", "21494": "YX", "21505": "YX", "21512": "HG", "21523": "XH", "21537": "PB", "21542": "PF", "21549": "KH", "21571": "E", "21574": "DA", "21588": "TD", "21589": "O", "21618": "ZC", "21621": "KHA", "21632": "ZJ", "21654": "KG", "21679": "LKG", "21683": "KH", "21710": "A", "21719": "YH", "21734": "WOE", "21769": "A", "21780": "WN", "21804": "XH", "21834": "A", "21899": "ZD", "21903": "RN", "21908": "WO", "21939": "ZC", "21956": "SA", "21964": "YA", "21970": "TD", "22003": "A", "22031": "JG", "22040": "XS", "22060": "ZC", "22066": "ZC", "22079": "MH", "22129": "XJ", "22179": "XA", "22237": "NJ", "22244": "TD", "22280": "JQ", "22300": "YH", "22313": "XW", "22331": "YQ", "22343": "YJ", "22351": "PH", "22395": "DC", "22412": "TD", "22484": "PB", "22500": "PB", "22534": "ZD", "22549": "DH", "22561": "PB", "22612": "TD", "22771": "KQ", "22831": "HB", "22841": "JG", "22855": "QJ", "22865": "XQ", "23013": "ML", "23081": "WM", "23487": "SX", "23558": "QJ", "23561": "YW", "23586": "YW", "23614": "YW", "23615": "SN", "23631": "PB", "23646": "ZS", "23663": "ZT", "23673": "YG", "23762": "TD", "23769": "ZS", "23780": "QJ", "23884": "QK", "24055": "XH", "24113": "DC", "24162": "ZC", "24191": "GA", "24273": "QJ", "24324": "NL", "24377": "TD", "24378": "QJ", "24439": "PF", "24554": "ZS", "24683": "TD", "24694": "WE", "24733": "LK", "24925": "TN", "25094": "ZG", "25100": "XQ", "25103": "XH", "25153": "PB", "25170": "PB", "25179": "KG", "25203": "PB", "25240": "ZS", "25282": "FB", "25303": "NA", "25324": "KG", "25341": "ZY", "25373": "WZ", "25375": "XJ", "25384": "A", "25457": "A", "25528": "SD", "25530": "SC", "25552": "TD", "25774": "ZC", "25874": "ZC", "26044": "YW", "26080": "WM", "26292": "PB", "26333": "PB", "26355": "ZY", "26366": "CZ", "26397": "ZC", "26399": "QJ", "26415": "ZS", "26451": "SB", "26526": "ZC", "26552": "JG", "26561": "TD", "26588": "JG", "26597": "CZ", "26629": "ZS", "26638": "YL", "26646": "XQ", "26653": "KG", "26657": "XJ", "26727": "HG", "26894": "ZC", "26937": "ZS", "26946": "ZC", "26999": "KJ", "27099": "KJ", "27449": "YQ", "27481": "XS", "27542": "ZS", "27663": "ZS", "27748": "TS", "27784": "SC", "27788": "ZD", "27795": "TD", "27812": "O", "27850": "PB", "27852": "MB", "27895": "SL", "27898": "PL", "27973": "QJ", "27981": "KH", "27986": "HX", "27994": "XJ", "28044": "YC", "28065": "WG", "28177": "SM", "28267": "QJ", "28291": "KH", "28337": "ZQ", "28463": "TL", "28548": "DC", "28601": "TD", "28689": "PB", "28805": "JG", "28820": "QG", "28846": "PB", "28952": "TD", "28975": "ZC", "29100": "A", "29325": "QJ", "29575": "SL", "29602": "FB", "30010": "TD", "30044": "CX", "30058": "PF", "30091": "YSP", "30111": "YN", "30229": "XJ", "30427": "SC", "30465": "SX", "30631": "YQ", "30655": "QJ", "30684": "QJG", "30707": "SD", "30729": "XH", "30796": "LG", "30917": "PB", "31074": "NM", "31085": "JZ", "31109": "SC", "31181": "ZC", "31192": "MLB", "31293": "JQ", "31400": "YX", "31584": "YJ", "31896": "ZN", "31909": "ZY", "31995": "XJ", "32321": "PF", "32327": "ZY", "32418": "HG", "32420": "XQ", "32421": "HG", "32438": "LG", "32473": "GJ", "32488": "TD", "32521": "QJ", "32527": "PB", "32562": "ZSQ", "32564": "JZ", "32735": "ZD", "32793": "PB", "33071": "PF", "33098": "XL", "33100": "YA", "33152": "PB", "33261": "CX", "33324": "BP", "33333": "TD", "33406": "YA", "33426": "WM", "33432": "PB", "33445": "JG", "33486": "ZN", "33493": "TS", "33507": "QJ", "33540": "QJ", "33544": "ZC", "33564": "XQ", "33617": "YT", "33632": "QJ", "33636": "XH", "33637": "YX", "33694": "WG", "33705": "PF", "33728": "YW", "33882": "SR", "34067": "WM", "34074": "YW", "34121": "QJ", "34255": "ZC", "34259": "XL", "34425": "JH", "34430": "XH", "34485": "KH", "34503": "YS", "34532": "HG", "34552": "XS", "34558": "YE", "34593": "ZL", "34660": "YQ", "34892": "XH", "34928": "SC", "34999": "QJ", "35048": "PB", "35059": "SC", "35098": "ZC", "35203": "TQ", "35265": "JX", "35299": "JX", "35782": "SZ", "35828": "YS", "35830": "E", "35843": "TD", "35895": "YG", "35977": "MH", "36158": "JG", "36228": "QJ", "36426": "XQ", "36466": "DC", "36710": "JC", "36711": "ZYG", "36767": "PB", "36866": "SK", "36951": "YW", "37034": "YX", "37063": "XH", "37218": "ZC", "37325": "ZC", "38063": "PB", "38079": "TD", "38085": "QY", "38107": "DC", "38116": "TD", "38123": "YD", "38224": "HG", "38241": "XTC", "38271": "ZC", "38415": "YE", "38426": "KH", "38461": "YD", "38463": "AE", "38466": "PB", "38477": "XJ", "38518": "YT", "38551": "WK", "38585": "ZC", "38704": "XS", "38739": "LJ", "38761": "GJ", "38808": "SQ", "39048": "JG", "39049": "XJ", "39052": "HG", "39076": "CZ", "39271": "XT", "39534": "TD", "39552": "TD", "39584": "PB", "39647": "SB", "39730": "LG", "39748": "TPB", "40109": "ZQ", "40479": "ND", "40516": "HG", "40536": "HG", "40583": "QJ", "40765": "YQ", "40784": "QJ", "40840": "YK", "40863": "QJG" };
|
||||
|
||||
|
||||
function checkCh(ch) {
|
||||
var uni = ch.charCodeAt(0);
|
||||
//如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
|
||||
if (uni > 40869 || uni < 19968)
|
||||
return ch; //dealWithOthers(ch);
|
||||
//检查是否是多音字,是按多音字处理,不是就直接在strChineseFirstPY字符串中找对应的首字母
|
||||
return (oMultiDiff[uni] ? oMultiDiff[uni] : (strChineseFirstPY.charAt(uni - 19968)));
|
||||
}
|
||||
|
||||
function mkRslt(arr) {
|
||||
var arrRslt = [""];
|
||||
for (var i = 0, len = arr.length; i < len; i++) {
|
||||
var str = arr[i];
|
||||
var strlen = str.length;
|
||||
if (strlen == 1) {
|
||||
for (var k = 0; k < arrRslt.length; k++) {
|
||||
arrRslt[k] += str;
|
||||
}
|
||||
} else {
|
||||
var tmpArr = arrRslt.slice(0);
|
||||
arrRslt = [];
|
||||
for (k = 0; k < strlen; k++) {
|
||||
//复制一个相同的arrRslt
|
||||
var tmp = tmpArr.slice(0);
|
||||
//把当前字符str[k]添加到每个元素末尾
|
||||
for (var j = 0; j < tmp.length; j++) {
|
||||
tmp[j] += str.charAt(k);
|
||||
}
|
||||
//把复制并修改后的数组连接到arrRslt上
|
||||
arrRslt = arrRslt.concat(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
return arrRslt;
|
||||
}
|
||||
//两端去空格函数
|
||||
String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }
|
||||
|
||||
//参数——中文字符串
|
||||
//返回值——拼音首字母串数组
|
||||
export function getFirstLetterList(str) {
|
||||
if (typeof(str) != "string")
|
||||
throw new Error(-1, "请传入字符串类型的参数!");
|
||||
var arrResult = new Array(); //保存中间结果的数组
|
||||
for (var i = 0, len = str.length; i < len; i++) {
|
||||
//获得unicode码
|
||||
var ch = str.charAt(i);
|
||||
//检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理
|
||||
arrResult.push(checkCh(ch));
|
||||
}
|
||||
//处理arrResult,返回所有可能的拼音首字母串数组
|
||||
return mkRslt(arrResult);
|
||||
}
|
||||
|
||||
// 判断字符串是否全是中文
|
||||
function isAllChinese(str) {
|
||||
return /^[\u4E00-\u9FA5]+$/.test(str);
|
||||
}
|
||||
|
||||
// 判断字符是否为中文
|
||||
function isChinese(char) {
|
||||
return /^[\u4E00-\u9FA5]$/.test(char);
|
||||
}
|
||||
|
||||
// 中文拼音名称排序
|
||||
export const sortListByCN = (vodList,key,order) => {
|
||||
if(!key){
|
||||
return vodList
|
||||
}
|
||||
order = order||'asc'; // 默认正序
|
||||
let ASCarr = vodList.sort((a, b) => {
|
||||
a = a[key];
|
||||
b = b[key];
|
||||
// 数字排在字符串前面
|
||||
if (typeof a === 'number' && typeof b === 'string') {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (typeof a === 'string' && typeof b === 'number') {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 当存在非数字时
|
||||
if (isNaN(a) || isNaN(b)) {
|
||||
|
||||
// 全汉字的排在非全汉字的后面
|
||||
if (isAllChinese(a) && !isAllChinese(b)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!isAllChinese(a) && isAllChinese(b)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 存在非数字的数据时,都转为字符串进行比较
|
||||
a = a.toString();
|
||||
b = b.toString();
|
||||
|
||||
let result = 0;
|
||||
|
||||
// 依次比较两个字符串的各项字符
|
||||
for (let index = 0; index < ((a.length - b.length) ? b.length : a.length); index++) {
|
||||
|
||||
// 汉字排在非汉字的后面
|
||||
if (!isChinese(a[index]) && isChinese(b[index])) {
|
||||
result = -1;
|
||||
}
|
||||
|
||||
if (isChinese(a[index]) && !isChinese(b[index])) {
|
||||
result = 1;
|
||||
}
|
||||
|
||||
// 若两个汉字进行比较,则比较他们的拼音首字母
|
||||
if (isChinese(a[index]) && isChinese(b[index])) {
|
||||
let pinyinA = getFirstLetterList(a[index]).toString();
|
||||
let pinyinB = getFirstLetterList(b[index]).toString();
|
||||
|
||||
result = pinyinA.localeCompare(pinyinB, 'zh-Hans-CN', { sensitivity: 'accent' });
|
||||
}
|
||||
|
||||
// 若已经比较出结果,则跳出循环,不再继续比较剩余字符
|
||||
if (result !== 0) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// 只要有一个无法转换为数字——转换为字符串进行比较——先按字符排序,然后按照数字排序
|
||||
return result || a.toString().localeCompare(b.toString(), 'zh-Hans-CN', { sensitivity: 'accent' });
|
||||
} else {
|
||||
// 都能转换为数字——转换为数字进行比较——从小到大排序
|
||||
return Number(a) - Number(b);
|
||||
}
|
||||
});
|
||||
if(order==='desc'){
|
||||
ASCarr.reverse();
|
||||
}
|
||||
return ASCarr
|
||||
};
|
||||
|
||||
// 首字母开头排序
|
||||
export const sortListByFirst = (vodList,key) => {
|
||||
key = key||'vod_name';
|
||||
// 名字以特殊符号开头的应用列表
|
||||
const symbol_list = [];
|
||||
// 名字以中文开头的应用列表
|
||||
const cn_list = [];
|
||||
// 名字以英文开头的应用列表
|
||||
const en_list = [];
|
||||
// 名字以数字开头的应用列表
|
||||
const num_list = [];
|
||||
|
||||
vodList.forEach((vod) => {
|
||||
const { vod_name } = vod;
|
||||
//通过正则进行数据分类
|
||||
if (/[\u4e00-\u9fa5]/.test(vod_name[0])) {
|
||||
cn_list.push(vod);
|
||||
} else if (/[a-zA-Z]/.test(vod_name[0])) {
|
||||
en_list.push(vod);
|
||||
} else if (/[\d]/.test(vod_name[0])) {
|
||||
num_list.push(vod);
|
||||
} else {
|
||||
symbol_list.push(vod);
|
||||
}
|
||||
});
|
||||
//按照要求的方式进行数据排序重组
|
||||
const newList = [
|
||||
...cn_list.sort((a, b) => a.vod_name[0]?.localeCompare(b.vod_name[0])),
|
||||
...en_list.sort((a, b) => a.vod_name[0].localeCompare(b.vod_name[0])),//localeCompare可以不区分大小写的进行排序
|
||||
...num_list.sort((a, b) => a.vod_name[0] - b.vod_name[0]),
|
||||
...symbol_list.sort((a, b) => a.vod_name[0] - b.vod_name[0])
|
||||
];
|
||||
return newList
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
52eb497172f44b498943ac642d62113e
|
||||
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"token":"",
|
||||
"open_token":"",
|
||||
"open_api_url":"get|https://adrive.xdow.net/oauth/access_token",
|
||||
"oauth_client_id":"",
|
||||
"oauth_client_secret":"",
|
||||
"oauth_auth_url":"",
|
||||
"oauth_refresh_url":"",
|
||||
"thread_limit":32,
|
||||
"is_vip":true,
|
||||
"vip_thread_limit":10,
|
||||
"vod_flags":"4kz|auto",
|
||||
"quark_thread_limit":32,
|
||||
"quark_is_vip":false,
|
||||
"quark_vip_thread_limit":32,
|
||||
"quark_flags":"4kz|auto",
|
||||
"uc_thread_limit":0,
|
||||
"uc_is_vip":false,
|
||||
"uc_vip_thread_limit":0,
|
||||
"uc_flags":"4kz|auto",
|
||||
"thunder_thread_limit":2,
|
||||
"thunder_is_vip":false,
|
||||
"thunder_vip_thread_limit":2,
|
||||
"thunder_flags":"4k|4kz|auto",
|
||||
"aliproxy":"",
|
||||
"aliproxy_url":"",
|
||||
"proxy":"",
|
||||
"danmu":true,
|
||||
"quark_danmu":true,
|
||||
"quark_cookie":"",
|
||||
"uc_cookie":"",
|
||||
"thunder_username":"",
|
||||
"thunder_password":"",
|
||||
"thunder_captchatoken":"",
|
||||
"yd_auth":"",
|
||||
"yd_thread_limit":4,
|
||||
"yd_flags":"auto|4kz",
|
||||
"yd_danmu":true,
|
||||
"pikpak_username":"",
|
||||
"pikpak_password":"",
|
||||
"pikpak_flags":"4k|auto",
|
||||
"pikpak_thread_limit":2,
|
||||
"pikpak_vip_thread_limit":2,
|
||||
"pikpak_proxy":"",
|
||||
"pikpak_proxy_onlyapi":false,
|
||||
"pikpak_danmu":true,
|
||||
"wgcf_key":"",
|
||||
"wgcf_key2":"",
|
||||
"wgcf_ipport":"",
|
||||
"wgcf_xray_url":"./xray.gz",
|
||||
"wgcf_geoip_url":"./geoip.dat.gz",
|
||||
"wgcf_json_url":"./wgcf.json",
|
||||
"wgcf_vless_id":"",
|
||||
"wgcf_vless_optname":"singapore.com:443",
|
||||
"wgcf_vless_worker":"",
|
||||
"wgcf_vless_path":"/?ed=2048",
|
||||
"wgcf_vless_protocol":"vless",
|
||||
"wgcf_vless_network":"ws",
|
||||
"wgcf_vless_tls":false,
|
||||
"libxl_url":"./libxl_thunder_sdk.so"
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"token":"",
|
||||
"open_token":"",
|
||||
"open_api_url":"get|https://adrive.xdow.net/oauth/access_token",
|
||||
"oauth_client_id":"",
|
||||
"oauth_client_secret":"",
|
||||
"oauth_auth_url":"",
|
||||
"oauth_refresh_url":"",
|
||||
"thread_limit":32,
|
||||
"is_vip":true,
|
||||
"vip_thread_limit":10,
|
||||
"vod_flags":"4kz|auto",
|
||||
"quark_thread_limit":32,
|
||||
"quark_is_vip":false,
|
||||
"quark_vip_thread_limit":32,
|
||||
"quark_flags":"4kz|auto",
|
||||
"uc_thread_limit":0,
|
||||
"uc_is_vip":false,
|
||||
"uc_vip_thread_limit":0,
|
||||
"uc_flags":"4kz|auto",
|
||||
"thunder_thread_limit":2,
|
||||
"thunder_is_vip":false,
|
||||
"thunder_vip_thread_limit":2,
|
||||
"thunder_flags":"4k|4kz|auto",
|
||||
"aliproxy":"",
|
||||
"aliproxy_url":"",
|
||||
"proxy":"",
|
||||
"danmu":true,
|
||||
"quark_danmu":true,
|
||||
"quark_cookie":"",
|
||||
"uc_cookie":"",
|
||||
"thunder_username":"",
|
||||
"thunder_password":"",
|
||||
"thunder_captchatoken":"",
|
||||
"yd_auth":"",
|
||||
"yd_thread_limit":4,
|
||||
"yd_flags":"auto|4kz",
|
||||
"yd_danmu":true,
|
||||
"pikpak_username":"",
|
||||
"pikpak_password":"",
|
||||
"pikpak_flags":"4k|auto",
|
||||
"pikpak_thread_limit":2,
|
||||
"pikpak_vip_thread_limit":2,
|
||||
"pikpak_proxy":"",
|
||||
"pikpak_proxy_onlyapi":false,
|
||||
"pikpak_danmu":true,
|
||||
"wgcf_key":"",
|
||||
"wgcf_key2":"",
|
||||
"wgcf_ipport":"",
|
||||
"wgcf_xray_url":"./xray.gz",
|
||||
"wgcf_geoip_url":"./geoip.dat.gz",
|
||||
"wgcf_json_url":"./wgcf.json",
|
||||
"wgcf_vless_id":"",
|
||||
"wgcf_vless_optname":"singapore.com:443",
|
||||
"wgcf_vless_worker":"",
|
||||
"wgcf_vless_path":"/?ed=2048",
|
||||
"wgcf_vless_protocol":"vless",
|
||||
"wgcf_vless_network":"ws",
|
||||
"wgcf_vless_tls":false,
|
||||
"libxl_url":"./libxl_thunder_sdk.so"
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
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;
|
||||
};
|
||||
}
|
||||
function getMubans() {
|
||||
var mubanDict = { // 模板字典
|
||||
mxpro: {
|
||||
title: '',
|
||||
host: '',
|
||||
// homeUrl:'/',
|
||||
url: '/vodshow/fyclass--------fypage---.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.navbar-items li:gt(2):lt(8);a&&Text;a&&href;/(\\d+).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: 'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.module-info-tag&&Text",
|
||||
"img": ".lazyload&&data-original",
|
||||
"desc": ".module-info-item:eq(1)&&Text;.module-info-item:eq(2)&&Text;.module-info-item:eq(3)&&Text",
|
||||
"content": ".module-info-introduction&&Text",
|
||||
"tabs": ".module-tab-item",
|
||||
"lists": ".module-play-list:eq(#id) a"
|
||||
},
|
||||
搜索: 'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text',
|
||||
},
|
||||
mxone5: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/show/fyclass--------fypage---.html',
|
||||
searchUrl: '/search/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.module-list;.module-items&&.module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.module-items .module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.tag-link&&Text",
|
||||
"img": ".module-item-pic&&img&&data-src",
|
||||
"desc": ".video-info-items:eq(0)&&Text;.video-info-items:eq(1)&&Text;.video-info-items:eq(2)&&Text;.video-info-items:eq(3)&&Text",
|
||||
"content": ".vod_content&&Text",
|
||||
"tabs": ".module-tab-item",
|
||||
"lists": ".module-player-list:eq(#id)&&.scroll-content&&a"
|
||||
},
|
||||
搜索: '.module-items .module-search-item;a&&title;img&&data-src;.video-serial&&Text;a&&href',
|
||||
},
|
||||
首图: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/vodshow/fyclass--------fypage---/',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(5);a&&Text;a&&href;/(\\d+).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.myui-vodlist.clearfix;li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.myui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".myui-content__detail .title&&Text;.myui-content__detail p:eq(-2)&&Text",
|
||||
"img": ".myui-content__thumb .lazyload&&data-original",
|
||||
"desc": ".myui-content__detail p:eq(0)&&Text;.myui-content__detail p:eq(1)&&Text;.myui-content__detail p:eq(2)&&Text",
|
||||
"content": ".content&&Text",
|
||||
"tabs": ".nav-tabs:eq(0) li",
|
||||
"lists": ".myui-content__list:eq(#id) li"
|
||||
},
|
||||
搜索: '#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
},
|
||||
首图2: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/list/fyclass-fypage.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA',
|
||||
// "Cookie": ""
|
||||
},
|
||||
// class_parse:'.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html',
|
||||
class_parse: '.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.stui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".stui-content__detail .title&&Text;.stui-content__detail p:eq(-2)&&Text",
|
||||
"img": ".stui-content__thumb .lazyload&&data-original",
|
||||
"desc": ".stui-content__detail p:eq(0)&&Text;.stui-content__detail p:eq(1)&&Text;.stui-content__detail p:eq(2)&&Text",
|
||||
"content": ".detail&&Text",
|
||||
"tabs": ".stui-vodlist__head h3",
|
||||
"lists": ".stui-content__playlist:eq(#id) li"
|
||||
},
|
||||
搜索: 'ul.stui-vodlist__media:eq(0) li,ul.stui-vodlist:eq(0) li,#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
搜索1: 'ul.stui-vodlist&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
搜索2: 'ul.stui-vodlist__media&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
},
|
||||
默认: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/vodshow/fyclass--------fypage---.html',
|
||||
searchUrl: '/vodsearch/-------------.html?wd=**',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
},
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
double: true, // 推荐内容是否双层定位
|
||||
},
|
||||
vfed: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/index.php/vod/show/id/fyclass/page/fypage.html',
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA',
|
||||
},
|
||||
// class_parse:'.fed-pops-navbar&&ul.fed-part-rows&&a.fed-part-eone:gt(0):lt(5);a&&Text;a&&href;.*/(.*?).html',
|
||||
class_parse: '.fed-pops-navbar&&ul.fed-part-rows&&a;a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.fed-list-info.fed-part-rows;li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.fed-list-info&&li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1.fed-part-eone&&Text;.fed-deta-content&&.fed-part-rows&&li&&Text",
|
||||
"img": ".fed-list-info&&a&&data-original",
|
||||
"desc": ".fed-deta-content&&.fed-part-rows&&li:eq(1)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(2)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(3)&&Text",
|
||||
"content": ".fed-part-esan&&Text",
|
||||
"tabs": ".fed-drop-boxs&&.fed-part-rows&&li",
|
||||
"lists": ".fed-play-item:eq(#id)&&ul:eq(1)&&li"
|
||||
},
|
||||
搜索: '.fed-deta-info;h1&&Text;.lazyload&&data-original;.fed-list-remarks&&Text;a&&href;.fed-deta-content&&Text',
|
||||
},
|
||||
海螺3: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/v_search/**----------fypage---.html',
|
||||
url: '/vod_____show/fyclass--------fypage---.html',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_parse: 'body&&.hl-nav li:gt(0);a&&Text;a&&href;.*/(.*?).html',
|
||||
cate_exclude: '明星|专题|最新|排行',
|
||||
limit: 40,
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
推荐: '.hl-vod-list;li;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
double: true,
|
||||
一级: '.hl-vod-list&&.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".hl-infos-title&&Text;.hl-text-conch&&Text",
|
||||
"img": ".hl-lazy&&data-original",
|
||||
"desc": ".hl-infos-content&&.hl-text-conch&&Text",
|
||||
"content": ".hl-content-text&&Text",
|
||||
"tabs": ".hl-tabs&&a",
|
||||
"lists": ".hl-plays-list:eq(#id)&&li"
|
||||
},
|
||||
搜索: '.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
},
|
||||
海螺2: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**/',
|
||||
url: '/index.php/vod/show/id/fyclass/page/fypage/',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_parse: '#nav-bar li;a&&Text;a&&href;id/(.*?)/',
|
||||
limit: 40,
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
推荐: '.list-a.size;li;a&&title;.lazy&&data-original;.bt&&Text;a&&href',
|
||||
double: true,
|
||||
一级: '.list-a&&li;a&&title;.lazy&&data-original;.list-remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h2&&Text;.deployment&&Text",
|
||||
"img": ".lazy&&data-original",
|
||||
"desc": ".deployment&&Text",
|
||||
"content": ".ec-show&&Text",
|
||||
"tabs": "#tag&&a",
|
||||
"lists": ".play_list_box:eq(#id)&&li"
|
||||
},
|
||||
搜索: '.search-list;a&&title;.lazy&&data-original;.deployment&&Text;a&&href',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
},
|
||||
短视: {
|
||||
title: '',
|
||||
host: '',
|
||||
// homeUrl:'/',
|
||||
url: '/channel/fyclass-fypage.html',
|
||||
searchUrl: '/search.html?wd=**',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.menu_bottom ul li;a&&Text;a&&href;.*/(.*?).html',
|
||||
cate_exclude: '解析|动态',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.pic-list&&li;a&&title;img&&data-src;.s1&&Text;a&&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',
|
||||
},
|
||||
短视2:{
|
||||
title: '',
|
||||
host: '',
|
||||
class_name:'电影&电视剧&综艺&动漫',
|
||||
class_url:'1&2&3&4',
|
||||
searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=50',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
headers:{'User-Agent':'MOBILE_UA'},
|
||||
url: '/index.php/api/vod#type=fyclass&page=fypage',
|
||||
filterable:0,//是否启用分类筛选,
|
||||
filter_url:'',
|
||||
filter: {},
|
||||
filter_def:{},
|
||||
detailUrl:'/index.php/vod/detail/id/fyid.html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐:'.list-vod.flex .public-list-box;a&&title;.lazy&&data-original;.public-list-prb&&Text;a&&href',
|
||||
一级:'js:let body=input.split("#")[1];let t=Math.round(new Date/1e3).toString();let key=md5("DS"+t+"DCC147D11943AF75");let url=input.split("#")[0];body=body+"&time="+t+"&key="+key;print(body);fetch_params.body=body;let html=post(url,fetch_params);let data=JSON.parse(html);VODS=data.list.map(function(it){it.vod_pic=urljoin2(input.split("/i")[0],it.vod_pic);return it});',
|
||||
二级:{
|
||||
"title":".slide-info-title&&Text;.slide-info:eq(3)--strong&&Text",
|
||||
"img":".detail-pic&&data-original",
|
||||
"desc":".fraction&&Text;.slide-info-remarks:eq(1)&&Text;.slide-info-remarks:eq(2)&&Text;.slide-info:eq(2)--strong&&Text;.slide-info:eq(1)--strong&&Text",
|
||||
"content":"#height_limit&&Text",
|
||||
"tabs":".anthology.wow.fadeInUp.animated&&.swiper-wrapper&&a",
|
||||
"tab_text":".swiper-slide&&Text",
|
||||
"lists":".anthology-list-box:eq(#id) li"
|
||||
},
|
||||
搜索:'json:list;name;pic;;id',
|
||||
}
|
||||
};
|
||||
return JSON.parse(JSON.stringify(mubanDict));
|
||||
}
|
||||
var mubanDict = getMubans();
|
||||
var muban = getMubans();
|
||||
export default {muban,getMubans};
|
||||
Reference in New Issue
Block a user