📖墨阅·起点
moyue://rapid
asdfhsf (15143)1天前
聚合站点会一直更新其他的优质平台站点!本站唯一Telegram群组:https://t.me/moyuexiaoshuo
{
"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
}