From 24c5be4eb4fab6e1a2f2aa712e67c10a283b8d95 Mon Sep 17 00:00:00 2001 From: src48597962 <48597962@qq.com> Date: Thu, 7 Jul 2022 08:50:46 +0000 Subject: [PATCH] 1 --- SrcJiemi.js | 53 + SrcJiexi.html | 22 + SrcJuying.js | 3119 ++++++++++++++++++++++++++++++++++ SrcParseS.js | 1031 +++++++++++ SrcTmplVersion.js | 25 + SrcVerify.js | 17 + plugins/UrlProcessor.js | 122 ++ plugins/categories-header.js | 495 ++++++ srcDyTmpl.js | 1732 +++++++++++++++++++ srcconfig.js | 1 + 10 files changed, 6617 insertions(+) create mode 100644 SrcJiemi.js create mode 100644 SrcJiexi.html create mode 100644 SrcJuying.js create mode 100644 SrcParseS.js create mode 100644 SrcTmplVersion.js create mode 100644 SrcVerify.js create mode 100644 plugins/UrlProcessor.js create mode 100644 plugins/categories-header.js create mode 100644 srcDyTmpl.js create mode 100644 srcconfig.js diff --git a/SrcJiemi.js b/SrcJiemi.js new file mode 100644 index 00000000..2df84361 --- /dev/null +++ b/SrcJiemi.js @@ -0,0 +1,53 @@ +var jiemi = { + 获取私钥: function (order) { + if(typeof(order)==='string' && order.length>=848){ + return order + } + var pkcs8Private; + let pkcs8Private1 = `-----BEGIN PRIVATE KEY----- + MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAK5WtrOWxP8FHYRu + t+qp2kz0JNfv47nj+EH9R/Ft7E7WeCUC/AcXcjrHQV0JqyAUQRec/7tBZZhOcQff + QB1flDVAsYvz8GlQfEumWK1zmf9YlljzaJq04jPXKVfr9eAiH1lcR1CsYKMqBK9b + W2Xm42QRwSFhijmUlrbNo2Cj1RC9AgMBAAECgYEAiSGQKIcpgWcmpqroY98i5XEN + IgWB3RBikJWH53INdJ3id0p3r6RTp8Rft60JO/xyjv5hcYupPDpHUmfa6L/rtQMi + AAiak6pWPasi+rMWHkWIyAHz3Lxxn89GeX1vC2FNqp9yLdRhc1qO3CMBz4AFiJPk + H2CRqZKNPc3boSW+j4kCQQDZ4j6s98yFErvN1OfJOTAfrfsB4cZdeClt63cxJpWe + cAUMBIGCloed663tgesag7a6X8JTBE2+GupxlT4VIuZDAkEAzNZWgta+H0eN6X7T + pk1Lyt/lrAW/l36PI6ft1y7fpKoJMQVA7sbIG4vHDIFW9EabAnABQ7HH3NiVDVsk + vt48/wJBAM82OnMXKzs3aMJFA7a8G4dVV80fYh6MY6I0+GMXFd3bHQGj22NNM2a9 + t+iT0PqjXwl6fn2jLyhnwqUI0UUarq8CQFyT8v2neL5CZM1HWPksrji/ANrCrlkW + BjOjTkeXE9UkVIsnSLWiegaZIhlwy5AT6TMs1CV4UFBsQtGKhA0P/JkCQC28mkKq + uc0mONTWMSenwXHfpAzhOP3l/NxJBkVXPunaOb6kOP7JejGMjMhnRHh4nDiGQRi9 + Kfo65lNN215J10s= + -----END PRIVATE KEY-----`; + switch (order){ + default: + pkcs8Private = pkcs8Private1; + break; + } + pkcs8Private = pkcs8Private.split('\n').slice(1,-1).join(''); + return pkcs8Private + }, + rsaDec: function (data){ + order = false; + if(/data|list|msg|code|{|}/.test(data)){ + return data + } + let pkcs8Private = 获取私钥(order); + try { + let decodedData = rsaDecrypt(data, pkcs8Private, { + config: "RSA/ECB/PKCS1Padding", + type: 1, + long: 2 + }); + if(!decodedData){ + log('通讯解密不正确:',decodedData); + } + return decodedData||data + } + catch (e) { + log('通讯解密失败:'+e.message); + return data + } + } +} \ No newline at end of file diff --git a/SrcJiexi.html b/SrcJiexi.html new file mode 100644 index 00000000..dafd5307 --- /dev/null +++ b/SrcJiexi.html @@ -0,0 +1,22 @@ + + + +解析 + + + + + + + + + \ No newline at end of file diff --git a/SrcJuying.js b/SrcJuying.js new file mode 100644 index 00000000..9e4e4ca3 --- /dev/null +++ b/SrcJuying.js @@ -0,0 +1,3119 @@ +//本代码仅用于个人学习,请勿用于其他作用,下载后请24小时内删除 +function SRCSet() { + addListener("onClose", $.toString(() => { + clearMyVar('guanlicz'); + //refreshPage(false); + })); + setPageTitle("♥管理"+getVar('SrcJuying-Version', '')); + function jiekouchuli(lx,urls) { + function apitype(apiurl) { + if(apiurl){ + if(apiurl.includes('.vod')){ + return "v1"; + }else if(apiurl.includes('/app/')){ + return "app"; + }else if(apiurl.includes('app.php')){ + return "v2"; + }else if(/iptv|Chengcheng/.test(apiurl)){ + return "iptv"; + }else if(apiurl.includes('provide/vod/')){ + return "cms"; + }else{ + return ""; + } + }else{ + return ""; + } + } + if(lx=="type"){ + return apitype(urls); + }else if(lx=="save"){ + try{ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + + var num = 0; + for (var i in urls) { + let urlname = urls[i].name; + let urlurl = urls[i].url; + let urlua = urls[i].ua||"Dalvik/2.1.0"; + let urltype = urls[i].type||apitype(urlurl); + let urlgroup = urls[i].group||""; + if(!datalist.some(item => item.url ==urlurl)&&urlname&&/^http/.test(urlurl)&&urltype){ + let arr = { "name": urlname, "url": urlurl, "ua": urlua, "type": urltype, "group": urlgroup }; + datalist.push(arr); + num = num + 1; + } + } + if(num>0){writeFile(filepath, JSON.stringify(datalist));} + } catch (e) { + log('导入失败:'+e.message); + return -1; + } + return num; + }else{ + return "toast://接口处理类型不正确"; + } + } + function getTitle(title, Color) { + return '' + title + ''; + } + var d = []; + d.push({ + title: getMyVar('guanli', 'jk')=="jk"?getTitle('接口管理', '#f13b66a'):'接口管理', + url: `#noLoading#@lazyRule=.js:putMyVar('guanli','jk');refreshPage(false);'toast://已切换到接口管理';`, + img: "https://lanmeiguojiang.com/tubiao/movie/98.svg", + col_type: "icon_small_3" + }); + d.push({ + title: getMyVar('guanli', 'jk')=="jk"?'解析管理':getTitle('解析管理', '#f13b66a'), + url: `#noLoading#@lazyRule=.js:putMyVar('guanli','jx');refreshPage(false);'toast://已切换到解析管理';`, + img: "https://lanmeiguojiang.com/tubiao/movie/105.svg", + col_type: "icon_small_3" + }); + d.push({ + title: '扩展中心', + url: $('hiker://empty#noRecordHistory##noHistory#').rule((jiekouchuli) => { + addListener("onClose", $.toString(() => { + refreshPage(false); + })); + var d = []; + var cfgfile = "hiker://files/rules/Src/Juying/config.json"; + var Juyingcfg=fetch(cfgfile); + if(Juyingcfg != ""){ + eval("var JYconfig=" + Juyingcfg+ ";"); + }else{ + var JYconfig= {}; + } + + d.push({ + title: '聚影分享', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + d.push({ + title: JYconfig['codeid']?'复制聚影资源码口令':'申请聚影资源码',//sharetime + desc: JYconfig['codetime']?JYconfig['codetime']+' 有效期三年\n'+(JYconfig['sharetime']?JYconfig['sharetime']+" 上次同步时间":"暂未分享同步"):'点击申请三年长期资源码', + url: JYconfig['codeid']?$().lazyRule((codeid)=>{ + let code = '聚影资源码¥'+codeid; + copy(code); + return "hiker://empty"; + },JYconfig['codeid']):$().lazyRule((JYconfig,cfgfile) => { + var num = ''; + for (var i = 0; i < 6; i++) { + num += Math.floor(Math.random() * 10); + } + + try{ + var pastecreate = JSON.parse(request('https://netcut.cn/api/note/create/', { + headers: { 'Referer': 'https://netcut.cn/' }, + body: 'note_name=Juying'+num+'¬e_content=¬e_pwd=0&expire_time=94608000', + method: 'POST' + })).data; + var codeid = pastecreate.note_id; + var codetime = pastecreate.created_time; + } catch (e) { + log('申请失败:'+e.message); + return 'toast://申请失败,请重新再试'; + } + JYconfig['codeid'] = aesEncode('Juying', codeid); + JYconfig['codetime'] = codetime; + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://申领成功'; + }, JYconfig, cfgfile), + col_type: "text_center_1" + }); + + d.push({ + title: '分享同步', + url: JYconfig['codeid']?$(["只传接口","只传解析","接口+解析"],2,"选择上传同步云端的项").select((JYconfig,cfgfile)=>{ + var text = {}; + if(input=="只传接口"||input=="接口+解析"){ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var datafile = fetch(filepath); + if(datafile==""){ + return 'toast://接口数据为空,无法同步云端'; + } + eval("var datalist=" + datafile+ ";"); + text['jiekou'] = datalist; + }else{ + text['jiekou'] = []; + } + if(input=="只传解析"||input=="接口+解析"){ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var datafile = fetch(filepath); + if(datafile==""){ + var datalist=[]; + }else{ + eval("var datalist=" + datafile+ ";"); + } + text['jiexi'] = datalist; + }else{ + text['jiexi'] = []; + } + + try{ + var pasteupdate = JSON.parse(request('https://netcut.cn/api/note/update/', { + headers: { 'Referer': 'https://netcut.cn/' }, + body: 'note_id='+aesDecode('Juying', JYconfig['codeid'])+'¬e_content='+base64Encode(JSON.stringify(text)), + method: 'POST' + })); + var status = pasteupdate.status + var sharetime = pasteupdate.data.updated_time; + if(status==1){ + JYconfig['sharetime'] = sharetime; + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + //let code = '聚影资源码¥'+JYconfig['codeid']; + //copy(code); + return "toast://分享同步云端数据成功"; + }else{ + return 'toast://分享同步失败,资源码应该不存在'; + } + } catch (e) { + log('分享失败:'+e.message); + return 'toast://分享同步失败,请重新再试'; + } + }, JYconfig, cfgfile):'toast://请先申请聚影资源码', + col_type: "text_2" + }); + d.push({ + title: '删除云端', + url: JYconfig['codeid']?$().lazyRule((JYconfig,cfgfile) => { + try{ + var pastedelete = JSON.parse(request('https://netcut.cn/api/note/del_note/', { + headers: { 'Referer': 'https://netcut.cn/' }, + body: 'note_id='+aesDecode('Juying', JYconfig['codeid']), + method: 'POST' + })); + var status = pastedelete.status + + delete JYconfig['codeid']; + delete JYconfig['codetime']; + delete JYconfig['sharetime']; + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + + if(status==1){ + return "toast://聚影资源码云端已删除"; + }else{ + return 'toast://无需删除,云端已不存在'; + } + } catch (e) { + log('删除失败:'+e.message); + return 'toast://删除资源失败,云端异常'; + } + }, JYconfig, cfgfile):'toast://请先申请聚影资源码', + col_type: "text_2" + }); + d.push({ + col_type: "line" + }); + + d.push({ + title: '订阅管理', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + d.push({ + title: JYconfig['codeid2']?'已订阅聚影资源码':'订阅聚影资源码', + desc: JYconfig['codeid2']?'点击订阅、复制、切换资源码'+(JYconfig['codedyname']?'\n当前订阅的资源码为:'+JYconfig['codedyname']:""):'订阅后将与分享者云端数据保持同步', + url: $(["订阅","复制","切换"],3).select((JYconfig,cfgfile)=>{ + if(input=="订阅"){ + return $("","聚影资源码口令").input((JYconfig,cfgfile) => { + if(input.split('¥')[0]!="聚影资源码"){ + return 'toast://口令有误'; + } + showLoading('正在较验有效性') + let codeid = input.split('¥')[1]; + let text = parsePaste('https://netcut.cn/p/'+aesDecode('Juying', codeid)); + hideLoading(); + if(codeid&&!/^error/.test(text)){ + return $("","当前资源码有效,起个名保存吧").input((JYconfig,cfgfile,codeid) => { + var filepath = "hiker://files/rules/Src/Juying/dingyue.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + if(datalist.some(item => item.name ==input)){ + return 'toast://名称重复,无法保存'; + }else if(input!=""){ + if(!datalist.some(item => item.url ==codeid)){ + JYconfig['codeid2'] = codeid; + JYconfig['codedyname'] = input; + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + datalist.push({name:input, url:codeid}) + writeFile(filepath, JSON.stringify(datalist)); + return 'toast://已保存,订阅成功'; + }else{ + return 'toast://已存在,订阅未成功'; + } + }else{ + return 'toast://名称为空,无法保存'; + } + }, JYconfig, cfgfile, codeid); + }else{ + return "toast://口令错误或资源码已失效"; + } + }, JYconfig, cfgfile) + }else if(input=="复制"){ + let codeid = JYconfig['codeid2']; + return codeid?$().lazyRule((codeid)=>{ + let code = '聚影资源码¥'+codeid; + copy(code); + return "hiker://empty"; + },codeid):'toast://请先订阅' + }else if(input=="切换"){ + let codeid = JYconfig['codeid2']; + var filepath = "hiker://files/rules/Src/Juying/dingyue.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + let list = datalist.map((list)=>{ + if(list.url !=codeid){ + return list.name; + } + }) + list = list.filter(n => n); + if(list.length>0){ + return $(list,3,"选择需切换的订阅源").select((datalist,JYconfig,cfgfile)=>{ + var url = ""; + for (var i in datalist) { + if(datalist[i].name==input){ + url = datalist[i].url; + break; + } + } + if(url){ + JYconfig['codeid2'] = url; + JYconfig['codedyname'] = input; + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://订阅已切换为:'+input+',更新资源立即生效'; + }else{ + return 'toast://本地订阅记录文件异常,是不是干了坏事?'; + } + },datalist,JYconfig,cfgfile) + }else{ + return 'toast://未找到可切换的历史订阅'; + } + } + },JYconfig,cfgfile), + col_type: "text_center_1" + }); + + d.push({ + title: '更新资源', + url: JYconfig['codeid2']?$().lazyRule((JYconfig) => { + try{ + let codeid = JYconfig['codeid2']; + let text = parsePaste('https://netcut.cn/p/'+aesDecode('Juying', codeid)); + if(codeid&&!/^error/.test(text)){ + let pastedata = JSON.parse(base64Decode(text)); + var jkfilepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var jkdatalist = pastedata.jiekou; + if(jkdatalist.length>0){ + writeFile(jkfilepath, JSON.stringify(jkdatalist)); + } + var jxfilepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var jxdatalist = pastedata.jiexi; + if(jxdatalist.length>0){ + writeFile(jxfilepath, JSON.stringify(jxdatalist)); + } + return "toast://同步完成,接口:"+jkdatalist.length+",解析:"+jxdatalist.length; + }else{ + return "toast://口令错误或资源码已失效"; + } + } catch (e) { + log('更新失败:'+e.message); + return "toast://无法识别的口令"; + } + }, JYconfig):'toast://请先订阅聚影资源码', + col_type: "text_2" + }); + d.push({ + title: '删除订阅', + url: JYconfig['codeid2']?$(["仅删订阅源,保留历史","册除订阅及历史,不再切换"],1).select((JYconfig,cfgfile)=>{ + if(input=="仅删订阅源,保留历史"){ + return $().lazyRule((JYconfig,cfgfile) => { + delete JYconfig['codeid2']; + delete JYconfig['codedyname']; + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://已删除订阅源,历史记录可用于切换'; + }, JYconfig, cfgfile) + }else if(input=="册除订阅及历史,不再切换"){ + return $().lazyRule((JYconfig,cfgfile) => { + let codeid2 = JYconfig['codeid2']; + delete JYconfig['codeid2']; + delete JYconfig['codedyname']; + writeFile(cfgfile, JSON.stringify(JYconfig)); + + var filepath = "hiker://files/rules/Src/Juying/dingyue.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + for (var i in datalist) { + if(datalist[i].url==codeid2){ + datalist.splice(i,1); + break; + } + } + writeFile(filepath, JSON.stringify(datalist)); + refreshPage(false); + return 'toast://已删除订阅源和历史记录'; + }, JYconfig, cfgfile) + } + }, JYconfig, cfgfile):'toast://请先订阅聚影资源码', + col_type: "text_2" + }); + + d.push({ + title: '个性设置', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + d.push({ + title: JYconfig['erjimode']!=2?'当前二级模式:常规':'当前二级模式:搜索', + desc: JYconfig['erjimode']!=2?'一级选片点击先用进二级,再扩展更多片源':'一级选片点击调用接口搜索扩展更多片源', + url: $('#noLoading#').lazyRule((JYconfig,cfgfile) => { + if(JYconfig['erjimode'] == 2){ + JYconfig['erjimode'] = 1; + var sm = "从一级先进二级常规模式"; + }else{ + JYconfig['erjimode'] = 2; + var sm = "从一级直接调接口到搜索模式"; + } + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://切换为:' + sm + ',返回主页后刷新生效'; + }, JYconfig, cfgfile), + col_type: "text_center_1" + }); + d.push({ + title: '搜索线程', + url: $(JYconfig['xunminum']?JYconfig['xunminum']:"10","每次搜索成功停止线程数").input((JYconfig,cfgfile) => { + if(!parseInt(input)||parseInt(input)<1||parseInt(input)>100){return 'toast://输入有误,请输入1-100数字'}else{ + JYconfig['xunminum'] = parseInt(input); + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://每次搜索成功线程数已设置为:'+input; + } + }, JYconfig, cfgfile), + col_type: "text_2" + }); + d.push({ + title: '搜索时长', + url: $(JYconfig['xunmitimeout']?JYconfig['xunmitimeout']:"5","设置接口搜索超时时长(秒)").input((JYconfig,cfgfile) => { + if(!parseInt(input)||parseInt(input)<1||parseInt(input)>10){return 'toast://输入有误,请输入1-10数字'}else{ + JYconfig['xunmitimeout'] = parseInt(input); + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://接口搜索超时时长已设置为:'+input+'秒'; + } + }, JYconfig, cfgfile), + col_type: "text_2" + }); + d.push({ + title: '解析保留', + url: $(JYconfig['appjiexinum']?JYconfig['appjiexinum']:"50","app自带解析保留数量").input((JYconfig,cfgfile) => { + if(!parseInt(input)||parseInt(input)<1||parseInt(input)>100){return 'toast://输入有误,请输入1-100数字'}else{ + JYconfig['appjiexinum'] = parseInt(input); + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://app自带解析保留数量已设置为:'+input; + } + }, JYconfig, cfgfile), + col_type: "text_2" + }); + d.push({ + title: '其他资源', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + + d.push({ + title: 'biu导入', + url:$("","输入biu资源地址").input((jiekouchuli) => { + try{ + var html = fetch(input); + var reg = /("([^\\\"]*(\\.)?)*")|('([^\\\']*(\\.)?)*')|(\/{2,}.*?(\r|\n|$))|(\/\*(\n|.)*?\*\/)/g; + html = html.replace(reg, function(word) { + return /^\/{2,}/.test(word) || /^\/\*/.test(word) ? "" : word; + }).replace(/\\ '/g,"\'").replace(/\\ "/g,`\"`).replace(/\\>/g,">").replace(/\\'"/g,`'"`); + var bbdata = JSON.parse(html); + var bbjiekou = bbdata.zhuyejiekou; + var bbcaiji = bbdata.caijizhan; + } catch (e) { + log('接口导入失败:'+e.message); + return "toast://导入失败:连接无效或内容有错"; + } + + var urls= []; + for(var i in bbjiekou){ + urls.push({ "name" : bbjiekou[i].name, "url" : bbjiekou[i].url}) + } + for(var i in bbcaiji){ + urls.push({ "name" : bbcaiji[i].name, "url" : /\/api.php^/.test(bbcaiji[i].url)?bbcaiji[i].url+"/provide/vod":bbcaiji[i].url}) + } + var jknum = jiekouchuli('save',urls); + if(jknum<0){ + return'toast://导入失败,内容异常'; + }else{ + var bbzhujiexi = bbdata.zhujiexi.split('#'); + var bbbeiyongjiexi = bbdata.beiyongjiexi.split('#'); + var jiexi = bbzhujiexi.concat(bbbeiyongjiexi); + if(jiexi.length>0){ + return $("接口导入已完成,成功保存:"+jknum+ ",确定要继续导入解析吗?\n不建议导入,因为99%是失效的").confirm((jiexi)=>{ + try{ + + var jxfilepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var jxdatafile = fetch(jxfilepath); + if(jxdatafile != ""){ + eval("var jxdatalist=" + jxdatafile+ ";"); + }else{ + var jxdatalist = []; + } + var jxnum = 0; + for (var i=0;i item.parse ==jiexi[i])){ + let namebh = parseInt(jxdatalist.length)+parseInt(jiexi.length); + let arr = { "name": "bb"+namebh, "parse": jiexi[i], "stopfrom": [], "priorfrom": [] }; + jxdatalist.push(arr); + jxnum = jxnum + 1; + } + } + if(jxnum>0){ + writeFile(jxfilepath, JSON.stringify(jxdatalist)); + return "toast://导入完成,解析保存:"+jxnum; + }else{ + return "toast://无解析"; + } + } catch (e) { + log('解析导入失败:'+e.message); + return "toast://解析导入失败"; + } + }, jiexi) + }else{ + return "接口导入已完成,成功保存:"+jknum; + } + } + }, jiekouchuli), + col_type: "text_3" + }); + d.push({ + title: 'TVb导入', + url:$("","输入TVb资源地址").input((jiekouchuli) => { + try{ + var html = fetch(input); + if(!/https:\/\/i.*memory.coding.net/.test(input)){ + var lx ="TVb"; + var reg = /("([^\\\"]*(\\.)?)*")|('([^\\\']*(\\.)?)*')|(\/{2,}.*?(\r|\n|$))|(\/\*(\n|.)*?\*\/)/g; + html = html.replace(reg, function(word) { + return /^\/{2,}/.test(word) || /^\/\*/.test(word) ? "" : word; + }).replace(/#.*?\n/g,""); + var data = JSON.parse(html); + var jiekou = data.sites; + var jiexi = data.parses; + }else{ + var lx ="."; + var jiekou = html.split('\n'); + var jiexi = []; + } + } catch (e) { + log('接口导入失败:'+e.message); + return "toast://导入失败:连接无效或内容有错"; + } + + var urls= []; + for(var i in jiekou){ + if(lx=="."){ + urls.push({ "name": jiekou[i].split('@')[1].split('=')[0], "url": jiekou[i].split('@')[1].split('=')[1].split('#')[0], "group":jiekou[i].split('@')[0]}) + }else{ + if(jiekou[i].api=="csp_AppYsV2"){ + urls.push({ "name": jiekou[i].name, "url": jiekou[i].ext}) + } + if(jiekou[i].type==1){ + urls.push({ "name": jiekou[i].name, "url": jiekou[i].api}) + } + } + } + var jknum = jiekouchuli('save',urls); + if(jknum<0){ + return'toast://导入失败,内容异常'; + }else{ + if(jiexi.length>0){ + return $("接口导入已完成,成功保存:"+jknum+ ",确定要继续导入解析吗?\n不建议导入,因为99%是失效的").confirm((jiexi)=>{ + try{ + var jxfilepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var jxdatafile = fetch(jxfilepath); + if(jxdatafile != ""){ + eval("var jxdatalist=" + jxdatafile+ ";"); + }else{ + var jxdatalist = []; + } + var jxnum = 0; + for (var i=0;i item.parse ==jiexi[i].url)){ + let arr = { "name": jiexi[i].name, "parse": jiexi[i].url, "stopfrom": [], "priorfrom": [] }; + jxdatalist.push(arr); + jxnum = jxnum + 1; + } + } + if(jxnum>0){ + writeFile(jxfilepath, JSON.stringify(jxdatalist)); + }else{ + return "toast://无解析"; + } + } catch (e) { + log('解析导入失败:'+e.message); + return "toast://解析导入失败"; + } + },jiexi) + }else{ + return "接口导入已完成,成功保存:"+jknum; + } + } + }, jiekouchuli), + col_type: "text_3" + }); + setHomeResult(d); + }, jiekouchuli), + img: "https://lanmeiguojiang.com/tubiao/ke/156.png", + col_type: "icon_small_3" + }); + if(getMyVar('guanli', 'jk')=="jk"){ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + }else if(getMyVar('guanli', 'jk')=="jx"){ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + } + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + + d.push({ + col_type: "line_blank" + }); + + function jiekou(lx,data,jiekouchuli) { + addListener("onClose", $.toString(() => { + clearMyVar('apiname'); + clearMyVar('apiurl'); + clearMyVar('apitype'); + clearMyVar('apiua'); + clearMyVar('apiurls'); + clearMyVar('addtype'); + clearMyVar('isload'); + clearMyVar('apigroup'); + })); + + var d = []; + if(lx!="update"){ + setPageTitle("♥接口管理-新增"); + d.push({ + title: '添加方式:点击切换', + col_type:'text_1', + url: $('#noLoading#').lazyRule(()=>{ + if(getMyVar('addtype', '1')=="1"){ + putMyVar('addtype', '2'); + }else{ + putMyVar('addtype', '1'); + } + refreshPage(false); + return'toast://已切换'; + }) + }); + }else{ + if(getMyVar('isload', '0')=="0"){ + setPageTitle("♥接口管理-变更"); + putMyVar('apiname', data.name); + putMyVar('apiurl', data.url); + putMyVar('apitype', data.type); + putMyVar('apiua', data.ua); + putMyVar('apigroup', data.group?data.group:""); + putMyVar('isload', '1'); + } + } + if(getMyVar('addtype', '1')=="1"){ + d.push({ + title:'apiname', + col_type: 'input', + desc: "接口名称", + extra: { + titleVisible: false, + defaultValue: getMyVar('apiname', ''), + onChange: 'putMyVar("apiname",input)' + } + }); + d.push({ + title:'apiurl', + col_type: 'input', + desc: "接口地址", + extra: { + titleVisible: false, + defaultValue: getMyVar('apiurl', ''), + onChange: 'putMyVar("apiurl",input)' + } + }); + d.push({ + title: getMyVar('apitype', '')==""?'类型:自动识别':'类型:'+getMyVar('apitype'), + col_type:'text_1', + url:$(["v1","app","v2","iptv","cms","自动"],3).select(()=>{ + if(input=="自动"){ + clearMyVar('apitype'); + }else{ + putMyVar('apitype', input); + } + refreshPage(false); + return'toast://已选择类型:' + input; + }) + }); + }else{ + d.push({ + title:'批量添加', + col_type: 'input', + desc: "一行一个接口\n格式:名称#接口地址#类型#分组\n格式:名称#接口地址#类型\n格式:名称#接口地址\n类型可以留空,自动判断\n分组可以留空,空则取类型\n分隔符#可以用,号代替", + extra: { + titleVisible: false, + type: "textarea", + height: 10, + onChange: 'putMyVar("apiurls",input)' + } + }); + } + + d.push({ + title: 'User-Agent:'+getMyVar('apiua','Dalvik/2.1.0'), + col_type:'text_1', + url:$(["Dalvik/2.1.0","Dart/2.13 (dart:io)","MOBILE_UA","PC_UA","自定义"],2).select(()=>{ + if(input=="自定义"){ + return $(getMyVar('apiua','Dalvik/2.1.0'),"输入指定ua").input(()=>{ + putMyVar('apiua', input); + refreshPage(true); + return "toast://已指定ua:"+input; + }) + }else{ + putMyVar('apiua', input); + refreshPage(true); + return "toast://已指定ua:"+input; + } + }) + }); + d.push({ + title:'分组名称:' + getMyVar('apigroup', ''), + col_type: 'text_1', + url:$(getMyVar('apigroup', ''),"输入分组名称,为空则取类型").input(()=>{ + putMyVar('apigroup', input); + refreshPage(true); + return "toast://"+input; + }) + }); + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + + d.push({ + title:'测试', + col_type:'text_3', + url: $(getMyVar("testkey","我的"),"输入测试搜索关键字").input((jiekouchuli)=>{ + putMyVar("testkey",input); + if(getMyVar('addtype', '1')=="1"&&!/^http/.test(getMyVar('apiurl',''))){return "toast://接口地址不正确"} + return $('hiker://empty#noRecordHistory##noHistory#').rule((name,jiekouchuli) => { + let apiurl = getMyVar('apiurl'); + let apiname = getMyVar('apiname'); + let apiurls = getMyVar('apiurls'); + let apiua = getMyVar('apiua','Dalvik/2.1.0'); + let datalist = []; + if(getMyVar('addtype', '1')=="1"&&apiname&&apiurl){ + let urltype = getMyVar('apitype')||jiekouchuli("type",apiurl); + let urlgroup = getMyVar('apigroup',''); + datalist.push({"name": apiname, "url": apiurl, "ua": apiua, "type": urltype, "group": urlgroup }); + }else if(getMyVar('addtype', '1')=="2"&&apiurls){ + var urls = apiurls.replace(/,|,/g,"#").split('\n'); + for (var i in urls) { + let urlname = urls[i].split('#')[0]; + let urlurl = urls[i].split('#')[1]; + let urltype = urls[i].split('#')[2]||jiekouchuli("type",urlurl); + let urlgroup = urls[i].split('#')[3]||getMyVar('apigroup',''); + if(!datalist.some(item => item.url ==urlurl)&&urlname&&/^http/.test(urlurl)&&urltype){ + let arr = { "name": urlname, "url": urlurl, "ua": apiua, "type": urltype, "group": urlgroup }; + datalist.push(arr); + } + } + }else{ + return "toast://无法测试,检查项目填写完整性"; + } + require(config.依赖); + xunmi(name, datalist); + },input, jiekouchuli); + },jiekouchuli) + }); + if(lx=="update"){ + d.push({ + title:'删除', + col_type:'text_3', + url: $("确定删除接口:"+data.name).confirm((dataurl)=>{ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var datafile = fetch(filepath); + eval("var datalist=" + datafile+ ";"); + for(var i=0;i{ + clearMyVar('apiname'); + clearMyVar('apiurl'); + clearMyVar('apiurls'); + clearMyVar('apitype'); + return "toast://已清空"; + }) + }); + } + d.push({ + title:'保存', + col_type:'text_3', + url: $().lazyRule((lx,data,jiekouchuli)=>{ + if(getMyVar('addtype', '1')=="1"&&!/^http/.test(getMyVar('apiurl',''))){return "toast://接口地址不正确"} + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + + let apiurl = getMyVar('apiurl'); + let apiname = getMyVar('apiname'); + let apiurls = getMyVar('apiurls'); + let apiua = getMyVar('apiua','Dalvik/2.1.0'); + if(getMyVar('addtype', '1')=="1"&&apiname&&apiurl){ + let urltype = getMyVar('apitype')||jiekouchuli("type",apiurl); + let apigroup = getMyVar('apigroup',''); + if(lx=="update"&&(apiurl!=data.url||apiname!=data.name||apiua!=data.ua||urltype!=data.type||apigroup!=data.group)){ + for(var i=0;i item.url ==apiurl)){ + let arr = { "name": apiname, "url": apiurl, "ua": apiua, "type": urltype, "group": apigroup }; + datalist.unshift(arr); + writeFile(filepath, JSON.stringify(datalist)); + back(true); + return "toast://已保存"; + }else{ + return "toast://已存在"; + } + }else{ + return "toast://暂不支持的api接口类型"; + } + }else if(getMyVar('addtype', '1')=="2"&&apiurls){ + var urls = apiurls.replace(/,|,/g,"#").split('\n'); + var urlnum = 0; + + for (var i in urls) { + let urlname = urls[i].split('#')[0]; + let urlurl = urls[i].split('#')[1]; + let urltype = urls[i].split('#')[2]||jiekouchuli("type",urlurl); + let urlgroup = urls[i].split('#')[3]||urltype; + if(!datalist.some(item => item.url ==urlurl)&&urlname&&/^http/.test(urlurl)&&urltype){ + let arr = { "name": urlname, "url": urlurl, "ua": apiua, "type": urltype, "group": urlgroup }; + datalist.push(arr); + urlnum = urlnum + 1; + } + } + if(urlnum>0){writeFile(filepath, JSON.stringify(datalist));} + back(true); + return "toast://合计:"+urls.length+",保存:"+urlnum; + }else{ + return "toast://无法保存,检查项目填写完整性"; + } + }, lx, data, jiekouchuli) + }); + setHomeResult(d); + } + function jiexi(lx,data) { + addListener("onClose", $.toString(() => { + clearMyVar('parsename'); + clearMyVar('parseurl'); + clearMyVar('parseurls'); + clearMyVar('addtype'); + clearMyVar('stopfrom'); + clearMyVar('priorfrom'); + //refreshPage(false); + })); + var d = []; + if(lx!="update"){ + setPageTitle("♥解析管理-新增"); + d.push({ + title: '添加方式:点击切换', + col_type:'text_1', + url: $('#noLoading#').lazyRule(()=>{ + if(getMyVar('addtype', '1')=="1"){ + putMyVar('addtype', '2'); + }else{ + putMyVar('addtype', '1'); + } + refreshPage(false); + return'toast://已切换'; + }) + }); + }else{ + setPageTitle("♥解析管理-变更"); + } + + if(getMyVar('addtype', '1')=="1"){ + d.push({ + title:'parseurl', + col_type: 'input', + desc: "解析名称", + extra: { + titleVisible: false, + defaultValue: getMyVar('parsename', lx=="update"?data.name:""), + onChange: 'putMyVar("parsename",input)' + } + }); + d.push({ + title:'parseurl', + col_type: 'input', + desc: "链接地址", + extra: { + titleVisible: false, + defaultValue: getMyVar('parseurl', lx=="update"?data.url:""), + onChange: 'putMyVar("parseurl",input)' + } + }); + let apistopfrom = getMyVar('stopfrom', lx=="update"?data.stopfrom:""); + d.push({ + title:'排除片源:' + apistopfrom, + col_type: 'text_1', + url:$(apistopfrom,"输入排除的片源标识,以逗号隔开,为空则自动管理").input(()=>{ + putMyVar('stopfrom', input); + refreshPage(false); + return "toast://"+input; + }) + }); + let apipriorfrom = getMyVar('priorfrom', data&&data.priorfrom?data.priorfrom:""); + d.push({ + title:'优先片源:' + apipriorfrom, + col_type: 'text_1', + url:$('hiker://empty#noRecordHistory##noHistory#').rule((apipriorfrom) => { + var d = []; + d.push({ + title: '优先片源标识不为空时,优先级在上次优先之后', + col_type: "rich_text" + }); + d.push({ + col_type: "line" + }); + d.push({ + title:'优先片源', + col_type: 'input', + desc: getMyVar('priorfrom',''), + extra: { + titleVisible: false, + defaultValue: getMyVar('priorfrom', apipriorfrom), + onChange: 'putMyVar("priorfrom",input)' + } + }); + d.push({ + title: '选择需要优先的片源标识>', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + var recordfile = "hiker://files/rules/Src/Juying/parse.json"; + var recordparse=fetch(recordfile); + if(recordparse!=""){ + eval("var recordlist=" + recordparse+ ";"); + }else{ + var recordlist={}; + } + var froms = recordlist.from || ['youku','mgtv','iqiyi','qq']; + for(var i in froms){ + d.push({ + title:froms[i], + col_type:'text_3', + url: $('#noLoading#').lazyRule((from)=>{ + let priorfrom = getMyVar('priorfrom','')?getMyVar('priorfrom','').replace(/,|,/g,",").split(','):[]; + if(priorfrom.indexOf(from)==-1){ + priorfrom.push(from); + var sm = '选择优先>'+from; + }else{ + function removeByValue(arr, val) { + for(var i = 0; i < arr.length; i++) { + if(arr[i] == val) { + arr.splice(i, 1); + break; + } + } + } + removeByValue(priorfrom,from); + var sm = '删除优先>'+from; + } + putMyVar('priorfrom',priorfrom.join(',')); + refreshPage(false); + return 'toast://'+sm; + }, froms[i]) + }) + } + d.push({ + col_type: "line_blank" + }); + d.push({ + title:'选择好了,点此返回', + col_type:'text_center_1', + url: $('#noLoading#').lazyRule(()=>{ + back(true); + return "hiker://empty"; + }) + }); + setHomeResult(d); + },apipriorfrom) + }); + }else{ + d.push({ + title:'批量添加', + col_type: 'input', + desc: "一行一个解析\n格式:解析名称#链接地址\n分隔符#可以用,号代替", + extra: { + titleVisible: false, + type: "textarea", + height: 10, + onChange: 'putMyVar("parseurls",input)' + } + }); + } + d.push({ + title:'测试', + col_type:'text_3', + url: $().lazyRule((data)=>{ + if(data){ + var dataurl = data.url; + }else{ + var dataurl = getMyVar('parseurl'); + } + if(!dataurl||!/^http/.test(dataurl)){ + return "toast://获取解析地址失败,无法测试"; + } + //if(findItem('jxfrom')){ + // deleteItemByCls('jxtest'); + //}else{ + addItemAfter('jxline',{ + title: '选择测试片源', + col_type: "rich_text", + extra:{ + id: 'jxfrom', + cls: 'jxtest' + } + }) + addItemAfter('jxfrom',{ + col_type: "line", + extra:{ + id: 'jxline2', + cls: 'jxtest' + } + }) + var filepath = 'hiker://files/rules/Src/Juying/testurls.json'; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var urls=" + datafile+ ";"); + }else{ + var urls = { + "1905": "https://vip.1905.com/m/play/1566444.shtml", + "爱奇艺": "https://m.iqiyi.com/v_sa04mvdzk8.html", + "优酷": "https://v.youku.com/v_show/id_XNDc0MDE1NTk1Mg==.html", + "腾讯": "https://v.qq.com/x/cover/mzc00200frpbpgb/r0042i6x2xp.html", + "芒果": "https://www.mgtv.com/b/349253/10424300.html", + "哔哩哔哩": "https://m.bilibili.com/bangumi/play/ep471494", + "搜狐": "https://m.tv.sohu.com/v/MjAyMjAxMDkvbjYwMTE1MjExMy5zaHRtbA==.html", + "西瓜": "https://www.ixigua.com/6532733952283640333?logTag=fbbfc792d3498d67c0fd", + "PPTV": "https://v.pptv.com/show/zVn3dJXt1xV49l4.html", + "咪咕": "https://m.miguvideo.com/mgs/msite/prd/detail.html?cid=676935232&mgdbid=&channelId=CAAAB000902015500000000", + "乐视": "http://www.le.com/ptv/vplay/26958608.html", + "融兴": "RongXingVR-5145649549215", + "龙腾": "LT-2a2ac4570caa6b6e987b05371d8a945e", + "旋风": "xfy-3be76512eb721f0b", + "五毒云": "wuduyun-90db2047aa43104c8821468d03258c52", + "思古": "sigu-1359862022c153dc90285a5a07ca42fda894ff0ee5_1", + "人人迷": "renrenmi-3bcde575190081f6", + "CL4K": "https://3.ruifenglb.com/play/1650861537.m3u8", + "多多": "https://m3u8.cache.suoyo.cc/m3u8/202206/3/e04f658333a07ef659d77cf7c2546400aee0f6bd.m3u8", + "新苍蓝": "canglan-42d3f9790dcdc5adc1345516174b6823", + "乐多": "XMMTk2Mzk5MDAwMF8xMA==", + "雪人": "xueren-1653287099" + } + writeFile(filepath, JSON.stringify(urls)); + } + + urls['自定义'] = ""; + for(var key in urls){ + + addItemBefore('jxline2', { + title: key, + url: key!="自定义"?$('#noRecordHistory##noHistory#').lazyRule((vipUrl,parseurl)=>{ + try{ + eval("var config =" + fetch("hiker://files/cache/MyParseSet.json")); + eval(fetch(config.cj)); + return aytmParse(vipUrl,parseurl); + }catch(e){ + return "toast://没有断插,无法测试"; + }; + },urls[key],dataurl):$("","输入自定义播放地址").input((parseurl) => { + if(input==""){ + return "toast://未输入自定义地址,无法测试"; + }else{ + return $().lazyRule((vipUrl,parseurl)=>{ + try{ + eval("var config =" + fetch("hiker://files/cache/MyParseSet.json")); + eval(fetch(config.cj)); + return aytmParse(vipUrl,parseurl); + }catch(e){ + return "toast://没有断插,无法测试"; + }; + }, input, parseurl) + } + }, dataurl), + col_type: "text_3", + extra:{ + cls: 'jxtest' + } + }) + } + addItemBefore('jxline2', { + title: '编辑测试', + url: $('#noRecordHistory##noHistory#').lazyRule(()=>{ + return "editFile://hiker://files/rules/Src/Juying/testurls.json"; + }), + col_type: "text_3", + extra:{ + cls: 'jxtest' + } + }) + //} + updateItem('jxtest', { + title:'测试', + col_type:'text_3', + url: "hiker://empty" + }) + return "hiker://empty"; + },data), + extra:{ + id: 'jxtest' + } + }); + if(lx=="update"){ + d.push({ + title:'删除', + col_type:'text_3', + url: $("确定删除解析:"+data.url).confirm((dataurl)=>{ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var datafile = fetch(filepath); + eval("var datalist=" + datafile+ ";"); + for(var i=0;i0){ + function removeByValue(arr, val) { + for(var i = 0; i < arr.length; i++) { + if(arr[i] == val) { + arr.splice(i, 1); + break; + } + } + } + removeByValue(excludeparse,dataurl); + writeFile(recordfile, JSON.stringify(recordlist)); + } + back(true); + return "toast://已删除"; + }, data.url) + }); + }else{ + d.push({ + title:'清空', + col_type:'text_3', + url:$("确定要清空上面填写的内容?").confirm(()=>{ + clearMyVar('parsename'); + clearMyVar('parseurl'); + clearMyVar('parseurls'); + refreshPage(false); + return "toast://已清空"; + }) + }); + } + d.push({ + title:'保存', + col_type:'text_3', + url: $().lazyRule((lx,data)=>{ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + let parseurl = getMyVar('parseurl'); + let parsename = getMyVar('parsename'); + let parseurls = getMyVar('parseurls'); + let parsestopfrom = getMyVar('stopfrom',""); + let pasrepriorfrom = getMyVar('priorfrom',""); + if(getMyVar('addtype', '1')=="1"&&parseurl&&parsename){ + if(lx=="update"&&(parseurl!=data.url||parsename!=data.name||parsestopfrom!=data.stopfrom||pasrepriorfrom!=data.priorfrom)){ + for(var i=0;i item.parse ==parseurl)){ + let stopfrom = parsestopfrom.replace(',',',').split(','); + stopfrom = stopfrom.filter(n => n); + let priorfrom = pasrepriorfrom.replace(',',',').split(','); + priorfrom = priorfrom.filter(n => n); + let arr = { "name": parsename, "parse": parseurl, "stopfrom": stopfrom, "priorfrom": priorfrom }; + datalist.unshift(arr); + writeFile(filepath, JSON.stringify(datalist)); + back(true); + return "toast://已保存"; + }else{ + return "toast://已存在"; + } + }else if(getMyVar('addtype', '1')=="2"&&parseurls){ + let urls = parseurls.replace(/,|,/g,"#").split('\n'); + let urlnum = 0; + + for (var i in urls) { + let urlname = urls[i].split('#')[0]; + let urlurl = urls[i].split('#')[1]; + if(!datalist.some(item => item.url ==urlurl)&&urlname&&/^http/.test(urlurl)){ + let arr = { "name": urlname, "parse": urlurl, "stopfrom": [], "priorfrom": [] }; + datalist.push(arr); + urlnum = urlnum + 1; + } + } + if(urlnum>0){writeFile(filepath, JSON.stringify(datalist));} + back(true); + return "toast://合计:"+urls.length+",保存:"+urlnum; + }else{ + return "toast://无法保存,检查项目填写完整性"; + } + + },lx,data) + }); + d.push({ + col_type: "line", + extra:{id:'jxline'} + }) + setHomeResult(d); + } + function guanlidata(data,jiekou,jiexi,jiekouchuli) { + try{ + if(getMyVar('guanli', 'jk')=="jk"){ + var czdatalist = data.map((datalist)=>{ + let dataurl = datalist.url; + let dataname = datalist.name; + let dataua = datalist.ua; + let datatype = datalist.type; + let datagroup = datalist.group; + return { + title: dataname + ' ('+datatype+')' + (datagroup&&datagroup!=datatype?' [' + datagroup + ']':""), + desc: dataurl, + url: getMyVar('guanlicz','0')=="1"?$('#noLoading#').lazyRule((name,url)=>{ + copy(name+'#'+url); + return "hiker://empty"; + },dataname, dataurl):getMyVar('guanlicz','0')=="2"?$('hiker://empty#noRecordHistory##noHistory#').rule((jiekou,data,jiekouchuli) => { + jiekou('update', data, jiekouchuli); + }, jiekou, {name:dataname, url:dataurl, ua:dataua, type:datatype, group:datagroup}, jiekouchuli):$("确定删除接口:"+dataname).confirm((dataurl)=>{ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var datafile = fetch(filepath); + eval("var datalist=" + datafile+ ";"); + for(var i=0;i{ + let dataurl = datalist.parse; + let dataname = datalist.name; + let datastopfrom = datalist.stopfrom||[]; + let datapriorfrom = datalist.priorfrom||""; + return { + title: dataname+'-'+dataurl, + desc: "优先强制:" + datapriorfrom + "" + "\n排除片源:" + datastopfrom + "", + url: getMyVar('guanlicz','0')=="1"?$('#noLoading#').lazyRule((name,url)=>{ + copy(name+"#"+url); + return "hiker://empty"; + },dataname,dataurl):getMyVar('guanlicz','0')=="2"?$('hiker://empty#noRecordHistory##noHistory#').rule((jiexi,data) => { + jiexi('update', data); + }, jiexi, {name:dataname, url:dataurl, stopfrom:datastopfrom+"", priorfrom:datapriorfrom+""}):$("确定删除解析:"+dataname).confirm((dataurl)=>{ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var datafile = fetch(filepath); + eval("var datalist=" + datafile+ ";"); + for(var i=0;i0){ + function removeByValue(arr, val) { + for(var i = 0; i < arr.length; i++) { + if(arr[i] == val) { + arr.splice(i, 1); + break; + } + } + } + removeByValue(excludeparse,dataurl); + writeFile(recordfile, JSON.stringify(recordlist)); + } + refreshPage(false); + return "toast://已删除"; + }, dataurl), + col_type: 'text_1', + extra: { + cls: "guanlidatalist" + } + } + }) + } + return czdatalist; + } catch (e) { + log(e.message); + return []; + } + } + d.push({ + title: '增加', + url: getMyVar('guanli', 'jk')=="jk"?$('hiker://empty#noRecordHistory##noHistory#').rule((jiekou,jiekouchuli) => { + jiekou('add','',jiekouchuli) + }, jiekou, jiekouchuli):$('hiker://empty#noRecordHistory##noHistory#').rule((jiexi) => { + jiexi('add'); + }, jiexi), + img: "https://lanmeiguojiang.com/tubiao/more/25.png", + col_type: "icon_small_4" + }); + d.push({ + title: getMyVar('guanlicz','0')=="1"?'复制':getMyVar('guanlicz','0')=="2"?'变更':getMyVar('guanlicz','0')=="3"?'删除':'操作', + url: $(["复制","变更","删除","清空"],2,"选择操作功能项").select(()=>{ + if(input=="复制"){ + putMyVar('guanlicz','1'); + refreshPage(false); + return 'toast://已切换到复制模式'; + }else if(input=="变更"){ + putMyVar('guanlicz','2'); + refreshPage(false); + return 'toast://已切换到变更模式'; + }else if(input=="删除"){ + putMyVar('guanlicz','3'); + refreshPage(false); + return 'toast://已切换到删除模式'; + }else if(input=="清空"){ + if(getMyVar('guanli', 'jk')=="jk"){ + var sm = "接口"; + }else{ + var sm = "私有解析"; + } + return $("确定要删除本地所有的"+sm+"吗?").confirm(()=>{ + if(getMyVar('guanli', 'jk')=="jk"){ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + }else if(getMyVar('guanli', 'jk')=="jx"){ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + } + var datalist = []; + writeFile(filepath, JSON.stringify(datalist)); + refreshPage(false); + return 'toast://已全部清空'; + }) + } + }), + img: getMyVar('guanlicz','0')=="1"?"https://lanmeiguojiang.com/tubiao/more/292.png":getMyVar('guanlicz','0')=="2"?"https://lanmeiguojiang.com/tubiao/more/275.png":getMyVar('guanlicz','0')=="3"?"https://lanmeiguojiang.com/tubiao/more/216.png":"https://lanmeiguojiang.com/tubiao/more/290.png", + col_type: "icon_small_4" + }); + d.push({ + title: '导入', + url: $("","聚影口令").input(()=>{ + try{ + if((input.split('¥')[0]=="聚影接口"||input.split('¥')[0]=="聚影资源码")&&getMyVar('guanli', 'jk')=="jk"){ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var sm = "聚影接口"; + }else if((input.split('¥')[0]=="聚影解析"||input.split('¥')[0]=="聚影资源码")&&getMyVar('guanli', 'jk')=="jx"){ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var sm = "聚影解析"; + }else{ + return "toast://无法识别的口令"; + } + if(input.split('¥')[0]=="聚影资源码"){ + var codelx = "dingyue"; + }else{ + var codelx = "share"; + } + let pasteurl = input.split('¥')[1]; + let text = parsePaste('https://netcut.cn/p/'+aesDecode('Juying', pasteurl)); + if(pasteurl&&!/^error/.test(text)){ + let pastedata = JSON.parse(base64Decode(text)); + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + var urlnum = 0; + + if(getMyVar('guanli', 'jk')=="jk"){ + if(codelx=="share"){ + var pastedatalist = pastedata; + }else if(codelx=="dingyue"){ + var pastedatalist = pastedata.jiekou; + } + for (var i in pastedatalist) { + if(!datalist.some(item => item.url ==pastedatalist[i].url)){ + //let arr = { "name" : pastedatalist[i].name, "url" : pastedatalist[i].url, "ua" : pastedatalist[i].ua, "type" : pastedatalist[i].type, "group" : pastedatalist[i].group?pastedatalist[i].group:pastedatalist[i].type }; + datalist.push(pastedatalist[i]); + urlnum = urlnum + 1; + } + } + }else{ + if(codelx=="share"){ + var pastedatalist = pastedata; + }else if(codelx=="dingyue"){ + var pastedatalist = pastedata.jiexi; + } + for (var i in pastedatalist) { + if(!datalist.some(item => item.parse ==pastedatalist[i].parse)){ + //let arr = { "name" : pastedatalist[i].name, "parse" : pastedatalist[i].parse, "stopfrom" : pastedatalist[i].stopfrom }; + datalist.push(pastedatalist[i]); + urlnum = urlnum + 1; + } + } + } + if(urlnum>0){ + writeFile(filepath, JSON.stringify(datalist)); + refreshPage(false); + } + return "toast://"+sm+"合计:"+pastedatalist.length+",保存:"+urlnum; + }else{ + return "toast://口令错误或已失效"; + } + } catch (e) { + return "toast://无法识别的口令"; + } + }), + img: "https://lanmeiguojiang.com/tubiao/more/43.png", + col_type: "icon_small_4" + }); + d.push({ + title: '分享', + url: datalist.length==0?'toast://数据为空,无法分享':$().lazyRule(()=>{ + if(getMyVar('guanli', 'jk')=="jk"){ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var sm = "聚影接口"; + }else{ + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var sm = "聚影解析"; + } + var datafile = fetch(filepath); + eval("var datalist=" + datafile+ ";"); + let text = JSON.stringify(datalist); + var num = ''; + for (var i = 0; i < 6; i++) { + num += Math.floor(Math.random() * 10); + } + var pasteurl = JSON.parse(request('https://netcut.cn/api/note/create/', { + headers: { 'Referer': 'https://netcut.cn/' }, + body: 'note_name=Juying'+num+'¬e_content='+base64Encode(text)+'¬e_pwd=0&expire_time=3600', + method: 'POST' + })).data.note_id || ""; + + if(pasteurl){ + let code = sm+'¥'+aesEncode('Juying', pasteurl)+'¥1小时内有效'; + copy(code); + return "toast://聚影分享口令已生成"; + }else{ + return "toast://分享失败,剪粘板异常"; + } + }), + img: "https://lanmeiguojiang.com/tubiao/more/3.png", + col_type: "icon_small_4" + }); + d.push({ + col_type: "line" + }); + + if(getMyVar('guanlicz','0')!="0"){ + d.push({ + title: "🔍", + url: $.toString((guanlidata,datalist,jiekou,jiexi,jiekouchuli) => { + if(datalist.length>0){ + deleteItemByCls('guanlidatalist'); + var lists = datalist.filter(item => { + if(item.url){ + return item.name.includes(input) || item.url.includes(input); + }else{ + return item.name.includes(input) || item.parse.includes(input); + } + }) + let gldatalist = guanlidata(lists,jiekou,jiexi,jiekouchuli); + addItemBefore('guanliloading', gldatalist); + } + return "hiker://empty"; + },guanlidata,datalist,jiekou,jiexi,jiekouchuli), + desc: "搜你想要的...", + col_type: "input", + extra: { + titleVisible: true + } + }); + + let gldatalist = guanlidata(datalist,jiekou,jiexi,jiekouchuli); + d = d.concat(gldatalist); + } + d.push( { + title: '当前共有'+datalist.length+'个'+(getMyVar('guanli', 'jk')=="jk"?"接口":"私有解析"), + url: "hiker://empty", + col_type: "text_center_1", + extra: { + id: "guanliloading" + } + }); + setResult(d); +} + +//寻觅片源 +function xunmi(name,data) { + addListener("onClose", $.toString(() => { + clearMyVar('moviemore'); + })); + putMyVar('moviemore','1'); + + if(data){ + var datalist = data; + }else{ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + } + var count = datalist.length; + + var d = []; + let grouplist = datalist.map((list)=>{ + return list.group||list.type; + }) + //去重复 + function uniq(array){ + var temp = []; //一个新的临时数组 + for(var i = 0; i < array.length; i++){ + if(temp.indexOf(array[i]) == -1){ + temp.push(array[i]); + } + } + return temp; + } + grouplist = uniq(grouplist); + for(var i in grouplist){ + var lists = datalist.filter(item => { + return item.group==grouplist[i] || item.type==grouplist[i]; + }) + d.push({ + title: grouplist[i]+'('+lists.length+')', + url: $('#noLoading#').lazyRule((bess,datalist,name,count)=>{ + let beresults = []; + deleteItemByCls('xunmilist'); + bess(datalist,beresults,name,count); + return'hiker://empty'; + },bess,lists,name,lists.length), + col_type: "scroll_button", + extra: { + id: "grouplist" + } + }); + } + d.push({ + title: count>0?'加载中...':'没有接口,无法搜索', + url: "hiker://empty", + col_type: "text_center_1", + extra: { + id: "loading" + } + }); + d.push({ + title: '
', + col_type: 'rich_text' + }); + setHomeResult(d); + + var beresults = []; + + function bess(datalist,beresults,name,count) { + var beerrors = []; + var success = 0; + var num = 0; + var cfgfile = "hiker://files/rules/Src/Juying/config.json"; + var Juyingcfg=fetch(cfgfile); + if(Juyingcfg != ""){ + eval("var JYconfig=" + Juyingcfg+ ";"); + var xunminum = JYconfig['xunminum'] || 10; + var xunmitimeout = JYconfig['xunmitimeout'] || 5; + }else{ + var xunmitimeout = 5; + } + var task = function(obj) { + let url_api = obj.url; + if (obj.type=="v1") { + let date = new Date(); + let mm = date.getMonth()+1; + let dd = date.getDate(); + let key = (mm<10?"0"+mm:mm)+""+(dd<10?"0"+dd:dd); + //mm<10?"0"+mm+""+dd:mm+""+dd; + /* + if(url_api.substr(url_api.length-1,1)=="/"){ + url_api = url_api.substr(0,url_api.length-1); + }*/ + var url = url_api + '/detail?&key='+key+'&vod_id='; + var ssurl = url_api + '?ac=videolist&limit=10&wd='+name+'&key='+key; + var lists = "html.data.list"; + } else if (obj.type=="app") { + var url = url_api + 'video_detail?id='; + var ssurl = url_api + 'search?limit=10&text='+name; + var lists = "html.list"; + } else if (obj.type=="v2") { + var url = url_api + 'video_detail?id='; + var ssurl = url_api + 'search?limit=10&text='+name; + var lists = "html.data"; + } else if (obj.type=="iptv") { + var url = url_api + '?ac=detail&ids='; + var ssurl = url_api + '?ac=list&zm='+name+'&wd='+name; + var lists = "html.data"; + } else if (obj.type=="cms") { + var url = url_api + '?ac=detail&ids='; + var ssurl = url_api + '?ac=videolist&wd='+name; + var lists = "html.list"; + }else{ + + } + updateItem('loading', { + title: beresults.length+'/'+count+',加载中...', + url: "hiker://empty", + col_type: "text_center_1", + extra: { + id: "loading" + } + }); + var urlua = obj.ua=="MOBILE_UA"?MOBILE_UA:obj.ua=="PC_UA"?PC_UA:obj.ua; + try { + var html = JSON.parse(request(ssurl, { headers: { 'User-Agent': urlua }, timeout:xunmitimeout*1000 })); + } catch (e) { + var html = { data: [] }; + } + try{ + try{ + var list = eval(lists)||html.list||html.data.list||html.data||[]; + } catch (e) { + var list = html.list||html.data.list||html.data||[]; + } + + if(list.length==0&&obj.type=="iptv"){ + try { + ssurl = ssurl.replace('&zm='+name,''); + html = JSON.parse(request(ssurl, { headers: { 'User-Agent': urlua }, timeout:xunmitimeout*1000 })); + list = html.data||[]; + } catch (e) { + list = []; + } + } + + if(list.length>0&&obj.type=="cms"){ + if(list[0].vod_name.indexOf(name)==-1){ + try { + ssurl = ssurl.replace('videolist','list'); + html = JSON.parse(request(ssurl, { headers: { 'User-Agent': urlua }, timeout:xunmitimeout*1000 })); + list = html.list||[]; + } catch (e) { + list = []; + } + } + } + + if(list.length>0){ + try { + let search = list.map((list)=>{ + let vodname = list.vod_name||list.title; + if(vodname.indexOf(name)>-1){ + let vodpic = list.vod_pic||list.pic; + let voddesc = list.vod_remarks||list.state||""; + let appname = '‘‘’’'+obj.name+''; + let vodurl = list.vod_id?url + list.vod_id:list.nextlink; + return { + title: vodname, + desc: voddesc + '\n\n' + appname + ' ('+obj.type+')'+(obj.group?' ['+obj.group+']':''), + pic_url: vodpic?vodpic + "@Referer=":"https://www.xawqxh.net/mxtheme/images/loading.gif", + url: $("hiker://empty##" + vodurl + "#immersiveTheme#").rule((type,ua) => { + require(config.依赖); + xunmierji(type,ua) + },obj.type, urlua), + col_type: "movie_1_vertical_pic", + extra: { + pic: vodpic, + name: vodname, + title: vodname+'-'+obj.name, + cls: 'xunmilist' + } + } + } + }); + search = search.filter(n => n); + if(search.length>0){ + return {result:1, apiurl:url_api, add:search}; + } + } catch (e) { + log(obj.name+'>'+e.message); + } + } + return {result:0, url:ssurl, apiurl:url_api}; + } catch (e) { + log(obj.name+'>'+e.message); + return {result:0, url:ssurl, apiurl:url_api}; + } + }; + + let Jklist = datalist.map((parse)=>{ + return { + func: task, + param: { + name: parse.name, + url: parse.url, + ua: parse.ua, + type: parse.type, + group: parse.group||"" + }, + id: parse.name + } + }); + + be(Jklist, { + func: function(obj, id, error, taskResult) { + num = num + 1; + let i = taskResult.result; + if(i==1){ + success = success + i; + addItemBefore('loading', taskResult.add); + }else{ + obj.errors.push({name:id,url:taskResult.url,apiurl:taskResult.apiurl}); + } + if(obj.results.indexOf(taskResult.apiurl)==-1){obj.results.push(taskResult.apiurl);} + + updateItem('loading', { + title: obj.results.length+'/'+count+',加载中...', + url: "hiker://empty", + col_type: "text_center_1", + extra: { + id: "loading" + } + }); + + if (success>=xunminum) { + //toast("我主动中断了"); + //log("√线程中止"); + return "break"; + } + if(error){log(id+"-错误信息:"+error);} + }, + param: { + results: beresults, + errors: beerrors + } + }); + + for (let k in beerrors) { + addItemBefore('loading', { + title: beerrors[k].name, + desc: "加载失败,点击操作", + url: $(["查看原网页","删除此接口"],2).select((name,url,api)=>{ + if(input=="查看原网页"){ + return url; + }else{ + return $("确定删除接口:"+name).confirm((dataurl)=>{ + var filepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var datafile = fetch(filepath); + eval("var datalist=" + datafile+ ";"); + for(var i=0;i{ + for (let j = 0; j < beresults.length; j++) { + for(var i = 0; i < datalist.length; i++){ + if(beresults[j] == datalist[i].url){ + datalist.splice(i,1); + break; + } + } + } + //var arr3 = datalist.filter(list => !beresults.includes(list.url)); + bess(datalist,beresults,name,count); + return "hiker://empty"; + },bess,datalist,beresults,name,count), + col_type: "text_center_1", + extra: { + id: "loading" + } + }); + } + if(count>0){bess(datalist,beresults,name,count);} +} + +function xunmierji(type,ua) { + addListener("onClose", $.toString(() => { + clearMyVar('parse_api'); + clearMyVar('moviedesc'); + clearMyVar('SrcM3U8'); + clearMyVar('linecode'); + })); + + var d = []; + setPageTitle(MY_PARAMS.title); + //加载本地自定义变量缓存文件 + var configfile = config.依赖.match(/https.*\//)[0] + 'srcconfig.js'; + require(configfile); + + //自动判断是否需要更新请求 + if (getMyVar('myurl', '0') != MY_URL || !configvar.详情1 || configvar.标识 != MY_URL) { + if (/v1|app|v2|iptv|cms/.test(type)) { + try{ + var html = JSON.parse(request(MY_URL.split('##')[1], { headers: { 'User-Agent': ua } })); + } catch (e) { + var html = ""; + } + }else{ + //后续网页类 + } + var zt = 1; + putMyVar('myurl', MY_URL); + } else { + var zt = 0; + } + //影片详情 + if (zt == 1) { + if (/v1|app|v2|cms/.test(type)) { + if (/cms/.test(type)) { + try{ + var json = html.list[0]; + }catch(e){ + var json = html.data.list[0]; + } + + var arts = json.vod_play_from.split('$$$'); + var conts = json.vod_play_url.split('$$$'); + }else{ + if($.type(html.data)=="array"){ + var json = html.data[0]; + }else{ + var json = html.data; + } + if(json&&json.vod_info){ + json = json.vod_info; + } + var arts = json.vod_play_list || json.vod_url_with_player; + var conts = arts; + } + let actor = json.vod_actor || "内详"; + let director = json.vod_director || "内详"; + let area = json.vod_area || "未知"; + let year = json.vod_year || "未知"; + let remarks = json.vod_remarks || ""; + let pubdate = json.vod_pubdate || json.vod_class || ""; + var details1 = '主演:' + actor.substring(0, 12) + '\n导演:' + director.substring(0, 12) + '\n地区:' + area + ' 年代:' + year; + var details2 = remarks + '\n' + pubdate; + var pic = MY_PARAMS.pic || json.vod_pic; + var desc = json.vod_blurb || '...'; + }else if (/iptv/.test(type)) { + let actor = html.actor.join(",") || "内详"; + let director = html.director.join(",") || "内详"; + let area = html.area.join(",") || "未知"; + let year = html.pubtime || "未知"; + let remarks = html.trunk || ""; + let pubdate = html.type.join(",") || ""; + var details1 = '主演:' + actor.substring(0, 12) + '\n导演:' + director.substring(0, 12) + '\n地区:' + area + ' 年代:' + year; + var details2 = remarks + '\n' + pubdate; + var pic = MY_PARAMS.pic || html.img_url; + var desc = html.intro || '...'; + var arts = html.videolist; + var conts = arts; + }else{ + //网页 + } + var newconfig = { 详情1: details1, 详情2: details2, 图片: pic, 简介: desc, 线路: arts, 影片: conts, 标识: MY_URL }; + var libsfile = 'hiker://files/libs/' + md5(configfile) + '.js'; + writeFile(libsfile, 'var configvar = ' + JSON.stringify(newconfig)); + } else { + var details1 = configvar.详情1; + var details2 = configvar.详情2; + var pic = configvar.图片; + var desc = configvar.简介; + var arts = configvar.线路; + var conts = configvar.影片; + } + d.push({ + title: details1,//详情1 + desc: details2,//详情2 + pic_url: pic + '@Referer=',//图片 + url: pic + '#noHistory#',//链接 + col_type: 'movie_1_vertical_pic_blur', + extra: { + gradient: true + } + }); + + //二级统一菜单 + putMyVar('moviedesc',desc) + for(var i in erjimenu){ + d.push( + erjimenu[i] + ) + } + var parse_api = ""; + var tabs = []; + var linecodes = []; + for (var i in arts) { + if (/v1|app|v2/.test(type)) { + let line = arts[i].name || arts[i].player_info.show; + tabs.push(line); + var linecode = arts[i].code || arts[i].player_info.from; + + if (getMyVar(MY_URL, '0') == i) { + try { + if(type=="v2"){ + var parse1 = arts[i].parse_api; + var parse2 = arts[i].extra_parse_api; + }else{ + var parse1 = arts[i].player_info.parse; + var parse2 = arts[i].player_info.parse2; + } + if (parse2.indexOf('//') == -1) { + parse_api = parse1; + } else if (parse1.indexOf('//') == -1) { + parse_api = parse2; + } else { + parse_api = parse2 + ',' + parse1; + } + } catch (e) { + parse_api = arts[i].parse_api; + } + if (parse_api != "" && parse_api != undefined) { + parse_api = parse_api.replace(/\.\./g, '.').replace(/。\./g, '.'); + } + } + }else if (/iptv/.test(type)) { + let line = i; + tabs.push(line); + var linecode = i; + }else if (/cms/.test(type)) { + tabs.push(arts[i]); + var linecode = arts[i]; + }else{ + var linecode = ""; + //网页 + } + linecodes.push(linecode); + } + + var lists = []; + for (var i in conts) { + if (/v1|app|v2/.test(type)) { + if(conts[i].url){ + let single = conts[i].url||""; + if(single){lists.push(single.split('#'))}; + }else{ + let single = conts[i].urls||[]; + if(single.length>0){ + var si = []; + for (let j = 0; j < single.length; j++) { + si.push(single[j].name+"$"+single[j].url); + } + lists.push(si); + }; + } + }else if (/iptv/.test(type)) { + let single = conts[i]||[]; + if(single.length>0){ + var si = []; + for (let j = 0; j < single.length; j++) { + si.push(single[j].title+"$"+single[j].url); + } + lists.push(si); + }; + }else if (/cms/.test(type)) { + let single = conts[i]||""; + if(single){lists.push(single.split('#'))}; + }else{ + //网页 + } + } + + //取之前足迹记录,用于自动定位之前的线路 + try { + eval('var SrcMark = ' + fetch("hiker://files/cache/SrcMark.json")); + if (SrcMark != "") { + if (SrcMark.route[MY_URL] != undefined) { + putMyVar(MY_URL, SrcMark.route[MY_URL]); + } + } + } catch (e) { } + var Marksum = 30;//设置记录线路足迹数量 + + //线路部份 + var Color = "#f13b66a"; + var Color1 = "#098AC1"; + function getHead(title) { + return '‘‘’’' + title + ''; + } + for (let i = 0; i < 9; i++) { + d.push({ + col_type: "blank_block" + }) + } + + function setTabs(tabs, vari) { + d.push({ + title: getMyVar('shsort') == '1'?'““””' : '““””', + url: $("#noLoading#").lazyRule(() => { + if (getMyVar('shsort') == '1') { putMyVar('shsort', '0'); } else { putMyVar('shsort', '1') }; + refreshPage(false); + return 'toast://切换排序成功' + }), + col_type: 'scroll_button' + }) + for (var i in tabs) { + if (tabs[i] != "") { + if(getMyVar(vari, '0') == i){putMyVar('linecode', linecodes[i])}; + d.push({ + title: getMyVar(vari, '0') == i ? getHead(tabs[i] + '↓') : tabs[i], + url: $("#noLoading#").lazyRule((vari, i, Marksum) => { + if (parseInt(getMyVar(vari, '0')) != i) { + try { + eval('var SrcMark = ' + fetch("hiker://files/cache/SrcMark.json")); + } catch (e) { + var SrcMark = ""; + } + if (SrcMark == "") { + SrcMark = { route: {} }; + } else if (SrcMark.route == undefined) { + SrcMark.route = {}; + } + SrcMark.route[vari] = i; + var key = 0; + var one = ""; + for (var k in SrcMark.route) { + key++; + if (key == 1) { one = k } + } + if (key > Marksum) { delete SrcMark.route[one]; } + writeFile("hiker://files/cache/SrcMark.json", JSON.stringify(SrcMark)); + putMyVar(vari, i); + refreshPage(false); + return 'toast://切换成功' + } else { + return '#noHistory#hiker://empty' + } + }, vari, i, Marksum), + col_type: 'scroll_button' + }) + } + } + } + setTabs(tabs, MY_URL); + + //选集部份 + function setLists(lists, index) { + var list = lists[index]; + function playlist(lx, len) {//定义选集列表生成 + if (lx == '1') { + if (/v1|app|v2|iptv|cms/.test(type)) { + var playtitle = list[j].split('$')[0]; + if (/iptv/.test(type)) { + var playurl = list[j].split('$')[1].split('url=')[1]; + parse_api = list[j].split('$')[1].split('url=')[0]+"url="; + }else{ + var playurl = list[j].split('$')[1]; + } + putMyVar('parse_api', parse_api); + var DTJX = $("").lazyRule(() => { + require(config.依赖.match(/https.*\//)[0] + 'SrcParseS.js'); + return SrcParseS.聚影(input); + }); + }else{ + //网页 + } + d.push({ + title: playtitle.replace(/第|集|话|期|-/g, ''), + url: playurl + DTJX, + extra: { id: playurl, referer: playurl, ua: PC_UA, jsLoadingInject: true, blockRules: ['.m4a', '.mp3', '.mp4', '.m3u8', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpg', '.jpeg', '.png', '.ico', '.svg', '.css'] }, + col_type: list.length > 4 && len < 7 ? 'text_4' : 'text_3' + }); + } else { + d.push({ + title: '当前无播放选集,点更多片源试试!', + url: '#noHistory#hiker://empty', + col_type: 'text_center_1' + }); + } + + } + if (list == undefined || list.length == 0) { + playlist('0'); + } else { + if (/v1|app|v2|iptv/.test(type)) { + var listone = list[0].split('$')[0]; + }else{ + //cms + } + if (listone) { + var len = listone.length; + } + if (getMyVar('shsort') == '1') { + try { + for (var j = list.length - 1; j >= 0; j--) { + playlist('1', len); + } + } catch (e) { + playlist('0'); + } + } else { + try { + for (var j = 0; j < list.length; j++) { + playlist('1', len); + } + } catch (e) { + playlist('0'); + } + + } + } + } + setLists(lists, getMyVar(MY_URL, '0')); + //底部说明 + d.push({ + desc: '‘‘’’此规则仅限学习交流使用,请于导入后24小时内删除,任何团体或个人不得以任何方式方法传播此规则的整体或部分!', + url: 'toast://温馨提示:且用且珍惜!', + col_type: 'text_center_1' + }); + setResult(d); +} + +//二级 +function erji() { + addListener("onClose", $.toString(() => { + clearMyVar('SrcM3U8'); + })); + var d = []; + //加载本地自定义变量缓存文件 + //var configfile = config.依赖.match(/https.*\//)[0] + 'srcconfig.js'; + //require(configfile); + + //自动判断是否需要更新请求 + //if (getMyVar('myurl', '0') != MY_URL || !configvar.详情1 || configvar.标识 != MY_URL) { + var html = fetch(MY_URL.split('##')[1]); + // var zt = 1; + // putMyVar('myurl', MY_URL); + //} else { + // var zt = 0; + //} + + //影片详情 + //if (zt == 1) { + var json = JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]).detail.itemData; + var plays = json.play.item_list; + //log(plays); + var shows = json.play_from_open_index; + //log(shows); + + let actor = json.starring?'演员:'+json.starring : json.emcee?'主持:'+json.emcee:'内详'; + let director = json.director?'导演:'+json.director : json.tv_station?json.tv_station:'内详'; + let area = json.zone?'地区:'+json.zone:''; + let year = json.year?' 年代:' + json.year:''; + let remarks = json.style ? json.style : ''; + let pubdate = json.update_wordstr ? json.update_wordstr : ''; + + var details1 = director.substring(0, 15) + '\n' + actor.substring(0, 15) + '\n' + area + year; + var details2 = remarks + '\n' + pubdate; + var pic = MY_PARAMS.pic; + /* var newconfig = { 详情1: details1, 详情2: details2, 图片: pic, 标识: MY_URL, plays: plays, shows: shows }; + var libsfile = 'hiker://files/libs/' + md5(configfile) + '.js'; + writeFile(libsfile, 'var configvar = ' + JSON.stringify(newconfig)); + } else { + var details1 = configvar.详情1; + var details2 = configvar.详情2; + var pic = configvar.图片; + var plays = configvar.plays; + var shows = configvar.shows; + }*/ + d.push({ + title: details1,//详情1 + desc: details2,//详情2 + pic_url: pic + '@Referer=',//图片 + url: pic + '#noHistory#',//链接 + col_type: 'movie_1_vertical_pic_blur', + extra: { + gradient: true + } + + }); + //二级统一菜单 + for(var i in erjimenu){ + d.push( + erjimenu[i] + ) + } + + var tabs = []; + var lists = []; + + for (var i in plays) { + lists.push(plays[i].info); + tabs.push(plays[i].sitename[0]); + } + + //取之前足迹记录,用于自动定位之前的线路 + try { + eval('var SrcMark = ' + fetch("hiker://files/cache/SrcMark.json")); + if (SrcMark != "") { + if (SrcMark.route[MY_URL] != undefined) { + putMyVar(MY_URL, SrcMark.route[MY_URL]); + } + } + } catch (e) { } + var Marksum = 30;//设置记录线路足迹数量 + + //线路部份 + var Color = "#f13b66a"; + var Color1 = "#098AC1"; + function getHead(title) { + return '‘‘’’' + title + ''; + } + for (let i = 0; i < 9; i++) { + d.push({ + col_type: "blank_block" + }) + } + + function setTabs(tabs, vari) { + d.push({ + title: getMyVar('shsort') == '1'?'““””' : '““””', + url: $("#noLoading#").lazyRule(() => { + if (getMyVar('shsort') == '1') { putMyVar('shsort', '0'); } else { putMyVar('shsort', '1') }; + refreshPage(false); + return 'toast://切换排序成功' + }), + col_type: 'scroll_button' + }) + for (var i in tabs) { + if (tabs[i] != "") { + d.push({ + title: getMyVar(vari, '0') == i ? getHead(tabs[i] + '↓') : tabs[i], + url: $("#noLoading#").lazyRule((vari, i, Marksum) => { + if (parseInt(getMyVar(vari, '0')) != i) { + try { + eval('var SrcMark = ' + fetch("hiker://files/cache/SrcMark.json")); + } catch (e) { + var SrcMark = ""; + } + if (SrcMark == "") { + SrcMark = { route: {} }; + } else if (SrcMark.route == undefined) { + SrcMark.route = {}; + } + SrcMark.route[vari] = i; + var key = 0; + var one = ""; + for (var k in SrcMark.route) { + key++; + if (key == 1) { one = k } + } + if (key > Marksum) { delete SrcMark.route[one]; } + writeFile("hiker://files/cache/SrcMark.json", JSON.stringify(SrcMark)); + putMyVar(vari, i); + refreshPage(false); + return 'toast://切换成功' + } else { + return '#noHistory#hiker://empty' + } + }, vari, i, Marksum), + col_type: 'scroll_button' + }) + } + } + } + try{ + var playsinfo = plays[0].info; + }catch(e){ + var playsinfo = ""; + } + if(playsinfo||shows){ + setTabs(tabs, MY_URL); + }else{ + d.push({ + col_type: "line" + }) + for (let i = 0; i < 8; i++) { + d.push({ + col_type: "blank_block" + }) + } + } + //var easy = `@lazyRule=.js:try{var input=fetch(input,{}).split("('")[1].split("',")[0];evalPrivateJS("OjB3OHrVodkVQlHIU8UUAC5W0ZBgTQEC4h9eUEcAT9kEM0hY/45YOxs7PDeQEnxjVhaWW2tIqO5GQimD4ssHKSka505+O0avEtQQZ9zRy6GxaBZdTHrbCPcoNIajmr3+JG22tRswOJFYDX5aYk0PfUDEFsZa2OjZbz+xTthnoUPLNm0R2g1kBFnWwGKBWUxEhEsFwFruhFSaxJi1E1WZ7WlbP0v4OpoQgn6M7UXGahP9h2fHi8UBVDGfjzIuVuJSCgICLlVGaAbT0ghic+Kfbp3TmjRhAo1DKretYp1U53apDMvO2Q+6oAyO1js5TJwx51ygFSUqVGAu0C2DLxkG0Z3+L8UPZyJa4KVDlqq/goE=");if(input.match(/ixigua|iqiyi|qq.com|mgtv|le.com|bili|sohu|youku|pptv|cctv|1905.com/)){var input=input.split("?")[0];aytmParse(input)}else if(input.match(/huanxi/)){var input=input.split("&")[0];aytmParse(input)}else if(input.match(/migu/)){var input=input.replace(/\\?.*cid/,'?cid').replace(/http/,'https').split("&")[0];aytmParse(input)}else{aytmParse(input)}}catch(e){input}`; + var easy = $("").lazyRule(() => { + try{ + let sgurl = input; + input=fetch(sgurl,{}).split("('")[1].split("'")[0]; + //input=fetch(input,{}).match(/replace\('(.*?)'\);/)[1]; + //input=fetch(input,{}).split("replace('")[1].split("')")[0]; + //log(input) + if(!/^http/.test(input)){ + input=fetch(sgurl.replace('https://v.sogou.com/vc/np','https://waptv.sogou.com/play'),{}).split("('")[1].split("'")[0]; + if(!/^http/.test(input)){ + return "toast://本集无播放地址,可从更多片源中寻找"; + } + } + if(input.match(/ixigua|iqiyi|qq.com|mgtv|le\.com|bili|sohu|youku|pptv|cctv|1905\.com/)){ + input=input.split("?")[0]; + }else if(input.match(/huanxi/)){ + input=input.split("&")[0]; + }else if(input.match(/migu/)){ + input=input.replace(/http/,'https').split("&from")[0]; + } + require(config.依赖.match(/https.*\//)[0] + 'SrcParseS.js'); + return SrcParseS.聚影(input); + }catch(e){ + return input; + } + }); + var block = ['.m4a', '.mp3', '.mp4', '.m3u8', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpg', '.jpeg', '.png', '.ico', '.svg', '.css']; + //选集部份 + function setLists(lists, index) { + var list = lists[index]; + + function nolist() { + d.push({ + title: '此影片无播放选集!', + url: '#noHistory#hiker://empty', + col_type: 'text_center_1' + }); + } + + if(list){ + if (list.length == 0) { + nolist(); + } else { + if (getMyVar('shsort') == '1') { + try { + for (var j = list.length - 1; j >= 0; j--) { + let url = 'https://v.sogou.com' + list[j].url; + if (!list[j].index == '0') { + d.push({ + title: list[j].index + '', + url: url + easy, + extra: { id: MY_URL+j, jsLoadingInject: true, blockRules: block }, + col_type: 'text_4' + }); + } + } + } catch (e) { + nolist(); + } + } else { + try { + for (var j = 0; j < list.length; j++) { + let url = 'https://v.sogou.com' + list[j].url; + if (!list[j].index == '0') { + d.push({ + title: list[j].index + '', + url: url + easy, + extra: { id: MY_URL+j, jsLoadingInject: true, blockRules: block }, + col_type: 'text_4' + }); + } + } + } catch (e) { + nolist(); + } + } + } + }else if (shows&&plays.length>0) { + var arr = []; + var zy = shows.item_list[index]; + for (var ii in zy.date) { + date = zy.date[ii]; + day = zy.date[ii].day; + for (j in day) { + dayy = day[j][0] >= 10 ? day[j][0] : "0" + day[j][0]; + Tdate = date.year + date.month + dayy; + arr.push(Tdate); + if (getMyVar('shsort') == '1') { + arr.sort(function(a, b) { + return a - b + }) + } else { + arr.sort(function(a, b) { + return b - a + }) + } + } + } + for (var k = 0; k < arr.length; k++) { + let url = "https://v.sogou.com/vc/eplay?query=" + arr[k] + "&date=" + arr[k] + "&key=" + json.dockey + "&st=5&tvsite=" + plays[index].site; + d.push({ + title: "第" + arr[k] + "期", + col_type: "text_2", + url: url + easy, + extra: { + id: MY_URL+k, jsLoadingInject: true, blockRules: block + } + }); + } + } else if (plays.length==0) { + nolist(); + } else { + for (var m in plays) { + let url = "https://v.sogou.com" + plays[m].url; + d.push({ + title: plays[m].flag_list.indexOf('trailer') == -1?plays[m].sitename[0]:plays[m].sitename[0] + '—预告', + img: 'http://dlweb.sogoucdn.com/video/wap/static/img/logo/' + plays[m].sitename[1], + url: url + easy, + col_type: "icon_2", + extra: { id: MY_URL, jsLoadingInject: true, blockRules: block }, + }) + } + } + } + setLists(lists, getMyVar(MY_URL, '0')); + + //底部说明 + d.push({ + desc: '‘‘’’此规则仅限学习交流使用,请于导入后24小时内删除,任何团体或个人不得以任何方式方法传播此规则的整体或部分!', + url: 'toast://温馨提示:且用且珍惜!', + col_type: 'text_center_1' + }); + + setResult(d); +} + + +//一级 +function yiji() { + Version(); + /* + addListener("onClose", $.toString(() => { + clearMyVar('isverifyA'); + })); +*/ + + var d = []; + const Color = "#3399cc"; + const categorys = ['电视剧','电影','动漫','综艺','纪录片']; + const listTabs = ['teleplay','film','cartoon','tvshow','documentary']; + const fold = getMyVar('SrcJuying$fold', "0"); + const 类型 = getMyVar('SrcJuying$类型', ''); + const 地区 = getMyVar('SrcJuying$地区', ''); + const 年代 = getMyVar('SrcJuying$年代', ''); + const 资源 = getMyVar('SrcJuying$资源', ''); + const 明星 = getMyVar('SrcJuying$明星', ''); + const 排序 = getMyVar('SrcJuying$排序', ''); + MY_URL = "https://waptv.sogou.com/napi/video/classlist?abtest=0&iploc=CN1304&spver=&listTab=" + getMyVar('SrcJuying$listTab', 'teleplay') + "&filter=&start="+ (MY_PAGE-1)*15 +"&len=15&fr=filter"; + + if(类型 != ""){ + MY_URL = MY_URL + "&style=" + 类型; + } + if(地区 != ""){ + MY_URL = MY_URL + "&zone=" + 地区; + } + if(年代 != ""){ + MY_URL = MY_URL + "&year=" + 年代; + } + if(资源 != ""){ + MY_URL = MY_URL + "&fee=" + 资源; + } + if(明星 != ""){ + MY_URL = MY_URL + "&emcee=" + 明星; + } + if(排序 != ""){ + MY_URL = MY_URL + "&order=" + (排序=="最新"?"time":"score"); + } + + if(MY_PAGE==1){ + d.push({ + title: "管理", + url: $("hiker://empty#noRecordHistory##noHistory#").rule(() => { + require(config.依赖); + SRCSet(); + }), + pic_url: 'https://lanmeiguojiang.com/tubiao/more/129.png', + col_type: 'icon_small_4' + }); + d.push({ + title: "历史", + url: "hiker://history", + pic_url: 'https://lanmeiguojiang.com/tubiao/more/109.png', + col_type: 'icon_small_4' + }); + d.push({ + title: "搜索", + url: $("hiker://empty#noRecordHistory##noHistory#").rule(() => { + require(config.依赖); + sousuo2(); + }), + pic_url: 'https://lanmeiguojiang.com/tubiao/more/101.png', + col_type: 'icon_small_4' + }); + d.push({ + title: "筛选", + url: $('#noLoading#').lazyRule((fold) => { + putMyVar('SrcJuying$fold', fold === '1' ? '0' : '1'); + refreshPage(false); + return "hiker://empty"; + }, fold), + pic_url: fold === '1'?'https://lanmeiguojiang.com/tubiao/more/213.png':'https://lanmeiguojiang.com/tubiao/more/172.png', + col_type: 'icon_small_4' + }); + d.push({ + col_type: 'line' + }); + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + + for (var i in categorys) { + d.push({ + title: getMyVar('SrcJuying$listTab', 'teleplay') === listTabs[i] ? '““””' + categorys[i] + '' : categorys[i], + url: $('#noLoading#').lazyRule((listTab) => { + putMyVar('SrcJuying$listTab', listTab); + refreshPage(false); + return "hiker://empty"; + }, listTabs[i]), + col_type: 'scroll_button' + }); + } + d.push({ + col_type: "blank_block" + }); + + var html = JSON.parse(request(MY_URL)); + + if(fold==='1'){ + var filter = html.listData.list.filter_list; + for (var i in filter) { + d.push({ + title: filter[i].name=="排序"?排序==""?'““””最热':"最热":(类型==""&&filter[i].name=="类型")||(地区==""&&filter[i].name=="地区")||(年代==""&&filter[i].name=="年代")||(资源==""&&filter[i].name=="资源")||(明星==""&&filter[i].name=="明星")?'““””全部':"全部", + url: $('#noLoading#').lazyRule((name) => { + putMyVar('SrcJuying$'+name, ''); + refreshPage(false); + return "hiker://empty"; + }, filter[i].name), + col_type: 'scroll_button', + }) + let option_list = filter[i].option_list; + for (var j in option_list) { + d.push({ + title: getMyVar('SrcJuying$'+filter[i].name, '')==option_list[j]?'““””'+option_list[j]+'':option_list[j], + url: $('#noLoading#').lazyRule((name,option) => { + putMyVar('SrcJuying$'+name, option); + refreshPage(false); + return "hiker://empty"; + }, filter[i].name, option_list[j]), + col_type: 'scroll_button' + }); + } + d.push({ + col_type: "blank_block" + }); + } + } + }else{ + var html = JSON.parse(request(MY_URL)); + } + var seachurl = $('').lazyRule(() => { + return $('hiker://empty#noRecordHistory##noHistory#').rule((name) => { + require(config.依赖); + xunmi(name); + }, input); + }); + var cfgfile = "hiker://files/rules/Src/Juying/config.json"; + var Juyingcfg=fetch(cfgfile); + if(Juyingcfg != ""){ + eval("var JYconfig=" + Juyingcfg+ ";"); + }else{ + var JYconfig= {}; + } + var list = html.listData.results; + for (var i in list) { + d.push({ + title: list[i].name, + img: list[i].v_picurl + '@Referer=', + url: JYconfig['erjimode']!=2?"hiker://empty##https://v.sogou.com" + list[i].url.replace('teleplay', 'series').replace('cartoon', 'series') + "#immersiveTheme#":list[i].name + seachurl, + desc: list[i].ipad_play_for_list.finish_episode?list[i].ipad_play_for_list.episode==list[i].ipad_play_for_list.finish_episode?"全集"+list[i].ipad_play_for_list.finish_episode:"连载"+list[i].ipad_play_for_list.episode+"/"+list[i].ipad_play_for_list.finish_episode:"", + extra: { + pic: list[i].v_picurl, + name: list[i].name + } + }); + } + + setResult(d); + if(getMyVar('jydingyue','0')=="0"&&JYconfig['codeid2']){ + putMyVar('jydingyue','1'); + try{ + var nowtime = Date.now(); + var oldtime = parseInt(getItem('dingyuetime','0').replace('time','')); + if(nowtime > (oldtime+180*60*1000)){ + let pasteurl = JYconfig['codeid2']; + let text = parsePaste('https://netcut.cn/p/'+aesDecode('Juying', pasteurl)); + if(pasteurl&&!/^error/.test(text)){ + let pastedata = JSON.parse(base64Decode(text)); + var jkfilepath = "hiker://files/rules/Src/Juying/jiekou.json"; + var jkdatalist = pastedata.jiekou; + if(jkdatalist.length>0){ + writeFile(jkfilepath, JSON.stringify(jkdatalist)); + } + var jxfilepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var jxdatalist = pastedata.jiexi; + if(jxdatalist.length>0){ + writeFile(jxfilepath, JSON.stringify(jxdatalist)); + } + log("自动订阅同步完成"); + }else{ + log("自动订阅同步口令错误或已失效"); + } + setItem('dingyuetime',nowtime+"time"); + } + } catch (e) { + log('自动订阅更新失败:'+e.message); + } + } +} + +//搜索页 +function sousuo2() { + addListener("onClose", $.toString(() => { + clearMyVar('sousuo$input'); + })); + var seachurl = $('').lazyRule(() => { + return $('hiker://empty#noRecordHistory##noHistory#').rule((name) => { + require(config.依赖); + xunmi(name); + }, input); + }); + var d = []; + d.push({ + title: "🔍", + url: $.toString((seachurl) => { + return input + seachurl; + },seachurl), + desc: "搜你想看的...", + col_type: "input", + extra: { + titleVisible: true, + id: "input", + onChange: $.toString((seachurl) => { + if(input.length==1){deleteItemByCls('suggest');} + if(input.length>1&&input!=getMyVar('sousuo$input', '')){ + putMyVar('sousuo$input', input); + deleteItemByCls('suggest'); + var html = request("https://movie.douban.com/j/subject_suggest?q=" + input, {timeout: 3000}); + var list = JSON.parse(html)||[]; + let suggest = list.map((sug)=>{ + try { + if(sug.img!=""){ + return { + title: sug.title, + img: sug.img + '@Referer=', + url: sug.title + seachurl, + desc: "年份:" + sug.year, + col_type: "movie_1_vertical_pic", + extra: { + cls: 'suggest' + } + } + }else{ + return { + title: "⚡" + sug.title, + url: sug.title + seachurl, + col_type: "text_1", + extra: { + cls: 'suggest' + } + } + } + } catch (e) { } + }); + if(suggest.length>0){ + addItemAfter('input', suggest); + } + } + }, seachurl) + } + }); + + d.push({ + title: '\t热搜榜\t\t\t', + url: "hiker://empty", + pic_url: 'https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=3779990328,1416553241&fm=179&app=35&f=PNG?w=60&h=70&s=E7951B62A4639D153293A4E90300401B', + col_type: 'icon_small_3' + }); + var cfgfile = "hiker://files/rules/Src/Juying/config.json"; + var Juyingcfg=fetch(cfgfile); + if(Juyingcfg != ""){ + eval("var JYconfig=" + Juyingcfg+ ";"); + var list = JYconfig['resoulist'] || []; + }else{ + var JYconfig= {}; + var list = []; + } + if(list.length==0||getVar('SrcJuying-VersionCheck', '0')=="0"){ + var html = request("https://waptv.sogou.com/hotsugg"); + var list = pdfa(html, "body&&.hot-list&&li"); + JYconfig['resoulist'] = list; + writeFile(cfgfile, JSON.stringify(JYconfig)); + } + + for (var i in list) { + d.push({ + title: i=="0"?'““””' + (parseInt(i)+1).toString() + '' + "\t\t\t" + pdfh(list[i], "a&&Text"):i=="1"?'““””' + (parseInt(i)+1).toString() + '' + "\t\t\t" + pdfh(list[i], "a&&Text"):i=="2"?'““””' + (parseInt(i)+1).toString() + '' + "\t\t\t" + pdfh(list[i], "a&&Text"):'““””' + (parseInt(i)+1).toString() + '' + "\t\t\t" + pdfh(list[i], "a&&Text"), + url: pdfh(list[i], "a&&Text") + seachurl, + col_type: "text_1" + }, ); + } + + setResult(d); +} + +//搜索 +function sousuo() { + var d = []; + var html = getResCode(); + try { + var list = JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]).result.longVideo.results; + for (var i = 0; i < list.length; i++) { + if (list[i].play.item_list){ + d.push({ + title: list[i].name.replace(/|/g,''), + url: 'hiker://empty##https://v.sogou.com' + list[i].tiny_url + "#immersiveTheme#", + desc: list[i].list_category.join(','), + content: list[i].introduction, + pic_url: list[i].v_picurl, + extra: { + pic: list[i].v_picurl, + name: list[i].name.replace(/|/g,'') + } + }) + } + } + } catch (e) { } + setResult(d); +} + +//二级统一菜单 +var erjimenu = [ + { + title: "剧情简介", + url: /\.sogou\./.test(MY_URL)?$('hiker://empty#noRecordHistory##noHistory#').rule((url) => { + var d=[]; + var html = fetch(url.split('##')[1]); + var story=parseDomForHtml(html, 'body&&.srch-result-info&&Html').replace(/<\/a>0){ + d.push({ + title: '剧照:', + col_type: 'rich_text' + }); + d.push({ + col_type: 'line' + }); + } + for(var i in photos){ + d.push({ + pic_url: parseDomForHtml(photos[i], 'img&&data-src'), + url: 'hiker://empty', + col_type: 'pic_1_full' + }); + d.push({ + col_type: 'line' + }); + } + }catch(e){}; + setHomeResult(d); + }, MY_URL): $('hiker://empty#noHistory#').rule(() => { + setHomeResult([{ + title: '影片简介:\n' + getMyVar('moviedesc',''), + col_type: 'long_text' + }]); + }), + pic_url: 'https://lanmeiguojiang.com/tubiao/messy/32.svg', + col_type: 'icon_small_3' + }, + { + title: "观影设置", + url: $('hiker://empty#noRecordHistory##noHistory#').rule(() => { + setPageTitle("♥个性化设置"); + var d = []; + var cfgfile = "hiker://files/rules/Src/Juying/config.json"; + var Juyingcfg=fetch(cfgfile); + if(Juyingcfg != ""){ + eval("var JYconfig=" + Juyingcfg+ ";"); + }else{ + var JYconfig= {}; + } + + d.push({ + title: '功能开关', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + d.push({ + title: JYconfig['printlog']==1?'打印日志(开)':'打印日志(关)', + url: $('#noLoading#').lazyRule((JYconfig,cfgfile) => { + if(JYconfig['printlog'] != 1){ + JYconfig['printlog'] = 1; + }else{ + JYconfig['printlog'] = 0; + } + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://切换成功'; + }, JYconfig, cfgfile), + col_type: "text_2" + }); + d.push({ + title: JYconfig['cachem3u8']!=0?'m3u8缓存(开)':'m3u8缓存(关)', + url: $('#noLoading#').lazyRule((JYconfig,cfgfile) => { + if(JYconfig['cachem3u8'] == 0){ + JYconfig['cachem3u8'] = 1; + }else{ + JYconfig['cachem3u8'] = 0; + } + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://切换成功'; + }, JYconfig, cfgfile), + col_type: "text_2" + }); + d.push({ + col_type: "line" + }); + if(fileExist('hiker://files/cache/MyParseSet.json')&&fileExist('hiker://files/rules/DuanNian/MyParse.json')){var isDn = 1}else{var isDn = 0}; + d.push({ + title: isDn==1&&JYconfig['isdn']!=0?'断插辅助(开)':'断插辅助(关)', + url: isDn==0?'toast://没有断插?无法开启!':$('#noLoading#').lazyRule((JYconfig,cfgfile) => { + if(JYconfig['isdn'] == 0){ + JYconfig['isdn'] = 1; + var sm = "开启断插同步并发解析"; + }else{ + JYconfig['isdn'] = 0; + var sm = "只走程序自身的解析"; + } + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://切换成功:' + sm; + }, JYconfig, cfgfile), + col_type: "text_2" + }); + d.push({ + title: isDn==1&&JYconfig['forcedn']==1?'强制断插(开)':'强制断插(关)', + url: isDn==0?'toast://没有断插?无法开启!':$('#noLoading#').lazyRule((JYconfig,cfgfile) => { + if(JYconfig['forcedn'] != 1){ + JYconfig['forcedn'] = 1; + var sm = "开启强制断插,仅走断插解析"; + }else{ + JYconfig['forcedn'] = 0; + var sm = "关闭强制断插,程序智能解析"; + } + writeFile(cfgfile, JSON.stringify(JYconfig)); + refreshPage(false); + return 'toast://切换成功:' + sm; + }, JYconfig, cfgfile), + col_type: "text_2" + }); + d.push({ + title: '屏蔽操作', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + d.push({ + title: '无效播放地址', + url: $("","屏蔽无效播放地址\n多数为跳舞小姐姐播放链接").input(()=>{ + var recordfile = "hiker://files/rules/Src/Juying/parse.json"; + var recordparse=fetch(recordfile); + if(recordparse != ""){ + eval("var recordlist=" + recordparse+ ";"); + }else{ + var recordlist = {}; + } + recordlist['excludeurl'] = recordlist['excludeurl']||[]; + let url = input.split(';{')[0].replace('file:///storage/emulated/0/Android/data/com.example.hikerview/files/Documents/cache/video.m3u8##','').replace('#isVideo=true#',''); + if(recordlist['excludeurl'].indexOf(url)==-1){ + recordlist['excludeurl'].push(url); + } + writeFile(recordfile, JSON.stringify(recordlist)); + return 'toast://屏蔽无效播放地址成功'; + }), + col_type: "text_2" + }); + var parsefrom = []; + var recordfile = "hiker://files/rules/Src/Juying/parse.json"; + var recordparse=fetch(recordfile); + if(recordparse != ""){ + eval("var recordlist=" + recordparse+ ";"); + try{ + for(var key in recordlist.parse){ + parsefrom.push(key); + } + }catch(e){ } + } + d.push({ + title: '屏蔽优先解析', + url: parsefrom.length==0?'toast://没有优先解析,无需操作':$(parsefrom,3,"选择片源屏蔽优先解析").select(()=>{ + var recordfile = "hiker://files/rules/Src/Juying/parse.json"; + var recordparse=fetch(recordfile); + eval("var recordlist=" + recordparse+ ";"); + var parseurl = recordlist.parse[input]; + var parsename = recordlist.name[input]; + delete recordlist.parse[input]; + + + var filepath = "hiker://files/rules/Src/Juying/myjiexi.json"; + var datafile = fetch(filepath); + if(datafile != ""){ + eval("var datalist=" + datafile+ ";"); + }else{ + var datalist = []; + } + if(datalist.some(item => item.parse == parseurl)){ + //私有解析在屏蔽优先时,仅排除片源 + for(var j=0;j排除片源>'+input; + }else{ + //app自带的解析在屏蔽优先时,直接加入黑名单 + recordlist['excludeparse'] = recordlist['excludeparse']||[]; + if(recordlist['excludeparse'].indexOf(recordlist.parse[input])==-1){ + recordlist['excludeparse'].push(recordlist.parse[input]); + } + var sm = parsename+'>加入全局黑名单'; + } + + writeFile(recordfile, JSON.stringify(recordlist)); + refreshPage(false); + log('已屏蔽'+input+'优先解析:'+sm); + return 'toast://已屏蔽'+input+'优先解析'; + }), + col_type: "text_2" + }); + + d.push({ + title: '反悔回退', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + d.push({ + title: '清除拦截记录', + url: $(["播放地址","优先解析"],2,"选择需清除记录的项").select(()=>{ + if(input=="播放地址"){ + return $("清除拦截跳舞小姐姐视频记录?").confirm(()=>{ + var recordfile = "hiker://files/rules/Src/Juying/parse.json"; + var recordparse=fetch(recordfile); + if(recordparse != ""){ + eval("var recordlist=" + recordparse+ ";"); + recordlist['exclude'] = []; + writeFile(recordfile, JSON.stringify(recordlist)); + return 'toast://已清除跳舞小姐姐视频拦截记录'; + }else{ + return 'toast://无记录'; + } + }) + }else if(input=="优先解析"){ + return $("清除app自带解析拦截黑名单记录?").confirm(()=>{ + var recordfile = "hiker://files/rules/Src/Juying/parse.json"; + var recordparse=fetch(recordfile); + if(recordparse != ""){ + eval("var recordlist=" + recordparse+ ";"); + recordlist['excludeparse'] = []; + writeFile(recordfile, JSON.stringify(recordlist)); + refreshPage(false); + return 'toast://已清除app自带解析拦截黑名单记录'; + }else{ + return 'toast://无记录'; + } + }) + } + + + }), + col_type: "text_2" + }); + setHomeResult(d); + }), + pic_url: 'https://lanmeiguojiang.com/tubiao/messy/37.svg', + col_type: 'icon_small_3' + }, + { + title: "更多片源", + url: !fileExist('hiker://files/rules/Src/Juying/jiekou.json')?"toast://分享页面或没有接口,无法扩展更多片源":getMyVar('moviemore','0')=="0"?$('hiker://empty#noRecordHistory##noHistory#').rule((name) => { + require(config.依赖); + xunmi(name); + }, MY_PARAMS.name):`#noLoading#@lazyRule=.js:back(false);'hiker://empty'`, + pic_url: 'https://lanmeiguojiang.com/tubiao/messy/25.svg', + col_type: 'icon_small_3' + } +] +//版本检测 +function Version() { + var nowVersion = 1.9;//现在版本 + var nowtime = Date.now(); + var oldtime = parseInt(getItem('VersionChecktime','0').replace('time','')); + if (getVar('SrcJuying-VersionCheck', '0') == '0' && nowtime > (oldtime+180*60*1000)) { + try { + eval(fetch(config.依赖.match(/https.*\//)[0] + 'SrcTmplVersion.js')) + if (newVersion.SrcJuying > nowVersion) { + confirm({ + title:'发现新版本,是否更新?', + content:nowVersion+'=>'+newVersion.SrcJuying+'\n'+newVersion.SrcJuyingdesc[eval(newVersion.SrcJuying)], + confirm:`deleteCache();refreshPage();`, + cancel:'' + }) + log('检测到新版本!\nV'+newVersion.SrcJuying+'版本》'+newVersion.SrcJuyingdesc[eval(newVersion.SrcJuying)]); + } + putVar('SrcJuying-Version', '-V'+newVersion.SrcJuying); + } catch (e) { } + putVar('SrcJuying-VersionCheck', '1'); + setItem('VersionChecktime',nowtime+"time"); + }else{ + putVar('SrcJuying-Version', '-V'+nowVersion); + } +} \ No newline at end of file diff --git a/SrcParseS.js b/SrcParseS.js new file mode 100644 index 00000000..2892259a --- /dev/null +++ b/SrcParseS.js @@ -0,0 +1,1031 @@ +var SrcParseS = { + formatUrl: function (url, i) { + try { + if (url.trim() == "") { + return "toast://解析失败,建议切换线路或更换解析方式"; + } else { + if (url[0] == '/') { url = 'https:' + url } + if (i == undefined) { + if (getMyVar('SrcM3U8', '1') == "1") { + url = cacheM3u8(url, {timeout: 2000}); + } + if(url.indexOf('User-Agent')==-1){ + if (/wkfile/.test(url)) { + url = url + ';{User-Agent@Mozilla/5.0&&Referer@https://fantuan.tv/}'; + } else if (/bilibili|bilivideo/.test(url)) { + url = url + ";{User-Agent@Mozilla/5.0&&Referer@https://www.bilibili.com/}"; + } /*else if (/shenglinyiyang\.cn/.test(url)) { + url = url + ";{User-Agent@Mozilla/5.0&&Referer@https://zyz.sdljwomen.com}"; + }*/ else if (/mgtv/.test(url)) { + url = url + ";{User-Agent@Mozilla/5.0}"; + }/* else { + url = url + ";{User-Agent@Mozilla/5.0}"; + }*/ + } + } else { + if (getMyVar('SrcM3U8', '1') == "1") { + url = cacheM3u8(url, {timeout: 2000}, 'video' + parseInt(i) + '.m3u8') + '#pre#'; + } + } + if(url.indexOf('#isVideo=true#')==-1){ + url = url + '#isVideo=true#'; + } + return url; + } + } catch (e) { + return url; + } + }, + mulheader: function (url) { + if (/mgtv/.test(url)) { + var header = { 'User-Agent': 'Mozilla/5.0', 'Referer': 'www.mgtv.com' }; + } else if (/bilibili|bilivideo/.test(url)) { + var header = { 'User-Agent': 'Mozilla/5.0', 'Referer': 'www.bilibili.com' }; + } else if (/wkfile/.test(url)) { + var header = { 'User-Agent': 'Mozilla/5.0', 'Referer': 'fantuan.tv' }; + } else { + var header = { 'User-Agent': 'Mozilla/5.0' }; + } + return header; + }, + 嗅探: function (vipUrl) { + showLoading('√嗅探解析中,请稍候'); + return (getMyVar('SrcXTNH', 'web') == 'x5' ? 'x5Rule://' : 'webRule://') + vipUrl + '@' + $.toString((formatUrl) => { + if (typeof (request) == 'undefined' || !request) { + eval(fba.getInternalJs()); + }; + if (window.c == null) { + window.c = 0; + }; + window.c++; + if (window.c * 250 >= 15 * 1000) { + fba.hideLoading(); + return "toast://解析超时,建议切换线路或更换解析方式"; + } + //fba.log(fy_bridge_app.getUrls()); + var urls = _getUrls(); + var exclude = /m3u8\.tv/; + var contain = /\.mp4|\.m3u8|\.flv|\.avi|\.mpeg|\.wmv|\.mov|\.rmvb|\.dat|qqBFdownload|mime=video%2F|video_mp4/; + for (var i in urls) { + if (!exclude.test(urls[i]) && contain.test(urls[i])) { + //fba.log(urls[i]); + if(fy_bridge_app.getHeaderUrl) + //return fy_bridge_app.getHeaderUrl(urls[i]).replace(";{", "#isVideo=true#;{"); + + return $$$("#noLoading#").lazyRule((url) => { + return cacheM3u8(url.split(";{")[0], {timeout: 2000})+"#isVideo=true#;{"+url.split(";{")[1]; + }, fy_bridge_app.getHeaderUrl(urls[i])); + else { + return $$$("#noLoading#").lazyRule((url, formatUrl) => { + //url = url.replace(/http.*?\?url=/, ''); + return formatUrl(url); + }, urls[i], formatUrl); + } + } + } + }, this.formatUrl) + }, + 智能: function (vipUrl, input) { + showLoading('√智能解析中,请稍候'); + var video = ""; + try { + if (vipUrl.search(/LT-/) > -1) { + var jxList = ["https://ltjx.jeeves.vip/home/api?type=ys&uid=461939&key=degkpqruyzACEJLORW&url=", "https://ltjx.jeeves.vip/home/api?type=ys&uid=1589472&key=aehjpzAHILOPQRU456&url=", "https://vip.legendwhb.cn/m3u8.php?url=", "https://jx.zjmiao.com/?url=", "https://09tv.top/jx/?url="]; + var keyList = ["", "", "D63D64E0EDA774E3", "63f49d21a0dccf3c", "A42EAC0C2B408472"]; + var refList = ["", "", "https://wnvod.net", "", "https://09tv.top"]; + var jxLX = ["O", "O", "M", "M", "M"]; + for (var i = 0; i < jxList.length; i++) { + if (jxLX[i] != "M") { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路LT:' + jxList[i] + ' 解析异常'); + } + } else { + video = this.maoss(jxList[i] + vipUrl, refList[i], keyList[i]); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路LT:' + jxList[i] + ' 解析异常'); + } + } + } + } else if (/renrenmi-/.test(vipUrl)) { + var jxList = ["https://jx.blbo.cc:4433/analysis.php?v=", "https://jx.renrenmi.cc/?url=", "https://a.dxzj88.com/jxrrm/jiami.php?url="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路RR:' + jxList[i] + ' 解析异常'); + } + } + } else if (/RongXingVR/.test(vipUrl)) { + var jxList = ["https://vip.rongxingvr.top/api/?key=CMTJsEtHIzsLqZ6OGl&url=", "https://tc.yuanmajs.cn/jxplayer.php?v="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路RX:' + jxList[i] + ' 解析异常'); + } + } + } else if (/wuduyun-/.test(vipUrl)) { + var jxList = ["http://jf.1080p.icu:3232/home/api?type=dsp&uid=147565&key=adilmopuBEFJNUV067&url="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路WD:' + jxList[i] + ' 解析异常'); + } + } + } else if (/xueren-/.test(vipUrl)) { + var jxList = ["https://www.shangjihuoke.com/json.php/?url="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路XR:' + jxList[i] + ' 解析异常'); + } + } + } else if (/\.suoyo|adHuRo0dcuHoM163L1/.test(vipUrl)) { + var apiList = ["https://p.tjomet.com/duoduo/api.php", "https://jiexi.ysgc.xyz/api.php"]; + var refList = ["https://www.ysgc.cc/", "https://www.ysgc.cc/"]; + if (/suoyo/.test(vipUrl)) { + //明码https://a.dxzj88.com/jxdd/dd.php?url= + vipUrl = 'adHuRo0dcuHoM163L1y49tM3U4LmNhY2hlLnN1b3lvLmNj' + base64Encode(vipUrl.replace('https://m3u8.cache.suoyo.cc', '')); + } + for (var i = 0; i < apiList.length; i++) { + video = this.DD(vipUrl, apiList[i], refList[i]); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路DD:' + apiList[i] + ' 解析异常'); + } + } + } else if (/ruifenglb/.test(vipUrl)) { + var jxList = ["http://player.yjhan.com:8090/api/?key=sQWHLErduwNEmxfx3V&url=", "https://004.summ.vip/?url=", "https://shangjihuoke.com/CL4K/?url="]; + var keyList = ["", "A42EAC0C2B408472", "A42EAC0C2B408472"]; + var refList = ["", "", ""]; + var jxLX = ["O", "M", "M"]; + for (var i = 0; i < jxList.length; i++) { + if (jxLX[i] != "M") { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路RX:' + jxList[i] + ' 解析异常'); + } + } else { + video = this.maoss(jxList[i] + vipUrl, refList[i], keyList[i]); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路CL4K:' + jxList[i] + ' 解析异常'); + } + } + } + } else if (/xfy-/.test(vipUrl)) { + video = this.maoss("https://jx.zjmiao.com/?url=" + vipUrl, "", "63f49d21a0dccf3c"); + } else if (/\.mp4|\.m3u8/.test(vipUrl)) { + video = vipUrl; + } else if (/youku|mgtv|ixigua|qq\.com|iqiyi|migu|bilibili|sohu|pptv|\.le\.|\.1905|cctv/.test(vipUrl)) { + if (getMyVar('SrcGJFS', '1') == "2") { + return this.DN(vipUrl); + } else { + return this.嗅探(input); + } + } + } catch (e) { } + if (video == "") { + return this.嗅探(input); + } else { + return this.formatUrl(video); + } + }, + 官网: function (vipUrl, jxUrl, isDn) { + try { + if (getMyVar('SrcGJFS', '1') == "2" || isDn == "1") { + return this.DN(vipUrl); + } else { + if (getMyVar('author') == "帅√`人才") { + return this.聚嗅(vipUrl); + } else { + if (jxUrl == "" || jxUrl == undefined) { jxUrl = "https://jx.blbo.cc:4433/?url=" } + return this.嗅探(jxUrl + vipUrl); + } + } + } catch (e) { + return ''; + } + }, + 明码: function (playUrl, ref) { + try { + if (ref == "") { + var html = request(playUrl, { timeout: 5000 }); + } else { + var html = request(playUrl, { headers: { 'Referer': ref }, timeout: 5000 }); + } + try { + let rurl = JSON.parse(html).url || JSON.parse(html).data; + if (typeof (rurl) != "undefined") { + var url = rurl; + } + } catch (e) { + var url = html.match(/urls = "(.*?)"/)[1]; + } + return url; + } catch (e) { + return ''; + } + }, + maoss: function (playUrl, ref, key) { + try { + if (ref) { + var html = request(playUrl, { headers: { 'Referer': ref }, timeout: 8000 }); + } else { + var html = request(playUrl, { timeout: 8000 }); + } + if (html.indexOf('&btwaf=') != -1) { + html = request(playUrl + '&btwaf' + html.match(/&btwaf(.*?)"/)[1], { headers: { 'Referer': ref }, timeout: 8000 }) + } + var iv = html.match(/_token = "(.*?)"/)[1]; + + var getVideoInfo = function (text) { + eval(getCryptoJS()); + var video = CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(key), { + 'iv': CryptoJS.enc.Utf8.parse(iv), + 'mode': CryptoJS.mode.CBC + }).toString(CryptoJS.enc.Utf8); + return video; + }; + eval(html.match(/var config = {[\s\S]*?}/)[0]); + if (config.url.slice(0, 4) != 'http') { + config.url = getVideoInfo(config.url); + } + if (config.url != "" && config.url.slice(0, 4) != 'http') { + config.url = decodeURIComponent(config.url); + } + return config.url; + } catch (e) { + return ''; + } + }, + DD: function (vipUrl, apiUrl, ref) { + try { + if (apiUrl == "" || apiUrl == undefined) { + /* + if(getMyVar('ddfrom', '')=="duoduozy"){ + apiUrl = "https://player.tjomet.com/ysgc/qa9ty92aTSGHwn3X.jpg" + }else{ + apiUrl = "https://ysgc.tjomet.com/qa9ty92aTSGHwn3X.jpg" + } + clearMyVar('ddfrom'); + */ + apiUrl = "https://ysgc.tjomet.com/qa9ty92aTSGHwn3X.jpg" ; + } + var html = request("https://ysgc.tjomet.com/?url="+vipUrl,{timeout:5000}); + eval(html.match(/var config = {[\s\S]*?}/)[0] + ''); + var bod = 'url=' + config.url + "&vkey=" + config.vkey + "&token=" + config.token + "&sign=bKvCXSsVjPyTNr9R"; + var json = JSON.parse(request(apiUrl, { method: 'POST', body: bod })); + eval(fetch("https://vkceyugu.cdn.bspapp.com/VKCEYUGU-03ee1f89-f0d4-49aa-a2b3-50e203514d8a/2e54cc42-9b4c-457d-b2de-0cdf3e2aeeaa.js"));//https://p.tjomet.com/duoduo/js/decode.js + let url = getVideoInfo(json.url); + if(/^http/.test(url)){ + return url; + }else{ + var jsonstr = JSON.parse(request("https://p.tjomet.com/lff/api.php", { headers: { 'Referer': ref }, method: 'POST', body: 'url=' + vipUrl })); + eval(getCryptoJS()); + return CryptoJS.AES.decrypt(jsonstr.url, CryptoJS.enc.Utf8.parse(CryptoJS.MD5('rXjWvXl6')), { + 'iv': CryptoJS.enc.Utf8.parse('NXbHoWJbpsEOin8b'), + 'mode': CryptoJS.mode.CBC, + 'padding': CryptoJS.pad.ZeroPadding + }).toString(CryptoJS.enc.Utf8); + } + } catch (e) { + return ''; + } + }, + DD2: function (vipUrl, apiUrl, ref) { + try { + if(/youku|mgtv|ixigua|qq\.com|iqiyi|migu|bilibili|sohu|pptv|\.le\.|\.1905|cctv/.test(url)) { + return SrcParseS.官网(url); + } else { + if (apiUrl == "" || apiUrl == undefined) { apiUrl = "https://bo.dd520.cc/xmplayer/duoduo.php" } + if (ref == "" || ref == undefined) { ref = "http://www.xawqxh.net" } + vipUrl = "ahHgRj0kceHdMc66L5y4" + base64Encode(vipUrl).slice(10); + //var json = JSON.parse(request(apiUrl, { headers: { 'Referer': ref }, method: 'POST', body: 'url=' + vipUrl })); + var json = JSON.parse(request(apiUrl, { method: 'POST', body: 'url=' + vipUrl })); + eval(getCryptoJS()); + return CryptoJS.AES.decrypt(json.url, CryptoJS.enc.Utf8.parse(CryptoJS.MD5('rXjWvXl6')), { + 'iv': CryptoJS.enc.Utf8.parse('NXbHoWJbpsEOin8b'), + 'mode': CryptoJS.mode.CBC, + 'padding': CryptoJS.pad.ZeroPadding + }).toString(CryptoJS.enc.Utf8); + } + } catch (e) { + return ''; + } + }, + DN: function (vipUrl) { + evalPrivateJS("OjB3OHrVodkVQlHIU8UUAC5W0ZBgTQEC4h9eUEcAT9kEM0hY/45YOxs7PDeQEnxjVhaWW2tIqO5GQimD4ssHKSka505+O0avEtQQZ9zRy6GxaBZdTHrbCPcoNIajmr3+JG22tRswOJFYDX5aYk0PfUDEFsZa2OjZbz+xTthnoUPLNm0R2g1kBFnWwGKBWUxEhEsFwFruhFSaxJi1E1WZ7WlbP0v4OpoQgn6M7UXGahP9h2fHi8UBVDGfjzIuVuJSCgICLlVGaAbT0ghic+Kfbp3TmjRhAo1DKretYp1U53apDMvO2Q+6oAyO1js5TJwx51ygFSUqVGAu0C2DLxkG0Z3+L8UPZyJa4KVDlqq/goE=") + return aytmParse(vipUrl); + }, + 聚嗅: function (vipUrl, x5jxlist) { + var jxhtml = config.依赖.match(/https.*\//)[0] + 'SrcJiexi.html'; + fc(jxhtml, 48); + let libsjxjs = fetch("hiker://files/libs/" + md5(jxhtml) + ".js"); + if (x5jxlist != undefined) { + if (x5jxlist.length > 0) { + var a = JSON.parse(libsjxjs.match(/apiArray=(.*?);/)[1]); + for (var i = 0; i < x5jxlist.length; i++) { + a.push(x5jxlist[i]); + } + function uniq(array) { + var temp = []; //一个新的临时数组 + for (var i = 0; i < array.length; i++) { + if (temp.indexOf(array[i]) == -1) { + temp.push(array[i]); + } + } + return temp; + } + a = uniq(a);//去重 + libsjxjs = libsjxjs.replace(libsjxjs.match(/apiArray=(.*?);/)[1], JSON.stringify(a)) + } + } + let libsjxhtml = "hiker://files/libs/" + md5(jxhtml) + ".html"; + writeFile(libsjxhtml, libsjxjs); + return this.嗅探(getPath(libsjxhtml) + '?url=' + vipUrl); + }, + + APP: function (vipUrl) { + var appParses = getMyVar('parse_api', ''); + var Uparselist = []; + Uparselist = appParses.split(','); + function uniq(array) { + var temp = []; //一个新的临时数组 + for (var i = 0; i < array.length; i++) { + if (temp.indexOf(array[i]) == -1) { + temp.push(array[i]); + } + } + return temp; + } + Uparselist = uniq(Uparselist);//去重 + var x5jxlist = []; //x5嗅探接口存放数组 + var url = ""; + var parseurl = ""; + var urls = [];//多线路地址 + var headers = [];//多线路头信息 + var exclude = /404\.m3u8|xiajia\.mp4|余额不足\.m3u8|\.suoyo|\.ruifenglb|m3u8\.tv/;//设置排除地址 + var contain = /\.mp4|\.m3u8|\.flv|\.avi|\.mpeg|\.wmv|\.mov|\.rmvb|\.dat|qqBFdownload|mime=video%2F|video_mp4/;//设置符合条件的正确地址 + if (!exclude.test(vipUrl) && contain.test(vipUrl)) { + url = vipUrl; + } + for (var i = 0; i < Uparselist.length; i++) { + if (contain.test(url)) { break; } + if (x5jxlist.length >= 3) { break; } + let UrlList = []; + let p = i + 3; + if (p > Uparselist.length) { p = Uparselist.length } + for (let s = i; s < p; s++) { + parseurl = Uparselist[s]; + if (parseurl[0] == '/') { parseurl = 'https:' + parseurl } + if (parseurl.substring(0, 4) == 'http') { + UrlList.push(parseurl); + } + i = s; + } + if (UrlList.length > 0) { + let playUrls = UrlList.map((playUrl) => { + return { + url: playUrl + vipUrl, + options: { headers: { 'User-Agent': PC_UA }, timeout: 2000 } + } + }); + + let bfhtml = batchFetch(playUrls); + for (let k in bfhtml) { + let gethtml = bfhtml[k]; + parseurl = UrlList[k]; + if (gethtml == undefined || gethtml == "" || !/<|{/.test(gethtml)) { + //url直链网页打不开 + } else { + try { + try { + var rurl = JSON.parse(gethtml).url || JSON.parse(gethtml).data; + } catch (e) { + try { + var rurl = gethtml.match(/urls = "(.*?)"/)[1]; + } catch (e) { + x5jxlist.push(parseurl); + } + } + if (typeof (rurl) != "undefined" && contain.test(rurl) && !exclude.test(rurl)) { + url = rurl; + urls.push(this.formatUrl(url, urls.length)); + headers.push(this.mulheader(url)); + } + } catch (e) { } + } + }//批量结果循环 + } + } + + if (url == "") { + if (/youku|mgtv|ixigua|qq\.com|iqiyi|migu|bilibili|sohu|pptv|\.le\.|\.1905|cctv/.test(vipUrl)) { + if (getMyVar('SrcGJFS', '1') == "2") { + return this.DN(vipUrl); + } else { + if (getMyVar('author') == "帅√`人才") { + return this.聚嗅(vipUrl); + } else { + return this.聚嗅(vipUrl, x5jxlist); + } + } + } else { + if (getMyVar('author') == "帅√`人才") { + return this.智能(vipUrl); + } else { + return this.聚嗅(vipUrl, x5jxlist); + } + } + } else { + if (urls.length > 1) { + return JSON.stringify({ + urls: urls, + headers: headers + }); + } else { + return this.formatUrl(url); + } + } + }, + 聚影: function (vipUrl) { + //聚影采用新的、独立的解析逻辑 + var cfgfile = "hiker://files/rules/Src/Juying/config.json"; + var Juyingcfg=fetch(cfgfile); + if(Juyingcfg != ""){ + eval("var JYconfig=" + Juyingcfg+ ";"); + }else{ + var JYconfig= {printlog: 0, isdn: 0, cachem3u8: 1, forcedn: 0, appjiexinum: 50, mulnum: 1}; + } + var printlog = JYconfig.printlog||0; + var isdn = 0; + if(fileExist('hiker://files/cache/MyParseSet.json')&&fileExist('hiker://files/rules/DuanNian/MyParse.json')){ + try { + isdn = JYconfig.isdn; + } catch (e) { } + } + var forcedn = JYconfig.forcedn||0; + var appjiexinum = JYconfig['appjiexinum'] || 50; + putMyVar('SrcM3U8',JYconfig.cachem3u8); + var mulnum = JYconfig.mulnum||1; + if(printlog==1){log("影片地址:"+vipUrl)}; + var exclude = /404\.m3u8|xiajia\.mp4|余额不足\.m3u8|m3u8\.tv/;//设置排除地址 + var contain = /\.mp4|\.m3u8|\.flv|\.avi|\.mpeg|\.wmv|\.mov|\.rmvb|\.dat|qqBFdownload|mime=video%2F|video_mp4/;//设置符合条件的正确地址 + var needparse = /suoyo\.cc|fen\.laodi/;//设置需要解析的视频地址 + + if(contain.test(vipUrl)&&!exclude.test(vipUrl)&&!needparse.test(vipUrl)){ + if(printlog==1){log("直链视频地址,直接播放")}; + if(vipUrl.indexOf('app.grelighting.cn')>-1){vipUrl = vipUrl.replace('app.','ht.')} + return vipUrl + '#isVideo=true#'; + }else if (vipUrl.indexOf('sa.sogou') != -1) { + if(printlog==1){log("优看视频,直接明码解析")}; + return unescape(fetch(vipUrl).match(/"url":"([^"]*)"/)[1].replace(/\\u/g, "%u")); + }else{ + var from = ""; + if(vipUrl.indexOf('-yanaifei.html') != -1){ + from = 'yanaifei'; + }else if(vipUrl.indexOf('.') != -1){ + var host = vipUrl.match(/\.(.*?)\//)[1]; + from = host.split('.')[0]; + }else if(vipUrl.indexOf('-') != -1){ + from = vipUrl.split('-')[0]; + }else{ + from = getMyVar('linecode', 'oth'); + } + if(from=="qiyi"){from = "iqiyi"} + + if(printlog==1){log("片源标识:"+from+",需要解析")}; + + var recordfile = "hiker://files/rules/Src/Juying/parse.json"; + var recordparse=fetch(recordfile); + if(recordparse!=""){ + eval("var recordlist=" + recordparse+ ";"); + }else{ + var recordlist={}; + } + + var excludeurl = recordlist.excludeurl||[]; + var excludeparse = recordlist.excludeparse||[]; + try { + var recordparse = recordlist.parse[from]; + var recordname = recordlist.name[from]||"***"; + } catch (e) { + var recordparse = ""; + var recordname = "***"; + } + function uniq(array) { + var temp = []; //一个新的临时数组 + for (var i = 0; i < array.length; i++) { + if (temp.indexOf(array[i]) == -1) { + temp.push(array[i]); + } + } + return temp; + } + function removeByValue(arr, val) { + for(var i = 0; i < arr.length; i++) { + if(arr[i] == val) { + arr.splice(i, 1); + break; + } + } + } + var Uparselist = []; + var Nparselist = []; + var appParses = getMyVar('parse_api', ''); + if(appParses){ + let appParselist = appParses.split(','); + appParselist = uniq(appParselist);//去重 + for (var i in appParselist) { + if(excludeparse.indexOf(appParselist[i])==-1){ + Uparselist.push({type:'appz',name:'appz'+appParselist.length,parse:appParselist[i]}); + Nparselist.push('appz'+appParselist.length); + } + } + if(printlog==1){log("接口自带的解析数:"+Uparselist.length)}; + } + //log(Uparselist) + //读取本地app保存的解析,将可用加入备选 + var appJXfile = "hiker://files/rules/Src/Juying/appjiexi.json"; + var appJX=fetch(appJXfile); + if(appJX != ""){ + eval("var appJXlist=" + appJX+ ";"); + var apjxnum = 0; + for(var j=0;j-1&&excludeparse.indexOf(appJXlist[j].parse)==-1&&!Uparselist.some(item => item.parse ==appJXlist[j].parse)){ + Uparselist.push({type:'apps',name:'apps'+appJXlist.length,parse:appJXlist[j].parse}); + Nparselist.push('apps'+appJXlist.length); + var apjxnum = apjxnum + 1; + } + } + if(printlog==1){log("保存的可用解析数:" + apjxnum)}; + }else{ + var appJXlist= []; + } + //读取私有增加的解析,将可用加入备选 + var myJXfile = "hiker://files/rules/Src/Juying/myjiexi.json"; + var myJX=fetch(myJXfile); + if(myJX != ""){ + eval("var myJXlist=" + myJX+ ";"); + var myjxnum = 0; + for(var j=0;j-1){ + if(Uparselist.some(item => item.parse ==myJXlist[j].parse)){ + for(var i=0;i item.parse ==myJXlist[j].parse)){ + Uparselist.push({type:'myjx',name:myJXlist[j].name,parse:myJXlist[j].parse}); + Nparselist.push(myJXlist[j].name); + myjxnum = myjxnum + 1; + } + } + } + if(printlog==1){log("私有的可用解析数:" + myjxnum)}; + }else{ + var myJXlist= []; + } + //log(Uparselist) + + var url = "";//视频地址 + var x5jxlist = []; //x5嗅探接口存放数组 + var urls = [];//多线路地址 + var names = [];//多线路名称 + var headers = [];//多线路头信息 + var dellist = [];//需从本地解析中删除列表 + var appJXchange = 0;//app解析是否有发现新的或增加可解片源 + var myJXchange = 0;//私有解析是否排除片源 + + //断插线程代码 + var dnaytmParse = function(vipUrl) { + eval("var config =" + fetch("hiker://files/cache/MyParseSet.json")); + eval(fetch(config.cj)); + var url = aytmParse(vipUrl); + return {url: url, ulist: {type:"dn",name:'dn',parse:'dn',x5:0}}; + } + + //明码解析线程代码 + var task = function(obj) { + var getjson = JSON.parse(request(obj.ulist.parse+obj.vipUrl,{withStatusCode:true,timeout:5000})); + if (getjson.body&&getjson.statusCode==200){ + var gethtml = getjson.body; + var rurl = ""; + try { + rurl = JSON.parse(gethtml).url||JSON.parse(gethtml).data||JSON.parse(gethtml).data.url; + } catch (e) { + if(/\.m3u8|\.mp4/.test(getjson.url)&&getjson.url.indexOf('=http')==-1){ + rurl = getjson.url; + }else if(/\.m3u8|\.mp4|\.flv/.test(gethtml)){ + try { + if(gethtml.indexOf('urls = "') != -1){ + rurl = gethtml.match(/urls = "(.*?)"/)[1]; + }else if(gethtml.indexOf('"url":"') != -1){ + rurl = gethtml.match(/"url":"(.*?)"/)[1]; + }else if(gethtml.indexOf('id="video" src="') != -1){ + rurl = gethtml.match(/id="video" src="(.*?)"/)[1]; + }else if(gethtml.indexOf('url: "') != -1){ + rurl = gethtml.match(/url: "(.*?)"/)[1]; + }else{ + //if(printlog==1){log('将日志提交给作者,帮助完善解析逻辑>>>'+gethtml)}; + } + } catch (e) { + if(printlog==1){log('明码获取错误:'+e.message)}; + } + } + } + var x5 = 0; + if(rurl == ""){ + if(!/404 /.test(gethtml)){ + if(x5jxlist.length<=5){ + x5jxlist.push(obj.ulist.parse); + } + x5 = 1; + } + }else{ + function testurl(url,name){ + try { + if (/\.m3u8/.test(url)) { + var urlcode = JSON.parse(fetch(url,{withStatusCode:true,timeout:2000})); + if(urlcode.statusCode!=200){ + log(name+'>播放地址疑似失效或网络无法访问,不信去验证一下>'+url); + return 0; + }else{ + var tstime = urlcode.body.match(/#EXT-X-TARGETDURATION:(.*?)\n/)[1]; + var urltss = urlcode.body.replace(/#.*?\n/g,'').replace('#EXT-X-ENDLIST','').split('\n'); + if(parseInt(tstime)*parseInt(urltss.length)<300){ + log(name+'>播放地址疑似跳舞小姐姐或防盗小视频,不信去验证一下>'+url); + return 0; + }else{ + var urlts = urltss[0]; + if(!/^http/.test(urlts)){ + let http = urlcode.url.match(/http.*\//)[0];//.match(/http(s)?:\/\/.*?\//)[0]; + urlts = http + urlts; + } + var tscode = JSON.parse(fetch(urlts,{onlyHeaders:true,timeout:1000})); + if(tscode.statusCode!=200){ + log(name+'>ts段地址疑似失效或网络无法访问,不信去验证一下>'+url+'\nts>'+urlts); + return 0; + } + } + } + //log('test>播放地址连接正常'); + }else if (/\.mp4/.test(url)) { + var urlheader = JSON.parse(fetch(url,{onlyHeaders:true,timeout:2000})); + if(urlheader.statusCode!=200){ + log(name+'>播放地址疑似失效或网络无法访问,不信去验证一下>'+url); + return 0; + }else{ + var filelength = urlheader.headers['content-length']; + if(parseInt(filelength[0])/1024/1024 < 80){ + log(name+'>播放地址疑似跳舞小姐姐或防盗小视频,不信去验证一下>'+url); + return 0; + } + } + } + return 1; + } catch (e) { + log(name+'>错误:探测超时未拦截,有可能是失败的') + return 1; + } + } + if(testurl(rurl,obj.ulist.name)==0){ + rurl = ""; + } + } + obj.ulist['x5'] = x5; + return {url: rurl,ulist: obj.ulist}; + }else{ + obj.ulist['x5'] = 0; + return {url: "",ulist: obj.ulist}; + } + }; + + if(recordparse&&forcedn==0&&mulnum<=1){ + //优先上次成功的 + url = task({ulist:{parse:recordparse, name:recordname}, vipUrl:vipUrl}).url; + + if(contain.test(url)&&!exclude.test(url)&&excludeurl.indexOf(url)==-1){ + if(printlog==1){log("优先上次解析("+recordname+")成功>"+url)}; + }else{ + if(printlog==1){log("优先上次解析("+recordname+")失败,无效视频地址")}; + url = ""; + delete recordlist.parse[from]; + writeFile(recordfile, JSON.stringify(recordlist)); + //失败的从待解列表中去除 + for(var i=0;i1){ + if(printlog==1){log('发现失效解析,自动删除解析片源')}; + removeByValue(appJXlist[j].from,from); + appJXchange = 1; + }else{ + if(printlog==1){log('发现失效解析,自动删除解析')}; + appJXlist.splice(j,1); + j = j-1; + appJXchange = 1; + } + } + } + } + } + if(url==""){ + if(forcedn==1){ + if(printlog==1){log("开启强制断插解析模式")}; + Uparselist = [{type:'dn'}]; + }else{ + if(printlog==1){log("待命解析:"+Nparselist)}; + if(isdn==1&&Uparselist.length==0){ + Uparselist.push({type:'dn'}); + } + } + } + //log(Uparselist); + + for (var i=0;iUparselist.length){p=Uparselist.length} + for(let s=i;s0){ + UrlList.push({type:'dn'}); + } + let Urlparses = UrlList.map((list)=>{ + if(list.type=="dn"){ + return {func: dnaytmParse, param: vipUrl, id: 'dn'} + }else{ + if (/^\/\//.test(list.parse)) { list.parse = 'https:' + list.parse } + return { + func: task, + param: { + ulist: list, + vipUrl: vipUrl + }, + id: list.parse + } + } + }); + + be(Urlparses, { + func: function(obj, id, error, taskResult) { + let beurl = taskResult.url; + if(needparse.test(beurl)&&beurl.indexOf('?')==-1){ + beurl = ""; + } + obj.results.push(beurl); + obj.parses.push(taskResult.ulist); + obj.errors.push(error); + if (contain.test(beurl)&&!exclude.test(beurl)&&excludeurl.indexOf(beurl)==-1) { + sccess = sccess + 1; + if(sccess>=mulnum){ + if(printlog==1){log("线程中止,已捕获视频")}; + return "break"; + } + }else{ + if(printlog==1&&taskResult.ulist.x5==0){log(taskResult.ulist.name + '>解析失败');} + } + }, + param: { + results: beurls, + parses: beparses, + errors: beerrors + } + }); + + + var isrecord = 0; + for(let k in beparses){ + var parseurl = beparses[k].parse; + if(url==""){url = beurls[k];} + if(beerrors[k]==null&&contain.test(url)&&!exclude.test(url)&&excludeurl.indexOf(url)==-1){ + //记录除断插线程以外最快的,做为下次优先 + if(beparses[k].type!="dn"){ + if(printlog==1){log(beparses[k].name+'-解析成功>'+url)}; + if(isrecord==0){ + if(printlog==1){log(beparses[k].name+',记录为片源'+from+'的优先')}; + recordlist['parse'] = recordlist['parse']||{}; + recordlist['parse'][from] = parseurl; + + recordlist['name'] = recordlist['name']||{}; + recordlist['name'][from] = beparses[k].name; + recordlist['from']= recordlist['from']||[]; + if(recordlist['from'].indexOf(from)==-1){recordlist['from'].push(from)} + writeFile(recordfile, JSON.stringify(recordlist)); + isrecord = 1; + } + + if(!myJXlist.some(item => item.parse ==parseurl)){ + //解析成功的且不在私有解析中的添加到本地 + var isaddparse = 1; + for(var j=0;j0){ + names.push(mnames[j]); + }else{ + names.push('线路'+urls.length); + } + headers.push(mheaders[j]); + } + } catch (e) { + log('判断多线路地址对象有错:'+e.message); + } + }else{ + let MulUrl = this.formatMulUrl(beurls[k], urls.length); + urls.push(MulUrl.url); + names.push('线路'+urls.length); + headers.push(MulUrl.header); + } + //if(ismul==0){break;} + }else{ + if((beparses[k].type=="apps"||beparses[k].type=="myjx")&&beparses[k].x5==0){dellist.push(beparses[k])}; + url = ""; + } + }//解析结果循环 + }//解析接口列表循环 + var failedmyjx = []; + //失败的解析,处理 + for(var p=0;p1){ + if(printlog==1){log('发现失效解析,自动删除解析片源'+from)}; + removeByValue(appJXlist[j].from,from); + appJXchange = 1; + }else{ + if(printlog==1){log('发现失效解析,自动删除解析')}; + appJXlist.splice(j,1); + appJXchange = 1; + } + break; + } + } + } + } + //私有解析有排除片源 + if(myJXchange == 1){writeFile(myJXfile, JSON.stringify(myJXlist))}; + //app有发现或修改解析时保存本地 + if(appJXchange == 1){writeFile(appJXfile, JSON.stringify(appJXlist))}; + //if(printlog==1&&failedmyjx.length>0){log('本次失败的私有解析有:' + failedmyjx)}; + //播放 + if(url!=""){ + if(urls.length>1){ + if(printlog==1){log('解析完成,进入播放2')}; + return JSON.stringify({ + urls: urls, + names: names, + headers: headers + }); + }else{ + if(printlog==1){log('解析完成,进入播放1')}; + return this.formatUrl(url); + } + }else{ + if(printlog==1){ + log('明码解析失败,转嗅探备用解析'); + log('进入嗅探解析列表:' + x5jxlist) + } + return this.聚嗅(vipUrl, x5jxlist); + } + }//需要解析的视频 + }, + //处理多线路播放地址 + formatMulUrl: function (url,i) { + try { + if (/mgtv/.test(url)) { + var header = {'User-Agent': 'Mozilla/5.0','Referer': 'www.mgtv.com'}; + }else if(/bilibili|bilivideo/.test(url)) { + var header = {'User-Agent': 'Mozilla/5.0','Referer': 'www.bilibili.com'}; + }else if (/wkfile/.test(url)) { + var header = {'User-Agent': 'Mozilla/5.0','Referer': 'fantuan.tv'}; + }else{ + var header = {'User-Agent': 'Mozilla/5.0'}; + } + + if (getMyVar('SrcM3U8', '1') == "1") { + var name = 'video'+parseInt(i)+'.m3u8'; + url = cacheM3u8(url, {headers: header, timeout: 2000}, name)+'#pre#'; + } + return {url:url, header:header}; + } catch (e) { + if(config.printlog==1){log("√错误:"+e.message)}; + return url; + } + }, + //测试视频地址有效性 + testvideourl: function (url) { + try { + if (/\.m3u8/.test(url)) { + var header = this.getheader(url); + var urlcode = JSON.parse(fetch(url,{header:header,withStatusCode:true,timeout:1000})); + if(urlcode.statusCode!=200){ + log('test>播放地址无法连接'); + return 0; + }else{ + var urlts = urlcode.body.replace(/#.*?\n/g,'').split('\n')[0]; + if(!/^http/.test(urlts)){ + let http = urlcode.url.match(/http(s)?:\/\/.*?\//)[0]; + urlts = http + urlts; + } + var tscode = JSON.parse(fetch(urlts,{onlyHeaders:true,timeout:1000})); + if(tscode.statusCode!=200){ + log('test>ts段无法连接'); + return 0; + } + } + log('test>播放地址连接正常'); + } + return 1; + } catch (e) { + log('test>错误:'+e.message) + return 1; + } + } + +} \ No newline at end of file diff --git a/SrcTmplVersion.js b/SrcTmplVersion.js new file mode 100644 index 00000000..a6beb2b3 --- /dev/null +++ b/SrcTmplVersion.js @@ -0,0 +1,25 @@ +var newVersion = { + "srcDyTmpl":5.4, + "SrcJuying":1.9, + "SrcJuyingdesc":{ + "0.1":"原始搜狗改造", + "0.2":"主页界面完成", + "0.3":"搜索界面完成", + "0.4":"管理界面完成", + "0.5":"各界面联动修复bug,功能增加完善", + "0.6":"搜索结果显示优化,清除无效显示;管理-扩展中心支持记录订阅历史和切换更新;管理接口和解析增加清空操作", + "0.7":"管理接口和解析支持聚影资源码增量导入;支持自定义设置默认搜索线程数;支持自定义设置app解析保留数", + "0.8":"管理-接口支持分组保存;搜索界面支持按分组进行搜索", + "0.9":"管理-订阅切换删除逻辑加强;依赖自动更新间隔改为3小时;自动订阅更新间隔改为3小时;ua转换改为在搜索界面执行", + "1.0":"管理-批量增加接口、解析时分隔符支持中英文逗号;其他资源导入时处理注释部份;增加TVb资源导入", + "1.1":"修复版本号和分隔符提示", + "1.2":"搜索界面增加快速删除;完善搜索异常错误的处理逻辑;测试记忆", + "1.3":"管理界面-操作增加筛选定位功能", + "1.4":"管理界面-定位搜索修复;其他资源导入解析未过虑问题修复;其他小问题修复", + "1.5":"搜索接口增强兼容很多;主页底稿数据修复异常;其他资源导入提示解析是否导入", + "1.6":"搜索接口显示类型和分组;增加优看明码直解支持;增加301跳转解析支持;重构解析逻辑,加强日志显示;cache增加超时;管理-解析增加排除片源手工操作", + "1.7":"管理解析测试改用断插常规调用方式;修复优看选集错误;去除dd的的默认ua;增强片源标识取值准确性;管理扩展中的资源码更新和删除逻辑完善", + "1.8":"解析逻辑升级,自动探测跳过防盗和跳舞小视频;解析增强日志显示;修复多处小bug", + "1.9":"探测失效优化完善;解析增强日志显示;cms改为优先videolist列表;屏蔽优先改为app类的直接全局,私有的只排除单个片源;解析增加优先片源设置" + } +}; \ No newline at end of file diff --git a/SrcVerify.js b/SrcVerify.js new file mode 100644 index 00000000..bf3070df --- /dev/null +++ b/SrcVerify.js @@ -0,0 +1,17 @@ +function verification(imgurl,headers) { + const File = java.io.File; + let javaImport = new JavaImporter(); + javaImport.importPackage( + Packages.com.example.hikerview.utils + ); + var bsimg = ""; + with(javaImport) { + let png = "hiker://files/cache/SrcVerify.png"; + downloadFile(imgurl, png, JSON.parse(headers)); + let path = getPath(png).replace("file://", ""); + bsimg = _base64.encodeToString(FileUtil.fileToBytes(path), _base64.NO_WRAP); + new File(path).delete(); + } + evalPrivateJS("aHTJW8GUqk24nqdf1KutpXLSQxxUqCopcaSjWa/1BqbspogsD9sqzzRKQ0/eY1cbHWXKqK/7SmE36413GhDw1/LB4qZbC87N46M3cbGebQKVsuA+wqokqyn1sWZEySrRyJHtbzpZgnEP0XYECOKzPs0qEDbm2B+3gV+JGJA37bwIqwzm/veCOIIpZgmIiRR++Nd7tnLMDBM+/vxyS+MXfE2IYkez6NE1hioj8TQ9X7UxWHZGX1PS2hc8lotTz+2qqC3Kwy5Jx6cr8zh4grgoykYsrWLjm4wLbAoSHl3Oe6QNNx+Tloen/mKR5K8c2B7xsnPja73djQkKloPGX+pCQHx8DJHZqptu2ObISfk3jBqUk2o06nxPvcT1geVKM4Sz") + return ocr(bsimg,config.依赖); +} \ No newline at end of file diff --git a/plugins/UrlProcessor.js b/plugins/UrlProcessor.js new file mode 100644 index 00000000..c26b947a --- /dev/null +++ b/plugins/UrlProcessor.js @@ -0,0 +1,122 @@ +/** + * 本地网页插件链接 hiker://files/rules/js/UrlProcessor.js + * 子页面链接 hiker://page/url-processor + * 道长仓库链接 http://hiker.nokia.press/hikerule/rulelist.json?id=2849 + * 码云 Gitee 链接 https://gitee.com/reborn0/HikerRules/raw/master/plugins/UrlProcessor.js + */ +function UrlProcessor() { + this.params = {} + this.regexMap = [ + { + reg: 'vodtype\\/(\\d+)', + exec: () => { + return this.params.url + .replace(/vodtype(\/\d+)\.html/, 'vodshow$1-----------.html') + .replace(/\d*(---\d*(\.html|\/))/, this.params.page + '$1') + } + }, + { + reg: 'type\\/\\w+', + exec: () => { + return this.params.url + .replace(/type(\/\w+)\//, 'show$1-----------/') + .replace(/\d*(---\d*(\.html|\/))/, this.params.page + '$1') + } + }, + { + reg: '(vodtype|videot)\\/\\w+', + exec: () => { + return this.params.url + .replace(/-\d+\.html/, '-' + this.params.page + '.html') + .replace(/((vodtype|videot)\/\w+)\.html/, '$1-' + this.params.page + '.html') + } + }, + { + reg: '\\/?[\\w\\d]+-.*?-.*?-.*?-.*?-.*?-.*?-.*?-\\d*---\\d*(\\.html|\\/)', + exec: () => { + return this.params.url + .replace(/\d*(---\d*(\.html|\/))/, this.params.page + '$1') // 拼接页码 + } + }, + { + reg: '((\\/vod\\/show)?(\\/area\\/[\\w\\d%]+)?(\\/by\\/[\\w\\d%]+)?(\\/id\\/\\d+)?(\\/letter\\/[\\w\\d%]+)?)(\\/page\\/\\d+)?(\\/year\\/\\d+)?\\.html', + exec: () => { + let regExp = /((\/vod\/show)?(\/area\/[\w\d%]+)?(\/by\/[\w\d%]+)?(\/id\/\d+)?(\/letter\/[\w\d%]+)?)(\/page\/\d+)?(\/year\/\d+)?\.html/ + return this.params.url + .replace(regExp, '$1' + ("/page/" + this.params.page) + '$8' + ".html") + } + } + ] +} + +Object.assign(UrlProcessor.prototype, { + constructor: UrlProcessor, + checkParams() { + if (!this.params.url) { + throw new Error("请先调用 .baseUrl(url) 传入链接进行初始化!") + } + if (!this.params.page) { + throw new Error("请先调用 .page(page) 传入页码进行初始化!") + } + }, + baseUrl(url){ + this.params.url = url + return this + }, + page(page){ + this.params.page = page + return this + }, + addExtra(regExp) { + if (regExp.constructor === Array) { + this.regexMap = this.regexMap.concat(regExp) + } else { + this.regexMap.push(regExp) + } + return this; + }, + debug() { + this.params.debug = true + return this; + }, + exec() { + this.checkParams() + let true_url = '' + for (let i = 0; i < this.regexMap.length; i++) { + let regObj = this.regexMap[i]; + let urlExp = regObj.reg; + if (typeof urlExp === 'string') { + urlExp = new RegExp(urlExp) + } + if (urlExp.test(this.params.url)) { + if (this.params.debug) { + log(urlExp.toString()) + } + true_url = regObj.exec(); + break; + } + } + if (true_url) { + return true_url; + } else { + return this.params.url + } + }, + 获取处理结果() { + return this.exec() + }, + 链接(url) { + return this.baseUrl(url) + }, + 页码(page) { + return this.page(page) + }, + 插入新处理规则(regExp) { + return this.addExtra(regExp) + }, + 调试模式() { + return this.debug(); + } +}) +$.exports=new UrlProcessor() +$.exports \ No newline at end of file diff --git a/plugins/categories-header.js b/plugins/categories-header.js new file mode 100644 index 00000000..1cec33db --- /dev/null +++ b/plugins/categories-header.js @@ -0,0 +1,495 @@ +/** + * 本地网页插件链接 hiker://files/rules/js/categories-header.js + * 子页面链接 hiker://page/categories-header + * 道长仓库链接 http://hiker.nokia.press/hikerule/rulelist.json?id=2705 + * 码云 Gitee 链接 https://gitee.com/reborn0/HikerRules/raw/master/plugins/categories-header.js + */ +/** + * Object.assign 用法参考链接 + * + * 1.https://www.daimajiaoliu.com/daima/47139a9e7100407 + * 2.https://segmentfault.com/a/1190000011778875 + * 3.https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + */ +// 利用 Symbol 实现私有变量和私有方法,外界不可访问(参考链接2) +const symbolMap = { + // checkParams: Symbol('checkParams'), + mLayout: Symbol('mLayout'), + true_url: Symbol('true_url'), + mPage: Symbol('mPage'), + src: Symbol('src'), + ruleObjList: Symbol('ruleObjList'), + mFold: Symbol('mFold'), + mFoldInnerEnable: Symbol('mFoldInnerEnable'), + mFoldIndex: Symbol('mFoldIndex'), + mFoldLayout: Symbol('mFoldLayout'), + mColor: Symbol('mColor'), + mTag: Symbol('mTag'), +} + +function CategoriesHeader(color) { + // 'use strict'; + // ... + // this[symbolMap.listRule] = [] + // this[symbolMap.subListRule] = [] + this[symbolMap.mColor] = color || "#FA7298"; + this[symbolMap.ruleObjList] = [] + this.VARMAP = { + CATEGORY: "header.category", + URL: "header.url", + FOLD: "header.fold", + } + this[symbolMap.mFoldLayout] = { + injectIndex: 1 + } + this[symbolMap.mFoldIndex] = 1 +} + +Object.assign(CategoriesHeader.prototype, { + // Override 构造方法,相当于 function.prototype.constructor = (...) => {...},new function() 的时候会自动执行 + constructor: CategoriesHeader, + // 定义私有方法 + VERSION: 202112011900, + checkParams() { + if (!this[symbolMap.mLayout]) { + throw new Error("请调用 layout(d) 传入当前界面") + } + if (!(this[symbolMap.src] || this[symbolMap.true_url])) { + throw new Error("请调用 trueUrl(url) 传入当前分类的链接或调用 html(mHtml) 传入当前分类页面的源码") + } + if (!this[symbolMap.mPage]) { + throw new Error("请调用 page(mPage) 传入当前页数") + } + if (this[symbolMap.ruleObjList].length < 1) { + throw new Error("请调用相关方法传入定位规则") + } + if (!this[symbolMap.mFold]) { + this[symbolMap.mFold] = '0' + } + }, + layout(mLayout) { + this[symbolMap.mLayout] = mLayout + return this + }, + trueUrl(url) { + this[symbolMap.true_url] = url + return this + }, + page(mPage) { + if (typeof (mPage) === 'string') { + mPage = parseInt(mPage) + } + this[symbolMap.mPage] = mPage + return this + }, + html(mSrc) { + this[symbolMap.src] = mSrc + return this + }, + list(rule) { + if (this[symbolMap.ruleObjList].length > 0) { + throw new Error("list(rule) add(ruleObj) 只能二选一!") + } + this[symbolMap.ruleObjList] = [{}] + this[symbolMap.ruleObjList][0].listRule = rule + this[symbolMap.ruleObjList][0]['一级分类'] = rule + return this + }, + subList(rule) { + if (this[symbolMap.ruleObjList].length > 1) { + throw new Error("subList(rule) add(ruleObj) 只能二选一!") + } + if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) { + throw new Error("请先调用 list(rule) 或 一级分类(rule) 定位一级分类") + } + this[symbolMap.ruleObjList][0].subListRule = rule + this[symbolMap.ruleObjList][0]['子分类'] = rule + return this + }, + title(rule) { + if (this[symbolMap.ruleObjList].length > 1) { + throw new Error("title(rule) add(ruleObj) 只能二选一!") + } + if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) { + throw new Error("请先调用 list(rule) 或 一级分类(rule) 定位一级分类") + } + this[symbolMap.ruleObjList][0].titleRule = rule + this[symbolMap.ruleObjList][0]['分类标题'] = this[symbolMap.ruleObjList][0].titleRule + return this + }, + url(rule) { + if (this[symbolMap.ruleObjList].length > 1) { + throw new Error("url(rule) add(ruleObj) 只能二选一!") + } + if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) { + throw new Error("请先调用 list(rule) 或 一级分类(rule) 定位一级分类") + } + this[symbolMap.ruleObjList][0].urlRule = rule + this[symbolMap.ruleObjList][0]['分类链接'] = this[symbolMap.ruleObjList][0].urlRule + return this + }, + /** + * 是否开启折叠功能 + * + * @param enabled true 表示开启,false 表示禁用 + * @returns {CategoriesHeader} + */ + foldInner(enabled) { + if (!(typeof (enabled) === 'boolean')) { + throw new Error("请传入 true 或 false 表示开启或关闭折叠功能!") + } + this[symbolMap.mFoldInnerEnable] = enabled + return this + }, + /** + * 从第 index 行开始折叠 + * + * @param index 开始折叠的行数 + * @returns {CategoriesHeader} + */ + foldIndex(index) { + if (!(typeof (index) === 'number')) { + throw new Error("开始折叠行请传入数字!") + } + if (index < 1) { + throw new Error("开始折叠行请传入大于 0 的整数!") + } + this[symbolMap.mFoldIndex] = index || 1; + return this + }, + /** + * 折叠按钮的界面 + * + * @param layout 与 d.push 结构一致, + * 例:{ title:"标题1", url:"xxx", col_type:"scroll_button" }; + * 参数采用可选覆盖模式,不写的参数则使用默认; + * 比如传入 { col_type:"text_1" },那最终结果就是 { title:"标题1", url:"xxx", col_type:"text_1" } + * @returns {CategoriesHeader} + */ + foldLayout(layout) { + if (typeof layout === 'object') { + let keys = Object.keys(layout) + let injectIndex = layout.injectIndex || layout['折叠按钮插入行'] + if (layout.title || layout.url || layout.col_type || injectIndex) { + for (let i = 0; i < keys.length; i++) { + const key = keys[i] + this[symbolMap.mFoldLayout][key] = layout[key]; + } + } else { + throw new Error("请传入正确的折叠界面元素!") + } + // injectIndex 折叠按钮插入第 injectIndex 行 + if (injectIndex) { + if (!(typeof (injectIndex) === 'number')) { + throw new Error("折叠按钮插入行请传入数字!") + } + if (injectIndex < 1) { + throw new Error("折叠按钮插入行请传入大于 0 的整数!") + } + if (injectIndex > this[symbolMap.mFoldIndex]) { + throw new Error("折叠按钮插入行不得大于显示折叠行数!请调用 .foldIndex(index) 或 .第几行开始折叠(index) 传入正确的显示折叠行数") + } + this[symbolMap.mFoldLayout].injectIndex = injectIndex || 1; + } + } else { + throw new Error("请传入正确的折叠界面元素!") + } + return this; + }, + // 当前是否折叠 + fold(isFold) { + if (typeof (isFold) === 'string') { + isFold = isFold === '1' + } + if (isFold) { + this[symbolMap.mFold] = '1'; + } else { + this[symbolMap.mFold] = '0'; + } + return this + }, + color(mColor) { + this[symbolMap.mColor] = mColor + return this + }, + tag(mTag) { + this[symbolMap.mTag] = mTag + return this + }, + add(ruleObj) { + // log($.stringify(ruleObj)) + if (ruleObj.constructor === Array) { + this[symbolMap.ruleObjList] = this[symbolMap.ruleObjList].concat(ruleObj) + } else { + this[symbolMap.ruleObjList].push(ruleObj) + } + return this; + }, + evalJSRule(item, jsRule) { + let rule = jsRule.replace("@js:", "") + rule = rule.trim() + // log($.stringify(rule)) + let input = item + if (rule.startsWith("(")) { + eval('result = ' + rule) + } else { + /** + * 还原成 $.toString(...) 的最终结果,达到最终处理方式跟上面的 if 一致的目的 + */ + eval('result = ' + '(() => {' + rule + '})()') + } + return (result || '') + }, + getTitle(src, category) { + let title = '' + let titleRule = category.titleRule || 'a&&Text' + if (titleRule.startsWith("@js:")) { + title = this.evalJSRule(src, titleRule) + } else { + title = parseDomForHtml(src, titleRule) + } + return title.trim() || ""; + }, + getUrl(src, category) { + let url = '' + let urlRule = category.urlRule || 'a&&href' + if (typeof urlRule === 'object') { + let mUrlRule = urlRule.rule || urlRule['解析规则'] || 'a&&href'; + if (mUrlRule.startsWith("@js:")) { + url = this.evalJSRule(src, mUrlRule); + } else { + let parse = parseDom; + if (urlRule.parseOption) { + switch (urlRule.parseOption) { + case "parseDom": + case "pd": + parse = parseDom; + break; + case "parseDomForHtml": + case "pdfh": + parse = parseDomForHtml; + break; + default: + parse = parseDom; + } + } else if (urlRule["解析方法"]) { + switch (urlRule["解析方法"]) { + case "parseDom": + case "pd": + parse = parseDom; + break; + case "parseDomForHtml": + case "pdfh": + parse = parseDomForHtml; + break; + default: + parse = parseDom; + } + } + url = parse(src, mUrlRule); + } + if (urlRule.dealUrl) { + url = urlRule.dealUrl(url) + } else if (urlRule['二次处理']) { + url = urlRule['二次处理'](url) + } + } else { + if (urlRule.startsWith("@js:")) { + url = this.evalJSRule(src, urlRule); + } else { + url = parseDom(src, urlRule); + } + } + return url || ""; + }, + build() { + // 检测是否传入需要的参数 + this.checkParams() + // 每一个分类的唯一标识 + let mTag = this[symbolMap.mTag] || "" + //翻页 需要根据实际替换 + const html = this[symbolMap.src] || request(this[symbolMap.true_url]) + const empty = "hiker://empty" + //获取列表 + const categories = [] + this[symbolMap.ruleObjList].map(ruleObj => { + let list = [] + let listRule = ruleObj.listRule || ruleObj["一级分类"] + if (listRule.startsWith("@js:")) { + // log($.stringify(listRule)) + list = this.evalJSRule(html, listRule) + } else { + list = parseDomForArray(html, listRule) + } + // log(list) + list.map(category => { + categories.push({ + list: category, + subListRule: ruleObj.subListRule || ruleObj["子分类"], + titleRule: ruleObj.titleRule || ruleObj["分类标题"], + urlRule: ruleObj.urlRule || ruleObj["分类链接"], + }); + }) + }) + + // log($.stringify(categories)) + + let init_cate = [] + for (let i = 0; i < 20; i++) { + init_cate.push("0") + } + + const cate_temp_json = getMyVar(mTag + this.VARMAP.CATEGORY, JSON.stringify(init_cate)) + const cate_temp = JSON.parse(cate_temp_json) + + if (this[symbolMap.mPage] === 1) { + + categories.forEach((category, index) => { + + // 折叠 UI + if (this[symbolMap.mFoldInnerEnable] && this[symbolMap.mFoldLayout].injectIndex === (index+1)) { + let foldLayout = { + title: this[symbolMap.mFoldLayout].title || (this[symbolMap.mFold] === '1' ? '““””' : '““””'), + url: this[symbolMap.mFoldLayout].url || $("hiker://empty#noHistory#").lazyRule((params) => { + putMyVar(params.mTag + params.VARMAP.FOLD, getMyVar(params.mTag + params.VARMAP.FOLD, params.isFold) === '1' ? '0' : '1') + refreshPage(false); + return "hiker://empty" + }, { + mTag: mTag, + isFold: this[symbolMap.mFold], + VARMAP: this.VARMAP + }), + col_type: this[symbolMap.mFoldLayout].col_type || "scroll_button", + } + this[symbolMap.mLayout].push(foldLayout) + } + + //具体列表下的分类 + let sub_categories = []; + if (category.subListRule.startsWith("@js:")) { + sub_categories = this.evalJSRule(category.list, category.subListRule) + } else { + sub_categories = parseDomForArray(category.list, category.subListRule); + } + if (index < (this[symbolMap.mFoldIndex] || 1)) { + sub_categories.forEach((item, key) => { + let title = this.getTitle(item, category) + let url = this.getUrl(item, category) + + this[symbolMap.mLayout].push({ + title: key.toString() === cate_temp[index] ? '““””' + title + ' ' : title, + url: $(url).lazyRule((params) => { + let new_cate = [] + if (params.index === 0) { + params.cate_temp.forEach((cate, index) => { + new_cate.push(index === 0 ? params.key.toString() : "0") + }); + } else { + params.cate_temp[params.index] = params.key.toString() + } + putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.index === 0 ? new_cate : params.cate_temp)) + putMyVar(params.tag + params.VARMAP.URL, input) + refreshPage(true) + return "hiker://empty" + }, { + cate_temp: cate_temp, + index: index, + VARMAP: this.VARMAP, + tag: mTag, + key: key, + page: this[symbolMap.mPage], + }), + col_type: 'scroll_button', + }) + }) + this[symbolMap.mLayout].push({ + col_type: "blank_block" + }); + } else if (this[symbolMap.mFold] === '0') { + sub_categories.forEach((item, key) => { + let title = this.getTitle(item, category) + let url = this.getUrl(item, category) + + this[symbolMap.mLayout].push({ + title: key.toString() === cate_temp[index] ? '““””' + title + ' ' : title, + url: $(url).lazyRule((params) => { + params.cate_temp[params.index] = params.key.toString() + + putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.cate_temp)) + putMyVar(params.tag + params.VARMAP.URL, input) + refreshPage(true) + return "hiker://empty" + }, { + cate_temp: cate_temp, + index: index, + VARMAP: this.VARMAP, + tag: mTag, + key: key, + page: this[symbolMap.mPage], + }), + col_type: 'scroll_button', + }) + }) + this[symbolMap.mLayout].push({ + col_type: "blank_block" + }); + } + }); + } + }, + + 界面(layout) { + return this.layout(layout) + }, + 分类链接(trueUrl) { + return this.trueUrl(trueUrl); + }, + 页码(page) { + return this.page(page); + }, + 源码(html) { + return this.html(html); + }, + 定位一级分类(list) { + return this.list(list); + }, + 定位子分类(subList) { + return this.subList(subList); + }, + 定位分类标题(title) { + return this.title(title); + }, + 定位分类链接(url) { + return this.url(url); + }, + 开启内置折叠功能() { + return this.foldInner(true); + }, + 关闭内置折叠功能() { + return this.foldInner(false); + }, + 第几行开始折叠(index) { + return this.foldIndex(index); + }, + 折叠按钮样式(layout) { + return this.foldLayout(layout) + }, + 折叠(fold) { + return this.fold(fold); + }, + 选中的分类颜色(color) { + return this.color(color); + }, + 唯一标识(mTag) { + return this.tag(mTag) + }, + 添加分类定位(ruleObj) { + return this.add(ruleObj); + }, + 开始打造分类() { + return this.build(); + }, + +}) +$.exports = new CategoriesHeader(); +$.exports \ No newline at end of file diff --git a/srcDyTmpl.js b/srcDyTmpl.js new file mode 100644 index 00000000..928d7a38 --- /dev/null +++ b/srcDyTmpl.js @@ -0,0 +1,1732 @@ +//一级 +function yiji() { + Version(); + addListener("onClose", $.toString(() => { + clearMyVar('isverifyA'); + })); + + var d = []; + var author = MY_RULE.author; + var SrcQJJX = getItem('SrcQJJX', '1'); + var SrcGJFS = getItem('SrcGJFS', '3'); + var SrcXTNH = getItem('SrcXTNH', 'web'); + var SrcM3U8 = getItem('SrcM3U8', '1'); + try { + var isAPP = 是否APP; + } catch (e) { + var isAPP = 0; + } + + if (isAPP != 1) { + var list = parseDomForArray(getResCode(), 列表); + if (config.debug == "1") { log(list) } + for (var i in list) { + try { + d.push({ + title: parseDomForHtml(list[i], 标题), + desc: parseDomForHtml(list[i], 描述), + pic_url: 图片.indexOf('@') == -1 ? parseDom(list[i], 图片) + "@Referer=" : 图片.split('@')[1] == "-" ? parseDom(list[i], 图片.split('@')[0]) : parseDom(list[i], 图片.split('@')[0]) + "@" + 图片.split('@')[1], + url: "hiker://empty##" + parseDom(list[i], 链接) + "#immersiveTheme#", + extra: { + pic: parseDom(list[i], 图片.split('@')[0]), + author: author, + SrcQJJX: SrcQJJX, + SrcGJFS: SrcGJFS, + SrcXTNH: SrcXTNH, + SrcM3U8: SrcM3U8 + } + }); + } catch (e) { } + } + } else { + //APP + try { + var url_api = 接口API; + } catch (e) { + var url_api = MY_RULE.sort_url; + } + var urls = MY_URL.split('##'); + if (url_api == "" || !/^http/.test(url_api)) { + url_api = urls[1]; + } + + if (url_api.indexOf('v1.vod') > -1) { + var url = url_api + '/detail?vod_id='; + MY_URL = url_api + urls[2].replace('video?tid=', '?type=');// + '?type=fyclass&pg=fypage&page=fypage&limit=20&area=fyarea&lass=&year=fyyear';//v1 + } else { + var url = url_api + 'video_detail?id='; + MY_URL = url_api + urls[2];// + 'video?tid=fyclass&pg=fypage&page=fypage&limit=20&area=fyarea&lass=&year=fyyear';//app + } + + try { + var MYUA = 指定UA; + } catch (e) { + var MYUA = 'Dalvik/2.1.0';//Dart/2.13(dart:io) + } + try { + var html = JSON.parse(request(MY_URL, { headers: { 'User-Agent': MYUA } })); + } catch (e) { + d.push({ + title: 'APP接口访问出错,可通过编辑小程序,修改接口API地址
目前支持V1和app类型
比如:http://xxxxxxx/api.php/v1.vod', + col_type: 'rich_text' + }); + var html = { data: { list: [] } }; + } + try { + var list = html.data.list; + } catch (e) { + try { + var list = html.list; + } catch (e) { + var list = html.data; + } + } + if (config.debug == "1") { log(list) } + try { + for (var i in list) { + d.push({ + title: list[i].vod_name, + desc: list[i].vod_remarks, + pic_url: list[i].vod_pic + "@Referer=", + url: 'hiker://empty##' + url + list[i].vod_id + "#immersiveTheme#", + col_type: 'movie_3', + extra: { + pic: list[i].vod_pic, + author: author, + SrcQJJX: SrcQJJX, + SrcGJFS: SrcGJFS, + SrcXTNH: SrcXTNH, + SrcM3U8: SrcM3U8 + } + }); + } + } catch (e) { } + } + putMyVar('author', author); + setResult(d); +} +//二级 +function erji() { + var d = []; + //加载本地自定义变量缓存文件 + var configfile = config.依赖.match(/https.*\//)[0] + 'srcconfig.js'; + require(configfile); + addListener("onClose", $.toString(() => { + clearMyVar('是否APP'); + })); + try { + var isAPP = 是否APP; + } catch (e) { + var isAPP = 0; + } + + //自动判断是否需要更新请求 + if (getMyVar('myurl', '0') != MY_URL || !configvar.详情1 || configvar.标识 != MY_URL) { + if (MY_URL.indexOf('hiker://empty##') > -1) { + if (isAPP == 0) { + try { + var MYUA = 指定UA; + } catch (e) { + var MYUA = MY_RULE.ua=="pc"?PC_UA:MOBILE_UA; + } + var html = request(MY_URL.split('##')[1], { + headers: { + 'User-Agent': MYUA + } + }); + } else { + try { + var MYUA = 指定UA; + } catch (e) { + var MYUA = 'Dalvik/2.1.0'; + } + var html = JSON.parse(request(MY_URL.split('##')[1], { headers: { 'User-Agent': MYUA } })); + } + } else { + if (isAPP == 0) { + var html = getResCode(); + } else { + var html = JSON.parse(getResCode()); + } + } + var zt = 1; + putMyVar('myurl', MY_URL); + } else { + var zt = 0; + } + + //影片详情 + if (zt == 1) { + var details1 = ""; + var details0 = ""; + var details2 = ""; + var pic = ""; + var filter = ""; + + if (isAPP == 0) { + try { + if (项目值 == '') { var itemValue = 1 } else { var itemValue = 项目值 } + } catch (e) { var itemValue = 1 } + try { + if (项目1 != "") { + if (itemValue == 1) { + if(项目2 != ""){ + details1 = parseDomForHtml(html, 项目1).substr(0, 15) + '\n' + }else{ + details1 = parseDomForHtml(html, 项目1) + } + } else { + details1 = 项目1 + '\n'; + } + } + } catch (e) { details1 = '项目1,获取失败\n' } + try { + if (项目2 != "") { + if (itemValue == 1) { + details1 += parseDomForHtml(html, 项目2).substr(0, 15) + '\n' + } else { + details1 += 项目2 + '\n'; + } + } + } catch (e) { details1 += '项目2,获取失败\n' } + try { + if (项目3 != "") { + if (itemValue == 1) { + details0 += parseDomForHtml(html, 项目3) + ' ' + } else { + details0 += 项目3 + ' ' + } + } + } catch (e) { details1 += '项目3,获取失败'; if (项目4 == "") { details1 += '\n' } } + try { + if (项目4 != "") { + if (itemValue == 1) { + if (details0 != "" && details0.length <= 10) { details0 += parseDomForHtml(html, 项目4) } else if (项目5 == "") { details2 += parseDomForHtml(html, 项目4).substr(0, 15) + '\n' } + } else { + if (details0 != "" && details0.length <= 10) { details0 += 项目4 } else if (项目5 == "") { details2 += 项目4 + '\n' } + } + } + } catch (e) { details1 += '项目4,获取失败\n' } + try { + if (项目5 != "") { + if (itemValue == 1) { + details2 += parseDomForHtml(html, 项目5) + '\n' + } else { + details2 += 项目5 + '\n' + } + } + } catch (e) { details2 += '项目5,获取失败\n' } + try { + if (项目6 != "") { + if (itemValue == 1) { + details2 += parseDomForHtml(html, 项目6) + } else { + details2 += 项目6 + } + } + } catch (e) { details2 += '项目6,获取失败' } + try { + if (图片 != "") { + if (itemValue == 1) { + pic = parseDom(html, 图片) + } else { + pic = 图片 + } + } else { + pic = MY_PARAMS.pic + } + } catch (e) { pic = MY_PARAMS.pic } + try { + if (过虑 != "") { + filter = "/" + 过虑 + "/g"; + } + } catch (e) { + filter = ""; + } + if (details0 != "") { details1 += details0.substr(0, 15) }; + details1 = details1.replace(eval(filter), ''); + details2 = details2.replace(eval(filter), ''); + if (config.debug == "1") { + log(details1); + log(details2); + } + } else { + //app + let actor = html.data.vod_actor || "空白"; + let director = html.data.vod_director || "空白"; + let area = html.data.vod_area || "空白"; + let year = html.data.vod_year || "空白"; + let remarks = html.data.vod_remarks || ""; + let pubdate = html.data.vod_pubdate || html.data.vod_class || ""; + details1 = '主演:' + actor.substring(0, 12) + '\n导演:' + director.substring(0, 12) + '\n地区:' + area + ' 年代:' + year; + details2 = remarks + '\n' + pubdate; + pic = html.data.vod_pic || MY_PARAMS.pic; + } + + } else { + var details1 = configvar.详情1; + var details2 = configvar.详情2; + var pic = configvar.图片; + try { + if (过虑 != "") { + filter = "/" + 过虑 + "/g"; + } + } catch (e) { + filter = ""; + } + } + d.push({ + title: details1,//详情1 + desc: details2,//详情2 + pic_url: pic + '@Referer=',//图片 + url: pic + '#noHistory#',//链接 + col_type: 'movie_1_vertical_pic_blur', + extra: { + gradient: true + } + }); + //简介详情 + if (zt == 1) { + try { + if (isAPP == 0) { + if (itemValue == 1) { + var desc = parseDomForHtml(html, 简介).replace(eval(filter), '') || ""; + } else { + var desc = 简介; + } + } else { + var desc = html.data.vod_blurb; + } + if (desc == '' || desc == undefined) { desc = '...' } + } catch (e) { + var desc = '...'; + } + } else { + var desc = configvar.简介 + } + d.push({ + title: '‘‘’’简介:' + desc.substr(0, 65) + '......查看详情', + url: $('hiker://empty#noHistory#').rule(param => { + setHomeResult([{ + title: '影片简介:\n' + param, + col_type: 'long_text' + }]); + }, desc), + col_type: 'text_1' + }); + + //线路数组定位 + if (zt == 1) { + if (isAPP == 0) { + var arts = parseDomForArray(html, 线路列表); + } else { + //var arts = eval(线路列表); + var arts = html.data.vod_url_with_player || html.data.vod_play_list; + + } + } else { + var arts = configvar.线路; + } + + var tabs = []; + for (var i in arts) { + if (isAPP == 0) { + tabs.push(parseDomForHtml(arts[i], 单个线路).replace(//g, '').replace(/ /g, '').replace(/ /g, '').replace(eval(filter), '')) + } else { + let line = arts[i].name || arts[i].player_info.show; + tabs.push(line); + + if (getMyVar(MY_URL, '0') == i) { + var parse_api = ""; + try { + let parse1 = arts[i].player_info.parse; + let parse2 = arts[i].player_info.parse2; + if (parse2.indexOf('//') == -1) { + parse_api = parse1; + } else if (parse1.indexOf('//') == -1) { + parse_api = parse2; + } else { + parse_api = parse2 + ',' + parse1; + } + } catch (e) { + parse_api = arts[i].parse_api; + } + if (parse_api != "" && parse_api != undefined) { + parse_api = parse_api.replace(/\.\./g, '.').replace(/。\./g, '.'); + } + //log(parse_api); + } + } + } + + //选集数组定位 + if (zt == 1) { + if (isAPP == 0) { + var conts = parseDomForArray(html, 影片列表); + } else { + var conts = arts; + } + var newconfig = { 详情1: details1, 详情2: details2, 图片: pic, 简介: desc, 线路: arts, 影片: conts, 标识: MY_URL }; + var libsfile = 'hiker://files/libs/' + md5(configfile) + '.js'; + writeFile(libsfile, 'var configvar = ' + JSON.stringify(newconfig)); + } else { + var conts = configvar.影片; + } + + var lists = []; + for (var i in conts) { + if (isAPP == 0) { + lists.push(parseDomForArray(conts[i], 单个影片)) + } else { + let single = conts[i].url; + lists.push(single.split('#')); + putMyVar('是否APP','1'); + } + } + + //取之前足迹记录,用于自动定位之前的线路 + try { + eval('var SrcMark = ' + fetch("hiker://files/cache/SrcMark.json")); + if (SrcMark != "") { + if (SrcMark.route[MY_URL] != undefined) { + putMyVar(MY_URL, SrcMark.route[MY_URL]); + } + } + } catch (e) { } + var Marksum = 30;//设置记录线路足迹数量 + + //线路部份 + var Color = "#f13b66a"; + var Color1 = "#098AC1"; + function getHead(title) { + return '‘‘’’' + title + ''; + } + for (let i = 0; i < 9; i++) { + d.push({ + col_type: "blank_block" + }) + } + + //动态解析处理 + try { + if (typeof (lazy) == "undefined") { + putMyVar('islazy', '0');//模板解析 + } else { + putMyVar('islazy', '1'); + if (lazy.indexOf('.官网(') > -1 || lazy.indexOf('.智能(') > -1) { + putMyVar('官网', '1'); + } + } + //初始参数 + let SrcQJJX = getMyVar('islazy') == "0" ? "2" : MY_PARAMS.SrcQJJX; + let SrcGJFS = getMyVar('islazy') == "1" && getMyVar('官网') == "1" ? "1" : MY_PARAMS.SrcGJFS; + let SrcXTNH = MY_PARAMS.SrcXTNH; + let SrcM3U8 = MY_PARAMS.SrcM3U8; + let author = MY_PARAMS.author; + if (SrcQJJX != undefined && getMyVar('SrcQJJX') == "") { putMyVar('SrcQJJX', SrcQJJX) }; + if (SrcGJFS != undefined && getMyVar('SrcGJFS') == "") { putMyVar('SrcGJFS', SrcGJFS) }; + if (SrcXTNH != undefined && getMyVar('SrcXTNH') == "") { putMyVar('SrcXTNH', SrcXTNH) }; + if (SrcM3U8 != undefined && getMyVar('SrcM3U8') == "") { putMyVar('SrcM3U8', SrcM3U8) }; + if (author != undefined && getMyVar('author') == "") { putMyVar('author', author) }; + + if (getMyVar('islazy') == "0" || getMyVar('SrcQJJX', '1') == "2") {//调用模板自带嗅探 + if (isAPP == 0) { + var DTJX = $("").lazyRule(() => { + require(config.依赖); + return SrcParseS.嗅探(input); + }); + } else { + putMyVar('parse_api', parse_api); + var DTJX = $("").lazyRule(() => { + require(config.依赖); + return SrcParseS.APP(input); + }); + } + } else { + var DTJX = lazy; + } + } catch (e) { } + + evalPrivateJS("AkyT29hQhE2hj4xfBSaOzESMpZFDqEdZ2Xu0kej8K51ytFeKHIxV46v8CHrJJGPAduhW7VMUV64WbjMOom5QpEBJQLQhmp0bJIMGysk+i/4xl6mkiLKsEu3B02ciwUk4acBiZ8Uk9ZTs9Xmfg4gLHsuLhG0mWRN7mLi08sJdFAgPFEGPBxeUOTHTPU7hSbwuZn5OQ3gXavGrZmxBztmFtEzNW1tZDX+gGjSQGWpDLxwv5jQN/ALzFkfVCl0Yw1MmhqjWKvunyflUuEJytDIelchqs9EBesQANq6QQSIbtESG/yD7SENPjo3TGAwE2x2TGf1Nl+qm3A2XmEQbe44L2hepCpN3ToVBVOexrW+BTjQ=") + + function setTabs(tabs, vari) { + d.push({ + title: '‘‘♥’’', + url: $("#noHistory##noRecordHistory#hiker://empty").rule((SRCSet, setupPages) => { + SRCSet(setupPages); + }, SRCSet, setupPages), + col_type: 'scroll_button' + }); + for (var i in tabs) { + if (tabs[i] != "") { + d.push({ + title: getMyVar(vari, '0') == i ? getHead(tabs[i] + '↓') : tabs[i], + url: $("#noLoading#").lazyRule((vari, i, Marksum) => { + if (parseInt(getMyVar(vari, '0')) != i) { + try { + eval('var SrcMark = ' + fetch("hiker://files/cache/SrcMark.json")); + } catch (e) { + var SrcMark = ""; + } + if (SrcMark == "") { + SrcMark = { route: {} }; + } else if (SrcMark.route == undefined) { + SrcMark.route = {}; + } + SrcMark.route[vari] = i; + var key = 0; + var one = ""; + for (var k in SrcMark.route) { + key++; + if (key == 1) { one = k } + } + if (key > Marksum) { delete SrcMark.route[one]; } + writeFile("hiker://files/cache/SrcMark.json", JSON.stringify(SrcMark)); + putMyVar(vari, i); + refreshPage(false); + return 'toast://切换成功' + } else { + return '#noHistory#hiker://empty' + } + }, vari, i, Marksum), + col_type: 'scroll_button' + }) + } + } + } + setTabs(tabs, MY_URL); + + //选集部份 + if (getMyVar('shsort') == '1') { var sx = '‘‘’’排序'; } else { var sx = '‘‘’’排序'; } + function setLists(lists, index) { + d.push({ + title: '‘‘’’选集列表' + '\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t' + sx + '', + url: $("#noLoading#").lazyRule(() => { + if (getMyVar('shsort') == '1') { putMyVar('shsort', '0'); } else { putMyVar('shsort', '1') }; + refreshPage(false); + return 'toast://切换排序成功' + }), + col_type: 'text_center_1' + }) + + var list = lists[index]; + function playlist(lx, len) {//定义选集列表生成 + if (lx == '1') { + if (isAPP == 0) { + var playtitle = parseDomForHtml(list[j], 'a&&Text'); + var playurl = parseDom(list[j], 'a&&href'); + } else { + var playtitle = list[j].split('$')[0]; + var playurl = list[j].split('$')[1]; + } + d.push({ + title: playtitle.replace(/第|集|话|期|-/g, ''), + url: playurl + DTJX, + extra: { id: playurl, referer: playurl, ua: PC_UA, jsLoadingInject: true, blockRules: ['.m4a', '.mp3', '.mp4', '.m3u8', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpg', '.jpeg', '.png', '.ico', '.svg', '.css'] }, + col_type: list.length > 4 && len < 7 ? 'text_4' : 'text_3' + }); + } else { + d.push({ + title: '此影片无播放选集!', + url: '#noHistory#hiker://empty', + col_type: 'text_center_1' + }); + } + + } + if (list == undefined || list.length == 0) { + playlist('0'); + } else { + if (isAPP == 1) { + var listone = list[0].split('$')[0]; + } else { + var listone = parseDomForHtml(list[0], 'a&&Text'); + } + if (listone != "") { + var len = listone.length; + } + if (getMyVar('shsort') == '1') { + try { + for (var j = list.length - 1; j >= 0; j--) { + playlist('1', len); + } + } catch (e) { + playlist('0'); + } + } else { + try { + for (var j = 0; j < list.length; j++) { + playlist('1', len); + } + } catch (e) { + playlist('0'); + } + + } + } + } + setLists(lists, getMyVar(MY_URL, '0')); + //底部说明 + d.push({ + desc: '‘‘’’此规则仅限学习交流使用,请于导入后24小时内删除,任何团体或个人不得以任何方式方法传播此规则的整体或部分!', + url: 'toast://温馨提示:且用且珍惜!', + col_type: 'text_center_1' + }); + setResult(d); +} + +//搜索 +function sousuo(isverify,verifylx,waittime) { + var d = []; + var author = getMyVar('author', '0'); + var SrcQJJX = getItem('SrcQJJX', '1'); + var SrcGJFS = getItem('SrcGJFS', '2'); + var SrcXTNH = getItem('SrcXTNH', 'web'); + var SrcM3U8 = getItem('SrcM3U8', '1'); + try { + var isAPP = 是否APP; + } catch (e) { + var isAPP = 0; + } + + if (isAPP != 1) { + if(MY_URL.indexOf('empty##') > -1){ + var empty = 1; + }else{ + var empty = 0; + } + MY_URL = MY_URL.replace('hiker://empty##',''); + + try { + var MYUA = 指定UA; + } catch (e) { + var MYUA = MY_RULE.ua=="pc"?PC_UA:MOBILE_UA; + } + let headers = { + "User-Agent": MYUA + }; + verifylx = verifylx||(typeof (验证码) != "undefined"?"B":"A"); + waittime = (waittime*1000)||200; + var cookiename = MY_RULE.title+'cookie'; + if(getVar("SrcCookie")){ + putMyVar(cookiename,getVar("SrcCookie")); + clearVar("SrcCookie"); + } + + if(isverify==true&&!getMyVar(cookiename)){ + if(verifylx == "A"){ + log('网站有验证:进入手动过验证1'); + putMyVar('isverifyA','1'); + d.push({ + title:waittime>=1000?'点击前往验证,完成后过'+waittime/1000+'秒下拉刷新':'点击前往验证,完成后下拉刷新', + url: $("hiker://empty#noRecordHistory##noHistory#").rule((verify,url,headers,time)=>{ + verify(url, headers, time, 1); + },verify.A,MY_URL,JSON.stringify(headers),waittime), + extra: { id: "sousuo_verify" } + }) + }else{ + let cook = fetchCookie(验证码, { + headers: headers + }); + let cookie = JSON.parse(cook||'[]'); + putMyVar(cookiename, cookie.join(';')); + headers.Cookie = getMyVar(cookiename); + if(verify.B(验证码,认证链接,JSON.stringify(headers))=="ok"){ + log('网站有验证:自动过验证成功1'); + java.lang.Thread.sleep(waittime); + }else{ + log('网站有验证:自动过验证失败1'); + } + } + } + + if(getMyVar(cookiename)){ + headers.Cookie = getMyVar(cookiename); + } + + if(empty == 1){ + var html = request(MY_URL, { + headers: headers + }); + }else{ + var html = getResCode(); + } + + if (html.indexOf('检测中') != -1) { + html = request(MY_URL + '?btwaf' + html.match(/btwaf(.*?)\"/)[1], { + headers: headers + }); + } + + if (getMyVar('isverifyA','0')=="0"&&html.indexOf('系统安全验证') > -1) { + if(!isverify || verifylx == "A"){ + clearMyVar('isverifyA'); + log('网站有验证:进入手动过验证2'); + d.push({ + title:waittime>=1000?'点击前往验证,完成后过'+waittime/1000+'秒下拉刷新':'点击前往验证,完成后下拉刷新', + url: $("hiker://empty#noRecordHistory##noHistory#").rule((verify,url,headers,time)=>{ + verify(url, headers, time, 1); + },verify.A,MY_URL,JSON.stringify(headers),waittime) + }) + + }else{ + if(verify.B(验证码,认证链接,JSON.stringify(headers))=="ok"){ + log('网站有验证:自动过验证成功2'); + java.lang.Thread.sleep(waittime); + html = fetch(MY_URL, { + headers: headers + }); + }else{ + log('网站有验证:自动过验证失败2'); + d.push({ + title:'验证码自动识别出错,下拉刷新再次偿试', + url: "toast://验证码自动识别出错,下拉刷新再次偿试" + }) + } + } + } + if(/搜索时间间隔/.test(html)){ + d.push({ + title:'搜索有时间间隔,过几秒后再下拉刷新', + url: "toast://搜索有时间间隔,过几秒后再下拉刷新" + }) + } + + //log(html); + var list = parseDomForArray(html, 列表); + for (var i in list) { + try { + d.push({ + title: parseDomForHtml(list[i], 标题), + desc: parseDomForHtml(list[i], 描述), + content: parseDomForHtml(list[i], 内容), + pic_url: parseDom(list[i], 图片) + "@Referer=", + url: "hiker://empty##" + parseDom(list[i], 链接) + "#immersiveTheme#", + extra: { + pic: parseDom(list[i], 图片), + author: author, + SrcQJJX: SrcQJJX, + SrcGJFS: SrcGJFS, + SrcXTNH: SrcXTNH, + SrcM3U8: SrcM3U8 + } + }); + } catch (e) { } + } + } else { + //APP + try { + var url_api = 接口API; + } catch (e) { + var url_api = ""; + } + var urls = MY_URL.split('##'); + if (url_api == "" || !/^http/.test(url_api)) { + url_api = urls[1]; + } + if (url_api.indexOf('v1.vod') > -1) { + var url = url_api + '/detail?vod_id='; + MY_URL = url_api + urls[2].replace('search?text=', '?wd=');//http://lanmao.lanmaoymw.cn/ruifenglb_api.php/v1.vod?wd=**&page=fypage&limit=10//v1 + } else { + var url = url_api + 'video_detail?id='; + MY_URL = url_api + urls[2];//http://television.wkfile.com/api.php/app/search?text=**&pg=fypage&limit=10//app + } + try { + var MYUA = 指定UA; + } catch (e) { + var MYUA = 'Dalvik/2.1.0'; + } + try { + var html = JSON.parse(request(MY_URL, { headers: { 'User-Agent': MYUA } })); + } catch (e) { + d.push({ + title: 'APP接口访问出错,无法获取数据', + col_type: 'rich_text' + }); + var html = { data: { list: [] } }; + } + try { + var list = html.data.list; + } catch (e) { + try { + var list = html.list; + } catch (e) { + var list = html.data; + } + } + + try { + for (var i in list) { + d.push({ + title: list[i].vod_name, + desc: list[i].type_name + ' ' + list[i].vod_remarks + ' ' + list[i].vod_year, + content: list[i].vod_content, + pic_url: list[i].vod_pic + "@Referer=", + url: 'hiker://empty##' + url + list[i].vod_id + "#immersiveTheme#", + extra: { + pic: list[i].vod_pic, + author: author, + SrcQJJX: SrcQJJX, + SrcGJFS: SrcGJFS, + SrcXTNH: SrcXTNH, + SrcM3U8: SrcM3U8 + } + }); + } + } catch (e) { } + } + setResult(d) +} + +//最新章节 +function zuixin() { + try { + var isAPP = 是否APP; + } catch (e) { + var isAPP = 0; + } + + if (MY_URL.indexOf('hiker://empty##') > -1) { + if (isAPP == 0) { + try { + var MYUA = 指定UA; + } catch (e) { + var MYUA = MY_RULE.ua=="pc"?PC_UA:MOBILE_UA; + } + var html = request(MY_URL.split('##')[1], { + headers: { + 'User-Agent': MYUA + } + }); + } else { + var html = JSON.parse(request(MY_URL.split('##')[1], { headers: { 'User-Agent': 'Dalvik/2.1.0' } })); + } + } else { + if (isAPP == 0) { + var html = getResCode(); + } else { + var html = JSON.parse(getResCode()); + } + } + + if (isAPP == 1) { + var conts = html.data.vod_url_with_player || html.data.vod_play_list;//影片列表 + var list = conts[0].url.split('#');//影片定位 + var title = list[list.length - 1].split('$')[0]; + } else { + var conts = parseDomForArray(html, 影片列表)[0];//影片列表 + var list = parseDomForArray(conts, 单个影片);//影片定位 + var title = parseDomForHtml(list[list.length - 1], 'a&&Text'); + } + + setResult("更新至: " + title); +} + +//一级动态分类 +function yijidtfl(isverify,verifylx,waittime) { + Version(); + addListener("onClose", $.toString(() => { + clearMyVar('isverifyA'); + })); + var d = d || [] + var author = MY_RULE.author; + var SrcQJJX = getItem('SrcQJJX', '1'); + var SrcGJFS = getItem('SrcGJFS', '3'); + var SrcXTNH = getItem('SrcXTNH', 'web'); + var SrcM3U8 = getItem('SrcM3U8', '1'); + var 分类颜色 = '#3399cc'; + var page = MY_PAGE; + var true_url = getMyVar('header.url', MY_URL); + let 链接处理工具 = require(config.依赖.match(/https.*\//)[0] + 'plugins/UrlProcessor.js') + true_url = 链接处理工具 + .链接(true_url) + .页码(page) + .获取处理结果(); + MY_URL = true_url; + try { + var MYUA = 指定UA; + } catch (e) { + var MYUA = MY_RULE.ua=="pc"?PC_UA:MOBILE_UA; + } + let headers = { + "User-Agent": MYUA + }; + + verifylx = verifylx||(typeof (验证码) != "undefined"?"B":"A"); + waittime = (waittime*1000)||200; + var cookiename = MY_RULE.title+'cookie'; + if(getVar("SrcCookie")){ + putMyVar(cookiename,getVar("SrcCookie")); + clearVar("SrcCookie"); + } + if(isverify==true&&!getMyVar(cookiename)){ + if(verifylx == "A"){ + if(getMyVar('verifyA','0')=="0"){ + putMyVar('verifyA','1'); + log('网站有验证:进入手动过验证1'); + verify.A(MY_URL, JSON.stringify(headers), waittime); + } + }else{ + let cook = fetchCookie(验证码, { + headers: headers + }); + let cookie = JSON.parse(cook||'[]'); + putMyVar(cookiename, cookie.join(';')); + headers.Cookie = getMyVar(cookiename); + if(verify.B(验证码,认证链接,JSON.stringify(headers))=="ok"){ + log('网站有验证:自动过验证成功1'); + java.lang.Thread.sleep(waittime); + }else{ + log('网站有验证:自动过验证失败1'); + } + } + } + + if(getMyVar(cookiename)){ + headers.Cookie = getMyVar(cookiename); + } + + var html = fetch(MY_URL, { + headers: headers + }) + if (html.indexOf('检测中') != -1) { + html = fetch(MY_URL + '?btwaf' + html.match(/btwaf(.*?)\"/)[1], { + headers: headers + }); + } + if (html.indexOf('系统安全验证') > -1) { + if(!isverify || verifylx == "A"){ + if(getMyVar('verifyA','0')=="0"){ + putMyVar('verifyA','1'); + log('网站有验证:进入手动过验证2'); + verify.A(MY_URL, JSON.stringify(headers), waittime); + } + }else{ + if(verify.B(验证码,认证链接,JSON.stringify(headers))=="ok"){ + log('网站有验证:自动过验证成功2'); + java.lang.Thread.sleep(waittime); + html = fetch(MY_URL, { + headers: headers + }); + }else{ + log('网站有验证:自动过验证失败2'); + d.push({ + title:'验证码自动识别出错,下拉刷新再次偿试', + url: $("#noLoading#").lazyRule(() => { + refreshPage(false); + return 'toast://已刷新'; + }), + col_type: "text_1" + }) + } + } + } + + // '0' 为默认不折叠,'1' 为默认折叠 + const 当前折叠状态 = getMyVar('header.fold', '1') + + // 引入动态分类依赖 + // 框架已经稳定,使用 require 更佳 + let htmlCategories = require(config.依赖.match(/https.*\//)[0] + 'plugins/categories-header.js') + htmlCategories.界面(d) + .分类链接(true_url) + .源码(html) + .页码(page) + .添加分类定位(定位列表) + .开启内置折叠功能() // 必须 + .折叠按钮样式({ + title: 当前折叠状态 == "1" ? "‘‘️▼’’" : "‘‘▲’’" + }) // 可选 + .折叠(当前折叠状态) // 必须 + .选中的分类颜色(分类颜色) + .开始打造分类(); + var list = pdfa(html, 列表); + for (var i in list) { + try { + d.push({ + title: parseDomForHtml(list[i], 标题), + desc: parseDomForHtml(list[i], 描述), + pic_url: 图片.indexOf('@') == -1 ? parseDom(list[i], 图片) + "@Referer=" : 图片.split('@')[1] == "-" ? parseDom(list[i], 图片.split('@')[0]) : parseDom(list[i], 图片.split('@')[0]) + "@" + 图片.split('@')[1], + url: "hiker://empty##" + parseDom(list[i], 链接) + "#immersiveTheme#", + extra: { + pic: parseDom(list[i], 图片.split('@')[0]), + author: author, + SrcQJJX: SrcQJJX, + SrcGJFS: SrcGJFS, + SrcXTNH: SrcXTNH, + SrcM3U8: SrcM3U8 + } + }); + } catch (e) { } + } + setResult(d); +} + +function setupPages(type) { + switch (type) { + case "设置": + return $("hiker://empty#noRecordHistory#").rule(() => { + this.d = []; + eval(fetch('hiker://files/cache/fileLinksᴰⁿ.txt')); + if (!getVar('jxItemV')) { + require(fLinks.jxItUrl); + } + d.push({ + desc: 'auto', + url: fLinks.x5Route + 'Parse_Dn.html', + col_type: 'x5_webview_single' + }); + var jxItNewV = getVar('jxItNewV', ''), + jxItemV = getVar('jxItemV', ''); + var versionTips = jxItNewV == '' ? '‘‘' : '‘‘' + jxItNewV + '\n'; + var pics = [ + 'https://tva1.sinaimg.cn/large/9bd9b167gy1fwri56wjhqj21hc0u0arr.jpg', + 'https://cdn.seovx.com/img/seovx-20-10%20(92).jpg', + 'https://cdn.seovx.com/img/mom2018%20(207).jpg', + 'https://tva4.sinaimg.cn/large/9bd9b167gy1fwrh5xoltdj21hc0u0tax.jpg', + 'https://tva1.sinaimg.cn/large/005BYqpggy1fwreyu4nl6j31hc0u0ahr.jpg', + 'https://s3.bmp.ovh/imgs/2021/10/d7e60b990742093d.jpeg', + 'https://s3.bmp.ovh/imgs/2021/10/91ad6d6538bf8689.jpg', + 'https://tva1.sinaimg.cn/large/005BYqpggy1fwresl5pmlj31hc0xcwka.jpg', + 'https://tva3.sinaimg.cn/large/005BYqpggy1fwrgjdk74oj31hc0u0dqn.jpg', + 'https://cdn.seovx.com/img/mom2018%20(803).jpg' + ]; + d.push({ + img: pics[Math.floor(Math.random() * 10)], + title: versionTips + '’’  点击此处查看操作指引
点击上方头像进入编辑', + desc: '当前版本: ' + jxItemV, + url: fLinks.czzy, + col_type: 'movie_1' + }); + setResult(d); + }) + break; + case "编辑": + return $("hiker://empty#noRecordHistory#").rule(() => { + this.d = []; + eval(fetch('hiker://files/cache/fileLinksᴰⁿ.txt')); + require(fLinks.jxItUrl); + jxItem.jxList(); + setResult(d); + }) + break; + default: + return 'toast://需要传入正确参数' + break; + } +} + +var SrcParseS = { + formatUrl: function (url, i) { + try { + if (url.trim() == "") { + return "toast://解析失败,建议切换线路或更换解析方式"; + } else { + if (url[0] == '/') { url = 'https:' + url } + if (i == undefined) { + if (getMyVar('SrcM3U8', '1') == "1") { + url = cacheM3u8(url); + } + if (/wkfile/.test(url)) { + url = url + ';{User-Agent@Mozilla/5.0&&Referer@https://fantuan.tv/}'; + } else if (/bilibili|bilivideo/.test(url)) { + url = url + ";{User-Agent@Mozilla/5.0&&Referer@https://www.bilibili.com/}"; + } else if (/shenglinyiyang\.cn/.test(url)) { + url = url + ";{User-Agent@Mozilla/5.0&&Referer@https://zyz.sdljwomen.com}"; + } + /* else { + url = url + ";{User-Agent@Mozilla/5.0}"; + }*/ + } else { + if (getMyVar('SrcM3U8', '1') == "1") { + url = cacheM3u8(url, {}, 'video' + parseInt(i) + '.m3u8') + '#pre#'; + } + } + return url + '#isVideo=true#'; + } + } catch (e) { + return url; + } + }, + 嗅探: function (vipUrl) { + showLoading('√嗅探解析中,请稍候'); + return (getMyVar('SrcXTNH', 'web') == 'x5' ? 'x5Rule://' : 'webRule://') + vipUrl + '@' + $.toString((formatUrl) => { + if (typeof (request) == 'undefined' || !request) { + eval(fba.getInternalJs()); + }; + if (window.c == null) { + window.c = 0; + }; + window.c++; + if (window.c * 250 >= 15 * 1000) { + fba.hideLoading(); + return "toast://解析超时,建议切换线路或更换解析方式"; + } + //fba.log(fy_bridge_app.getUrls()); + var urls = _getUrls(); + var exclude = /m3u8\.tv/; + var contain = /\.mp4|\.m3u8|\.flv|\.avi|\.mpeg|\.wmv|\.mov|\.rmvb|\.dat|qqBFdownload|mime=video%2F|video_mp4/; + for (var i in urls) { + if (!exclude.test(urls[i]) && contain.test(urls[i])) { + //fba.log(urls[i]); + if(fy_bridge_app.getHeaderUrl) + //return fy_bridge_app.getHeaderUrl(urls[i]).replace(";{", "#isVideo=true#;{"); + return $$$("#noLoading#").lazyRule((url) => { + return cacheM3u8(url.split(";{")[0])+"#isVideo=true#;{"+url.split(";{")[1]; + }, fy_bridge_app.getHeaderUrl(urls[i])); + else { + return $$$("#noLoading#").lazyRule((url, formatUrl) => { + //url = url.replace(/http.*?\?url=/, ''); + return formatUrl(url); + }, urls[i], formatUrl); + } + } + } + }, this.formatUrl) + }, + 智能: function (vipUrl, input) { + showLoading('√智能解析中,请稍候'); + var video = ""; + try { + if (vipUrl.search(/LT-/) > -1) { + var jxList = ["https://ltjx.jeeves.vip/home/api?type=ys&uid=461939&key=degkpqruyzACEJLORW&url=", "https://ltjx.jeeves.vip/home/api?type=ys&uid=1589472&key=aehjpzAHILOPQRU456&url=", "https://vip.legendwhb.cn/m3u8.php?url=", "https://jx.zjmiao.com/?url=", "https://09tv.top/jx/?url="]; + var keyList = ["", "", "D63D64E0EDA774E3", "63f49d21a0dccf3c", "A42EAC0C2B408472"]; + var refList = ["", "", "https://wnvod.net", "", "https://09tv.top"]; + var jxLX = ["O", "O", "M", "M", "M"]; + for (var i = 0; i < jxList.length; i++) { + if (jxLX[i] != "M") { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路LT:' + jxList[i] + ' 解析异常'); + } + } else { + video = this.maoss(jxList[i] + vipUrl, refList[i], keyList[i]); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路LT:' + jxList[i] + ' 解析异常'); + } + } + } + } else if (/renrenmi-/.test(vipUrl)) { + var jxList = ["https://jx.blbo.cc:4433/analysis.php?v=", "https://jx.renrenmi.cc/?url=", "https://a.dxzj88.com/jxrrm/jiami.php?url="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路RR:' + jxList[i] + ' 解析异常'); + } + } + } else if (/RongXingVR/.test(vipUrl)) { + var jxList = ["https://vip.rongxingvr.top/api/?key=CMTJsEtHIzsLqZ6OGl&url=", "https://tc.yuanmajs.cn/jxplayer.php?v="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路RX:' + jxList[i] + ' 解析异常'); + } + } + } else if (/wuduyun-/.test(vipUrl)) { + var jxList = ["http://jf.1080p.icu:3232/home/api?type=dsp&uid=147565&key=adilmopuBEFJNUV067&url="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路WD:' + jxList[i] + ' 解析异常'); + } + } + } else if (/xueren-/.test(vipUrl)) { + var jxList = ["https://www.shangjihuoke.com/json.php/?url="]; + for (var i = 0; i < jxList.length; i++) { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路XR:' + jxList[i] + ' 解析异常'); + } + } + } else if (/\.suoyo|adHuRo0dcuHoM163L1/.test(vipUrl)) { + var apiList = ["https://p.tjomet.com/duoduo/api.php", "https://jiexi.ysgc.xyz/api.php"]; + var refList = ["https://www.ysgc.cc/", "https://www.ysgc.cc/"]; + if (/suoyo/.test(vipUrl)) { + //明码https://a.dxzj88.com/jxdd/dd.php?url= + vipUrl = 'adHuRo0dcuHoM163L1y49tM3U4LmNhY2hlLnN1b3lvLmNj' + base64Encode(vipUrl.replace('https://m3u8.cache.suoyo.cc', '')); + } + for (var i = 0; i < apiList.length; i++) { + video = this.DD(vipUrl, apiList[i], refList[i]); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路DD:' + apiList[i] + ' 解析异常'); + } + } + } else if (/ruifenglb/.test(vipUrl)) { + var jxList = ["http://player.yjhan.com:8090/api/?key=sQWHLErduwNEmxfx3V&url=", "https://004.summ.vip/?url=", "https://shangjihuoke.com/CL4K/?url="]; + var keyList = ["", "A42EAC0C2B408472", "A42EAC0C2B408472"]; + var refList = ["", "", ""]; + var jxLX = ["O", "M", "M"]; + for (var i = 0; i < jxList.length; i++) { + if (jxLX[i] != "M") { + video = this.明码(jxList[i] + vipUrl); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路RX:' + jxList[i] + ' 解析异常'); + } + } else { + video = this.maoss(jxList[i] + vipUrl, refList[i], keyList[i]); + if (video.slice(0, 4) == 'http') { + break; + } else { + log('线路CL4K:' + jxList[i] + ' 解析异常'); + } + } + } + } else if (/xfy-/.test(vipUrl)) { + video = this.maoss("https://jx.zjmiao.com/?url=" + vipUrl, "", "63f49d21a0dccf3c"); + } else if (/\.mp4|\.m3u8/.test(vipUrl)) { + video = vipUrl; + } else if (/youku|mgtv|ixigua|qq\.com|iqiyi|migu|bilibili|sohu|pptv|\.le\.|\.1905|cctv/.test(vipUrl)) { + if (getMyVar('SrcGJFS', '1') == "2") { + return this.DN(vipUrl); + } else { + return this.嗅探(input); + } + } + } catch (e) { } + if (video == "") { + return this.嗅探(input); + } else { + return this.formatUrl(video); + } + }, + 官网: function (vipUrl, jxUrl, isDn) { + try { + if (getMyVar('SrcGJFS', '1') == "2" || isDn == "1") { + return this.DN(vipUrl); + } else { + if (getMyVar('author') == "帅√`人才") { + return this.聚嗅(vipUrl); + } else { + if (jxUrl == "" || jxUrl == undefined) { jxUrl = "https://jx.blbo.cc:4433/?url=" } + return this.嗅探(jxUrl + vipUrl); + } + } + } catch (e) { + return ''; + } + }, + 明码: function (playUrl, ref) { + try { + if (ref == "") { + var html = request(playUrl, { timeout: 5000 }); + } else { + var html = request(playUrl, { headers: { 'Referer': ref }, timeout: 5000 }); + } + try { + let rurl = JSON.parse(html).url || JSON.parse(html).data; + if (typeof (rurl) != "undefined") { + var url = rurl; + } + } catch (e) { + var url = html.match(/urls = "(.*?)"/)[1]; + } + return url; + } catch (e) { + return ''; + } + }, + maoss: function (playUrl, ref, key) { + try { + if (ref) { + var html = request(playUrl, { headers: { 'Referer': ref }, timeout: 8000 }); + } else { + var html = request(playUrl, { timeout: 8000 }); + } + if (html.indexOf('&btwaf=') != -1) { + html = request(playUrl + '&btwaf' + html.match(/&btwaf(.*?)"/)[1], { headers: { 'Referer': ref }, timeout: 8000 }) + } + var iv = html.match(/_token = "(.*?)"/)[1]; + + var getVideoInfo = function (text) { + eval(getCryptoJS()); + var video = CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(key), { + 'iv': CryptoJS.enc.Utf8.parse(iv), + 'mode': CryptoJS.mode.CBC + }).toString(CryptoJS.enc.Utf8); + return video; + }; + eval(html.match(/var config = {[\s\S]*?}/)[0]); + if (config.url.slice(0, 4) != 'http') { + config.url = getVideoInfo(config.url); + } + if (config.url != "" && config.url.slice(0, 4) != 'http') { + config.url = decodeURIComponent(config.url); + } + return config.url; + } catch (e) { + return ''; + } + }, + DD: function (vipUrl, apiUrl, ref) { + try { + if (apiUrl == "" || apiUrl == undefined) { + /* + if(getMyVar('ddfrom', '')=="duoduozy"){ + apiUrl = "https://player.tjomet.com/ysgc/qa9ty92aTSGHwn3X.jpg" + }else{ + apiUrl = "https://ysgc.tjomet.com/qa9ty92aTSGHwn3X.jpg" + } + clearMyVar('ddfrom'); + */ + apiUrl = "https://ysgc.tjomet.com/qa9ty92aTSGHwn3X.jpg" ; + } + var html = request("https://ysgc.tjomet.com/?url="+vipUrl,{timeout:5000}); + eval(html.match(/var config = {[\s\S]*?}/)[0] + ''); + var bod = 'url=' + config.url + "&vkey=" + config.vkey + "&token=" + config.token + "&sign=bKvCXSsVjPyTNr9R"; + var json = JSON.parse(request(apiUrl, { method: 'POST', body: bod })); + eval(fetch("https://vkceyugu.cdn.bspapp.com/VKCEYUGU-03ee1f89-f0d4-49aa-a2b3-50e203514d8a/2e54cc42-9b4c-457d-b2de-0cdf3e2aeeaa.js"));//https://p.tjomet.com/duoduo/js/decode.js + let url = getVideoInfo(json.url); + if(/^http/.test(url)){ + return url; + }else{ + var jsonstr = JSON.parse(request("https://p.tjomet.com/lff/api.php", { headers: { 'Referer': ref }, method: 'POST', body: 'url=' + vipUrl })); + eval(getCryptoJS()); + return CryptoJS.AES.decrypt(jsonstr.url, CryptoJS.enc.Utf8.parse(CryptoJS.MD5('rXjWvXl6')), { + 'iv': CryptoJS.enc.Utf8.parse('NXbHoWJbpsEOin8b'), + 'mode': CryptoJS.mode.CBC, + 'padding': CryptoJS.pad.ZeroPadding + }).toString(CryptoJS.enc.Utf8); + } + } catch (e) { + return ''; + } + }, + DD2: function (vipUrl, apiUrl, ref) { + try { + if(/youku|mgtv|ixigua|qq\.com|iqiyi|migu|bilibili|sohu|pptv|\.le\.|\.1905|cctv/.test(url)) { + return SrcParseS.官网(url); + } else { + if (apiUrl == "" || apiUrl == undefined) { apiUrl = "https://bo.dd520.cc/xmplayer/duoduo.php" } + if (ref == "" || ref == undefined) { ref = "http://www.xawqxh.net" } + vipUrl = "ahHgRj0kceHdMc66L5y4" + base64Encode(vipUrl).slice(10); + //var json = JSON.parse(request(apiUrl, { headers: { 'Referer': ref }, method: 'POST', body: 'url=' + vipUrl })); + var json = JSON.parse(request(apiUrl, { method: 'POST', body: 'url=' + vipUrl })); + eval(getCryptoJS()); + return CryptoJS.AES.decrypt(json.url, CryptoJS.enc.Utf8.parse(CryptoJS.MD5('rXjWvXl6')), { + 'iv': CryptoJS.enc.Utf8.parse('NXbHoWJbpsEOin8b'), + 'mode': CryptoJS.mode.CBC, + 'padding': CryptoJS.pad.ZeroPadding + }).toString(CryptoJS.enc.Utf8); + } + } catch (e) { + return ''; + } + }, + DN: function (vipUrl) { + evalPrivateJS("OjB3OHrVodkVQlHIU8UUAC5W0ZBgTQEC4h9eUEcAT9kEM0hY/45YOxs7PDeQEnxjVhaWW2tIqO5GQimD4ssHKSka505+O0avEtQQZ9zRy6GxaBZdTHrbCPcoNIajmr3+JG22tRswOJFYDX5aYk0PfUDEFsZa2OjZbz+xTthnoUPLNm0R2g1kBFnWwGKBWUxEhEsFwFruhFSaxJi1E1WZ7WlbP0v4OpoQgn6M7UXGahP9h2fHi8UBVDGfjzIuVuJSCgICLlVGaAbT0ghic+Kfbp3TmjRhAo1DKretYp1U53apDMvO2Q+6oAyO1js5TJwx51ygFSUqVGAu0C2DLxkG0Z3+L8UPZyJa4KVDlqq/goE=") + return aytmParse(vipUrl); + }, + 聚嗅: function (vipUrl, x5jxlist) { + var jxhtml = config.依赖.match(/https.*\//)[0] + 'SrcJiexi.html'; + fc(jxhtml, 48); + let libsjxjs = fetch("hiker://files/libs/" + md5(jxhtml) + ".js"); + if (x5jxlist != undefined) { + if (x5jxlist.length > 0) { + libsjxjs = libsjxjs.replace(libsjxjs.match(/apiArray=(.*?);/)[1], JSON.stringify(x5jxlist)) + } + } + let libsjxhtml = "hiker://files/libs/" + md5(jxhtml) + ".html"; + writeFile(libsjxhtml, libsjxjs); + return this.嗅探(getPath(libsjxhtml) + '?url=' + vipUrl); + }, + mulheader: function (url) { + if (/mgtv/.test(url)) { + var header = { 'User-Agent': 'Mozilla/5.0', 'Referer': 'www.mgtv.com' }; + } else if (/bilibili|bilivideo/.test(url)) { + var header = { 'User-Agent': 'Mozilla/5.0', 'Referer': 'www.bilibili.com' }; + } else if (/wkfile/.test(url)) { + var header = { 'User-Agent': 'Mozilla/5.0', 'Referer': 'fantuan.tv' }; + } else { + var header = { 'User-Agent': 'Mozilla/5.0' }; + } + return header; + }, + APP: function (vipUrl) { + var appParses = getMyVar('parse_api', ''); + var Uparselist = []; + Uparselist = appParses.split(','); + function uniq(array) { + var temp = []; //一个新的临时数组 + for (var i = 0; i < array.length; i++) { + if (temp.indexOf(array[i]) == -1) { + temp.push(array[i]); + } + } + return temp; + } + Uparselist = uniq(Uparselist);//去重 + var x5jxlist = []; //x5嗅探接口存放数组 + var url = ""; + var parseurl = ""; + var urls = [];//多线路地址 + var headers = [];//多线路头信息 + var exclude = /404\.m3u8|xiajia\.mp4|余额不足\.m3u8|\.suoyo|\.ruifenglb|m3u8\.tv/;//设置排除地址 + var contain = /\.mp4|\.m3u8|\.flv|\.avi|\.mpeg|\.wmv|\.mov|\.rmvb|\.dat|qqBFdownload|mime=video%2F|video_mp4/;//设置符合条件的正确地址 + if (!exclude.test(vipUrl) && contain.test(vipUrl)) { + url = vipUrl; + } + for (var i = 0; i < Uparselist.length; i++) { + if (contain.test(url)) { break; } + if (x5jxlist.length >= 3) { break; } + let UrlList = []; + let p = i + 3; + if (p > Uparselist.length) { p = Uparselist.length } + for (let s = i; s < p; s++) { + parseurl = Uparselist[s]; + if (parseurl[0] == '/') { parseurl = 'https:' + parseurl } + if (parseurl.substring(0, 4) == 'http') { + UrlList.push(parseurl); + } + i = s; + } + if (UrlList.length > 0) { + let playUrls = UrlList.map((playUrl) => { + return { + url: playUrl + vipUrl, + options: { headers: { 'User-Agent': PC_UA }, timeout: 2000 } + } + }); + + let bfhtml = batchFetch(playUrls); + for (let k in bfhtml) { + let gethtml = bfhtml[k]; + parseurl = UrlList[k]; + if (gethtml == undefined || gethtml == "" || !/<|{/.test(gethtml)) { + //url直链网页打不开 + } else { + try { + try { + var rurl = JSON.parse(gethtml).url || JSON.parse(gethtml).data; + } catch (e) { + try { + var rurl = gethtml.match(/urls = "(.*?)"/)[1]; + } catch (e) { + x5jxlist.push(parseurl); + } + } + if (typeof (rurl) != "undefined" && contain.test(rurl) && !exclude.test(rurl)) { + url = rurl; + urls.push(this.formatUrl(url, urls.length)); + headers.push(this.mulheader(url)); + } + } catch (e) { } + } + }//批量结果循环 + } + } + + if (url == "") { + if (/youku|mgtv|ixigua|qq\.com|iqiyi|migu|bilibili|sohu|pptv|\.le\.|\.1905|cctv/.test(vipUrl)) { + if (getMyVar('SrcGJFS', '1') == "2") { + return this.DN(vipUrl); + } else { + if (getMyVar('author') == "帅√`人才") { + return this.聚嗅(vipUrl); + } else { + return this.聚嗅(vipUrl, x5jxlist); + } + } + } else { + if (getMyVar('author') == "帅√`人才") { + return this.智能(vipUrl); + } else { + return this.聚嗅(vipUrl, x5jxlist); + } + } + } else { + if (urls.length > 1) { + return JSON.stringify({ + urls: urls, + headers: headers + }); + } else { + return this.formatUrl(url); + } + } + } +} + +function SRCSet(setupPages) { + addListener("onClose", $.toString(() => { + //clearMyVar('官网'); + refreshPage(false); + })); + setPageTitle("♥设置"); + + function getTitle(title, Color) { + return '' + title + ''; + } + var d = []; + //if(getMyVar('islazy', '0') =="1"){ + d.push({ + title: '↓按需求修改此小程序的相关设置↓', + col_type: "rich_text" + }); + d.push({ + col_type: "line_blank" + }); + + //全局解析设置:1为自行编写动态解析,2为帅模板的通用嗅探解析 + var QJJX = getMyVar('SrcQJJX', '1'); + putMyVar('SrcQJJX', QJJX); + var islazy = getMyVar('islazy', '0'); + d.push({ + title: islazy == "1" && QJJX == '1' ? `‘‘’’全局解析方式:‘‘’’小程序的解析规则` : `‘‘’’全局解析方式:‘‘’’帅模板的嗅探逻辑`, + url: islazy == "0" ? 'toast://规则没有lazy解析,使用模板解析' : $('#noLoading#').lazyRule((QJJX) => { + if (QJJX == '1') { + setItem('SrcQJJX', '2'); + putMyVar('SrcQJJX', '2'); + var sm = "帅模板的嗅探规则"; + } else { + setItem('SrcQJJX', '1'); + putMyVar('SrcQJJX', '1'); + var sm = "小程序的解析规则"; + } + refreshPage(false); + return 'toast://全局解析方式:' + sm; + }, QJJX), + col_type: "text_1" + }); + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + d.push({ + col_type: "line_blank" + }); + //设置针对官网资源的默认解析方式:1为规则自定义解析,2为断插解析,3为嗅探解析 + + var GJFSsm = getTitle('官方资源解析方式:', '#098AC1'); + var GJFS = islazy == '1' ? getMyVar('SrcGJFS', '1') : getMyVar('SrcGJFS', '3'); + putMyVar('SrcGJFS', GJFS); + d.push({ + title: islazy == '1' && GJFS == '1' ? GJFSsm + getTitle('规则的动态解析', '#f13b66a') : GJFS == '2' ? GJFSsm + getTitle('调用断插解析', '#f13b66a') : GJFSsm + getTitle('模板嗅探解析', '#f13b66a'), + col_type: "rich_text" + }); + d.push({ + col_type: 'line' + }); + if (islazy == '1' && QJJX == '1') { + d.push({ + title: GJFS == '1' ? getTitle('规则', '#f13b66a') : '规则', + url: `#noLoading#@lazyRule=.js:setItem('SrcGJFS','1');putMyVar('SrcGJFS','1');refreshPage(false);'toast://官方资源解析方式:规则lazy自定义';`, + img: "https://lanmeiguojiang.com/tubiao/ke/23.png", + col_type: "icon_small_3" + }); + } + if (getMyVar('官网', '0') == "1" || getMyVar('是否APP','0') == "1") { + d.push({ + title: GJFS == '2' ? getTitle('断插', '#f13b66a') : '断插', + url: `#noLoading#@lazyRule=.js:setItem('SrcGJFS','2');putMyVar('SrcGJFS','2');refreshPage(false);'toast://官方资源解析方式:调用断插解析';`, + img: "https://lanmeiguojiang.com/tubiao/ke/24.png", + col_type: "icon_small_3" + }); + d.push({ + title: GJFS == '3' ? getTitle('嗅探', '#f13b66a') : '嗅探', + url: `#noLoading#@lazyRule=.js:setItem('SrcGJFS','3');putMyVar('SrcGJFS','3');refreshPage(false);'toast://官方资源解析方式:模板嗅探解析';`, + img: "https://lanmeiguojiang.com/tubiao/ke/25.png", + col_type: "icon_small_3" + }); + } + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + d.push({ + col_type: "line_blank" + }); + if (GJFS == '2') { + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + d.push({ + title: '断插接口设置', + url: fileExist('hiker://files/cache/fileLinksᴰⁿ.txt') ? setupPages("设置") : "hiker://page/Route?rule=MyFieldᴰⁿ&type=设置#noHistory#", + img: "https://lanmeiguojiang.com/tubiao/messy/30.svg", + col_type: "icon_2" + }); + d.push({ + title: '解析接口管理', + url: fileExist('hiker://files/cache/fileLinksᴰⁿ.txt') ? setupPages("编辑") : "hiker://page/Route?rule=MyFieldᴰⁿ&type=编辑#noRecordHistory#", + img: "https://lanmeiguojiang.com/tubiao/messy/17.svg", + col_type: "icon_2" + }); + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + d.push({ + col_type: "line_blank" + }); + } + + if (GJFS == '3' || QJJX == '2') { + var XTNH = getMyVar('SrcXTNH', 'web'); + putMyVar('SrcXTNH', XTNH); + d.push({ + title: XTNH == 'web' ? getTitle('通用嗅探内核:', '#098AC1') + getTitle('webview内核', '#f13b66a') : getTitle('通用嗅探内核:', '#098AC1') + getTitle('腾讯x5内核', '#f13b66a'), + col_type: "rich_text" + }); + d.push({ + col_type: 'line' + }); + d.push({ + title: '使用x5内核', + url: `#noLoading#@lazyRule=.js:setItem('SrcXTNH','x5');putMyVar('SrcXTNH','x5');refreshPage(false);'toast://通用嗅探内核:腾讯x5内核';`, + img: "https://lanmeiguojiang.com/tubiao/ke/127.png", + col_type: "icon_2" + }); + d.push({ + title: '使用web内核', + url: `#noLoading#@lazyRule=.js:setItem('SrcXTNH','web');putMyVar('SrcXTNH','web');refreshPage(false);'toast://通用嗅探内核:webview内核';`, + img: "https://lanmeiguojiang.com/tubiao/more/251.png", + col_type: "icon_2" + }); + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + d.push({ + col_type: "line_blank" + }); + } + var M3U8 = getMyVar('SrcM3U8', '1'); + putMyVar('SrcM3U8', M3U8); + d.push({ + title: M3U8 == '1' ? `‘‘’’m3u8播放连接方式:‘‘’’通过缓存m3u8文件` : `‘‘’’m3u8播放连接方式:‘‘’’直接在线访问`, + url: $('#noLoading#').lazyRule((M3U8) => { + if (M3U8 == '1') { + setItem('SrcM3U8', '2'); + putMyVar('SrcM3U8', '2'); + var sm = "直接在线访问,有可能会失效,但兼容通用性好"; + } else { + setItem('SrcM3U8', '1'); + putMyVar('SrcM3U8', '1'); + var sm = "通过缓存m3u8文件,避免可能失效,但某些场景不支持"; + } + refreshPage(false); + return 'toast://m3u8播放连接方式:' + sm; + }, M3U8), + col_type: "text_1" + }); + for (let i = 0; i < 10; i++) { + d.push({ + col_type: "blank_block" + }) + } + d.push({ + col_type: "line_blank" + }); + //} + d.push({ + title: '恢复设置', + url: `#noLoading#@lazyRule=.js:clearItem('SrcQJJX');clearMyVar('SrcQJJX');clearItem('SrcGJFS');clearMyVar('SrcGJFS');clearItem('SrcXTNH');clearMyVar('SrcXTNH');clearItem('SrcM3U8');clearMyVar('SrcM3U8');refreshPage(false);'toast://已恢复小程序默认设置';`, + img: "https://lanmeiguojiang.com/tubiao/ke/56.png", + col_type: "icon_4" + }); + d.push({ + title: '清除缓存', + url: `#noLoading#@lazyRule=.js:deleteCache();back(true);'toast://已清除小程序所有依赖缓存';`, + img: "https://lanmeiguojiang.com/tubiao/more/334.png", + col_type: "icon_4" + }); + setResult(d); +} +//验证 +var verify = { + A: function (yurl, headers, waittime, isss) {//手动过验证 + //log(yurl);log(headers);log(ua);log(timeout); + var d = []; + headers = JSON.parse(headers)||{}; + d.push({ + desc: '100%&&float', + url: yurl, + extra: { + ua: headers, + js: $.toString((time,isss) => { + var cook = document.cookie; + var html = document.documentElement.outerHTML; + if (!/系统安全验证/.test(html)){ + fba.showLoading('验证中,请稍候'); + fba.putVar("SrcCookie", cook); + if(isss==1){ + setTimeout("fba.back()",200); + }else{ + fba.setTimeout(fba.parseLazyRule(`hiker://empty@lazyRule=.js:refreshX5WebView('');refreshPage(true);hideLoading();`), time); + } + } + },waittime,isss), + jsLoadingInject: true + }, + col_type: 'x5_webview_single' + }); + setResult(d); + }, + B: function (verifyimg,verifyapi,headers) {//自动过字母数字验证 + //log(verifyimg);log(verifyapi);log(headers); + headers = JSON.parse(headers)||{}; + const File = java.io.File; + let javaImport = new JavaImporter(); + javaImport.importPackage( + Packages.com.example.hikerview.utils + ); + var bsimg = ""; + with(javaImport) { + let png = "hiker://files/cache/SrcVerify.png"; + downloadFile(verifyimg, png, headers); + let path = getPath(png).replace("file://", ""); + bsimg = _base64.encodeToString(FileUtil.fileToBytes(path), _base64.NO_WRAP); + new File(path).delete(); + } + evalPrivateJS("aHTJW8GUqk24nqdf1KutpXLSQxxUqCopcaSjWa/1BqbspogsD9sqzzRKQ0/eY1cbHWXKqK/7SmE36413GhDw1/LB4qZbC87N46M3cbGebQKVsuA+wqokqyn1sWZEySrRyJHtbzpZgnEP0XYECOKzPs0qEDbm2B+3gV+JGJA37bwIqwzm/veCOIIpZgmIiRR++Nd7tnLMDBM+/vxyS+MXfE2IYkez6NE1hioj8TQ9X7UxWHZGX1PS2hc8lotTz+2qqC3Kwy5Jx6cr8zh4grgoykYsrWLjm4wLbAoSHl3Oe6QNNx+Tloen/mKR5K8c2B7xsnPja73djQkKloPGX+pCQHx8DJHZqptu2ObISfk3jBqUk2o06nxPvcT1geVKM4Sz") + + let vcode = ocr(bsimg,config.依赖); + //log(vcode); + let result = fetch(verifyapi + vcode, { + headers: headers, + method: 'POST' + }); + try { + return JSON.parse(result).msg; + } catch (e) { + return ""; + } + } +} +//版本检测 +function Version() { + var nowVersion = 5.4;//现在版本 + if (getVar('srcDyTmpl-VersionCheck', '0') == '0') { + try { + eval(fetch(config.依赖.match(/https.*\//)[0] + 'SrcTmplVersion.js')) + if (newVersion.srcDyTmpl > nowVersion) { + deleteCache(); + require(config.依赖); + log('检测到新依赖文件,已更新!'); + } + } catch (e) { } + putVar('srcDyTmpl-VersionCheck', '1'); + } +} \ No newline at end of file diff --git a/srcconfig.js b/srcconfig.js new file mode 100644 index 00000000..df47e30b --- /dev/null +++ b/srcconfig.js @@ -0,0 +1 @@ +var configvar = {}; \ No newline at end of file