//本代码仅用于个人学习,请勿用于其他作用,下载后请24小时内删除,代码虽然是公开学习的,但请尊重作者,应留下说明 //聚集型、接口型、平台型空壳小程序,接口分为主页源和搜索源 require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJuPublic.js'); //一级 function yiji() { Version(); downloadicon(); let sourcedata = yidatalist.filter(it => { return it.name == sourcename; }); let parse; let page; try { if (sourcedata.length > 0) { eval("let source = " + sourcedata[0].parse); if (source.ext && /^http/.test(source.ext)) { requireCache(source.ext, 48); parse = yidata; } else { parse = source; } page = parse["页码"]; if(!getMyVar(runMode+"_"+sourcename)){ toast("当前主页源:" + sourcename + (parse["作者"] ? ",作者:" + parse["作者"] : "")); } } } catch (e) { log("一级源接口加载异常>" + e.message); } page = page || {}; let d = []; d.push({ title: "管理", url: $("hiker://empty#noRecordHistory##noHistory#").rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJuSet.js'); SRCSet(); }), pic_url: "https://lanmeiguojiang.com/tubiao/more/129.png", col_type: 'icon_5' }) d.push({ title: "排行", url: $("hiker://empty#noRecordHistory##noHistory#" + (page["排行"] ? "?page=fypage" : "")).rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJuPublic.js'); getYiData('排行'); }), pic_url: "https://lanmeiguojiang.com/tubiao/more/229.png", col_type: 'icon_5' }) d.push({ title: "分类", url: $("hiker://empty#noRecordHistory##noHistory#" + (page["分类"] != 0 ? "?page=fypage" : "")).rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJuPublic.js'); getYiData('分类'); }), pic_url: "https://lanmeiguojiang.com/tubiao/more/287.png", col_type: 'icon_5' }) d.push({ title: "更新", url: $("hiker://empty#noRecordHistory##noHistory#" + (page["更新"] ? "?page=fypage" : "")).rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJuPublic.js'); getYiData('更新'); }), pic_url: "https://lanmeiguojiang.com/tubiao/more/288.png", col_type: 'icon_5' }) d.push({ title: Juconfig["btnmenu5"] || "书架", url: Juconfig["btnmenu5"] == "历史" ? "hiker://history?rule="+MY_RULE.title : Juconfig["btnmenu5"] == "收藏" ? "hiker://collection?rule="+MY_RULE.title : $("hiker://empty###noRecordHistory##noHistory#").rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJuPublic.js'); let type = []; let Julist = []; let collection = JSON.parse(fetch("hiker://collection?rule="+MY_RULE.title)); collection.forEach(it => { try{ if(it.params&& (JSON.parse(it.params).title==MY_RULE.title)){ Julist.push(it); let params = JSON.parse(it.params); if(params.params){ let t = JSON.parse(params.params).stype; if(type.indexOf(t)==-1){ type.push(t) } } } }catch(e){ log("书架加载异常>"+e.message); } }) let d = []; d.push({ title: ' 本地书架', url: "hiker://page/Main.view?rule=本地资源管理", img: "https://lanmeiguojiang.com/tubiao/messy/70.svg", col_type: "icon_2" }); d.push({ title: ' 切换样式', url: $('#noLoading#').lazyRule((cfgfile, Juconfig) => { if(Juconfig["bookCase_col_type"]=="movie_1_vertical_pic"){ Juconfig["bookCase_col_type"] = "movie_3_marquee"; }else{ Juconfig["bookCase_col_type"] = "movie_1_vertical_pic"; } writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'hiker://empty'; }, cfgfile, Juconfig), img: "https://lanmeiguojiang.com/tubiao/messy/85.svg", col_type: "icon_2" }); for (let i = 0; i < 8; i++) { d.push({ col_type: "blank_block" }) } type.forEach(it=>{ d.push({ title: getMyVar("SrcJuBookType","")==it?`““””`+it+``:it, url: $('#noLoading#').lazyRule((it) => { putMyVar("SrcJuBookType",it); refreshPage(false); return "hiker://empty"; },it), col_type: 'scroll_button' }) }) Julist.forEach(it => { try{ let params = JSON.parse(it.params); let stype = JSON.parse(params.params).stype; if(getMyVar("SrcJuBookType")==stype || !getMyVar("SrcJuBookType")){ let name = JSON.parse(params.params).name; let sname = JSON.parse(params.params).sname; let extraData = it.extraData?JSON.parse(it.extraData):{}; let last = extraData.lastChapterStatus?extraData.lastChapterStatus:""; let mask = it.lastClick?it.lastClick.split('@@')[0]:""; let col = Juconfig["bookCase_col_type"] || 'movie_1_vertical_pic'; d.push({ title: col=='movie_1_vertical_pic'?name + "\n\n‘‘’’💠 "+stype+" | "+(sname||"")+"":name, pic_url: it.picUrl, desc: col=='movie_1_vertical_pic'?"🕓 "+mask+"\n\n🔘 "+last:last, url: $("hiker://empty#immersiveTheme##autoCache#").rule(() => { require(config.依赖); erji(); }), col_type: col, extra: { pageTitle: name, name: name, img: it.picUrl, stype: stype, lineVisible: false, cls: "caselist" } }) } }catch(e){ log("书架加载异常>"+e.message); } }) d.push({ title: "", url: "hiker://empty", col_type: "text_center_1", extra: { lineVisible: false, id: "caseloading" } }) setResult(d); }), pic_url: "https://lanmeiguojiang.com/tubiao/more/286.png", col_type: 'icon_5', extra: { longClick: [{ title: "切换按钮", js: $.toString(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJuPublic.js'); return $(["书架", "收藏", "历史"], 1).select((cfgfile, Juconfig) => { Juconfig["btnmenu5"] = input; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://已切换为' + input; }, cfgfile, Juconfig) }) }] } }) d.push({ col_type: 'line' }) getYiData('主页', d); putMyVar(runMode+"_"+sourcename, "1"); } //搜索页面 function sousuo() { putMyVar('SrcJuSousuo', '1'); let name = MY_URL.split('##')[1]; let d = []; d.push({ title: "搜索中...", url: "hiker://empty", extra: { id: "sousuoloading" } }); setResult(d); java.lang.Thread.sleep(1000); search(name); clearMyVar('SrcJuSousuo'); } //二级+源搜索 function erji() { addListener("onClose", $.toString(() => { clearMyVar('erjiextra'); clearMyVar('SrcJudescload'); })); clearMyVar('SrcJudescload'); let name = MY_PARAMS.name; let isload;//是否正确加载 let sauthor = "未知"; let detailsfile = "hiker://files/cache/src/details.json"; let d = []; let parse; let details; let stype = MY_PARAMS.stype; let datasource = [storage0.getMyVar('erjiextra'), MY_PARAMS, getMark(name, stype)]; let erjiextra; let sname; let surl; for(let i=0; i { return it.name == sname && it.erparse && it.type == stype; }); let sourcedata2;//用于正常加载时,将二级接口存入当前页面PARAMS,确保分享时可以打开 try { if (sourcedata.length == 0 && MY_PARAMS && MY_PARAMS.sourcedata) { log('分享页面,且本地无对应接口'); sourcedata.push(MY_PARAMS.sourcedata); } if (sourcedata.length > 0 && sourcedata[0].erparse) { eval("let source = " + sourcedata[0].erparse); if (source.ext && /^http/.test(source.ext)) { requireCache(source.ext, 48); parse = erdata; } else { parse = source; } sourcedata2 = sourcedata[0]; } } catch (e) { log(e.message); } try { if (parse && surl) { MY_URL = surl; sauthor = parse["作者"] || sauthor; let detailsmark; if(getMyVar('SrcJuloading')){ let detailsdata = fetch(detailsfile); if (detailsdata != "") { try{ eval("let detailsjson=" + detailsdata + ";"); if(detailsjson.sname==sname && detailsjson.surl==surl){ detailsmark = detailsjson; } }catch(e){ } } } details = detailsmark || parse['二级'](surl); let pic = (details.img || MY_PARAMS.img || "https://p1.ssl.qhimgs1.com/sdr/400__/t018d6e64991221597b.jpg") + '@Referer='; d.push({ title: details.detail1 || "", desc: details.detail2 || "", pic_url: pic.indexOf("@Referer=") == -1 ? pic + "@Referer=" : pic, url: surl, col_type: 'movie_1_vertical_pic_blur', extra: { id: "detailid", gradient: true } }) let indexid = getMyVar(surl, '0'); let 线路s = details.line?details.line:["线路"]; let 列表s = details.line?details.list:[details.list]; let 列表 = 列表s[indexid]; if (getMyVar(sname + 'sort') == '1') { 列表.reverse(); } let 解析 = parse['解析']; d.push({ title: "详情简介", url: $("#noLoading#").lazyRule((desc) => { if(getMyVar('SrcJudescload')=="1"){ clearMyVar('SrcJudescload'); deleteItemByCls("SrcJudescload"); }else{ putMyVar('SrcJudescload',"1"); addItemAfter('detailid', [{ title: `详情简介 >`, col_type: "avatar", url: "hiker://empty", pic_url: "https://lanmeiguojiang.com/tubiao/ke/91.png", extra: { cls: "SrcJudescload" } },{ title: desc, col_type: "rich_text", extra: { cls: "SrcJudescload" } }]); } return "hiker://empty"; }, details.desc||""), pic_url: "https://lanmeiguojiang.com/tubiao/messy/32.svg", col_type: 'icon_small_3', extra: { cls: "loadlist" } }) d.push({ title: "下载阅读", url: "hiker://page/download.view#noRecordHistory##noRefresh##noHistory#?rule=本地资源管理", pic_url: 'https://lanmeiguojiang.com/tubiao/messy/124.svg', col_type: 'icon_small_3', extra: { cls: "loadlist", chapterList: 列表, "defaultView": "1", "info": { "bookName": name, "bookTopPic": pic, "parseCode": "(\n(解析) => {\n return 解析(input);\n})(" + 解析 + ")", "ruleName": MY_RULE.title } } }) d.push({ title: "切换书源", url: getMyVar('backsousuo') == "1" ? `#noLoading#@lazyRule=.js:back(false);'hiker://empty'` : $("#noLoading#").lazyRule((name) => { if(!getMyVar('SrcJuSearching')){ clearMyVar('SrcJuselectsname'); require(config.依赖); deleteItemByCls('loadlist'); search(name); return 'hiker://empty' }else{ return "toast://不要心急,稍等..."; } }, name), pic_url: 'https://lanmeiguojiang.com/tubiao/messy/20.svg', col_type: 'icon_small_3', extra: { cls: "loadlist" } }) d.push({ col_type: "line_blank" }); for (let i = 0; i < 10; i++) { d.push({ col_type: "blank_block" }) } d.push({ title: getMyVar(sname + 'sort') == '1' ? `““””排序` : `““””排序`, url: $("#noLoading#").lazyRule((列表, 解析, name, sname) => { deleteItemByCls('playlist'); if (getMyVar(sname + 'sort') == '1') { putMyVar(sname + 'sort', '0'); updateItem('listsort', { title: `““””排序` }); } else { putMyVar(sname + 'sort', '1') 列表.reverse(); updateItem('listsort', { title: `““””排序` }); }; let d = []; 列表.forEach((item, id) => { d.push({ title: item.title, url: item.url + $("").lazyRule((解析) => { return 解析(input); }, 解析), col_type: "text_2", extra: { id: name + "_选集_" + id, cls: "loadlist playlist" } }); }) addItemBefore('listloading', d); return 'toast://切换排序成功' }, 列表, 解析, name, sname), col_type: 'scroll_button', extra: { id: "listsort", cls: "loadlist" } }) d.push({ title: `““””样式🎨`, url: $(["text_1","text_2","text_3","flex_button"],1,"选集列表样式").select((列表, 解析, name) => { deleteItemByCls('playlist'); let d = []; 列表.forEach((item, id) => { d.push({ title: item.title, url: item.url + $("").lazyRule((解析) => { return 解析(input); }, 解析), col_type: input, extra: { id: name + "_选集_" + id, cls: "loadlist playlist" } }); }) addItemBefore('listloading', d); setItem('SrcJuList_col_type', input); return 'hiker://empty' }, 列表, 解析, name), col_type: 'scroll_button', extra: { id: "listcol_type", cls: "loadlist" } }) if(线路s.length>1){ d.push({ title: `““””`+线路s[indexid]+``, url: $(线路s,2,"选择线路").select((线路s,surl) => { let index = 线路s.indexOf(input); putMyVar(surl,index); refreshPage(false); return 'hiker://empty' }, 线路s, surl), col_type: 'scroll_button', extra: { id: "listcol_type", cls: "loadlist" } }) } 列表.forEach((item, id) => { d.push({ title: item.title, url: item.url + $("").lazyRule((解析) => { return 解析(input); }, 解析), col_type: getItem('SrcJuList_col_type', 'text_2'), extra: { id: name + "_选集_" + id, cls: "loadlist playlist" } }); }) isload = 1; } } catch (e) { toast('有异常,看日志'); log(MY_PARAMS.sname + '>加载详情失败>' + e.message); } if (isload) { d.push({ title: "‘‘’’当前数据源:" + sname + ", 作者:" + sauthor+"", url: 'hiker://empty', col_type: 'text_center_1', extra: { id: "listloading", lineVisible: false } }); setResult(d); //setPageTitle(name);//不能用了,会影响收藏状态和足迹,软件反应不过来 if(!getMyVar(sname+"_"+name)){ toast('当前数据源:' + sname + ', 作者:' + sauthor); } putMyVar(sname+"_"+name, "1"); //二级源浏览记录保存 let erjidata = { name: name, sname: sname, surl: surl, stype: stype }; setMark(erjidata); if (typeof (setPageParams) != "undefined") { delete sourcedata2['parse'] erjiextra.sourcedata = sourcedata2; setPageParams(erjiextra); } //当前二级详情数据保存 details.sname = sname; details.surl = surl; writeFile(detailsfile, JSON.stringify(details)); //收藏更新最新章节 if (parse['最新']) { setLastChapterRule('js:' + $.toString((surl, 最新) => { 最新(surl); }, surl, parse['最新'])) } putMyVar('SrcJuloading','1');//判断是否取本地缓存文件,软件打开初次必需在线取同名数据 } else { d.push({ title: "\n搜索接口源结果如下", desc: "\n\n选择一个源观看吧👇", pic_url: MY_PARAMS.img + '@Referer=', url: MY_PARAMS.img + '@Referer=', col_type: 'movie_1_vertical_pic_blur', extra: { gradient: true } }); d.push({ title: "", url: 'hiker://empty', col_type: 'text_center_1', extra: { id: "listloading", lineVisible: false } }); setResult(d); search(name); } } //搜索接口 function search(name, sdata) { let searchMark = storage0.getMyVar('searchMark') || {}; let loadid = getMyVar('SrcJuSousuo') == "1" ? 'sousuoloading' : 'listloading'; if (searchMark[name] && !sdata) { //log("重复搜索>"+name+",调用搜索缓存"); addItemBefore(loadid, searchMark[name]); updateItem(loadid, { title: getMyVar('SrcJuSousuo') == "1" ? "当前搜索为缓存" : "‘‘’’当前搜索为缓存" }) } else { showLoading('搜源中,请稍后.'); let searchMark = storage0.getMyVar('searchMark') || {}; let i = 0; let one = ""; for (var k in searchMark) { i++; if (i == 1) { one = k } } if (i > 20) { delete searchMark[one]; } let success = 0; let task = function (obj) { try { let parse; eval("let source = " + obj.erparse); if (source.ext && /^http/.test(source.ext)) { requireCache(source.ext, 48); parse = erdata; } else { parse = source; } let data = []; eval("let 搜索 = " + parse['搜索']) data = 搜索(name) || []; if (data.length > 0) { data.forEach(item => { let extra = item.extra || {}; extra.name = extra.name || item.title; extra.img = extra.img || item.img || item.pic_url; extra.stype = obj.type; extra.sname = obj.name; extra.pageTitle = extra.name; extra.surl = item.url ? item.url.replace(/#immersiveTheme#|#autoCache#|#noRecordHistory#|#noHistory#/, "") : ""; item.extra = extra; if (getMyVar('SrcJuSousuo') == "1") { item.url = $("hiker://empty#immersiveTheme##autoCache#").rule(() => { require(config.依赖); erji(); }) } else { item.url = item.url + $("#noLoading#").lazyRule((extra) => { if(getMyVar('SrcJuselectsname')){ return "toast://请勿重复点击,稍等..."; }else{ putMyVar('SrcJuselectsname','1'); clearMyVar(extra.sname+"_"+extra.name); storage0.putMyVar('erjiextra', extra); refreshPage(false); return "toast://已切换源:" + extra.sname; } }, extra); } item.content = item.desc; item.desc = getMyVar('SrcJuSousuo') == "1" ? MY_RULE.title + ' · ' + obj.name : obj.name + ' · ' + item.desc; item.col_type = getMyVar('SrcJuSousuo') == "1" ? "video" : "avatar"; }) searchMark[name] = searchMark[name] || []; searchMark[name] = searchMark[name].concat(data); addItemBefore(loadid, data); success++; hideLoading(); } } catch (e) { log(obj.name + '>搜源失败>' + e.message); } return 1; } if (sdata) { erdatalist = []; erdatalist.push(sdata); } let list = erdatalist.map((item) => { return { func: task, param: item, id: item.name } }); if (list.length > 0) { putMyVar('SrcJuSearching','1'); deleteItemByCls('loadlist'); be(list, { func: function (obj, id, error, taskResult) { }, param: { } }); if (!sdata) { storage0.putMyVar('searchMark', searchMark); } let sousuosm = getMyVar('SrcJuSousuo') == "1" ? success + "/" + list.length + ",搜索完成" : "‘‘’’" + success + "/" + list.length + ",搜索完成"; updateItem(loadid, { title: sousuosm }) toast('搜源完成'); } else { toast('无接口,未找到源'); } clearMyVar('SrcJuSearching'); hideLoading(); } } //取本地足迹记录 function getMark(name, stype) { let markfile = "hiker://files/rules/Src/Ju/mark.json"; let markdata = fetch(markfile); if (markdata != "") { eval("var marklist=" + markdata + ";"); } else { var marklist = []; } let mark = marklist.filter(it => { return it.name == name && it.stype == stype; }) if (mark.length > 0) { return mark[0]; } else { return ""; } } //保存本地足迹记录 function setMark(data) { let markfile = "hiker://files/rules/Src/Ju/mark.json"; let markdata = fetch(markfile); if (markdata != "") { eval("var marklist=" + markdata + ";"); } else { var marklist = []; } let mark = marklist.filter(it => { return it.name == data.name && it.stype == data.stype; }) if (mark.length > 0) { let index = marklist.indexOf(mark[0]); marklist.splice(index, 1) } marklist.push(data); if (marklist.length > 100) { marklist.splice(0, 1); } writeFile(markfile, JSON.stringify(marklist)); return 1; } //图标下载 function downloadicon() { try { if (!fileExist('hiker://files/cache/src/管理.svg')) { downloadFile('https://lanmeiguojiang.com/tubiao/messy/13.svg', 'hiker://files/cache/src/管理.svg'); } if (!fileExist('hiker://files/cache/src/更新.webp')) { downloadFile(config.依赖.match(/http(s)?:\/\/.*\//)[0] + "img/更新.webp", 'hiker://files/cache/src/更新.webp'); } if (!fileExist('hiker://files/cache/src/分类.webp')) { downloadFile(config.依赖.match(/http(s)?:\/\/.*\//)[0] + "img/分类.webp", 'hiker://files/cache/src/分类.webp'); } if (!fileExist('hiker://files/cache/src/排行.webp')) { downloadFile(config.依赖.match(/http(s)?:\/\/.*\//)[0] + "img/排行.webp", 'hiker://files/cache/src/排行.webp'); } if (!fileExist('hiker://files/cache/src/收藏.svg')) { downloadFile('https://lanmeiguojiang.com/tubiao/messy/165.svg', 'hiker://files/cache/src/收藏.svg'); } } catch (e) { } } //版本检测 function Version() { var nowVersion = "0.3";//现在版本 var nowtime = Date.now(); var oldtime = parseInt(getItem('VersionChecktime', '0').replace('time', '')); if (getMyVar('SrcJu-VersionCheck', '0') == '0' && nowtime > (oldtime + 12 * 60 * 60 * 1000)) { try { eval(request(config.依赖.match(/http(s)?:\/\/.*\//)[0].replace('/Ju/', '/master/') + 'SrcTmplVersion.js')) if (parseFloat(newVersion.SrcJu) > parseFloat(nowVersion)) { confirm({ title: '发现新版本,是否更新?', content: nowVersion + '=>' + newVersion.SrcJu + '\n' + newVersion.SrcJudesc[newVersion.SrcJu], confirm: $.toString((nowtime) => { setItem('VersionChecktime', nowtime + 'time'); deleteCache(); delete config.依赖; refreshPage(); }, nowtime), cancel: '' }) log('检测到新版本!\nV' + newVersion.SrcJu + '版本》' + newVersion.SrcJudesc[newVersion.SrcJu]); } putMyVar('SrcJu-Version', '-V' + newVersion.SrcJu); } catch (e) { } putMyVar('SrcJu-VersionCheck', '1'); } else { putMyVar('SrcJu-Version', '-V' + nowVersion); } }