js:
var d=[];
require(config.模板);//超级牛逼,只要使用自动匹配模板初始化就自动依赖dr模板
putVar('cmsapp.jsRoot','https://gitcode.net/qq_32394351/dr/-/raw/master/js/');
设置(d);
function demo(p){
let d_url;
let s_url;
let detailUrl;
let system;
let ua='';
switch (p){
case 0:
d_url='https://hikerfans.com/ys';
s_url='/ys/index.php/vod/search/page/fypage/wd/**.html';
detailUrl='vod/detail/';
system='/ys/index.php/gbook/index.html';
break;
case 1:
d_url='https://hikerfans.com/ys';
s_url='/ys/index.php/vod/search/page/fypage/wd/**.html';
detailUrl='vod/detail/';
system='true';
break;
case 2:
d_url='https://www.i8k.cc/label/hot.html';
// s_url='/vodsearch/**-/page/fypage.html';
s_url='/search/page/fypage/wd/**.html';
detailUrl='/voddetail/';
system='';
break;
case 3:
d_url = 'http://m.kuhuiv.com/channel/tv.html';
s_url = '/so/page/fypage/wd/**.html';
detailUrl='show/';
system='';
ua = MOBILE_UA;
break;
}
return $('#noLoading#').lazyRule((d_url,s_url,detailUrl,system,ua)=>{
putMyVar('url',d_url);
putMyVar('surl',s_url);
putMyVar('detailUrl',detailUrl);
putMyVar('system',system);
putMyVar('ua',ua);
refreshPage(false);
return 'toast://例子已经给你了,别再找我要了!'
},d_url,s_url,detailUrl,system,ua)
}
d.push({
title: '““””♻检测升级',
desc:'清除所有DR模板依赖,等同于长按小程序标题清除缓存',
col_type: 'scroll_button',
url: $('#noLoading#').lazyRule(()=>{
showLoading('升级检测中,请稍等...');
require('http://hiker.nokia.press/hikerule/rulelist.json?id=2505');
config={
模板:'http://hiker.nokia.press/hikerule/rulelist.json?id=2505'
}
require(config['模板']);
let requireId = version.requireId;
let ver = version.ver;
let update = version.update;
let localDate = new Date(update);
try {
var webLib = fetch(requireId);
var webVer = (function(webLib) {
eval(webLib);
return version;
})(webLib);
}catch (e) {
hideLoading();
return 'toast://远程服务器通讯错误,本次检测升级失败\n'+e.message;
}
let webDate = new Date(webVer.update);
// $.dateFormat(new Date(parseInt(localDate)),"yyyy-MM-dd HH:mm:ss");
if(webDate>localDate||webVer.ver!==ver){//网页更新时间大于本地库时间或者版本号不等
hideLoading();
let msg = '本地依赖更新时间:'+update+',版本:'+ver+'\n云端依赖更新时间:'+webVer.update+',版本:'+webVer.ver+'\n有升级:['+ver+']=>['+webVer.ver+'],立即升级?';
return $(msg).confirm((requireId,webLib) => {
let jsp = 'hiker://files/libs/'+md5(requireId)+'.js';
log('本地依赖模块路径=> '+jsp);
deleteCache();
clearMyVar('是否进入规则');
writeFile(jsp,webLib)
refreshPage(false);
return 'toast://升级成功!模块依赖缓存已清除'
},requireId,webLib);
}else{
hideLoading();
return 'toast://经检测已经是最新的['+ver+']了!'
}
})
});
d.push({
title:`““””${getItem('mode','WEB')}`,
col_type: "scroll_button",
url:$('#noLoading#').lazyRule(()=>{
let modes = ['WEB','APP','混合'];
let idex = modes.indexOf(getItem('mode','WEB'));
let nextIdex = idex < modes.length -1?idex+1:0;
let nextMode = modes[nextIdex];
return $(`切换一级匹配模式为${nextMode}?`).confirm((nextMode)=>{
setItem('mode',nextMode);
refreshPage(false);
return 'hiker://empty'
},nextMode)
})
});
d.push({
title: '““””例子' ,
url: $('#noLoading#').lazyRule(()=>{
return $('需要例子别点我,点右边的。\n非要点我也不是不行,确认可以帮你清除自动匹配插件的依赖文件').confirm(()=>{
deleteCache(getVar('cmsapp.jsRoot')+'自动模板匹配.js');
return 'toast://已经清除,自己检查吧!'
})
}),
col_type: "scroll_button",
desc: "",
pic_url: ""
});
d.push({
title: '蓝莓影视1' ,
url: demo(0),
col_type: "scroll_button",
desc: "",
pic_url: ""
});
d.push({
title: '蓝莓影视2' ,
url: demo(1),
col_type: "scroll_button",
desc: "",
pic_url: ""
});
d.push({
title: '极客影视' ,
url: demo(2),
col_type: "scroll_button",
desc: "",
pic_url: ""
});
d.push({
title: '酷绘' ,
url: demo(3),
col_type: "scroll_button",
desc: "",
pic_url: ""
});
d.push({
title: '““””一二级处理' ,
url: $('hiker://empty#noHistory##noRecordHistory##noRefresh#').rule(()=>{
setPageTitle('一二级处理函数生成工具');
let d = [];
d.push({
title:'开始生成',
desc: "输入dr规则的一二级处理对象,开始生成符合模板的一二级处理字符串",
col_type:'input',
url:$.toString(()=>{
let dr_deal_obj = getMyVar('dr_deal_obj','{}');
try {
eval(dr_deal_obj); //只是检验一下这个obj没问题
let jdk = `$.toString(()=>{return ${dr_deal_obj}})`;
jdk = ''+eval(jdk);
jdk = jdk.replace(/"/g,"'");//将双引号替换单引号,防止json引号冲突问题
putMyVar('dr_deal_str',jdk);
refreshPage(false);
return 'hiker://empty'
}catch (e) {
return 'toast://发生了错误:\n'+e.message;
}
}),
extra:{
titleVisible: true,
textSize: 13,
type: "textarea",
height:5,
onChange: "putMyVar('dr_deal_obj',input)",
defaultValue: getMyVar('dr_deal_obj', '{}')||"{}"
}
});
d.push({
title:'复制',
desc: "对应上面obj对象的模板字符串结果,可以复制后用于一二级及搜索模板",
col_type:'input',
url:$.toString(()=>{
return 'copy://'+getMyVar('dr_deal_str', '{}')||"{}"
}),
extra:{
titleVisible: true,
textSize: 13,
type: "textarea",
height:8,
onChange: "putMyVar('dr_deal_str',input)",
defaultValue: getMyVar('dr_deal_str', '{}')||"{}"
}
});
d.push({
title:'点此进入网页将复制的结果在线压缩成一行',
url:$('#noLoading##noHistory##noRecordHistory#').lazyRule(()=>{return 'https://c.runoob.com/front-end/47/'}),
col_type:'text_1'
})
setResult(d);
}),
col_type: "scroll_button",
desc: "",
pic_url: ""
});
d.push({
title: '““””清除匹配记录',
url:$('#noLoading#').lazyRule(()=>{
return $('执行此操作将清空本模板运行过程中的匹配记录缓存,下次测试重新按模板顺序开始匹配,是否继续?').confirm(()=>{
clearMyVar('ssmuban');
clearMyVar('yjmuban');
clearMyVar('muban');
return 'toast://全部自动匹配模板的匹配记录已清除!'
})
}),
col_type:'scroll_button'
});
let desc="测试如果能正常进首页即成功,支持常见视频类网页书签地址。测试环境已升级完整的运行沙箱,点击二级进不去的人记得升级模板,出来了一级就说明可用";
d.push({
title: '道长dr模板说明-点此管理本地模板',
url: $('hiker://empty').rule(()=>{
setPageTitle('DR自动匹配模板管理');
let root = 'hiker://files/rules/dzHouse/json/'; //模板根目录
let files = ['一级模板','二级模板','搜索模板'];
let d = [];
for(let file of files){
d.push({
title:file===getMyVar('mubanManage',files[1])?'““””'+file+'':file,
col_type:'scroll_button',
url:$('#noLoading#').lazyRule((file)=>{
putMyVar('mubanManage',file);
refreshPage(false);
return 'hiker://empty'
},file),
});
}
let fileName = getMyVar('mubanManage',files[1]);
let filePath = `${root}${fileName}.json`;
let code = request(filePath);
d.push({
title:'DR模板注意事项',
col_type:'text_1',
desc:'三种模板对应的是三个本地文件,手动新增json的时候千万要注意,别把一级模板json新增到搜索模板文件里了,导入功能是有校验的倒是随便导入',
url:'toast://看懂了吗?如果没懂啥意思,我劝你最好别用新增功能'
});
d.push({
title:'编辑模板',
col_type:'text_4',
url:$('#noLoading#').lazyRule((filePath)=>{
let status = fetch('hiker://home@JSON编辑器');
let hasJsonEditor = (status && status !== 'null');
if(!hasJsonEditor){
return 'editFile://'+filePath;
}else{
return 'hiker://page/interface#noHistory##noRecordHistory#?rule=JSON编辑器&Json='+base64Encode(filePath);
}
},filePath)
});
d.push({
title:'初始化',
col_type:'text_4',
url:$('#noLoading#').lazyRule((filePath,fileName)=>{
return $(`确认初始化本地模板文件:${fileName}?将自动拉仓库道长的公开模板覆盖本地模板文件`).confirm((filePath,fileName)=>{
let api = 'http://hiker.nokia.press/hikerule/rulelist.json?id=';
let mubans = {
一级模板:api+'4551',
二级模板:api+'4552',
搜索模板:api+'4553',
};
let muban = mubans[fileName];
let code = request(muban);
if(!/解析/.test(code)){
return 'toast://仓库服务器通讯异常,请稍候再试...\n'+code
}else{
writeFile(filePath,code);
refreshPage(false);
return 'toast://已初始化重置模板:'+fileName+'=>'+muban
}
},filePath,fileName)
},filePath,fileName)
});
d.push({
title:'新增',
col_type:'text_4',
url:$("{{clipboard}}","自动识别剪切板内容或手动输入JSON文本").input((filePath)=>{
let obj = {};
try{
obj = JSON.parse(input)
}catch(e){
return 'toast://新增失败,JSON校验不通过:'+e.message
}
let localmubans = JSON.parse(fetch(filePath)||'[]');//本地的模板
let idex = localmubans.findIndex(it=>it.名称===obj.名称);
if(idex>-1){
return 'toast://你的第'+idex+'个跟待新增的冲突了,自己改名新增或者去编辑原来那个模板吧'
}
localmubans.push(obj);
writeFile(filePath, JSON.stringify(localmubans));
refreshPage(false);
return 'toast://已成功新增到:'+filePath
},filePath)
});
d.push({
title:'导入',
col_type:'text_4',
url:$("{{clipboard}}","自动识别剪切板内容或手动输入口令").input((filePath,fileName)=>{
if(!/一级模板|二级模板|搜索模板/.test(input)){
return 'toast://无法识别的模板导入口令.必须包含字符串一级模板|二级模板|搜索模板'
}
if(!input.includes(fileName)){
return 'toast://当前位置仅允许导入:'+fileName+',你的是:'+input.split(':')[0]
}
try {
input = input.split('\n')[1].trim();
let text = parsePaste(input);
let obj = JSON.parse(base64Decode(text));
// log(obj);
let localmubans = JSON.parse(fetch(filePath)||'[]');//本地的模板
let titles = localmubans.map(it=>it.名称); // 模板标题
//单条导入
let idex = titles.indexOf(obj.名称);
if (idex < 0) {
localmubans.push(obj);
writeFile(filePath, JSON.stringify(localmubans));
refreshPage(false);
return 'toast://成功导入到:'+filePath
} else {
return $('检测到已有订阅:' + obj.名称 + ',是否覆盖?').confirm((filePath, idex, obj) => {
let localmubans = JSON.parse(fetch(filePath) || '[]');
localmubans[idex] = obj;
writeFile(filePath, JSON.stringify(localmubans));
refreshPage(false);
return 'toast://覆盖并导入成功'
}, filePath, idex, obj)
}
}catch (e) {
return 'toast://内容有误啊兄弟:'+input+'\n'+e.message
}
},filePath,fileName)
});
// d.push({
// title:code,
// col_type:'rich_text'
// });
try {
let localmubans = JSON.parse(code);
for(let i in localmubans){
let muban = localmubans[i];
d.push({
title:i+':'+muban.名称,
col_type:'text_1',
url:$('hiker://empty#noHistory##noRecordHistory##noRefresh#').rule((muban)=>{
setPageTitle('编辑:'+muban.名称);
setResult([{title:JSON.stringify(muban),col_type:'rich_text'}]);
},muban),
extra:{
lineVisible:false
}
});
d.push({
title:'编辑',
col_type:'text_3',
url:$(JSON.stringify(muban),'请输入编辑后的内容').input((localmubans,i,filePath)=>{
let ret = {};
try {
ret = JSON.parse(input)
}catch (e) {
return 'toast://JSON校验失败,不允许保存'
}
if(JSON.stringify(localmubans[i])!==input) {
localmubans[i] = ret;
writeFile(filePath, JSON.stringify(localmubans));
refreshPage(false);
return 'toast://已修改并保存'
}else{
return 'toast://原文件无变化'
}
},localmubans,i,filePath)
});
d.push({
title:'导出',
col_type:'text_3',
url:$('#noLoading#').lazyRule((muban,fileName)=>{
try {
let shareText = base64Encode(JSON.stringify(muban));
var pastes = getPastes();
var url = sharePaste(shareText, pastes.slice(-1)[0]);
let import_rule = fileName + ":" + muban.名称 + '\n' + url;
copy(import_rule);
return 'toast://已导出并复制到剪切板,快去分享吧';
}catch (e) {
return 'toast://发生错误:'+e.message
}
},muban,fileName)
});
d.push({
title:'删除',
col_type:'text_3',
url:$(`确认删除${getMyVar('mubanManage',files[1])}:${muban.名称}`).confirm((localmubans,i,filePath,name)=>{
localmubans.splice(i,1);//删除
writeFile(filePath,JSON.stringify(localmubans));
refreshPage(false);
return 'toast://已删除'+name
},localmubans,i,filePath,muban.名称)
});
}
}catch (e) {log(e.message)}
setResult(d);
}),
// url: 'toast://'+desc,
col_type: "text_1",
desc:desc ,
pic_url: ""
});
d.push({
title: '详情页标识',
url: $.toString(()=>{
return $('清空输入?').confirm(()=>{
putMyVar('detailUrl','');
refreshPage(false);
return 'toast://已清空详情页标识'
});
}),
col_type: "input",
desc: "输入网站的影片详情页标识或完整链接,必填",
pic_url: "",
extra:{
defaultValue:getMyVar('detailUrl','detail'),
onChange:"putMyVar('detailUrl',input)",
titleVisible: true,
textSize: 13,
type: "textarea",
height:1,
}
});
d.push({
title: '系统功能',
url: $.toString(()=>{
return $('清空输入?').confirm(()=>{
putMyVar('system','');
refreshPage(false);
return 'toast://已清空系统功能链接'
});
}),
col_type: "input",
desc: "拦截网站的某个可点击链接进行注入模板的设置功能,选填。不拦截填true",
pic_url: "",
extra:{
defaultValue:getMyVar('system','true'),
onChange:"putMyVar('system',input)",
titleVisible: true,
textSize: 13,
type: "textarea",
height:2,
}
});
d.push({
title: '一二级测试',
url: $.toString(()=>{
let url=getMyVar('url','').trim();
if(!url||!/^http/.test(url)){
return 'toast://请输入正确的网页地址'
}
let homeUrl='hiker://empty##'+url;
var ua = getMyVar('ua','');
initConfig({
指定ua:ua,
// 模板:'http://hiker.nokia.press/hikerule/rulelist.json?id=2505'
});
if(ua) {
log('一二级测试指定ua:' + ua);
}
// log(config.模板);
// log(config.ua);
clearMyVar('test_mode');//关闭测试模式
return $(homeUrl).rule(()=>{
// addListener('onClose', $.toString(()=>{//监听返回事件
// initConfig({}); //清空配置
// }));
require(config.自动匹配);
if(getItem('mode','WEB')==='APP'){
let cates = 打造动态分类([]);
// 设置(cates);
自动一级(null,cates,null,true);
}else if(getItem('mode','WEB')==='WEB'){
// require(config['模板']);
依赖检测();
一级书签(getMyVar('detailUrl','detail'),getMyVar('system','true'));
}else{
if(lsg.getItem('dr_mode','WEB')==='APP'){
refreshX5Desc('float&&0');
refreshX5WebView('http://127.0.0.1:4848');
let cates = 打造动态分类([]);
自动一级(null,cates,null,true);
}else{
依赖检测();
一级书签(getMyVar('detailUrl','detail'),getMyVar('system','true'));
}
}
})
}),
col_type: "input",
desc: "输入待添加的视频网站地址",
pic_url: "",
extra:{
defaultValue:getMyVar('url',''),
onChange:"putMyVar('url',input)"
}
});
d.push({
title: '搜索关键字:'+'““””'+getMyVar('skey','斗罗')+'',
col_type:'text_2',
url:$(getMyVar('skey','斗罗'),'请输入搜索关键字').input(()=>{
putMyVar('skey',input);
refreshPage(false);
return 'hiker://empty'
})
});
d.push({
title: '验证字符:'+'““””'+getMyVar('sflag','')+'',
col_type:'text_2',
url:$(getMyVar('sflag',''),'若有搜索验证,请输入搜索成功必然出现的字符串,比如 搜索结果|相关的,多个可用|隔开').input(()=>{
putMyVar('sflag',input);
refreshPage(false);
return 'hiker://empty'
})
});
d.push({
title: '搜索测试',
url: $.toString(()=>{
let key = getMyVar('skey','斗罗');
let url=getMyVar('surl','').trim();
let host = getHome(getMyVar('url','').trim());
if(!url){
return 'toast://请输入正确的搜索地址'
}else if(!/^http/.test(url)&&!/^http/.test(host)){
return 'toast://非完整的搜索地址需求有一个一二级测试地址'
}
if(!/^http/.test(url)){
url = (host+url);
}
url = url.replace('**',key);//构造搜索地址
let homeUrl='hiker://empty##'+url;//搜索链接避免第一次请求
var ua = getMyVar('ua','');
initConfig({
指定ua:ua,
});
if(ua) {
log('搜索测试指定ua:' + ua);
}
// log(homeUrl);
putMyVar('test_mode','true');//设置为测试模式,这样二级才有
return $(homeUrl).rule((key)=>{
setPageTitle('搜索测试:'+key);
// log(MY_URL);
require(config.自动匹配);
自动搜索(getMyVar('sflag',''));
},key)
}),
col_type: "input",
desc: "输入视频网站的搜索接口,搜索词用**表示",
pic_url: "",
extra:{
defaultValue:getMyVar('surl',''),
onChange:"putMyVar('surl',input)",
textSize: 13,
type: "textarea",
height:2,
}
});
d.push({
title: '自定义UA',
url: $.toString(()=>{
return $('清空输入?').confirm(()=>{
putMyVar('ua','');
refreshPage(false);
return 'toast://已清空自定义UA'
});
}),
col_type: "input",
desc: "输入自定义的UA,可不填",
pic_url: "",
extra:{
defaultValue:getMyVar('ua',''),
onChange:"putMyVar('ua',input)",
titleVisible: true,
textSize: 13,
type: "textarea",
height:2,
}
});
d.push({
title: '🚇快捷UA',
col_type: "text_3",
url:$('#noLoading#').lazyRule(()=>{
let sel_title = ['电脑','手机','Dart/2.13 (dart:io)','Dalvik/2.1.0'];
return $(sel_title,2,'请选择一个快捷UA').select(()=>{
switch (input){
case '电脑':
putMyVar('ua',PC_UA);
break;
case '手机':
putMyVar('ua',MOBILE_UA);
break;
case 'Dart/2.13 (dart:io)':
putMyVar('ua',input);
break;
case 'Dalvik/2.1.0':
putMyVar('ua','Dalvik/2.1.0 (Linux; U; Android 9; RVL-AL09 Build/HUAWEIRVL-AL09)');
break;
}
refreshPage(false);
return 'hiker://empty'
});
})
});
d.push({
title: '📲生成规则' ,
url: $('#noLoading#').lazyRule(()=>{
let url=getMyVar('url','').trim();
if(!url||!/^http/.test(url)){
return 'toast://你没输入正确的地址呢?'
}
return $('','确定测试好了并生成小程序吗?取个名字吧').input((url)=>{
if(!input){
return 'toast://小程序不起名你想玩蛇皮?'
}
const {rule}=$.require('hiker://page/ruleGen');
let ext = 'DR';
if(getItem('mode','WEB')==='APP'){
ext = 'dr';
}else if(getItem('mode','WEB')==='混合'){
ext = 'Dr'
}
// rule.title=input.includes('.')?input:input+'.DR';
rule.title=/dr/gi.test(input)?input:input+'.'+ext;//正则匹配dr不区分大小写
let ourl=rule.url.match(/##(.*)/)[1];
let opre=rule.preRule;
let osf=rule.searchFind;
let ua=getMyVar('ua','');
let sflag=getMyVar('sflag','');
rule.url=rule.url.replace(ourl,url);
// 替换一级解析
if(getItem('mode','WEB')==='APP'){
rule.find_rule='js:\n'+$.toString(()=>{
require(config.自动匹配);
自动一级();
}).split('{')[1].split('}')[0].replace(/ /g,'').trim();
}else if(getItem('mode','WEB')==='WEB'){
rule.find_rule=rule.find_rule.replace(/\$detailUrl/g,getMyVar('detailUrl','detail')).replace(/\$system/g,getMyVar('system','true'));
}else{
rule.find_rule=`js:
require(config.自动匹配);
let ui = ()=>{
//page = MY_PAGE;
//true_url = getMyVar('header.url', MY_URL);
//if(page>1){true_url=true_url.replace(/(\\d+)\\.html/,'$1-'+page+'.html')}
true_url = 获取正确链接();
//log(true_url);
/*
可能用到: 一级分类 子分类 分类标题
分类链接:{
二次处理(u){
return u.replace(/type/,'show')}
}
*/
let cates = 打造动态分类([{
一级分类:'',
子分类:'',
}]);
设置(cates);
自动一级(null,cates);
}
混合(ui,"${getMyVar('detailUrl','detail')}","${getMyVar('system','true')}");`;
}
// 替换搜索链接
rule.search_url='hiker://empty##'+getMyVar('surl','').trim();
// 替换二级解析
rule.detail_find_rule=JSON.parse(request('hiker://home@' + MY_RULE.title)).detail_find_rule;
// 替换预处理
rule.preRule=opre.replace('$ua',ua);
// 替换搜索成功标识
rule.searchFind=osf.replace('$sflag',sflag);
//替换图标
rule.icon='http://1.117.152.239:39000/tupian.php?text='+input;
//log(rule);
let path='hiker://files/ruleCache/dr/'+input+'.json';
writeFile(path,JSON.stringify(rule));
putMyVar('genRule',JSON.stringify({
title:input,
url:path,
ua:ua
}));
return 'toast://已生成小程序:'+input+'=>地址:'+url
},url);
}),
col_type: "text_3",
desc: "",
pic_url: ""
});
d.push({
title: '📥导入' ,
url: $('#noLoading#').lazyRule(()=>{
var rule=getMyVar('genRule','');
if(!rule){
return 'toast://没生成过规则,无法导入,请先测试好并生成一个规则吧'
}
try{
rule=JSON.parse(rule);
}catch(e){
log(e.message);
return 'toast://生成的规则有误,请重试吧'
}
log(rule);
/*
let ruleCode = "海阔视界规则分享,当前分享的是:小程序,无根树,花正清,不断荤腥不戒淫¥home_rule_v2¥base64://@测试CMS@" + base64Encode(fetch(rule.url));
importUrl = "rule://" + base64Encode(ruleCode);
*/
let ruleCode = "海阔视界首页频道规则【"+rule.title + "】¥home_rule_url¥" + rule.url;
log(ruleCode);
let importUrl = "rule://" + base64Encode(ruleCode)
return importUrl
}),
col_type: "text_3",
desc: "",
pic_url: ""
});
setResult(d);