[{"bookSourceComment":"聚合站点会一直更新其他的优质平台站点！本站唯一Telegram群组：https:\/\/t.me\/moyuexiaoshuo","bookSourceGroup":"墨阅-聚合","bookSourceName":"📖墨阅·起点","bookSourceType":0,"bookSourceUrl":"moyue:\/\/rapid","customButton":false,"customOrder":2,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"eventListener":false,"exploreUrl":"<js>\ntry{\nvar cfg = SRCFG(source);\nvar modes = ['小说','听书','漫画','短剧'];\nvar tab = cfg.mode || '小说';\nif(modes.indexOf(tab) < 0){ tab = '小说'; }\nvar srcList = {};\ntry{ srcList = JSON.parse(String(java.ajax(host + '\/legado\/sources'))); }catch(e){}\nvar plats = SRCLIST(srcList, tab);\nvar out = [];\nout.push(SRFLT('模式', modes, tab, '模式', 1));\nout.push(SRFLT('平台', plats, cfg.platform, '平台', 1));\nif(tab == '小说'){\n  out.push(SRFLT('频道', ['男频','女频'], cfg.gender, '频道', 1));\n}\nvar plat = (cfg.platform=='' || cfg.platform=='全部' || plats.indexOf(cfg.platform)<0) ? '番茄' : PLATNAME(cfg.platform);\nvar gd = (cfg.gender == '女频') ? 2 : 1;\nvar menuUrl = host + '\/legado\/explore\/menu?tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(plat) + '&gender=' + encodeURIComponent(cfg.gender);\nvar menuLoaded = false;\ntry{\n  var menu = JSON.parse(String(java.ajax(menuUrl)));\n  if(Array.isArray(menu) && menu.length > 0){\n    out = out.concat(menu);\n    menuLoaded = true;\n    try{\n      var sv = {};\n      try{ sv = JSON.parse(source.getVariable() || '{}'); }catch(e){}\n      sv._exploreCache = JSON.stringify(menu);\n      source.setVariable(JSON.stringify(sv));\n    }catch(e){}\n  }\n}catch(e){}\nif(!menuLoaded){\n  var cached = '';\n  try{\n    var sv = JSON.parse(source.getVariable() || '{}');\n    cached = sv._exploreCache || '';\n  }catch(e){}\n  if(cached){\n    try{\n      var cm = JSON.parse(cached);\n      if(Array.isArray(cm) && cm.length > 0){\n        out = out.concat(cm);\n        menuLoaded = true;\n      }\n    }catch(e){}\n  }\n}\nif(!menuLoaded){\n  var bt = encodeURIComponent(tab);\n  var bp = encodeURIComponent(plat);\n  var ranks = ['推荐榜','完本榜','热门榜','新书榜'];\n  for(var ri=0; ri<ranks.length; ri++){\n    out.push({title:ranks[ri], url:host+'\/legado\/explore\/data?source='+bp+'&tab='+bt+'&bdtype='+encodeURIComponent(ranks[ri])+'&gender='+gd+'&is_ranking=1&page={{page}}', style:{layout_flexGrow:1, layout_flexBasisPercent:0.25}});\n  }\n}\nJSON.stringify(out);\n}catch(e){\n  JSON.stringify([{title:'发现页加载失败，下拉刷新重试', url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1}}]);\n}\n<\/js>","header":"@js:try{var v=JSON.parse(source.getVariable()||'{}');v.token?JSON.stringify({'Authorization':'Bearer '+v.token,'User-Agent':'Legado\/3.0'}):JSON.stringify({'User-Agent':'Legado\/3.0'});}catch(e){JSON.stringify({'User-Agent':'Legado\/3.0'});}","jsLib":"\nvar host = 'https:\/\/moyue.app';\n\nfunction J(r){ if(typeof r==='string'){ try{return JSON.parse(r);}catch(e){ return {}; } } return r||{}; }\nfunction detailUrlOf(bu){ return host+'\/legado\/detail?url='+encodeURIComponent(bu); }\nfunction tocUrlOf(bu){ return host+'\/legado\/toc?url='+encodeURIComponent(bu); }\n\nfunction contentUrlOf(cu){ return host+'\/legado\/content?url='+encodeURIComponent(cu)+'&fmt=legado'; }\nfunction PLATNAME(p){ return String(p||'').replace(\/\\(VIP\\)$\/,''); }\n\n\n\nfunction SRCLIST(j, tab){\n  var out=['全部'];\n  try{\n    var a=(j&&j[tab])||[];\n    for(var i=0;i<a.length;i++){ out.push(a[i].n + (a[i].v ? '(VIP)' : '')); }\n  }catch(e){}\n  if(out.length<2){ out.push('番茄'); }\n  return out;\n}\nfunction SRCFG(src){\n  var v={};\n  try{ v=JSON.parse(src.getVariable()||'{}')||{}; }catch(e){ v={}; }\n  var m=null;\n  try{ m=src.getLoginInfoMap(); }catch(e){ m=null; }\n  function pick(k,d){\n    if(v[k]){ return String(v[k]); }\n    if(m){ try{ var x=m.get(k); if(x){ return String(x); } }catch(e){} }\n    return d;\n  }\n  var h=String(v.host||'').trim();\n  if(!h && m){ try{ var lh=m.get('线路'); if(lh){ h=String(lh); } }catch(e){} }\n  if(!h){ h=host; }\n  if(h.indexOf('http')!=0){ h='http:\/\/'+h; }\n  return { host:h, gender:pick('频道','男频'), platform:pick('平台','全部'), mode:pick('模式','小说') };\n}\nfunction SRSHOW(m, t){\n  var j=this.java, s=this.source;\n  var data={};\n  try{ data=JSON.parse(s.getVariable()||'{}')||{}; }catch(e){ data={}; }\n  data[t]=m;\n  s.setVariable(JSON.stringify(data));\n  j.refreshExplore();\n}\nfunction SRFLT(title, chars, def, key, size){\n  return { title:title, type:'select', chars:chars, default:def,\n    action:\"SRSHOW(infoMap['\"+title+\"'],'\"+key+\"')\",\n    style:{layout_flexGrow:1, layout_flexBasisPercent:size} };\n}\nfunction SRHDR(title){\n  return { title:title, url:'', style:{layout_flexGrow:1, layout_flexBasisPercent:1} };\n}\n\n\n\n\n\n\nfunction probe() {\n    var java = this.java;\n    var source = this.source;\n\n    try {\n        if (typeof java.showReadingBrowser == 'function') {\n            return \"ios\";\n        }\n    } catch (e) {}\n\n    try {\n        if (typeof java.reLoginView == 'function') {\n            return \"panel\";\n        }\n        new Packages.io.legado.kazusa.utils.TimeoutCancellationException('');\n        return \"panel\";\n    } catch (e) {}\n\n    try {\n        if (typeof source.loginUi == 'function') {\n            return \"browser\";\n        }\n    } catch (e) {}\n\n    return \"panel\";\n}\n\nfunction openReview(url, sources, ident) {\n    var java = this.java;\n    if (ident == null) ident = '段评';\n    var rt = this.probe();\n    if (rt == \"panel\") {\n        var htmlContent = '';\n        try {\n            htmlContent = java.ajax(url);\n        } catch (e) {}\n        try {\n        java.showBrowser(\n            url,\n            htmlContent,\n            'window.java=java;',\n            JSON.stringify({\n                \"expandedCornersRadius\": 20,\n                \"dismissOnTouchOutside\": true,\n                \"isDraggable\": true,\n                \"shouldDimBackground\": true,\n                \"backgroundDimAmount\": 0.5,\n                \"hardwareAccelerated\": true,\n                \"isNestedScrollingEnabled\": true,\n                \"isGestureInsetBottomIgnored\": true,\n                \"setFitToContents\": true,\n                \"isHideable\": true,\n                \"heightPercentage\": 0.8\n            })\n        );\n        } catch (e) {\n            java.startBrowser(url, sources + ident);\n        }\n    } else {\n        try { java.showReadingBrowser(url, sources + ident); return; } catch (e) {}\n        java.startBrowser(url, sources + ident);\n    }\n}\n\nfunction godOpen(u, t) { try { java.showReadingBrowser(u, t); return; } catch (e) {} try { java.startBrowser(u, t); } catch (e) {} }\n","lastUpdateTime":"1792105980755","loginCheckJs":"if(result.code()==401||String(result.body()).indexOf('40101')>=0){source.login();var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){v={};}var h={'User-Agent':'Legado\/3.0'};if(v.token){h['Authorization']='Bearer '+v.token;}var u='';try{u=String(result.request().url());}catch(e){u='';}if(u){java.getStrResponse(u,JSON.stringify(h));}else{java.getStrResponse();}}else{result;}","loginUi":"[{\"name\": \"邮箱\", \"type\": \"text\", \"default\": \"\"}, {\"name\": \"密码\", \"type\": \"password\", \"default\": \"\"}, {\"name\": \"登录墨阅\", \"type\": \"button\", \"action\": \"login(true)\"}, {\"name\": \"📝注册账号\", \"type\": \"button\", \"action\": \"java.startBrowserAwait((function(){var b='';try{b=String((JSON.parse(source.getVariable()||'{}')||{}).host||'');}catch(e){}return b||((typeof host!=='undefined'&&host)?host:'https:\/\/moyue.app');})()+'\/register','注册墨阅账号')\"}, {\"name\": \"个人中心\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}var t=String(v.token||'');if(!t){java.toast('请先登录书源账号');return;}var bh=String(v.host||'')||((typeof host!=='undefined'&&host)?host:'https:\/\/moyue.app');java.startBrowser(bh+'\/user\/token-login?token='+encodeURIComponent(t),'墨阅·个人中心');})()\"}, {\"name\": \"退出登录\", \"type\": \"button\", \"action\": \"(function(){var v={};try{v=JSON.parse(source.getVariable()||'{}');}catch(e){}delete v.token;source.setVariable(JSON.stringify(v));java.toast('已退出登录');})()\"}]","loginUrl":"function login(flag){\n  if(flag===undefined){\n    try{ result=JSON.parse(source.getLoginInfo()||'{}'); }catch(e){ result={}; }\n  }else{\n    try{ source.putLoginInfo(JSON.stringify(result)); result=JSON.parse(source.getLoginInfo()||'{}'); }catch(e){ result={}; }\n  }\n  var email=String(result['邮箱']||'');\n  var pwd=String(result['密码']||'');\n  if(!email||!pwd){ java.longToast('请填写邮箱和密码'); throw '请填写邮箱和密码'; }\n  var hh='';try{hh=String((JSON.parse(source.getVariable()||'{}')||{}).host||'').trim();}catch(e){}\n  if(!hh){ try{ hh=String(result['线路']||'').trim(); }catch(e){} }\n  if(!hh){ hh=(typeof host!=='undefined')?host:''; }\n  if(hh.indexOf('http')!=0){ hh='http:\/\/'+hh; }\n  var opt=JSON.stringify({method:'POST',body:JSON.stringify({email:email,password:pwd}),headers:{'Content-Type':'application\/json'}});\n  java.longToast('正在登录…');\n  var resp=java.ajax(hh+'\/legado\/login,'+opt);\n  var j=JSON.parse(resp);\n  if(j && j.code==200 && j.data && j.data.token){\n    var vv={};try{vv=JSON.parse(source.getVariable()||'{}');}catch(e){}\n    vv.token=j.data.token; vv.host=hh;\n    source.setVariable(JSON.stringify(vv));\n    java.longToast('登录成功'+((j.data.user&&j.data.user.nickname)?('：'+j.data.user.nickname):''));\n  }else{\n    var em=(j&&j.msg)||'登录失败'; java.longToast(em); throw em;\n  }\n}","respondTime":180000,"ruleBookInfo":{"author":"$.author","coverUrl":"$.coverUrl","intro":"$.intro","kind":"{{$.origin}} {{$.kind}}","lastChapter":"$.lastChapter","name":"$.name","tocUrl":"<js>\nvar b = J(result);\nif(!b.bookUrl){ throw '详情bookUrl为空:' + String(result).substring(0,60); }\ntry{ book.type = b.bookType || 8; }catch(e){}\nhost + '\/legado\/toc?url=' + encodeURIComponent(b.bookUrl);\n<\/js>","wordCount":"$.wordCount"},"ruleContent":{"content":"<js>\nvar r = J(result);\nif(r.error){ throw r.error; }\ntry{ book.type = r.bookType || 8; }catch(e){}\nvar out;\nif(r.playUrl){\n  try{ java.startBrowser(r.playUrl, String(book.name||'短剧播放')); java.toast('正在打开播放器，支持选集\/倍速\/自动连播'); }catch(e){}\n  out = '【正在打开播放器】支持选集\/倍速\/自动连播';\n}else{\n  out = (r.lines||[]).join('\\n');\n  try{\n    var pf = 'panel';\n    try{ pf = probe.call(this) || 'panel'; }catch(e1){}\n    var rr = java.ajax(host + '\/legado\/render?pf=' + pf + ',' + JSON.stringify({method:'POST', body: out, headers:{'Content-Type':'text\/plain;charset=utf-8'}}));\n    rr = String(rr||'');\n    if(rr && rr.indexOf('error') < 0){ out = rr; }\n  }catch(e2){}\n}\nout;\n<\/js>","imageStyle":"full"},"ruleExplore":{"author":"$.author","bookList":"$","bookUrl":"<js>detailUrlOf(J(result).bookUrl)<\/js>","coverUrl":"$.coverUrl","intro":"$.intro","kind":"{{$.origin}} {{$.kind}}","lastChapter":"$.lastChapter","name":"$.name","wordCount":"$.wordCount"},"ruleSearch":{"author":"$.author","bookList":"$","bookUrl":"<js>detailUrlOf(J(result).bookUrl)<\/js>","checkKeyWord":"斗破苍穹","coverUrl":"$.coverUrl","intro":"$.intro","kind":"{{$.origin}} {{$.kind}}","lastChapter":"$.lastChapter","name":"$.name","wordCount":"$.wordCount"},"ruleToc":{"chapterList":"<js>\nvar r = JSON.parse(String(result));\nif(!Array.isArray(r) || r.length === 0){ throw '目录为空:' + String(result).substring(0,60); }\ntry{ book.type = r[0].bookType || 8; }catch(e){}\nJSON.stringify(r);\n<\/js>$[*]","chapterName":"$.title","chapterUrl":"<js>contentUrlOf(J(result).url)<\/js>","isVolume":"<js>J(result).isVolume===true<\/js>","updateTime":"$.updateTime"},"searchUrl":"<js>\nvar cfg = SRCFG(source);\nvar tab = cfg.mode || '小说';\nhost + '\/legado\/search?key=' + encodeURIComponent(key) + '&page=' + page + '&tab=' + encodeURIComponent(tab) + '&source=' + encodeURIComponent(PLATNAME(cfg.platform));\n<\/js>","weight":0}]