diff --git a/drpy/drpy.js b/drpy/drpy.js index d63b7e4..e9d40d5 100644 --- a/drpy/drpy.js +++ b/drpy/drpy.js @@ -1,1448 +1,34 @@ -import 'https://raw.iqiq.io/2hacc/TVBox/main/drpy/lib/util.js'; -import cheerio from 'https://raw.iqiq.io/2hacc/TVBox/main/drpy/lib/cheerio.min.js'; -import 'https://raw.iqiq.io/2hacc/TVBox/main/drpy/lib/crypto-js.js' -// import muban from 'https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/模板.js'; - -// const key = 'drpy_zbk'; -// eval(req('http://192.168.1.124:5705/libs/es6py.js').content); -function init_test() { - console.log("init_test_start"); - console.log(RKEY); - console.log(JSON.stringify(rule)); - // clearItem(RULE_CK); - // console.log(JSON.stringify(rule)); - // let aa = base64Encode('编码测试一下') - // log(aa); - // let bb = base64Decode(aa); - // log('bb:' + bb); - // 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"); -} - -let rule = {}; -/** 已知问题记录 - * 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 - * Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 - * 2.import es6py.js但是里面的函数没有被装载进来.比如drpy规则报错setResult2 is undefiend - * 3.无法重复导入cheerio(怎么解决drpy和parseTag里都需要导入cheerio的问题) 无法在副文件导入cheerio (现在是全部放在drpy一个文件里了,凑合解决?) - * 4.有个错误不知道哪儿来的 executeScript: com.quickjs.JSObject$Undefined cannot be cast to java.lang.String 在 点击选集播放打印init_test_end后面打印 - * 5.需要实现 stringify 函数,比起JSON.stringify函数,它会原封不动保留中文不会编码unicode - * todo: jsp:{pdfa,pdfh,pd},json:{pdfa,pdfh,pd},jq:{pdfa,pdfh,pd} - * * 电脑看日志调试 - adb tcpip 5555 - adb connect 192.168.10.192 - adb devices -l - adb logcat -c - adb logcat | grep -i QuickJS - * **/ - - -/*** 以下是内置变量和解析方法 **/ -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 = '猜你|喜欢|APP|下载|剧情|热播'; -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在线识别接口 -if (typeof (MY_URL) === 'undefined') { - var MY_URL; // 全局注入变量,pd函数需要 -} -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 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; - -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) { - 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 ''; - } -} - -let VODS = [];// 一级或者搜索需要的数据列表 -let VOD = {};// 二级的单个数据 - -/** - * 重写pd方法-增加自动urljoin(没法重写,改个名继续骗) - * @param html - * @param parse - * @param uri - * @returns {*} - */ -function pD(html, parse, uri) { - let ret = pdfh(html, parse); - if (typeof (uri) === 'undefined' || !uri) { - uri = ''; - } - if (DOM_CHECK_ATTR.test(parse)) { - if (/http/.test(ret)) { - ret = ret.substr(ret.indexOf('http')); - } else { - ret = urljoin(MY_URL, ret) - } - } - // MY_URL = getItem('MY_URL',MY_URL); - // console.log(`规则${RKEY}打印MY_URL:${MY_URL},uri:${uri}`); - return ret -} - -const parseTags = { - jsp: { - pdfh: pdfh, - pdfa: pdfa, - pd: pD, +var rule = { + title:'drpy', + host:'https://frodo.douban.com', + homeUrl:'', + searchUrl:'', + searchable:1, + quickSearch:1, + filterable:1, + // 分类链接fypage参数支持1个()表达式 + url:'/?pg=fypage&class=fyclass&douban=', + filter_url:'fl={{fl}}', + headers:{ + "Host": "frodo.douban.com", + "Connection": "Keep-Alive", + "Referer": "https://servicewechat.com/wx2f9b06c1de1ccfca/84/page-frame.html", + "content-type": "application/json", + "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat" }, - 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: pdfh, - pdfa: pdfa, - 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; - -/*** 后台需要实现的java方法并注入到js中 ***/ - -/** - * 读取本地文件->应用程序目录 - * @param filePath - * @returns {string} - */ -function readFile(filePath) { - filePath = filePath || 'https://raw.iqiq.io/2hacc/TVBox/main/drpy/lib/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 { - return html.match(/[\w|\W|\s|\S]*?(\{[\w|\W|\s|\S]*\})/).group[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' }); - html = JSON.parse(html); - code = html.url || ''; - } 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 }); - let json = JSON.parse(hhtml); - if (!cookie) { - cookie = json['set-cookie'] ? json['set-cookie'].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} - * @returns {string|string|DocumentFragment|*} - */ -function request(url, obj) { - if (typeof (obj) === 'undefined' || !obj || obj === {}) { - if (!fetch_params || !fetch_params.headers) { - let headers = { - 'User-Agent': MOBILE_UA, - }; - if (rule.headers) { - Object.assign(headers, rule.headers); - } - fetch_params.headers = headers; - } - if (!fetch_params.headers.Referer) { - fetch_params.headers.Referer = getHome(url) - } - obj = fetch_params; - } else { - let headers = obj.headers || {}; - let keys = Object.keys(headers).map(it => it.toLowerCase()); - if (!keys.includes('user-agent')) { - headers['User-Agent'] = MOBILE_UA; - } if (!keys.includes('referer')) { - headers['Referer'] = getHome(url); - } - obj.headers = headers; - } - console.log(JSON.stringify(obj.headers)); - if (typeof (obj.headers.body) != 'undefined' && obj.headers.body && typeof (obj.headers.body) === 'string') { - let data = {}; - obj.headers.body.split('&').forEach(it => { - data[it.split('=')[0]] = it.split('=')[1] - }); - obj.data = data; - delete obj.headers.body - } - if (!url) { - return obj.withHeaders ? '{}' : '' - } - if (obj.toBase64) { // 返回base64,用于请求图片 - obj.buffer = 2; - delete obj.toBase64 - } - console.log('request:' + url); - 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 - } -} - -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 = console.log; -/** - * 检查宝塔验证并自动跳过获取正确源码 - * @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; - 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) { - 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 -} - -/** - * 首页分类解析,筛选暂未实现 - * @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(';'); - if (p.length >= 4) { - try { - let html = getHtml(homeObj.MY_URL); - if (html) { - homeHtmlCache = html; - let list = pdfa(html, p[0]); - if (list && list.length > 0) { - list.forEach((it, idex) => { - try { - let name = pdfh(it, p[1]); - if (homeObj.cate_exclude && (new RegExp(homeObj.cate_exclude).test(name))) { - return; - } - let url = pdfh(it, p[2]); - if (p[3]) { - let exp = new RegExp(p[3]); - url = url.match(exp)[1]; - } - - classes.push({ - 'type_id': url.trim(), - 'type_name': name.trim() - }); - } catch (e) { - console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`); - } - }); - } - } - } catch (e) { - console.log(e.message); - } - - } - } - // 排除分类 - classes = classes.filter(it => !homeObj.cate_exclude || !(new RegExp(homeObj.cate_exclude).test(it.type_name))); - let resp = { - 'class': classes - }; - if (homeObj.filter) { - resp.filters = homeObj.filter; - } - console.log(JSON.stringify(resp)); - return JSON.stringify(resp); - -} - -/** - * 首页推荐列表解析 - * @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 p = homeVodObj.推荐; - if (!p || typeof (p) !== 'string') { - return '{}' - } - p = p.trim(); - if (p.startsWith('js:')) { - const TYPE = 'home'; - var input = MY_URL; - const HOST = rule.host; - eval(p.replace('js:', '')); - d = VODS; - } else { - p = p.split(';'); - if (!homeVodObj.double && p.length < 5) { - return '{}' - } else if (homeVodObj.double && p.length < 6) { - return '{}' - } - let _ps = parseTags.getParse(p[0]); - _pdfa = _ps.pdfa; - _pdfh = _ps.pdfh; - _pd = _ps.pd; - let is_json = p[0].startsWith('json:'); - p[0] = p[0].replace(/^(jsp:|json:|jq:)/, ''); - // print(p[0]); - 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]); - // console.log(items.length); - for (let item of items) { - // console.log(p[1]); - let items2 = _pdfa(item, p[1]); - // console.log(items2.length); - 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('$') - }; - // print(vod); - 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) { - - } - } - // console.log(JSON.stringify(d)); - 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 (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 : {}; - 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]; - // 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); - } - } - if (cateObj.pg === 1 && url.includes('[') && url.includes(']')) { - url = url.split('[')[1].split(']')[0]; - } - 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; - 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); - } - } - // print(d); - return d.length < 1 ? '{}' : JSON.stringify({ - 'page': parseInt(cateObj.pg), - 'pagecount': 999, - 'limit': 20, - 'total': 999, - 'list': d, - }); -} - -/** - * 搜索列表数据解析 - * @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 url = searchObj.searchUrl.replaceAll('**', searchObj.wd).replaceAll('fypage', searchObj.pg); - MY_URL = url; - console.log(MY_URL); - // 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 _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}`); - } - // obj.headers['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, - }); -} - -/** - * 二级详情页数据解析 - * @param detailObj - * @returns {string} - */ -function detailParse(detailObj) { - fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); - let vod = { - vod_id: detailObj.orId, //"id", - 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); - // 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; - } 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]).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:')) { - 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) { - let p_tab = p.tabs.split(';')[0]; - console.log(p_tab); - let vHeader = _pdfa(html, p_tab); - - console.log(vHeader.length); - for (let v of vHeader) { - let v_title = _pdfh(v, 'body&&Text'); - console.log(v_title); - if (tab_exclude && (new RegExp(tab_exclude)).test(v_title)) { - continue; - } - playFrom.push(v_title); - } - console.log(JSON.stringify(playFrom)); - } else { - playFrom = ['道长在线'] - } - vod.vod_play_from = playFrom.join(vod_play_from); - - // console.log(3); - let vod_play_url = '$$$'; - let vod_tab_list = []; - if (p.lists) { - for (let i = 0; i < playFrom.length; i++) { - let tab_name = playFrom[i]; - let tab_ext = p.tabs.split(';').length > 1 ? 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); - // 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 = []; - let tabName = tab_ext ? _pdfh(html, tab_ext) : tab_name; - console.log(tabName); - // console.log('cheerio解析Text'); - vodList.forEach(it => { - // 请注意,这里要固定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, 'body&&Text') + '$' + _pd(it, 'a&&href', MY_URL)); - }); - let vlist = new_vod_list.join('#'); - vod_tab_list.push(vlist); - } - } - vod.vod_play_url = vod_tab_list.join(vod_play_url); - } - // print(vod); - return JSON.stringify({ - list: [vod] - }) -} - -/** - * 选集播放点击事件解析 - * @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 - }; - let lazy_play; - if (!rule.play_parse || !rule.lazy) { - lazy_play = common_play; - } else if (rule.play_parse && rule.lazy && typeof (rule.lazy) === 'string') { - try { - let lazy_code = rule.lazy.replace('js:', '').trim(); - print('开始执行js免嗅=>' + lazy_code); - eval(lazy_code); - lazy_play = typeof (input) === 'object' ? input : { - parse: 1, - jx: 1, - url: input - }; - } catch (e) { - print('js免嗅错误:' + e.message); - lazy_play = common_play; - } - } else { - lazy_play = common_play; - } - console.log(JSON.stringify(lazy_play)); - return JSON.stringify(lazy_play); -} - -/** - * js源预处理特定返回对象中的函数 - * @param ext - */ -function init(ext) { - console.log('init'); - try { - // make shared jsContext happy - if (typeof (globalThis.mubanJs) === 'undefined') { - // let mubanJs = request('https://gitcode.net/qq_32394351/dr_py/-/raw/master/js/模板.js', { 'User-Agent': MOBILE_UA }); - let mubanJs = request('https://raw.iqiq.io/2hacc/TVBox/main/drpy/lib/模板.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')); - } - /** 处理一下 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 || 5000; - 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); - } - } - // 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); - 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) { - 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; - 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) -} - -/** - * 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) { - let searchObj = { - searchUrl: rule.searchUrl, - 搜索: rule.搜索, - wd: wd, - //pg: pg, - pg: 1, - quick: quick, - }; - // console.log(JSON.stringify(searchObj)); - return searchParse(searchObj) -} - -function DRPY() {//导出函数 - return { - init: init, - home: home, - homeVod: homeVod, - category: category, - detail: detail, - play: play, - search: search, - } -} - - -let pd = pD; - -// 导出函数对象 -__JS_SPIDER__ = { - init: init, - home: home, - homeVod: homeVod, - category: category, - detail: detail, - play: play, - search: search, - DRPY: DRPY -} + timeout:5000, + class_name:'我的豆瓣&热门电影&热播剧集&热播综艺&电影筛选&电视筛选&电影榜单&电视榜单', + class_url:'interests&hot_gaia&tv_hot&show_hot&movie&tv&rank_list_movie&rank_list_tv', + filter:{'interests': [{'key': 'status', 'name': '状态', 'value': [{'n': '想看', 'v': 'mark'}, {'n': '在看', 'v': 'doing'}, {'n': '看过', 'v': 'done'}]}, {'key': 'subtype_tag', 'name': '形式', 'value': [{'n': '全部', 'v': ''}, {'n': '电影', 'v': 'movie'}, {'n': '电视', 'v': 'tv'}]}, {'key': 'year_tag', 'name': '年代', 'value': [{'n': '全部', 'v': '全部'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}], 'hot_gaia': [{'key': 'sort', 'name': '排序', 'value': [{'n': '热度', 'v': 'recommend'}, {'n': '最新', 'v': 'time'}, {'n': '评分', 'v': 'rank'}]}, {'key': 'area', 'name': '地区', 'value': [{'n': '全部', 'v': '全部'}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}]}], 'tv_hot': [{'key': 'type', 'name': '分类', 'value': [{'n': '综合', 'v': 'tv_hot'}, {'n': '国产剧', 'v': 'tv_domestic'}, {'n': '欧美剧', 'v': 'tv_american'}, {'n': '日剧', 'v': 'tv_japanese'}, {'n': '韩剧', 'v': 'tv_korean'}, {'n': '动画', 'v': 'tv_animation'}]}], 'show_hot': [{'key': 'type', 'name': '分类', 'value': [{'n': '综合', 'v': 'show_hot'}, {'n': '国内', 'v': 'show_domestic'}, {'n': '国外', 'v': 'show_foreign'}]}], 'movie': [{'key': '类型', 'name': '类型', 'value': [{'n': '全部类型', 'v': ''}, {'n': '喜剧', 'v': '喜剧'}, {'n': '爱情', 'v': '爱情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '动画', 'v': '动画'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '惊悚', 'v': '惊悚'}, {'n': '冒险', 'v': '冒险'}, {'n': '音乐', 'v': '音乐'}, {'n': '历史', 'v': '历史'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '战争', 'v': '战争'}, {'n': '传记', 'v': '传记'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '武侠', 'v': '武侠'}, {'n': '情色', 'v': '情色'}, {'n': '灾难', 'v': '灾难'}, {'n': '西部', 'v': '西部'}, {'n': '纪录片', 'v': '纪录片'}, {'n': '短片', 'v': '短片'}]}, {'key': '地区', 'name': '地区', 'value': [{'n': '全部地区', 'v': ''}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '英国', 'v': '英国'}, {'n': '法国', 'v': '法国'}, {'n': '德国', 'v': '德国'}, {'n': '意大利', 'v': '意大利'}, {'n': '西班牙', 'v': '西班牙'}, {'n': '印度', 'v': '印度'}, {'n': '泰国', 'v': '泰国'}, {'n': '俄罗斯', 'v': '俄罗斯'}, {'n': '加拿大', 'v': '加拿大'}, {'n': '澳大利亚', 'v': '澳大利亚'}, {'n': '爱尔兰', 'v': '爱尔兰'}, {'n': '瑞典', 'v': '瑞典'}, {'n': '巴西', 'v': '巴西'}, {'n': '丹麦', 'v': '丹麦'}]}, {'key': 'sort', 'name': '排序', 'value': [{'n': '近期热度', 'v': 'T'}, {'n': '首映时间', 'v': 'R'}, {'n': '高分优先', 'v': 'S'}]}, {'key': '年代', 'name': '年代', 'value': [{'n': '全部年代', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}], 'tv': [{'key': '类型', 'name': '类型', 'value': [{'n': '不限', 'v': ''}, {'n': '电视剧', 'v': '电视剧'}, {'n': '综艺', 'v': '综艺'}]}, {'key': '电视剧形式', 'name': '电视剧形式', 'value': [{'n': '不限', 'v': ''}, {'n': '喜剧', 'v': '喜剧'}, {'n': '爱情', 'v': '爱情'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '动画', 'v': '动画'}, {'n': '武侠', 'v': '武侠'}, {'n': '古装', 'v': '古装'}, {'n': '家庭', 'v': '家庭'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '科幻', 'v': '科幻'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '历史', 'v': '历史'}, {'n': '战争', 'v': '战争'}, {'n': '动作', 'v': '动作'}, {'n': '冒险', 'v': '冒险'}, {'n': '传记', 'v': '传记'}, {'n': '剧情', 'v': '剧情'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '惊悚', 'v': '惊悚'}, {'n': '灾难', 'v': '灾难'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '音乐', 'v': '音乐'}]}, {'key': '综艺形式', 'name': '综艺形式', 'value': [{'n': '不限', 'v': ''}, {'n': '真人秀', 'v': '真人秀'}, {'n': '脱口秀', 'v': '脱口秀'}, {'n': '音乐', 'v': '音乐'}, {'n': '歌舞', 'v': '歌舞'}]}, {'key': '地区', 'name': '地区', 'value': [{'n': '全部地区', 'v': ''}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '国外', 'v': '国外'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '美国', 'v': '美国'}, {'n': '英国', 'v': '英国'}, {'n': '泰国', 'v': '泰国'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '意大利', 'v': '意大利'}, {'n': '法国', 'v': '法国'}, {'n': '德国', 'v': '德国'}, {'n': '西班牙', 'v': '西班牙'}, {'n': '俄罗斯', 'v': '俄罗斯'}, {'n': '瑞典', 'v': '瑞典'}, {'n': '巴西', 'v': '巴西'}, {'n': '丹麦', 'v': '丹麦'}, {'n': '印度', 'v': '印度'}, {'n': '加拿大', 'v': '加拿大'}, {'n': '爱尔兰', 'v': '爱尔兰'}, {'n': '澳大利亚', 'v': '澳大利亚'}]}, {'key': 'sort', 'name': '排序', 'value': [{'n': '近期热度', 'v': 'T'}, {'n': '首播时间', 'v': 'R'}, {'n': '高分优先', 'v': 'S'}]}, {'key': '年代', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}, {'key': '平台', 'name': '平台', 'value': [{'n': '全部', 'v': ''}, {'n': '腾讯视频', 'v': '腾讯视频'}, {'n': '爱奇艺', 'v': '爱奇艺'}, {'n': '优酷', 'v': '优酷'}, {'n': '湖南卫视', 'v': '湖南卫视'}, {'n': 'Netflix', 'v': 'Netflix'}, {'n': 'HBO', 'v': 'HBO'}, {'n': 'BBC', 'v': 'BBC'}, {'n': 'NHK', 'v': 'NHK'}, {'n': 'CBS', 'v': 'CBS'}, {'n': 'NBC', 'v': 'NBC'}, {'n': 'tvN', 'v': 'tvN'}]}], 'rank_list_movie': [{'key': '榜单', 'name': '榜单', 'value': [{'n': '实时热门电影', 'v': 'movie_real_time_hotest'}, {'n': '一周口碑电影榜', 'v': 'movie_weekly_best'}, {'n': '豆瓣电影Top250', 'v': 'movie_top250'}]}], 'rank_list_tv': [{'key': '榜单', 'name': '榜单', 'value': [{'n': '实时热门电视', 'v': 'tv_real_time_hotest'}, {'n': '华语口碑剧集榜', 'v': 'tv_chinese_best_weekly'}, {'n': '全球口碑剧集榜', 'v': 'tv_global_best_weekly'}, {'n': '国内口碑综艺榜', 'v': 'show_chinese_best_weekly'}, {'n': '国外口碑综艺榜', 'v': 'show_global_best_weekly'}]}]}, + limit:20, + play_parse:false, + 推荐:'', + 推荐:'js:let d=[];let douban_api_host="https://frodo.douban.com/api/v2";let miniapp_apikey="0ac44ae016490db2204ce0a042db2916";const count=30;function miniapp_request(path,query){try{let url=douban_api_host+path;query.apikey=miniapp_apikey;fetch_params.headers=oheaders;url=buildUrl(url,query);let html=fetch(url,fetch_params);return JSON.parse(html)}catch(e){print("发生了错误:"+e.message);return{}}}function subject_real_time_hotest(){try{let res=miniapp_request("/subject_collection/subject_real_time_hotest/items",{});let lists=[];let arr=res.subject_collection_items||[];arr.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"暂无评分";let honnor=(item.honor_infos||[]).map(function(it){return it.title}).join("|");lists.append({vod_id:"msearch:"+TYPE,vod_name:item.title||"",vod_pic:item.pic.normal,vod_remarks:rating+" "+honnor})}});return lists}catch(e){print("发生了错误:"+e.message);return[]}}VODS=subject_real_time_hotest();print(VODS);', + // 手动调用解析请求json的url,此lazy不方便 + lazy:'', + // 推荐:'.list_item;img&&alt;img&&src;a&&Text;a&&data-float', + 一级:'', + 一级:'js:let d=[];let douban=input.split("douban=")[1].split("&")[0];let douban_api_host="https://frodo.douban.com/api/v2";let miniapp_apikey="0ac44ae016490db2204ce0a042db2916";const count=30;function miniapp_request(path,query){try{let url=douban_api_host+path;query.apikey=miniapp_apikey;fetch_params.headers=oheaders;url=buildUrl(url,query);let html=fetch(url,fetch_params);return JSON.parse(html)}catch(e){print("发生了错误:"+e.message);return{}}}function cate_filter(d,douban){douban=douban||"";try{let res={};if(MY_CATE==="interests"){if(douban){let status=MY_FL.status||"mark";let subtype_tag=MY_FL.subtype_tag||"";let year_tag=MY_FL.year_tag||"全部";let path="/user/"+douban+"/interests";res=miniapp_request(path,{type:"movie",status:status,subtype_tag:subtype_tag,year_tag:year_tag,start:(MY_PAGE-1)*count,count:count})}else{return{}}}else if(MY_CATE==="hot_gaia"){let sort=MY_FL.sort||"recommend";let area=MY_FL.area||"全部";let path="/movie/"+MY_CATE;res=miniapp_request(path,{area:area,sort:sort,start:(MY_PAGE-1)*count,count:count})}else if(MY_CATE==="tv_hot"||MY_CATE==="show_hot"){let stype=MY_FL.type||MY_CATE;let path="/subject_collection/"+stype+"/items";res=miniapp_request(path,{start:(MY_PAGE-1)*count,count:count})}else if(MY_CATE.startsWith("rank_list")){let id=MY_CATE==="rank_list_movie"?"movie_real_time_hotest":"tv_real_time_hotest";id=MY_FL.榜单||id;let path="/subject_collection/"+id+"/items";res=miniapp_request(path,{start:(MY_PAGE-1)*count,count:count})}else{let path="/"+MY_CATE+"/recommend";let selected_categories;let tags;let sort;if(Object.keys(MY_FL).length>0){sort=MY_FL.sort||"T";tags=Object.values(MY_FL).join(",");if(MY_CATE==="movie"){selected_categories={"类型":MY_FL.类型||"","地区":MY_FL.地区||""}}else{selected_categories={"类型":MY_FL.类型||"","形式":MY_FL.类型?MY_FL.类型+"地区":"","地区":MY_FL.地区||""}}}else{sort="T";tags="";if(MY_CATE==="movie"){selected_categories={"类型":"","地区":""}}else{selected_categories={"类型":"","形式":"","地区":""}}}let params={tags:tags,sort:sort,refresh:0,selected_categories:stringify(selected_categories),start:(MY_PAGE-1)*count,count:count};res=miniapp_request(path,params)}let result={page:MY_PAGE,pagecount:Math.ceil(res.total/count),limit:count,total:res.total};let items=[];if(/^rank_list|tv_hot|show_hot/.test(MY_CATE)){items=res["subject_collection_items"]}else if(MY_CATE==="interests"){res["interests"].forEach(function(it){items.push(it.subject)})}else{items=res.items}let lists=[];items.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"";let rat_str=rating||"暂无评分";let title=item.title;let honor=item.honor_infos||[];let honor_str=honor.map(function(it){return it.title}).join("|");let vod_obj={vod_name:title!=="未知电影"?title:"暂不支持展示",vod_pic:item.pic.normal,vod_remarks:rat_str+" "+honor_str};let vod_obj_d={url:item.type+"$"+item.id,title:title!=="未知电影"?title:"暂不支持展示",pic_url:item.pic.normal,desc:rat_str+" "+honor_str};lists.push(vod_obj);d.push(vod_obj_d)}});result.list=lists;return result}catch(e){print(e.message)}return{}}let res=cate_filter(d);setResult2(res);', + 二级:'', + 搜索:'', +} \ No newline at end of file diff --git a/drpy/js/69美剧.js b/drpy/js/69美剧.js new file mode 100644 index 0000000..2632cc4 --- /dev/null +++ b/drpy/js/69美剧.js @@ -0,0 +1,23 @@ +var rule={ + title:'69美剧', + host:'https://www.69mj.com', + // homeUrl:'/', + url:'/index.php/vod/show/by/time/id/fyclass/page/fypage/year/2022.html', + searchUrl:'/index.php/vod/search.html?wd=**', + searchable:2,//是否启用全局搜索, + quickSearch:1,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + class_parse:'.nav-menu-items&&li;a&&Text;a&&href;/(\\d+).html', + play_parse:true, + lazy:'', + limit:6, + 推荐:'.module-list;&&.module-item;a&&title;.lazyloaded&&data-src;.module-item-text&&Text;a&&href', + double:true, // 推荐内容是否双层定位 + 一级:'.module&&.module-item;a&&title;.lazyloaded&&data-src;.module-item-text&&Text;a&&href', + 二级:{"title":"h1&&Text;.tag-link&&span&&Text","img":".lazyload&&data-src","desc":".scroll-box:eq(0)&&Text;.scroll-box:eq(1)&&Text;.scroll-box:eq(2)&&Text;.scroll-box:eq(3)&&Text","content":".vod_content&&Text","tabs":".module-tab-content&&div","lists":".sort-item:eq(#id) a"}, + 搜索:'.module&&.module-search-item;h3&&Text;.lazyload&&data-src;.video-serial&&Text;a&&href', +} \ No newline at end of file diff --git a/drpy/js/8号影院.js b/drpy/js/8号影院.js new file mode 100644 index 0000000..2378991 --- /dev/null +++ b/drpy/js/8号影院.js @@ -0,0 +1,22 @@ +var rule={ +title:'8号影院', + host:'http://www.8hysw.com', + // homeUrl:'/', + url:'/frim/fyclass-fypage.html', + searchUrl:'/search.php?page=fypage&searchword=**&searchtype=', +searchable:2,//是否启用全局搜索, +quickSearch:0,//是否启用快速搜索, +filterable:0,//是否启用分类筛选, +class_name:'电影&电视剧&综艺&动漫&日韩剧&国产剧&欧美剧&港台剧', + class_url:'1&2&3&4&16&13&15&14', +play_parse:true, +lazy:'', +limit:6, +tab_exclude:'本周热门|最近更新', +推荐:'.stui-pannel_bd;.stui-vodlist li;h4&&Text;.lazyload&&data-original;.text-right&&Text;a&&href', +double:true, // 推荐内容是否双层定位 +一级:'.stui-vodlist.clearfix&&li;a&&title;.lazyload&&data-original;.text-right&&Text;a&&href', +二级:{"title":"h1&&Text;.stui-content__detail&&p&&Text","img":".lazyload&&data-original","desc":".data:eq(0)&&Text;.data:eq(1)&&Text;.data:eq(2)&&Text;.data:eq(3)&&Text","content":".desc&&Text","tabs":".stui-pannel__head.bottom-line h3","lists":".stui-content__playlist:eq(#id) li"}, + 搜索:muban.首图2.搜索2, + +} \ No newline at end of file diff --git a/drpy/js/KUBO影视[飞].js b/drpy/js/KUBO影视[飞].js new file mode 100644 index 0000000..fa644a1 --- /dev/null +++ b/drpy/js/KUBO影视[飞].js @@ -0,0 +1,25 @@ +var rule = { + title:'KUBO影视', + host:'https://123kubo.tv', + // homeUrl:'/', + url:'/show/fyclass/page/fypage.html', + searchUrl:'/search/page/fypage/wd/**.html', + searchable:2,//是否启用全局搜索, + quickSearch:0,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + class_name:'电影&电视剧&综艺&动漫', + class_url:'1&2&3&4', + //class_parse:'.myui-panel-box&&ul&&li;a&&Text;a&&href;/v/(.*)/', + play_parse:true, + lazy:'', + limit:6, + 推荐:'ul.hl-vod-list;li;a&&title;.hl-item-thumb.hl-lazy&&data-original;.hl-pic-text&&Text;a&&href', + double:true, // 推荐内容是否双层定位 + 一级:'.hl-list-item;a&&title;.hl-item-thumb.hl-lazy&&data-original;.hl-pic-text&&Text;a&&href', + 二级:{"title":".hl-item-thumb.hl-lazy&&title;.hl-full-box&&ul li:eq(6)&&Text","img":".hl-item-thumb.hl-lazy&&data-original","desc":".hl-full-box&&ul&&li:eq(1)&&Text;.hl-full-box&&ul&&li:eq(2)&&Text;.hl-full-box&&ul&&li:eq(3)&&Text","content":".hl-col-xs-12.blurb&&Text","tabs":".hl-plays-from:eq(0) a","lists":".hl-plays-list:eq(#id) li"}, + 搜索:'.hl-item-div;a&&title;.hl-item-thumb&&data-original;.hl-lc-1&&Text;a&&href;.text-muted:eq(-1)&&Text', +} diff --git a/drpy/js/RP影视.js b/drpy/js/RP影视.js new file mode 100644 index 0000000..54f63c2 --- /dev/null +++ b/drpy/js/RP影视.js @@ -0,0 +1,21 @@ + +var rule={ + title:'RP影视', + host:'https://mac.rp123.top', + url:'/vodshow/fyclass--------fypage---/', + searchUrl:'/vodsearch/**----------fypage---/', + searchable:2, + quickSearch:0, + filterable:0, + headers:{'User-Agent':'MOBILE_UA',}, + class_name:'电影&电视剧&综艺&动漫&纪录片&4K专区', + class_url:'1&2&3&4&35&40', + 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.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', +} \ No newline at end of file diff --git a/drpy/js/TV蜂.js b/drpy/js/TV蜂.js new file mode 100644 index 0000000..21b14cf --- /dev/null +++ b/drpy/js/TV蜂.js @@ -0,0 +1,25 @@ + +var rule = { + title:'TV蜂', + host:'https://www.tvfeng.net', + // homeUrl:'/', + url:'/tvfenshow/fyclass--------fypage---.html', + searchUrl:'/tvfensearch/**----------fypage---.html', + searchable:2,//是否启用全局搜索, + quickSearch:0,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + class_name:'电影&电视剧&综艺&动漫', + class_url:'1&2&3&4', + 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(3)&&Text;.video-info-items:eq(2)&&Text;.video-info-items:eq(1)&&Text","content":".vod_content&&Text","tabs":".module-tab-item","lists":".module-player-list:eq(#id)&&.scroll-content&&a"}, + 搜索:'.module-items .module-search-item;h3&&Text;img&&data-src;.video-serial&&Text;a&&href', +} diff --git a/drpy/js/ddys.js b/drpy/js/ddys.js new file mode 100644 index 0000000..5d67d28 --- /dev/null +++ b/drpy/js/ddys.js @@ -0,0 +1,29 @@ +var rule={ + title:'ddys', + host:'https://ddys.tv', + // homeUrl:'/', + url:'/fyclass/page/fypage/', + searchUrl:'/?s=**&post_type=post', + searchable:2,//是否启用全局搜索, + quickSearch:0,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + // class_name:'电影&剧集&动画', + // class_url:'movie&airing&anime', + class_parse:'#primary-menu li.menu-item;a&&Text;a&&href;\.tv/(.*)', + cate_exclude:'站长|^其他$|关于|^电影$|^剧集$|^类型$', + play_parse:true, + lazy:'js:let purl=input.split("|")[0];let referer=input.split("|")[1];let zm=input.split("|")[2];print("purl:"+purl);print("referer:"+referer);print("zm:"+zm);let myua="okhttp/3.15";if(/ddrkey/.test(purl)){let ret=request(purl,{Referer:referer,withHeaders:true,"User-Agent":myua});log(ret);input=purl}else{let html=request(purl,{headers:{Referer:referer,"User-Agent":myua}});print(html);try{input=JSON.parse(html).url||{}}catch(e){input=purl}}', + limit:6, + //推荐:'.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href', + double:true, // 推荐内容是否双层定位 + 一级:'.post-box-list&&article;a:eq(-1)&&Text;.post-box-image&&style;a:eq(0)&&Text;a:eq(-1)&&href', + 二级:{"title":".post-title&&Text;.cat-links&&Text","img":".doulist-item&&img&&data-cfsrc","desc":".published&&Text","content":".abstract&&Text","tabs":"js:TABS=['国内','海外(貌似不能播放)']", + lists:'js:log(TABS);let d=[];pdfh=jsp.pdfh;pdfa=jsp.pdfa;if(typeof play_url==="undefined"){var play_url=""}function getLists(html){let src=pdfh(html,".wp-playlist-script&&Html");src=JSON.parse(src).tracks;let list1=[];let list2=[];src.forEach(function(it){let src0=it.src0;let src1=it.src1;let src2=it.src2;let title=it.caption;let url1="https://ddys.tv/getvddr/video?id="+src1+"&dim=1080P+&type=mix";let url2="https://w.ddys.tv"+src0+"?ddrkey="+src2;let zm="https://ddys.tv/subddr/"+it.subsrc;list1.push({title:title,url:url1,desc:zm});list2.push({title:title,url:url2,desc:zm})});return{list1:list1,list2:list2}}var data=getLists(html);var list1=data.list1;var list2=data.list2;let nums=pdfa(html,"body&&.post-page-numbers");nums.forEach(function(it){let num=pdfh(it,"body&&Text");log(num);let nurl=input+num+"/";if(num==1){return}log(nurl);let html=request(nurl);let data=getLists(html);list1=list1.concat(data.list1);list2=list2.concat(data.list2)});list1=list1.map(function(item){return item.title+"$"+play_url+urlencode(item.url+"|"+input+"|"+item.desc)});list2=list2.map(function(item){return item.title+"$"+play_url+urlencode(item.url+"|"+input+"|"+item.desc)});LISTS=[list1,list2];', + }, + 搜索:'#main&&article;.post-title&&Text;;.published&&Text;a&&href', + 推荐:'*' +} \ No newline at end of file diff --git a/drpy/js/if101[飞].js b/drpy/js/if101[飞].js new file mode 100644 index 0000000..21bff1d --- /dev/null +++ b/drpy/js/if101[飞].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/drpy/js/凌云影视.js b/drpy/js/凌云影视.js index 8f2d9bb..7443647 100644 --- a/drpy/js/凌云影视.js +++ b/drpy/js/凌云影视.js @@ -1,21 +1,4 @@ -var rule={ +var rule = Object.assign(muban.短视,{ title:'凌云影视', host:'https://www.lingyun.in', - // searchUrl:'/v_search/**----------fypage---.html', - url:'/channel/fyclass-fypage.html', - headers:{ - 'User-Agent':'MOBILE_UA' - }, - timeout:5000, - class_parse:'.over-auto li;a&&Text;a&&href;.*/(.*?).html', - cate_exclude:'解析', - limit:40, - play_parse:true, - lazy:'', - 推荐:'ul.pic-list.pic-list-nth;li;a&&title;img&&data-src;.s1&&Text;a&&href', - double:true, - 一级:'ul.pic-list.clearfix&&li;a&&title;img&&data-src;.s1&&Text;a&&href', - 二级:{"title":".content-rt&&h1&&Text;.content-rt&&p:eq(0)&&Text","img":".img&&img&&data-src","desc":".content-rt&&p:eq(2)&&Text;.content-rt&&p:eq(3)&&Text","content":".movie-introduce&&.sqjj_a&&Text","tabs":".py-tabs&&option","lists":"ul.player:eq(#id)&&li"}, - // 搜索:'.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href', - searchable:0,//是否启用全局搜索, -}; \ No newline at end of file +}); \ No newline at end of file diff --git a/drpy/js/双十电影.js b/drpy/js/双十电影.js new file mode 100644 index 0000000..cea09dc --- /dev/null +++ b/drpy/js/双十电影.js @@ -0,0 +1,14 @@ +muban.首图2.推荐 = 'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href'; +muban.首图2.二级.content = '.stui-pannel_bd p:eq(0)'; +muban.首图2.二级.desc = ';;.stui-content__detail p:eq(0);.stui-content__detail p:eq(1);.stui-content__detail p:eq(2)' +muban.首图2.二级.tabs = '.stui-pannel__head.bottom-line.active.clearfix h3'; +var rule = Object.assign(muban.首图2,{ +title:'双十电影', +host:'https://www.1010dy3.com', +url:'/show/fyclass/page/fypage/', +searchUrl:'/search/page/fypage/wd/**/', +class_name:'电影&电视剧&动漫&综艺', +class_url:'1&2&3&4', +tab_exclude:'为你|榜单', +搜索:'ul.stui-vodlist__media&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text', +}); diff --git a/drpy/js/完美看看.js b/drpy/js/完美看看.js index c8211ce..a2de524 100644 --- a/drpy/js/完美看看.js +++ b/drpy/js/完美看看.js @@ -2,9 +2,8 @@ muban.首图2.二级.tabs = '.stui-pannel__head&&h3'; var rule = Object.assign(muban.首图2,{ title:'完美看看', host:'https://www.wanmeikk.film', +class_parse:'.dropdown&&li;a&&Text;a&&href;.*/(.*?).html', +cate_exclude:'消息|专题', url:'/category/fyclass-fypage.html', -searchUrl:'/vodsearch/**-------------.html', -class_name:'电影&美剧&韩剧&日剧&国产剧&动漫',//静态分类名称拼接 -class_url:'1&2&3&4&5&6',//静态分类标识拼接 -class_parse:'', -}); +searchUrl:'/so/-------------.html?wd=**&submit=', +}); \ No newline at end of file diff --git a/drpy/js/小品网.js b/drpy/js/小品网.js new file mode 100644 index 0000000..a387828 --- /dev/null +++ b/drpy/js/小品网.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/drpy/js/小强迷.js b/drpy/js/小强迷.js index d922187..58075a2 100644 --- a/drpy/js/小强迷.js +++ b/drpy/js/小强迷.js @@ -1,6 +1,6 @@ muban.首图2.二级.content = '.stui-content__desc&&Text'; muban.首图2.二级.title = '.stui-content__detail&&h3&&Text;.stui-content__detail&&p:eq(1)&&Text;'; -muban.首图2.二级.重定向='js:let url = jsp.pd(html,".playbtn&&a&&href");log(url);html = request(url)'; +muban.首图2.二级.重定向='js:let url = jsp.pd(html,".playbtn&&a&&href");log("重定向到:"+url);html = request(url)'; muban.首图2.二级.tabs='.t-ul&&li'; muban.首图2.二级.lists='.stui-content__playlist:eq(#id)&&li'; diff --git a/drpy/js/尘落影视.js b/drpy/js/尘落影视.js new file mode 100644 index 0000000..d8ec910 --- /dev/null +++ b/drpy/js/尘落影视.js @@ -0,0 +1,23 @@ +var rule={ + title:'尘落影视', + host:'http://v.ftixkrv.cn', + url:'/whole/fyclass_______0_addtime_fypage.html', + searchUrl:'/?c=search&wd=**&sort=addtime&order=desc&page=fypage', + searchable:2,//是否启用全局搜索, + quickSearch:0,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'PC_UA', + // "Cookie": "searchneed=ok" + }, + class_name:'电影&电视剧&综艺&动漫', + class_url:'1&2&4&3', + cate_exclude:'全网资源', + play_parse:true, + lazy:'', + limit:6, + 推荐:'.movie-item-in;a&&title;img&&src;em&&Text;a&&href', + 一级:'.movie-item-in;a&&title;img&&src;em&&Text;a&&href', + 二级:{"title":"h1&&Text;.table-striped tr:eq(2)&&Text","img":".img-thumbnail&&src","desc":";;.table-striped tr:eq(3)&&Text;.table-striped tr:eq(1)&&Text;.table-striped tr:eq(0)&&Text","content":".movie-introduce&&Text","tabs":".nav.nav-tabs li a","lists":".tab-pane.active:eq(#id) div a"}, + 搜索:'.movie-item-in;a&&title;img&&src;em&&Text;a&&href', +} \ No newline at end of file diff --git a/drpy/js/快看.js b/drpy/js/快看.js new file mode 100644 index 0000000..5dbf552 --- /dev/null +++ b/drpy/js/快看.js @@ -0,0 +1,25 @@ +var rule={ + title:'快看', + host:'https://www.kuaikanys.net', + // homeUrl:'/', + url:'/s/fyclass/page/fypage.html', + searchUrl:'/vodsearch/-------------.html?wd=**&submit=', + searchable:2,//是否启用全局搜索, + quickSearch:1,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + class_parse:'nav ul li;a&&Text;a&&href;.*/(.*?)\.html', + cate_exclude:'专题', + play_parse:true, + lazy:'', + limit:6, + 推荐:'.show;ul&&li;*;*;*;*', + double:true, // 推荐内容是否双层定位 + 一级:'.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"}, + 搜索:'*', + // 搜索:'*;*;*;*;*', +} \ No newline at end of file diff --git a/drpy/js/抓饭体育.js b/drpy/js/抓饭体育.js new file mode 100644 index 0000000..ea8785b --- /dev/null +++ b/drpy/js/抓饭体育.js @@ -0,0 +1,29 @@ +// 道长 drpy仓库 https://gitcode.net/qq_32394351/dr_py +// drpy安卓本地搭建说明 https://gitcode.net/qq_32394351/dr_py/-/blob/master/%E5%AE%89%E5%8D%93%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E8%AF%B4%E6%98%8E.md +// Pluto Player官方TG https://t.me/PlutoPlayer +// Pluto Player官方TG https://t.me/PlutoPlayerChannel + +var rule = { + title:'抓饭体育', + host:'https://www.zhuafan.tech', + url:'/sports-home/category/fyclass', + class_name:'全部&足球&篮球&羽乒&台球&棒球&户外&搏击&综合&棋盘&电竞&网球&排球&聊天&原声', + class_url:'all&Football&Basketball&Badminton&Billiards&Baseball&Outdoors&Wrestling&Others&Boardgame&Popular&Tennis&Volleyball&Chat&Acoustic', + homeUrl:'/sports-home/category/all',//网站的首页链接,用于分类获取和推荐获取 + detailUrl:'https://m.zhuafan.tech/fyid',//二级详情拼接链接(json格式用) + searchUrl:'/live-search/search/query/data?keyword=**&page=fypage&num=&searchType=all&uid=null&from=pc', + searchable:2, + quickSearch:0, + headers:{ + 'User-Agent':'PC_UA' + }, + limit:6, + timeout:5000, + play_parse:true, + lazy:'', + double:false, + 推荐:'*', + 一级:'json:data;cname;imageUrl;uname;id', + 二级:'*', + 搜索:'json:cObj.cList;*;*;*;_id', +} \ No newline at end of file diff --git a/drpy/js/斗鱼直播.js b/drpy/js/斗鱼直播.js new file mode 100644 index 0000000..745a312 --- /dev/null +++ b/drpy/js/斗鱼直播.js @@ -0,0 +1,29 @@ +// 道长 drpy仓库 https://gitcode.net/qq_32394351/dr_py +// drpy安卓本地搭建说明 https://gitcode.net/qq_32394351/dr_py/-/blob/master/%E5%AE%89%E5%8D%93%E6%9C%AC%E5%9C%B0%E6%90%AD%E5%BB%BA%E8%AF%B4%E6%98%8E.md +// Pluto Player官方TG https://t.me/PlutoPlayer +// Pluto Player官方TG https://t.me/PlutoPlayerChannel + +var rule = { + title:'斗鱼直播', + host:'https://www.douyu.com', + homeUrl:'/japi/weblist/apinc/recLabelList?',//网站的首页链接,用于分类获取和推荐获取 + url:'/gapi/rkc/directory/mixList/fyclass/fypage', + class_name:'一起看&网游竞技&单机热游&手游休闲&娱乐天地&科技文化&语音互动&语音直播&正能量&颜值&音乐&舞蹈&二次元&户外&美食&互动交友&趣生活&数码科技&文化&科普&社会人文&汽车&纪录片&斗鱼购物&交友&电台&一起玩&音乐之声&正能量&英雄联盟&热门游戏&DOTA2&穿越火线&CFHD&DNF&炉石传说&CS:GO&逆战&lol云顶之弈&魔兽争霸&魔兽怀旧服&网易游戏&守望先锋&DOTA&魔兽世界&天涯明月刀&三国杀&主机游戏&永劫无间&生死狙击2&迷失ARK&艾尔登法环&逃离塔科夫&V Rising&海上狼人杀&怀旧游戏&王者荣耀&和平精英&火影忍者&LOL手游&金铲铲之战&重返帝国&COD手游&哈利波特:魔法觉醒&CF手游&欢乐斗地主&原神&天刀手游&棋牌娱乐&欢乐麻将&新游中心&QQ飞车&阴阳师&热门手游', + class_url:'2_208&1_1&1_15&1_9&1_2&1_11&1_20&1_18&1_13&2_201&2_175&2_1008&2_174&2_124&2_194&2_1555&2_1097&2_134&2_195&2_204&2_1162&2_136&2_514&2_1203&2_1221&2_1556&2_1575&2_910&2_250&2_1&2_270&2_3&2_33&2_1997&2_40&2_2&2_6&2_46&2_917&2_55&2_1055&2_3567&2_148&2_217&2_5&2_59&2_14&2_19&2_1227&2_1781&2_3528&2_3406&2_1024&2_3684&2_3556&2_26&2_181&2_350&2_196&2_1920&2_2556&2_2915&2_767&2_1192&2_178&2_416&2_1223&2_911&2_113&2_451&2_229&2_331&2_240&2_30', + detailUrl:'/fyid',//二级详情拼接链接(json格式用) + searchUrl:'/japi/search/api/searchShow?kw=**&page=fypage&pageSize=20', + searchable:2, + quickSearch:0, + headers:{ + 'User-Agent':'PC_UA' + }, + timeout:5000, + limit:8, + play_parse:true, + lazy:'', + double:true, + 推荐:'json:data.list;room;*;cover;*;*', + 一级:'json:data.rl;rn;rs16;nn;rid', + 二级:'*', + 搜索:'json:data.relateShow;roomName;roomSrc;nickName;*', +} \ No newline at end of file diff --git a/drpy/js/有声小说吧.js b/drpy/js/有声小说吧.js new file mode 100644 index 0000000..1e79705 --- /dev/null +++ b/drpy/js/有声小说吧.js @@ -0,0 +1,23 @@ +var rule = { + title:'有声小说吧', + 编码:'gb2312', + host:'http://m.ysxs8.vip', + url:'/downlist/fyclass_fypage.html', + searchUrl:'/search.asp?page=fypage&searchword=**&searchtype=-1', + searchable:2, + quickSearch:0, + headers:{ + 'User-Agent':'MOBILE_UA' + }, + timeout:5000, + class_name:'网络玄幻&恐怖悬疑&传统武侠&都市言情&官场刑侦&历史军事&探险盗墓&职场商战&明朝那些事儿&评书下载&相声戏曲&人物传记&广播剧&百家讲坛&外语读物&有声文学&儿童读物&管理营销', + class_url:'r52&r17&r12&r13&r14&r15&r45&r81&r36&r3&r7&r16&r18&r32&r35&r41&r4&r6', + play_parse:true, + lazy:'', + limit:6, + double:true, + 推荐:'.list-ul;a;.list-name&&Text;img&&data-original;.module-slide-author&&Text;a&&href', + 一级:'.book-ol&&li;h4&&Text;img&&data-original;.book-submeta&&Text;a&&href', + 二级:{title:'h2&&Text',img:'.bookimg&&img&&data-original',desc:'.book-rand-a:eq(0)&&Text;.book-rand-a:eq(1)&&Text;.book-rand-a:eq(2)&&Text;.book-rand-a:eq(3)&&Text',content:'.book_intro&&Text',tabs:'.list-contitle&&h3',lists:'#playlist:eq(#id)&&ul&&li'}, + 搜索:'*', +} diff --git a/drpy/js/爱迪影视.js b/drpy/js/爱迪影视.js new file mode 100644 index 0000000..cb30056 --- /dev/null +++ b/drpy/js/爱迪影视.js @@ -0,0 +1,19 @@ +var rule={ + title:'爱迪影视', + host:'https://aidi.tv', + url:'/show/fyclass--------fypage---.html', + searchUrl:'/vsearch/-------------.html?wd=**&submit=', + searchable:2, + quickSearch:0, + filterable:0, + headers:{ 'User-Agent':'MOBILE_UA', }, + class_name:'电影&电视剧&综艺&动漫', + class_url:'dianying&lianxuju&zongyi&dongman', + tab_exclude:'app专用|VIP线路', + play_parse:true, + double:true, + 推荐:'body .vodlist.vodlist_wi;li;a&&title;.vodlist_thumb.lazyload&&data-original;.pic-text&&Text;a&&href', + 一级:'.vodlist.vodlist_wi&&li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href', + 二级:{"title":"h2&&Text;.data:eq(1)&&Text","img":".lazyload&&data-original","desc":";.content_min li:eq(1)&&Text;;.content_min li:eq(2)&&Text;.content_min li:eq(3)&&Text;.data:eq(4)&&Text","content":".context.clearfix&&Text","tabs":".play_source_tab&&a","lists":".content_playlist:eq(#id) li"}, + 搜索:'.searchlist_img;a&&title;.vodlist_thumb.lazyload&&data-original;.pic-text&&Text;a&&href', +} \ No newline at end of file diff --git a/drpy/js/百忙无果.js b/drpy/js/百忙无果.js index 96d175d..0dc8845 100644 --- a/drpy/js/百忙无果.js +++ b/drpy/js/百忙无果.js @@ -28,7 +28,7 @@ var rule = { // 一级:'json:data.hitDocs;title;img;updateInfo;playPartId', 二级:'', 二级:'js:log(input);', - 二级:'js:fetch_params.headers.Referer="https://www.mgtv.com";fetch_params.headers["User-Agent"]=UA;pdfh=jsp.pdfh;pdfa=jsp.pdfa;pd=jsp.pd;VOD={};let d=[];let html=request(input);let json=JSON.parse(html);let host="https://www.mgtv.com";let ourl=json.data.list.length>0?json.data.list[0].url:json.data.series[0].url;if(!/^http/.test(ourl)){ourl=host+ourl}fetch_params.headers["User-Agent"]=MOBILE_UA;html=request(ourl);if(html.includes("window.location =")){print("开始获取ourl");ourl=pdfh(html,"meta[http-equiv=refresh]&&content").split("url=")[1];print("获取到ourl:"+ourl);html=request(ourl)}try{let details=pdfh(html,".m-details&&Html").replace(/h1>/,"h6>").replace(/div/g,"br");let actor="",director="",time="";if(/播出时间/.test(details)){actor=pdfh(html,"p:eq(5)&&Text").substr(0,25);director=pdfh(html,"p:eq(4)&&Text");time=pdfh(html,"p:eq(3)&&Text")}else{actor=pdfh(html,"p:eq(4)&&Text").substr(0,25);director=pdfh(html,"p:eq(3)&&Text");time="已完结"}let _img=pd(html,".video-img&&img&&src");let JJ=pdfh(html,".desc&&Text").split("简介:")[1];let _desc=time;VOD.vod_name=pdfh(html,".vt-txt&&Text");VOD.type_name=pdfh(html,"p:eq(0)&&Text").substr(0,6);VOD.vod_area=pdfh(html,"p:eq(1)&&Text");VOD.vod_actor=actor;VOD.vod_director=director;VOD.vod_remarks=_desc;VOD.vod_pic=_img;VOD.vod_content=JJ}catch(e){log("获取影片信息发生错误:"+e.message)}function getRjpg(imgUrl,xs){xs=xs||3;let picSize=/jpg_/.test(imgUrl)?imgUrl.split("jpg_")[1].split(".")[0]:false;let rjpg=false;if(picSize){let a=parseInt(picSize.split("x")[0])*xs;let b=parseInt(picSize.split("x")[1])*xs;rjpg=a+"x"+b+".jpg"}let img=/jpg_/.test(imgUrl)&&rjpg?imgUrl.replace(imgUrl.split("jpg_")[1],rjpg):imgUrl;return img}if(json.data.total===1&&json.data.list.length===1){let data=json.data.list[0];let url="https://www.mgtv.com"+data.url;d.push({title:data.t4,desc:data.t2,pic_url:getRjpg(data.img),url:url})}else if(json.data.list.length>1){for(let i=1;i<=json.data.total_page;i++){if(i>1){json=JSON.parse(fetch(input.replace("page=1","page="+i),{}))}json.data.list.forEach(function(data){let url="https://www.mgtv.com"+data.url;if(data.isIntact=="1"){d.push({title:data.t4,desc:data.t2,pic_url:getRjpg(data.img),url:url})}})}}else{print(input+"暂无片源")}VOD.vod_play_from="mgtv";VOD.vod_play_url=d.map(function(it){return it.title+"$"+it.url}).join("#");setResult(d);', + 二级:'js:fetch_params.headers.Referer="https://www.mgtv.com";fetch_params.headers["User-Agent"]=UA;pdfh=jsp.pdfh;pdfa=jsp.pdfa;pd=jsp.pd;VOD={};let d=[];let html=request(input);let json=JSON.parse(html);let host="https://www.mgtv.com";let ourl=json.data.list.length>0?json.data.list[0].url:json.data.series[0].url;if(!/^http/.test(ourl)){ourl=host+ourl}fetch_params.headers["User-Agent"]=MOBILE_UA;html=request(ourl);if(html.includes("window.location =")){print("开始获取ourl");ourl=pdfh(html,"meta[http-equiv=refresh]&&content").split("url=")[1];print("获取到ourl:"+ourl);html=request(ourl)}try{let details=pdfh(html,".m-details&&Html").replace(/h1>/,"h6>").replace(/div/g,"br");print(details);let actor="",director="",time="";if(/播出时间/.test(details)){actor=pdfh(html,"p:eq(5)&&Text").substr(0,25);director=pdfh(html,"p:eq(4)&&Text");time=pdfh(html,"p:eq(3)&&Text")}else{actor=pdfh(html,"p:eq(4)&&Text").substr(0,25);director=pdfh(html,"p:eq(3)&&Text");time="已完结"}let _img=pd(html,".video-img&&img&&src");let JJ=pdfh(html,".desc&&Text").split("简介:")[1];let _desc=time;VOD.vod_name=pdfh(html,".vt-txt&&Text");VOD.type_name=pdfh(html,"p:eq(0)&&Text").substr(0,6);VOD.vod_area=pdfh(html,"p:eq(1)&&Text");VOD.vod_actor=actor;VOD.vod_director=director;VOD.vod_remarks=_desc;VOD.vod_pic=_img;VOD.vod_content=JJ}catch(e){log("获取影片信息发生错误:"+e.message)}function getRjpg(imgUrl,xs){xs=xs||3;let picSize=/jpg_/.test(imgUrl)?imgUrl.split("jpg_")[1].split(".")[0]:false;let rjpg=false;if(picSize){let a=parseInt(picSize.split("x")[0])*xs;let b=parseInt(picSize.split("x")[1])*xs;rjpg=a+"x"+b+".jpg"}let img=/jpg_/.test(imgUrl)&&rjpg?imgUrl.replace(imgUrl.split("jpg_")[1],rjpg):imgUrl;return img}if(json.data.total===1&&json.data.list.length===1){let data=json.data.list[0];let url="https://www.mgtv.com"+data.url;d.push({title:data.t4,desc:data.t2,pic_url:getRjpg(data.img),url:url})}else if(json.data.list.length>1){for(let i=1;i<=json.data.total_page;i++){if(i>1){json=JSON.parse(fetch(input.replace("page=1","page="+i),{}))}json.data.list.forEach(function(data){let url="https://www.mgtv.com"+data.url;if(data.isIntact=="1"){d.push({title:data.t4,desc:data.t2,pic_url:getRjpg(data.img),url:url})}})}}else{print(input+"暂无片源")}VOD.vod_play_from="mgtv";VOD.vod_play_url=d.map(function(it){return it.title+"$"+it.url}).join("#");setResult(d);', 搜索:'', 搜索:'js:fetch_params.headers.Referer="https://www.mgtv.com";fetch_params.headers["User-Agent"]=UA;let d=[];let html=request(input);let json=JSON.parse(html);json.data.contents.forEach(function(data){if(data.data.sourceList||data.data.yearList){let list=data.data.sourceList?data.data.sourceList:data.data.yearList[0].sourceList;let desc="";list.forEach(function(it){desc+=it.name+"\\t"});if(list[0].source==="imgo"){let img=data.data.pic?data.data.pic:data.data.yearList[0].pic;d.push({title:data.data.title?data.data.title:data.data.yearList[0].title,img:img,content:data.data.story?data.data.story:data.data.yearList[0].story,desc:data.data.playTime,url:list[0].vid})}}});setResult(d);', } \ No newline at end of file diff --git a/drpy/js/短视频.js b/drpy/js/短视频.js new file mode 100644 index 0000000..20cfc4c --- /dev/null +++ b/drpy/js/短视频.js @@ -0,0 +1,26 @@ +//已知问题: +// 相较于其他壳,pluto player 无法正常嗅探的"分类"或"影片"较多 +// 推荐页面: pluto正常, 其他壳异常 +// 无法搜索 + +var rule = { + title:'短视频', + host:'http://www.sharenice.net', + url:'/fyclass?page=fypage', + //searchUrl:'/video/search?search_key=**', + searchable:0, + quickSearch:0, + headers:{ + 'User-Agent':'PC_UA' + }, + timeout:5000, + class_name:'抖音&快手&微视&火山&场库&体育&美拍&秒拍&全民&梨&好兔&美女&正能量&搞笑&社会&游戏&娱乐&旅游&萌系&生活&音乐&美食&明星&动漫&影视&时尚', + class_url:'douyin&kuaishou&weishi&huoshan&changku&tags/t-5L2T6IKy.html&meipai&miaopai&quanmin&lishipin&haotu&tags/t-576O5aWz.html&tags/t-5q2j6IO96YeP.html&tags/t-5pCe56yR.html&tags/t-56S+5Lya.html&tags/t-5ri45oiP.html&tags/t-5aix5LmQ.html&tags/t-5peF5ri4.html&tags/t-6JCM57O7.html&tags/t-55Sf5rS7.html&tags/t-6Z+z5LmQ.html&tags/t-576O6aOf.html&tags/t-5piO5pif.html&tags/t-5Yqo5ryr.html&tags/t-5b2x6KeG.html&tags/t-5pe25bCa.html', + play_parse:true, + lazy:'', + limit:6, + double:false, + 推荐:'*', + 一级:'.item-box&&ul&&li;a&&title;img&&data-original;;a&&href', + 二级:'*', +} \ No newline at end of file diff --git a/drpy/js/秋霞.js b/drpy/js/秋霞.js new file mode 100644 index 0000000..b3ca54b --- /dev/null +++ b/drpy/js/秋霞.js @@ -0,0 +1,10 @@ +muban.首图2.二级.tabs = '.stui-pannel__head.bottom-line.active.clearfix h3'; +muban.首图2.二级.content = '.stui-content__desc&&Text'; +var rule = Object.assign(muban.首图2,{ +title:'秋霞', +host:'https://www.7xiady.cc', +url:'/type/fyclass-fypage/', +class_parse:'.stui-header__menu li;a&&Text;a&&href;/type/(.*?)/', +searchUrl:'/search/**----------fypage---.html', +搜索:'ul.stui-vodlist&&li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href', +}); \ No newline at end of file diff --git a/drpy/js/素白白.js b/drpy/js/素白白.js new file mode 100644 index 0000000..e092d53 --- /dev/null +++ b/drpy/js/素白白.js @@ -0,0 +1,23 @@ +var rule = { + title:'素白白', + host:'https://www.subaibaiys.com', + url:'/fyclass/page/fypage', + searchUrl:'/grabble?q=**', + searchable:2,//是否启用全局搜索, + quickSearch:0,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{ + 'User-Agent':'UC_UA', + // "Cookie": "" + }, + class_parse:'.navlist&&li;a&&Text;a&&href;com/(.*)', + cate_exclude:'公告留言', + play_parse:true, + lazy:'', + limit:6, + 推荐:'.mi_cont&&ul;li;h3&&Text;img&&data-original;.jidi&&Text;a&&href', + double:true, // 推荐内容是否双层定位 + 一级:'.mi_cont&&ul&&li;h3&&Text;img&&data-original;.jidi&&Text;a&&href', + 二级:{"title":"h1&&Text;.moviedteail_list&&li&&Text","img":".dyimg&&img&&src","desc":".moviedteail_list&&li:eq(1)&&Text;.moviedteail_list&&li:eq(2)&&Text;.moviedteail_list&&li:eq(3)&&Text;.moviedteail_list&&li:eq(4)&&Text","content":".yp_context&&Text","tabs":".mi_paly_box .ypxingq_t","lists":".paly_list_btn:eq(#id) a"}, + 搜索:'.mi_cont&&ul&&li;h3&&Text;.lazy&&data-original;.jidi&&Text;a&&href', +} \ No newline at end of file diff --git a/drpy/js/蛋蛋赞.js b/drpy/js/蛋蛋赞.js new file mode 100644 index 0000000..e98ce3a --- /dev/null +++ b/drpy/js/蛋蛋赞.js @@ -0,0 +1,24 @@ +var rule={ + title:'蛋蛋赞', + host:'https://www.dandanzan10.top', + // homeUrl:'/', + url:'/fyclass/index_fypage.html[/fyclass/index.html]', + searchUrl:'/so/**-**--.html', + searchable:2,//是否启用全局搜索, + quickSearch:0,//是否启用快速搜索, + filterable:0,//是否启用分类筛选, + headers:{//网站的请求头,完整支持所有的,常带ua和cookies + 'User-Agent':'MOBILE_UA', + // "Cookie": "searchneed=ok" + }, + class_name:'电视剧&电影&综艺&动漫', + class_url:'dianshiju&dianying&zongyi&dongman', + + 推荐:'div.lists-content;li;h2&&Text;.thumb&&src;.note&&Text;a&&href', + + 一级:'.lists-content:eq(1)&&ul&&li;img&&alt;.thumb&&src;.note&&Text;a&&href', + + double:true, // 推荐内容是否双层定位 + 二级:{"title":"h1&&Text;.product-excerpt:eq(2)&&Text","img":".thumb&&src","desc":";;.product-excerpt:eq(3)&&Text;.product-excerpt:eq(1)&&Text;.product-excerpt:eq(0)&&Text","content":".product-excerpt:eq(5)&&Text","tabs":".playlists dl dt","lists":".play-div-oa:eq(#id) li"}, + 搜索:'.lists-content&&ul&&li;*;*;*;*', +} \ No newline at end of file diff --git a/drpy/js/酷云77.js b/drpy/js/酷云77.js index 2ffb5b5..ddda550 100644 --- a/drpy/js/酷云77.js +++ b/drpy/js/酷云77.js @@ -13,8 +13,8 @@ var rule = { filter_url:'year={{fl.y}}&category={{fl.scat}}&area={{fl.a}}', filter:{0: [{'key': 'y', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2015之前', 'v': 'lt|2015'}]}, {'key': 'a', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '日本', 'v': '日本'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '欧洲', 'v': '欧洲'}, {'n': '其他', 'v': '泰国'}]}, {'key': 'scat', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '剧情', 'v': '剧情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '喜剧', 'v': '喜剧'}, {'n': '战争', 'v': '战争'}, {'n': '爱情', 'v': '爱情'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '伦理', 'v': '伦理'}]}], 1: [{'key': 'y', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2015之前', 'v': 'lt|2015'}]}, {'key': 'a', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '日本', 'v': '日本'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '欧洲', 'v': '欧洲'}, {'n': '其他', 'v': '泰国'}]}, {'key': 'scat', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '剧情', 'v': '剧情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '喜剧', 'v': '喜剧'}, {'n': '战争', 'v': '战争'}, {'n': '爱情', 'v': '爱情'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '伦理', 'v': '伦理'}]}], 2: [{'key': 'y', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2015之前', 'v': 'lt|2015'}]}, {'key': 'a', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '日本', 'v': '日本'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '欧洲', 'v': '欧洲'}, {'n': '其他', 'v': '泰国'}]}, {'key': 'scat', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '剧情', 'v': '剧情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '喜剧', 'v': '喜剧'}, {'n': '战争', 'v': '战争'}, {'n': '爱情', 'v': '爱情'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '伦理', 'v': '伦理'}]}], 3: [{'key': 'y', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2015之前', 'v': 'lt|2015'}]}, {'key': 'a', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '日本', 'v': '日本'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '欧洲', 'v': '欧洲'}, {'n': '其他', 'v': '泰国'}]}, {'key': 'scat', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '剧情', 'v': '剧情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '喜剧', 'v': '喜剧'}, {'n': '战争', 'v': '战争'}, {'n': '爱情', 'v': '爱情'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '伦理', 'v': '伦理'}]}], 4: [{'key': 'y', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2015之前', 'v': 'lt|2015'}]}, {'key': 'a', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '日本', 'v': '日本'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '欧洲', 'v': '欧洲'}, {'n': '其他', 'v': '泰国'}]}, {'key': 'scat', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '剧情', 'v': '剧情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '喜剧', 'v': '喜剧'}, {'n': '战争', 'v': '战争'}, {'n': '爱情', 'v': '爱情'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '伦理', 'v': '伦理'}]}]}, headers:{ - "User-Agent": "Dalvik/2.1.0" - }, + "User-Agent":"okhttp/3.12.0" + }, timeout:5000, class_name:'全部&电影&电视剧&综艺&动漫', class_url:'0&1&2&3&4',