From f160ead3d34dd830a1a25da7f3f92f183550986d Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Mon, 17 Oct 2022 12:34:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=87=B33.9.9,=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=96=B0=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/rules.db | Bin 86016 -> 86016 bytes controllers/cms.py | 89 +++- "js/if101[\351\243\236].js" | 24 + js/version.txt | 2 +- "js/\345\260\217\345\223\201\347\275\221.js" | 23 + "js/\345\277\253\347\234\213.js" | 11 +- libs/drpy.js | 119 +++-- libs/drpy.min.js | 2 +- readme.md | 2 + txt/py/py_czspp.py | 473 ++++++++++--------- txt/py/py_jrskbs.py | 168 +++++++ 11 files changed, 634 insertions(+), 279 deletions(-) create mode 100644 "js/if101[\351\243\236].js" create mode 100644 "js/\345\260\217\345\223\201\347\275\221.js" create mode 100644 txt/py/py_jrskbs.py diff --git a/base/rules.db b/base/rules.db index f41dffa7ccbb2974d81518f3d53668f9cf6da7c1..ed75dbf0bc604b7992a43339a480a350235164e9 100644 GIT binary patch delta 289 zcmZozz}m2Yb%Hdb_Cy(HM(vFWOXQi?vfP`@uJE0S<=*Ch3ip_KxS1uHp6*}$d`>sR z=FP8Eq+TjvNrjPCg(e eH~HOl&dIZmicjXh!K#nd8Mqy|z0rxWo)-WJL03Hh delta 128 zcmV-`0Du30pap=S1&|v7B#|6L0VJ_tq#pyU1nQFqAosE%-UE?P4zubc8tVa6mjw_3 ztCs>10Zh025CQQC0a=sbq!qUcJ^}UtvtG4I0++xw0bsYI9|2(y15*XSmj^Hbr?G(& i1(%>T0S&j!H32sY10Mo`mj^%rKe2&30=I!e0e=lpvMUV$ diff --git a/controllers/cms.py b/controllers/cms.py index 6e48abd..f17fdba 100644 --- a/controllers/cms.py +++ b/controllers/cms.py @@ -562,33 +562,53 @@ class CMS: if self.double and len(p) < 6: return self.blank() jsp = jsoup(self.homeUrl) - is_json = str(p[0]).startswith('json:') + pp = self.一级.split(';') + def getPP(p,pn,pp,ppn): + ps = pp[ppn] if p[pn] == '*' and len(pp) > ppn else p[pn] + return ps + p0 = getPP(p,0,pp,0) + is_json = str(p0).startswith('json:') if is_json: html = self.dealJson(html) pdfh = jsp.pjfh if is_json else jsp.pdfh pdfa = jsp.pjfa if is_json else jsp.pdfa pd = jsp.pj if is_json else jsp.pd + + + # print(html) try: if self.double: - items = pdfa(html, p[0].replace('json:','')) + items = pdfa(html, p0.replace('json:','')) # print(p[0]) # print(items) # print(len(items)) for item in items: items2 = pdfa(item,p[1]) - # print(items2) + # print(len(items2)) for item2 in items2: try: - title = pdfh(item2, p[2]) + p2 = getPP(p,2,pp,1) + title = pdfh(item2, p2) + # print(title) try: - img = pd(item2, p[3]) + p3 = getPP(p,3,pp,2) + img = pd(item2, p3) except: img = '' - desc = pdfh(item2, p[4]) - links = [pd(item2, p5) if not self.detailUrl else pdfh(item2, p5) for p5 in p[5].split('+')] + try: + p4 = getPP(p,4,pp,3) + desc = pdfh(item2, p4) + except: + desc = '' + p5 = getPP(p,5,pp,4) + links = [pd(item2, _p5) if not self.detailUrl else pdfh(item2, _p5) for _p5 in p5.split('+')] link = '$'.join(links) - content = '' if len(p) < 7 else pdfh(item2, p[6]) + if len(p) > 6 and p[6]: + p6 = getPP(p,6,pp,5) + content = pdfh(item2, p6) + else: + content = '' videos.append({ "vod_id": link, "vod_name": title, @@ -603,17 +623,31 @@ class CMS: except: pass else: - items = pdfa(html, p[0].replace('json:','')) + items = pdfa(html, p0.replace('json:','')) # print(items) for item in items: try: - title = pdfh(item, p[1]) - img = pd(item, p[2]) - desc = pdfh(item, p[3]) + p1 = getPP(p,1,pp,1) + title = pdfh(item, p1) + try: + p2 = getPP(p,2,pp,2) + img = pd(item, p2) + except: + img = '' + try: + p3 = getPP(p,3,pp,3) + desc = pdfh(item, p3) + except: + desc = '' + p4 = getPP(p,4,pp,4) # link = pd(item, p[4]) - links = [pd(item, p5) if not self.detailUrl else pdfh(item, p5) for p5 in p[4].split('+')] + links = [pd(item, _p5) if not self.detailUrl else pdfh(item, _p5) for _p5 in p4.split('+')] link = '$'.join(links) - content = '' if len(p) < 6 else pdfh(item, p[5]) + if len(p) > 5 and p[5]: + p5 = getPP(p,5,pp,5) + content = pdfh(item, p5) + else: + content = '' videos.append({ "vod_id": link, "vod_name": title, @@ -1096,9 +1130,14 @@ class CMS: return self.blank() # p = self.一级.split(';') if self.搜索 == '*' and self.一级 else self.搜索.split(';') # 解析 p = self.一级 if self.搜索 == '*' and self.一级 else self.搜索 + pp = self.一级.split(';') jsp = jsoup(self.url) videos = [] is_js = isinstance(p, str) and str(p).startswith('js:') # 是js + + def getPP(p, pn, pp, ppn): + ps = pp[ppn] if p[pn] == '*' and len(pp) > ppn else p[pn] + return ps if is_js: headers['Referer'] = getHome(url) py_ctx.update({ @@ -1159,28 +1198,34 @@ class CMS: logger.info('搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码') print(html) - items = pdfa(html,p[0].replace('json:','',1)) + p0 = getPP(p,0,pp,0) + items = pdfa(html,p0.replace('json:','',1)) # print(len(items),items) videos = [] for item in items: # print(item) try: # title = pdfh(item, p[1]) - title = ''.join([pdfh(item, i) for i in p[1].split('||')]) + p1 = getPP(p, 1, pp, 1) + title = ''.join([pdfh(item, i) for i in p1.split('||')]) try: - img = pd(item, p[2]) + p2 = getPP(p, 2, pp, 2) + img = pd(item, p2) except: img = '' try: - desc = pdfh(item, p[3]) + p3 = getPP(p, 3, pp, 3) + desc = pdfh(item, p3) except: desc = '' - try: - content = '' if len(p) < 6 else pdfh(item, p[5]) - except: + if len(p) > 5 and p[5]: + p5 = getPP(p, 5, pp, 5) + content = pdfh(item, p5) + else: content = '' # link = '$'.join([pd(item, p4) for p4 in p[4].split('+')]) - links = [pd(item, p4) if not self.detailUrl else pdfh(item, p4) for p4 in p[4].split('+')] + p4 = getPP(p, 4, pp, 4) + links = [pd(item, _p4) if not self.detailUrl else pdfh(item, _p4) for _p4 in p4.split('+')] link = '$'.join(links) # print(content) # sid = self.regStr(sid, "/video/(\\S+).html") diff --git "a/js/if101[\351\243\236].js" "b/js/if101[\351\243\236].js" new file mode 100644 index 0000000..21bff1d --- /dev/null +++ "b/js/if101[\351\243\236].js" @@ -0,0 +1,24 @@ +var rule={ + title:'if101', + host:'https://www.oulevod.tv', + // homeUrl:'/', + url:'/index.php/vod/show/id/fyclass/page/fypage.html', + searchUrl:'/index.php/vod/search.html?wd=**', + searchable:2,//是否启用全局搜索, + quickSearch:0,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + class_parse:'.conch-nav&&ul&&li;a&&Text;a&&href;./(\\d+).html', + cate_exclude:'', + play_parse:true, + lazy:'', + limit:6, + 推荐:'body&&.hl-list-wrap;ul&&li;a&&title;.hl-lazy&&data-original;.hl-pic-text&&Text;a&&href', + double:true, // 推荐内容是否双层定位 + 一级:'.hl-vod-list&&li;a&&title;.hl-lazy&&data-original;.hl-pic-text&&Text;a&&href', + 二级:{"title":".hl-dc-title&&Text;.hl-col-xs-12&&em&&.hl-text-muted:eq(0)&&Text","img":".hl-lazy&&data-original","desc":".hl-col-xs-12&&em&&.hl-text-muted:eq(-2)&&Text;.hl-col-xs-12&&em&&.hl-text-muted:eq(1)&&Text;.hl-col-xs-12&&em&&.hl-text-muted:eq(2)&&Text","content":".hl-content-text&&Text","tabs":".hl-plays-wrap","lists":".hl-plays-list:eq(#id) li"}, + 搜索:'.hl-list-wrap&&ul&&li;h3&&Text;.hl-lazy&&data-original;.hl-item-title:eq(0)&&Text;a&&href', +} \ No newline at end of file diff --git a/js/version.txt b/js/version.txt index f48bd70..77caa0f 100644 --- a/js/version.txt +++ b/js/version.txt @@ -1 +1 @@ -3.9.8beta2 \ No newline at end of file +3.9.9 \ No newline at end of file diff --git "a/js/\345\260\217\345\223\201\347\275\221.js" "b/js/\345\260\217\345\223\201\347\275\221.js" new file mode 100644 index 0000000..a387828 --- /dev/null +++ "b/js/\345\260\217\345\223\201\347\275\221.js" @@ -0,0 +1,23 @@ +var rule = { + title:'小品网', + host:'http://www.xiaopin.tv', + url:'/?cate=fyclass&page=fypage', + searchUrl:'/search.php?q=**', + searchable:2, + quickSearch:0, + filterable:0, + headers:{ + 'User-Agent':'MOBILE_UA' + }, + timeout:5000, + class_name:'小品&相声&二人转&春晚小品', + class_url:'2&1&3&14', + play_parse:true, + lazy:'', + limit:6, + double:true, + 推荐:'.itemlist;ul&&li;.itemname&&a&&Text;.itemimg img&&src;*;*', + 一级:'.catecon&&ul&&li;.catename&&a&&Text;img&&src;.icoplay&&Text;a&&href', + 二级:'*', + 搜索:'*', +} \ No newline at end of file diff --git "a/js/\345\277\253\347\234\213.js" "b/js/\345\277\253\347\234\213.js" index 9df6b31..5dbf552 100644 --- "a/js/\345\277\253\347\234\213.js" +++ "b/js/\345\277\253\347\234\213.js" @@ -11,14 +11,15 @@ var rule={ 'User-Agent':'MOBILE_UA', // "Cookie": "searchneed=ok" }, - class_name:'电影&连续剧&综艺&动漫', - class_url:'dianying&lianxuju&zongyi&dongman', + class_parse:'nav ul li;a&&Text;a&&href;.*/(.*?)\.html', + cate_exclude:'专题', play_parse:true, lazy:'', limit:6, - 推荐:'.show;ul&&li;a&&title;img&&src;.score&&Text;a&&href', + 推荐:'.show;ul&&li;*;*;*;*', double:true, // 推荐内容是否双层定位 - 一级:'.row&&li;a&&title;img&&src;.score&&Text;a&&href', + 一级:'.show&&ul&&li;a&&title;img&&src;.score&&Text;a&&href', 二级:{"title":"h1&&Text;.info&&ul&&p&&Text","img":"img&&src","desc":".info&&ul&&p:eq(-2)&&Text;.info&&ul&&p:eq(-1)&&Text;.info&&ul&&p:eq(0)&&Text;.info&&ul&&p:eq(1)&&Text;.info&&ul&&p:eq(2)&&Text;.info&&ul&&p:eq(3)&&Text","content":".text&&Text","tabs":".play&&span","lists":".playlist&&ul:eq(#id) li"}, - 搜索:'.row&&li;a&&title;img&&src;.score&&Text;a&&href', + 搜索:'*', + // 搜索:'*;*;*;*;*', } \ No newline at end of file diff --git a/libs/drpy.js b/libs/drpy.js index 76a6f7c..166753f 100644 --- a/libs/drpy.js +++ b/libs/drpy.js @@ -1054,6 +1054,19 @@ function homeParse(homeObj) { } +/** + * 推荐和搜索单字段继承一级 + * @param p 推荐或搜索的解析分割;列表 + * @param pn 自身列表序号 + * @param pp 一级解析分割;列表 + * @param ppn 继承一级序号 + * @returns {*} + */ +function getPP(p, pn, pp, ppn){ + let ps = p[pn] === '*' && pp.length > ppn ?pp[ppn]:p[pn] + return ps +} + /** * 首页推荐列表解析 * @param homeVodObj @@ -1074,6 +1087,7 @@ function homeVodParse(homeVodObj){ return '{}' } p = p.trim(); + let pp = rule.一级.split(';'); if(p.startsWith('js:')){ const TYPE = 'home'; var input = MY_URL; @@ -1087,12 +1101,13 @@ function homeVodParse(homeVodObj){ } else if (homeVodObj.double && p.length < 6) { return '{}' } - let _ps = parseTags.getParse(p[0]); + let p0 = getPP(p,0,pp,0) + let _ps = parseTags.getParse(p0); _pdfa = _ps.pdfa; _pdfh = _ps.pdfh; _pd = _ps.pd; - let is_json = p[0].startsWith('json:'); - p[0] = p[0].replace(/^(jsp:|json:|jq:)/,''); + let is_json = p0.startsWith('json:'); + p0 = p0.replace(/^(jsp:|json:|jq:)/,''); // print(p[0]); let html = homeHtmlCache || getHtml(MY_URL); homeHtmlCache = undefined; @@ -1103,7 +1118,7 @@ function homeVodParse(homeVodObj){ try { console.log('double:' + homeVodObj.double); if (homeVodObj.double) { - let items = _pdfa(html, p[0]); + let items = _pdfa(html, p0); // console.log(items.length); for (let item of items) { // console.log(p[1]); @@ -1111,22 +1126,36 @@ function homeVodParse(homeVodObj){ // console.log(items2.length); for (let item2 of items2) { try { - let title = _pdfh(item2, p[2]); + let p2 = getPP(p,2,pp,1); + let title = _pdfh(item2, p2); let img = ''; try { - img = _pd(item2, p[3]) - } catch (e) { - } - let desc = _pdfh(item2, p[4]); + let p3 = getPP(p,3,pp,2); + img = _pd(item2, p3); + } catch (e) {} + let desc = ''; + try { + let p4 = getPP(p,4,pp,3); + desc = _pdfh(item2, p4); + }catch (e) {} + let p5 = getPP(p,5,pp,4); let links = []; - for (let p5 of p[5].split('+')) { - let link = !homeVodObj.detailUrl ? _pd(item2, p5, MY_URL) : _pdfh(item2, p5); + 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]){ + let p6 = getPP(p,6,pp,5); + content = _pdfh(item2, p6); + } else{ + content = ''; + } let vod = { vod_name: title, vod_pic: img, vod_remarks: desc, + vod_content: content, vod_id: links.join('$') }; // print(vod); @@ -1142,26 +1171,39 @@ function homeVodParse(homeVodObj){ } else { - let items = _pdfa(html, p[0]); + let items = _pdfa(html, p0); for (let item of items) { try { - let title = _pdfh(item, p[1]); + let p1 = getPP(p,1,pp,1); + let title = _pdfh(item, p1); let img = ''; try { - img = _pd(item, p[2], MY_URL); - } catch (e) { - - } - let desc = _pdfh(item, p[3]); + let p2 = getPP(p,2,pp,2); + img = _pd(item, p2, MY_URL); + } catch (e) {} + let desc = ''; + try { + let p3 = getPP(p,3,pp,3); + desc = _pdfh(item, p3); + }catch (e) {} + let p4 = getPP(p,4,pp,4); let links = []; - for (let p5 of p[4].split('+')) { - let link = !homeVodObj.detailUrl ? _pd(item, p5, MY_URL) : _pdfh(item, p5); + 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]){ + let p5 = getPP(p,5,pp,5); + content = _pdfh(item, p5); + }else{ + content = '' + } let vod = { vod_name: title, vod_pic: img, vod_remarks: desc, + vod_content: content, vod_id: links.join('$') }; d.push(vod); @@ -1308,6 +1350,7 @@ function searchParse(searchObj) { 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); @@ -1325,12 +1368,13 @@ function searchParse(searchObj) { if (p.length < 5) { return '{}' } - let _ps = parseTags.getParse(p[0]); + let p0 = getPP(p,0,pp,0); + let _ps = parseTags.getParse(p0); _pdfa = _ps.pdfa; _pdfh = _ps.pdfh; _pd = _ps.pd; - let is_json = p[0].startsWith('json:'); - p[0] = p[0].replace(/^(jsp:|json:|jq:)/,''); + let is_json = p0.startsWith('json:'); + p0 = p0.replace(/^(jsp:|json:|jq:)/,''); try { let html = getHtml(MY_URL); if (html) { @@ -1352,22 +1396,30 @@ function searchParse(searchObj) { if(is_json){ html = dealJson(html); } - let list = _pdfa(html, p[0]); + let list = _pdfa(html, p0); list.forEach(it => { - let links = p[4].split('+').map(p4=>{ - return !rule.detailUrl?_pd(it, p4,MY_URL):_pdfh(it, p4) + 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 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]){ + let p5 = getPP(p,5,pp,5); + content = _pdfh(item, p5); + }else{ + content = ''; + } let ob = { 'vod_id': link, - 'vod_name': _pdfh(it, p[1]).replace(/\n|\t/g,'').trim(), - 'vod_pic': _pd(it, p[2],MY_URL), - 'vod_remarks': _pdfh(it, p[3]).replace(/\n|\t/g,'').trim(), + 'vod_name': _pdfh(it, p1).replace(/\n|\t/g,'').trim(), + 'vod_pic': _pd(it, p2,MY_URL), + 'vod_remarks': _pdfh(it, p3).replace(/\n|\t/g,'').trim(), + 'vod_content': content.replace(/\n|\t/g,'').trim(), }; - if (p.length > 5 && p[5]) { - ob.vod_content = _pdfh(it, p[5]); - } d.push(ob); }); @@ -1375,7 +1427,6 @@ function searchParse(searchObj) { } catch (e) { return '{}' } - } return JSON.stringify({ 'page': parseInt(searchObj.pg), diff --git a/libs/drpy.min.js b/libs/drpy.min.js index 17f8c04..e896026 100644 --- a/libs/drpy.min.js +++ b/libs/drpy.min.js @@ -1 +1 @@ -import cheerio from"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/cheerio.min.js";import"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/crypto-js.js";import"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/drT.js";function init_test(){console.log("init_test_start");console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}let rule={};const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|APP|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://cms.nokia.press/parse/ocr";if(typeof MY_URL==="undefined"){var MY_URL}var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|data-original|data-src)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option);if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(!SELECT_REGEX_A.test(sp[i])&&i=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.headers.body!="undefined"&&obj.headers.body&&typeof obj.headers.body==="string"){let data={};obj.headers.body.split("&").forEach(it=>{data[it.split("=")[0]]=it.split("=")[1]});obj.data=data;delete obj.headers.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}fetch=request;print=function(data){data=data||"";if(typeof data!=="string"){try{data=JSON.stringify(data)}catch(e){console.log("print:"+e.message)}}console.log(data)};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){obj.headers["Cookie"]=cookie}else if(!obj.headers){obj.headers={Cookie:cookie}}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let p=homeVodObj.推荐;if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;const HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p[0]);for(let item of items){let items2=_pdfa(item,p[1]);for(let item2 of items2){try{let title=_pdfh(item2,p[2]);let img="";try{img=_pd(item2,p[3])}catch(e){}let desc=_pdfh(item2,p[4]);let links=[];for(let p5 of p[5].split("+")){let link=!homeVodObj.detailUrl?_pd(item2,p5,MY_URL):_pdfh(item2,p5);links.push(link)}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_id:links.join("$")};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p[0]);for(let item of items){try{let title=_pdfh(item,p[1]);let img="";try{img=_pd(item,p[2],MY_URL)}catch(e){}let desc=_pdfh(item,p[3]);let links=[];for(let p5 of p[4].split("+")){let link=!homeVodObj.detailUrl?_pd(item,p5,MY_URL):_pdfh(item,p5);links.push(link)}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_id:links.join("$")};d.push(vod)}catch(e){}}}}catch(e){}}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;d.push({vod_id:vod_id,vod_name:_pdfh(it,p[1]).replace(/\n|\t/g,"").trim(),vod_pic:_pd(it,p[2],MY_URL),vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}return d.length<1?"{}":JSON.stringify({page:parseInt(cateObj.pg),pagecount:999,limit:20,total:999,list:d})}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let url=searchObj.searchUrl.replaceAll("**",searchObj.wd).replaceAll("fypage",searchObj.pg);MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let ob={vod_id:link,vod_name:_pdfh(it,p[1]).replace(/\n|\t/g,"").trim(),vod_pic:_pd(it,p[2],MY_URL),vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()};if(p.length>5&&p[5]){ob.vod_content=_pdfh(it,p[5])}d.push(ob)})}}catch(e){return"{}"}}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let vod={vod_id:detailObj.orId,vod_name:"片名",vod_pic:"",type_name:"剧情",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;console.log(MY_URL);if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){if(!html){html=getHtml(MY_URL)}let _impJQP=true;let _ps;if(p.is_json){_ps=parseTags.json;html=dealJson(html);_impJQP=false}else if(p.is_jsp){_ps=parseTags.jsp}else if(p.is_jq){_ps=parseTags.jq}else{_ps=parseTags.jq}if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);if(html&&typeof html!=="string"){html=html.rr(html.ele).toString()}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];console.log(p_tab);let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);for(let v of vHeader){let v_title=_pdfh(v,"body&&Text").trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);if(html&&typeof html!=="string"){html=html.rr(html.ele).toString()}var input=MY_URL;eval(p.lists.replace("js:",""));vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}else{for(let i=0;i1?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);console.log(p1);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);vodList.forEach(it=>{new_vod_list.push(_pdfh(it,"body&&Text").trim()+"$"+_pd(it,"a&&href",MY_URL))});let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}return JSON.stringify({list:[vod]})}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{if(typeof globalThis.mubanJs==="undefined"){let mubanJs=request("https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/模板.js",{"User-Agent":MOBILE_UA});mubanJs=mubanJs.replace("export default","(function() {return muban;}()) // export default");globalThis.mubanJs=mubanJs}let muban=eval(globalThis.mubanJs);if(typeof ext=="object"){rule=ext;if(rule.template){rule=Object.assign(muban[rule.template],rule)}}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}}else{eval(ext.replace("var rule","rule"))}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url;let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file +import cheerio from"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/cheerio.min.js";import"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/crypto-js.js";import"https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/drT.js";function init_test(){console.log("init_test_start");console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}let rule={};const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";const PC_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";const UA="Mozilla/5.0";const UC_UA="Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";const IOS_UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|APP|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://cms.nokia.press/parse/ocr";if(typeof MY_URL==="undefined"){var MY_URL}var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|data-original|data-src)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option);if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1]}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(!SELECT_REGEX_A.test(sp[i])&&i=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.headers.body!="undefined"&&obj.headers.body&&typeof obj.headers.body==="string"){let data={};obj.headers.body.split("&").forEach(it=>{data[it.split("=")[0]]=it.split("=")[1]});obj.data=data;delete obj.headers.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}fetch=request;print=function(data){data=data||"";if(typeof data!=="string"){try{data=JSON.stringify(data)}catch(e){console.log("print:"+e.message)}}console.log(data)};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){obj.headers["Cookie"]=cookie}else if(!obj.headers){obj.headers={Cookie:cookie}}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let p=homeVodObj.推荐;if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;const HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let 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);for(let item of items){let items2=_pdfa(item,p[1]);for(let item2 of items2){try{let p2=getPP(p,2,pp,1);let title=_pdfh(item2,p2);let img="";try{let p3=getPP(p,3,pp,2);img=_pd(item2,p3)}catch(e){}let desc="";try{let p4=getPP(p,4,pp,3);desc=_pdfh(item2,p4)}catch(e){}let p5=getPP(p,5,pp,4);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]){let p6=getPP(p,6,pp,5);content=_pdfh(item2,p6)}else{content=""}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:links.join("$")};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);for(let item of items){try{let p1=getPP(p,1,pp,1);let title=_pdfh(item,p1);let img="";try{let p2=getPP(p,2,pp,2);img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{let p3=getPP(p,3,pp,3);desc=_pdfh(item,p3)}catch(e){}let p4=getPP(p,4,pp,4);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]){let p5=getPP(p,5,pp,5);content=_pdfh(item,p5)}else{content=""}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:links.join("$")};d.push(vod)}catch(e){}}}}catch(e){}}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;d.push({vod_id:vod_id,vod_name:_pdfh(it,p[1]).replace(/\n|\t/g,"").trim(),vod_pic:_pd(it,p[2],MY_URL),vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}return d.length<1?"{}":JSON.stringify({page:parseInt(cateObj.pg),pagecount:999,limit:20,total:999,list:d})}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let 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 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);list.forEach(it=>{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 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]){let p5=getPP(p,5,pp,5);content=_pdfh(item,p5)}else{content=""}let ob={vod_id:link,vod_name:_pdfh(it,p1).replace(/\n|\t/g,"").trim(),vod_pic:_pd(it,p2,MY_URL),vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){return"{}"}}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let vod={vod_id:detailObj.orId,vod_name:"片名",vod_pic:"",type_name:"剧情",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;console.log(MY_URL);if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){if(!html){html=getHtml(MY_URL)}let _impJQP=true;let _ps;if(p.is_json){_ps=parseTags.json;html=dealJson(html);_impJQP=false}else if(p.is_jsp){_ps=parseTags.jsp}else if(p.is_jq){_ps=parseTags.jq}else{_ps=parseTags.jq}if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");vod.vod_name=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();let type_name=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").replace(/ /g,"").trim():"";vod.type_name=type_name||vod.type_name}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);if(html&&typeof html!=="string"){html=html.rr(html.ele).toString()}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];console.log(p_tab);let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);for(let v of vHeader){let v_title=_pdfh(v,"body&&Text").trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);if(html&&typeof html!=="string"){html=html.rr(html.ele).toString()}var input=MY_URL;eval(p.lists.replace("js:",""));vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}else{for(let i=0;i1?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);console.log(p1);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);vodList.forEach(it=>{new_vod_list.push(_pdfh(it,"body&&Text").trim()+"$"+_pd(it,"a&&href",MY_URL))});let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}return JSON.stringify({list:[vod]})}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function init(ext){console.log("init");try{if(typeof globalThis.mubanJs==="undefined"){let mubanJs=request("https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/模板.js",{"User-Agent":MOBILE_UA});mubanJs=mubanJs.replace("export default","(function() {return muban;}()) // export default");globalThis.mubanJs=mubanJs}let muban=eval(globalThis.mubanJs);if(typeof ext=="object"){rule=ext;if(rule.template){rule=Object.assign(muban[rule.template],rule)}}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}}else{eval(ext.replace("var rule","rule"))}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());rule_cate_excludes=rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it=>it.trim()));rule_tab_excludes=rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it=>it.trim()));rule.cate_exclude=rule_cate_excludes.join("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl;rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url;let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick){let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:1,quick:quick};return searchParse(searchObj)}function DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,DRPY:DRPY}; \ No newline at end of file diff --git a/readme.md b/readme.md index efc703c..c09c378 100644 --- a/readme.md +++ b/readme.md @@ -49,6 +49,8 @@ [获取本地设备信息](https://m.jb51.net/article/140716.htm) ###### 2022/10/17 - [X] 3.9.8beta2 全局关闭https对应的ssl证书验证 +- [X] 3.9.9 增加新特性,简写快看源,修复小品网推荐显示 +- [X] 新增 推荐和搜索支持用*替代继承一级对应位置的列表,标题,图片,描述,详情,内容等定位 ###### 2022/10/16 - [X] 3.9.8 完成ddys选集播放和免嗅(可惜我刚弄完没播放俩个剧就被封ip了) - [X] 3.9.8beta1 增加了俩自建js解析 diff --git a/txt/py/py_czspp.py b/txt/py/py_czspp.py index f20ca3c..76be901 100644 --- a/txt/py/py_czspp.py +++ b/txt/py/py_czspp.py @@ -1,236 +1,277 @@ -#coding=utf-8 -#!/usr/bin/python +# coding=utf-8 +# !/usr/bin/python import sys -sys.path.append('..') +sys.path.append('..') from base.spider import Spider -import json import base64 +from requests import session, utils from Crypto.Cipher import AES class Spider(Spider): # 元类 默认的元类 type - def getName(self): - return "厂长资源" - def init(self,extend=""): - print("============{0}============".format(extend)) - pass - def homeContent(self,filter): - result = {} - cateManual = { - "豆瓣电影Top250": "dbtop250", - "最新电影": "zuixindianying", - "电视剧": "dsj", - "国产剧": "gcj", - "美剧": "meijutt", - "韩剧": "hanjutv", - "番剧": "fanju", - "动漫": "dm" - } - classes = [] - for k in cateManual: - classes.append({ - 'type_name':k, - 'type_id':cateManual[k] - }) - result['class'] = classes - return result - def homeVideoContent(self): - rsp = self.fetch("https://czspp.com") - root = self.html(rsp.text) - aList = root.xpath("//div[@class='mi_btcon']//ul/li") - videos = [] - for a in aList: - name = a.xpath('./a/img/@alt')[0] - pic = a.xpath('./a/img/@data-original')[0] - mark = a.xpath("./div[@class='hdinfo']/span/text()")[0] - sid = a.xpath("./a/@href")[0] - sid = self.regStr(sid,"/movie/(\\S+).html") - videos.append({ - "vod_id":sid, - "vod_name":name, - "vod_pic":pic, - "vod_remarks":mark - }) - result = { - 'list':videos - } - return result - def categoryContent(self,tid,pg,filter,extend): - result = {} - url = 'https://czspp.com/{0}/page/{1}'.format(tid,pg) - rsp = self.fetch(url) - root = self.html(rsp.text) - aList = root.xpath("//div[contains(@class,'mi_cont')]//ul/li") - videos = [] - for a in aList: - name = a.xpath('./a/img/@alt')[0] - pic = a.xpath('./a/img/@data-original')[0] - mark = a.xpath("./div[@class='hdinfo']/span/text()")[0] - sid = a.xpath("./a/@href")[0] - sid = self.regStr(sid,"/movie/(\\S+).html") - videos.append({ - "vod_id":sid, - "vod_name":name, - "vod_pic":pic, - "vod_remarks":mark - }) + def getName(self): + return "厂长资源" - result['list'] = videos - result['page'] = pg - result['pagecount'] = 9999 - result['limit'] = 90 - result['total'] = 999999 - return result - def detailContent(self,array): - tid = array[0] - url = 'https://czspp.com/movie/{0}.html'.format(tid) - rsp = self.fetch(url) - root = self.html(rsp.text) - node = root.xpath("//div[@class='dyxingq']")[0] + def init(self, extend=""): + print("============{0}============".format(extend)) + pass - pic = node.xpath(".//div[@class='dyimg fl']/img/@src")[0] - title = node.xpath('.//h1/text()')[0] - detail = root.xpath(".//div[@class='yp_context']//p/text()")[0] + def homeContent(self, filter): + result = {} + cateManual = { + "豆瓣电影Top250": "dbtop250", + "最新电影": "zuixindianying", + "电视剧": "dsj", + "国产剧": "gcj", + "美剧": "meijutt", + "韩剧": "hanjutv", + "番剧": "fanju", + "动漫": "dm" + } + classes = [] + for k in cateManual: + classes.append({ + 'type_name': k, + 'type_id': cateManual[k] + }) + result['class'] = classes + return result - vod = { - "vod_id":tid, - "vod_name":title, - "vod_pic":pic, - "type_name":"", - "vod_year":"", - "vod_area":"", - "vod_remarks":"", - "vod_actor":"", - "vod_director":"", - "vod_content":detail - } + def homeVideoContent(self): + url = "https://czspp.com" + if len(self.cookies) <= 0: + self.getCookie(url) + url = url + self.zid + rsp = self.fetch(url) + root = self.html(self.cleanText(rsp.text)) + aList = root.xpath("//div[@class='mi_btcon']//ul/li") + videos = [] + for a in aList: + name = a.xpath('./a/img/@alt')[0] + pic = a.xpath('./a/img/@data-original')[0] + mark = a.xpath("./div[@class='hdinfo']/span/text()")[0] + sid = a.xpath("./a/@href")[0] + sid = self.regStr(sid, "/movie/(\\S+).html") + videos.append({ + "vod_id": sid, + "vod_name": name, + "vod_pic": pic, + "vod_remarks": mark + }) + result = { + 'list': videos + } + return result - infoArray = node.xpath(".//ul[@class='moviedteail_list']/li") - for info in infoArray: - content = info.xpath('string(.)') - if content.startswith('类型'): - vod['type_name'] = content - if content.startswith('年份'): - vod['vod_year'] = content - if content.startswith('地区'): - vod['vod_area'] = content - if content.startswith('豆瓣'): - vod['vod_remarks'] = content - if content.startswith('主演'): - vod['vod_actor'] = content - if content.startswith('导演'): - vod['vod_director'] = content - # if content.startswith('剧情'): - # vod['vod_content'] = content + header = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"} + cookies = '' + def getCookie(self,url): + rsp = self.fetch(url,headers=self.header) + baseurl = self.regStr(reg=r'(https://.*?/)', src=url) + append = url.replace(baseurl,'') + zid = self.regStr(rsp.text, "{0}(\\S+)\"".format(append)) + self.zid = zid + self.cookies = rsp.cookies + if 'btwaf' not in zid: + zid = '' + return rsp.cookies, zid - vod_play_from = '$$$' - playFrom = ['厂长'] - vod_play_from = vod_play_from.join(playFrom) - - vod_play_url = '$$$' - playList = [] - vodList = root.xpath("//div[@class='paly_list_btn']") - for vl in vodList: - vodItems = [] - aList = vl.xpath('./a') - for tA in aList: - href = tA.xpath('./@href')[0] - name = tA.xpath('./text()')[0] - tId = self.regStr(href,'/v_play/(\\S+).html') - vodItems.append(name + "$" + tId) - joinStr = '#' - joinStr = joinStr.join(vodItems) - playList.append(joinStr) - vod_play_url = vod_play_url.join(playList) + def categoryContent(self, tid, pg, filter, extend): + result = {} + url = 'https://czspp.com/{0}/page/{1}'.format(tid,pg) + if len(self.cookies) <= 0: + self.getCookie(url) + url = url + self.zid + rsp = self.fetch(url, cookies=self.cookies,headers=self.header) + root = self.html(self.cleanText(rsp.text)) + aList = root.xpath("//div[contains(@class,'bt_img mi_ne_kd mrb')]/ul/li") + videos = [] + for a in aList: + name = a.xpath('./a/img/@alt')[0] + pic = a.xpath('./a/img/@data-original')[0] + mark = a.xpath("./div[@class='hdinfo']/span/text()")[0] + sid = a.xpath("./a/@href")[0] + sid = self.regStr(sid, "/movie/(\\S+).html") + videos.append({ + "vod_id": sid, + "vod_name": name, + "vod_pic": pic, + "vod_remarks": mark + }) + result['list'] = videos + result['page'] = pg + result['pagecount'] = 9999 + result['limit'] = 90 + result['total'] = 999999 + return result - vod['vod_play_from'] = vod_play_from - vod['vod_play_url'] = vod_play_url + def detailContent(self, array): + tid = array[0] + url = 'https://czspp.com/movie/{0}.html'.format(tid) + if len(self.cookies) <= 0: + self.getCookie(url) + url = url + self.zid + rsp = self.fetch(url,cookies=self.cookies,headers=self.header) + root = self.html(self.cleanText(rsp.text)) + node = root.xpath("//div[@class='dyxingq']")[0] + pic = node.xpath(".//div[@class='dyimg fl']/img/@src")[0] + title = node.xpath('.//h1/text()')[0] + detail = root.xpath(".//div[@class='yp_context']//p/text()")[0] + vod = { + "vod_id": tid, + "vod_name": title, + "vod_pic": pic, + "type_name": "", + "vod_year": "", + "vod_area": "", + "vod_remarks": "", + "vod_actor": "", + "vod_director": "", + "vod_content": detail + } + infoArray = node.xpath(".//ul[@class='moviedteail_list']/li") + for info in infoArray: + content = info.xpath('string(.)') + if content.startswith('地区'): + tpyeare = '' + for inf in info: + tn = inf.text + tpyeare = tpyeare +'/'+'{0}'.format(tn) + vod['vod_area'] = tpyeare.strip('/') + if content.startswith('年份'): + vod['vod_year'] = content.replace("年份:","") + if content.startswith('主演'): + tpyeact = '' + for inf in info: + tn = inf.text + tpyeact = tpyeact +'/'+'{0}'.format(tn) + vod['vod_actor'] = tpyeact.strip('/') + if content.startswith('导演'): + tpyedire = '' + for inf in info: + tn = inf.text + tpyedire = tpyedire +'/'+'{0}'.format(tn) + vod['vod_director'] = tpyedire .strip('/') + vod_play_from = '$$$' + playFrom = ['厂长'] + vod_play_from = vod_play_from.join(playFrom) + vod_play_url = '$$$' + playList = [] + vodList = root.xpath("//div[@class='paly_list_btn']") + for vl in vodList: + vodItems = [] + aList = vl.xpath('./a') + for tA in aList: + href = tA.xpath('./@href')[0] + name = tA.xpath('./text()')[0].replace('\xa0','') + tId = self.regStr(href, '/v_play/(\\S+).html') + vodItems.append(name + "$" + tId) + joinStr = '#' + joinStr = joinStr.join(vodItems) + playList.append(joinStr) + vod_play_url = vod_play_url.join(playList) - result = { - 'list':[ - vod - ] - } - return result + vod['vod_play_from'] = vod_play_from + vod['vod_play_url'] = vod_play_url + result = { + 'list': [ + vod + ] + } + return result - def searchContent(self,key,quick): - url = 'https://czspp.com/xssearch?q={0}'.format(key) - # getHeader() - rsp = self.fetch(url) - root = self.html(rsp.text) + def searchContent(self, key, quick): + url = 'https://czspp.com/xssearch?q={0}'.format(key) + if len(self.cookies) <= 0: + self.getCookie(url) + url = url + self.zid + rsp = self.fetch(url,cookies=self.cookies,headers=self.header) + root = self.html(self.cleanText(rsp.text)) + vodList = root.xpath("//div[contains(@class,'mi_ne_kd')]/ul/li/a") + videos = [] + for vod in vodList: + name = vod.xpath('./img/@alt')[0] + pic = vod.xpath('./img/@data-original')[0] + href = vod.xpath('./@href')[0] + tid = self.regStr(href, 'movie/(\\S+).html') + res = vod.xpath('./div[@class="jidi"]/span/text()') + if len(res) == 0: + remark = '全1集' + else: + remark = vod.xpath('./div[@class="jidi"]/span/text()')[0] + videos.append({ + "vod_id": tid, + "vod_name": name, + "vod_pic": pic, + "vod_remarks": remark + }) + result = { + 'list': videos + } + return result + config = { + "player": {}, + "filter": {} + } + header = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36" + } + def parseCBC(self, enc, key, iv): + keyBytes = key.encode("utf-8") + ivBytes = iv.encode("utf-8") + cipher = AES.new(keyBytes, AES.MODE_CBC, ivBytes) + msg = cipher.decrypt(enc) + paddingLen = msg[len(msg) - 1] + return msg[0:-paddingLen] - result = {} - vodList = root.xpath("//div[contains(@class,'mi_ne_kd')]/ul/li/a") - videos = [] - for vod in vodList: - name = vod.xpath('./img/@alt')[0] - pic = vod.xpath('./img/@data-original')[0] - href = vod.xpath('./@href')[0] - tid = self.regStr(href,'movie/(\\S+).html') - remark = "" - videos.append({ - "vod_id": tid, - "vod_name": name, - "vod_pic": pic, - "vod_remarks": remark - }) - result = { - 'list':videos - } - return result + def playerContent(self, flag, id, vipFlags): + result = {} + url = 'https://czspp.com/v_play/{0}.html'.format(id) + if len(self.cookies) <= 0: + self.getCookie(url) + url = url + self.zid + pat = '\\"([^\\"]+)\\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\\"([\\d\\w]+)\\".*md5.enc.Utf8.parse\\(([\\d]+)\\)' + rsp = self.fetch(url,cookies=self.cookies,headers=self.header) + html = rsp.text + content = self.regStr(html, pat) + if content == '': + str3 = url + pars = 1 + header = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" + } + else: + key = self.regStr(html, pat, 2) + iv = self.regStr(html, pat, 3) + decontent = self.parseCBC(base64.b64decode(content), key, iv).decode() + urlPat = 'video: \\{url: \\\"([^\\\"]+)\\\"' + vttPat = 'subtitle: \\{url:\\\"([^\\\"]+\\.vtt)\\\"' + str3 = self.regStr(decontent, urlPat) + str4 = self.regStr(decontent, vttPat) + self.loadVtt(str3) + pars = 0 + header = '' + if len(str4) > 0: + result['subf'] = '/vtt/utf-8' + result['subt'] = '' + result = { + 'parse': pars, + 'playUrl': '', + 'url': str3, + 'header': header + } + return result - config = { - "player": { }, - "filter": { } - } - header = { - "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36" - } - def parseCBC(self, enc, key, iv): - keyBytes = key.encode("utf-8") - ivBytes = iv.encode("utf-8") - cipher = AES.new(keyBytes, AES.MODE_CBC, ivBytes) - msg = cipher.decrypt(enc) - paddingLen = msg[len(msg)-1] - return msg[0:-paddingLen] + def loadVtt(self, url): + pass - def playerContent(self,flag,id,vipFlags): - url = 'https://czspp.com/v_play/{0}.html'.format(id) - pat = '\\"([^\\"]+)\\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\\"([\\d\\w]+)\\".*md5.enc.Utf8.parse\\(([\\d]+)\\)' - rsp = self.fetch(url) + def isVideoFormat(self, url): + pass - html = rsp.text - content = self.regStr(html,pat) - key = self.regStr(html,pat,2) - iv = self.regStr(html,pat,3) - decontent = self.parseCBC(base64.b64decode(content),key,iv).decode() + def manualVideoCheck(self): + pass - urlPat = 'video: \\{url: \\\"([^\\\"]+)\\\"' - vttPat = 'subtitle: \\{url:\\\"([^\\\"]+\\.vtt)\\\"' - - str3 = self.regStr(decontent,urlPat) - str4 = self.regStr(decontent,vttPat) - - self.loadVtt(str3) - - result = { - 'parse':'0', - 'playUrl':'', - 'url':str3, - 'header':'' - } - if len(str4) > 0: - result['subf'] = '/vtt/utf-8' - # result['subt'] = Proxy.localProxyUrl() + "?do=czspp&url=" + URLEncoder.encode(str4) - result['subt'] = '' - return result - - def loadVtt(self,url): - print(url) - def isVideoFormat(self,url): - pass - def manualVideoCheck(self): - pass - def localProxy(self,param): - action = {} - return [200, "video/MP2T", action, ""] \ No newline at end of file + def localProxy(self, param): + action = {} + return [200, "video/MP2T", action, ""] diff --git a/txt/py/py_jrskbs.py b/txt/py/py_jrskbs.py new file mode 100644 index 0000000..b31ae23 --- /dev/null +++ b/txt/py/py_jrskbs.py @@ -0,0 +1,168 @@ +#coding=utf-8 +#!/usr/bin/python +import sys +sys.path.append('..') +from base.spider import Spider +import re +import math + +class Spider(Spider): + def getName(self): + return "体育直播" + def init(self,extend=""): + pass + def isVideoFormat(self,url): + pass + def manualVideoCheck(self): + pass + def homeContent(self,filter): + result = {} + cateManual = { + "全部": "" + } + classes = [] + for k in cateManual: + classes.append({ + 'type_name': k, + 'type_id': cateManual[k] + }) + + result['class'] = classes + if (filter): + result['filters'] = self.config['filter'] + return result + def homeVideoContent(self): + result = {} + return result + + def categoryContent(self,tid,pg,filter,extend): + result = {} + url = 'https://m.jrskbs.com' + rsp = self.fetch(url) + html = self.html(rsp.text) + aList = html.xpath("//div[contains(@class, 'contentList')]/a") + videos = [] + numvL = len(aList) + pgc = math.ceil(numvL/15) + for a in aList: + aid = a.xpath("./@href")[0] + aid = self.regStr(reg=r'/live/(.*?).html', src=aid) + img = a.xpath(".//div[@class='contentLeft']/p/img/@src")[0] + home = a.xpath(".//div[@class='contentLeft']/p[@class='false false']/text()")[0] + away = a.xpath(".//div[@class='contentRight']/p[@class='false false']/text()")[0] + rmList = a.xpath(".//div[@class='contentCenter']/p/text()") + remark = rmList[1].replace('|','').replace(' ','') + '|' + rmList[0] + videos.append({ + "vod_id": aid, + "vod_name": home + 'vs' + away, + "vod_pic": img, + "vod_remarks": remark + }) + result['list'] = videos + result['page'] = pg + result['pagecount'] = pgc + result['limit'] = numvL + result['total'] = numvL + return result + + def detailContent(self,array): + aid = array[0] + url = "http://m.jrskbs.com/live/{0}.html".format(aid) + rsp = self.fetch(url) + root = self.html(rsp.text) + divContent = root.xpath("//div[@class='today']")[0] + home = divContent.xpath(".//p[@class='onePlayer homeTeam']/text()")[0] + away = divContent.xpath(".//div[3]/text()")[0].strip() + title = home + 'vs' + away + pic = divContent.xpath(".//img[@class='gameLogo1 homeTeam_img']/@src")[0] + typeName = divContent.xpath(".//div/p[@class='name1 matchTime_wap']/text()")[0] + remark = divContent.xpath(".//div/p[@class='time1 matchTitle']/text()")[0].replace(' ','') + vod = { + "vod_id": aid, + "vod_name": title, + "vod_pic": pic, + "type_name": typeName, + "vod_year": "", + "vod_area": "", + "vod_remarks": remark, + "vod_actor": '', + "vod_director":'', + "vod_content": '' + } + urlList = root.xpath("//div[@class='liveshow']/a") + playUrl = '' + for url in urlList: + name = url.xpath("./text()")[0] + purl = url.xpath("./@data-url")[0] + playUrl =playUrl + '{0}${1}#'.format(name, purl) + vod['vod_play_from'] = '体育直播' + vod['vod_play_url'] = playUrl + + result = { + 'list': [ + vod + ] + } + return result + + def searchContent(self,key,quick): + result = {} + return result + + def playerContent(self,flag,id,vipFlags): + result = {} + url = id + if '04stream' in url: + rsp = self.fetch(url) + html = rsp.text + strList = re.findall(r"eval\((.*?)\);", html) + fuctList = strList[1].split('+') + scrpit = '' + for fuc in fuctList: + if fuc.endswith(')'): + append = fuc.split(')')[-1] + else: + append = '' + Unicode = int(self.regStr(reg=r'l\((.*?)\)', src=fuc)) + char = chr(Unicode % 256) + char = char + append + scrpit = scrpit + char + par = self.regStr(reg=r'/(.*)/', src=scrpit).replace(')', '') + pars = par.split('/') + infoList = strList[2].split('+') + str = '' + for info in infoList: + if info.startswith('O'): + Unicode = int(int(self.regStr(reg=r'O\((.*?)\)', src=info)) / int(pars[0]) / int(pars[1])) + char = chr(Unicode % 256) + str = str + char + purl = self.regStr(reg=r"play_url=\'(.*?)\'", src=str) + result["parse"] = 0 + elif 'v.stnye.cc' in url: + purl = id + result["parse"] = 1 + elif 'dplayer' in url: + url = 'https://m.jrskbs.com' + url + rsp = self.fetch(url) + purl = self.regStr(reg=r'var PlayUrl = \"(.*?)\"', src=rsp.text) + result["parse"] = 0 + result["playUrl"] = '' + result["url"] = purl + result["header"] = '' + return result + + config = { + "player": {}, + "filter": {} + } + header = {} + + def localProxy(self,param): + action = { + 'url':'', + 'header':'', + 'param':'', + 'type':'string', + 'after':'' + } + return [200, "video/MP2T", action, ""] \ No newline at end of file -- GitLab