🍊青橙小说API
https://goway.reader.yueyouxs.com
laizhiyu (6509)1天前
该用户很懒,什么介绍也没有写!
{
"bookSourceGroup": "API,APP",
"bookSourceName": "🍊青橙小说API",
"bookSourceType": 0,
"bookSourceUrl": "https:\/\/goway.reader.yueyouxs.com",
"bookUrlPattern": "https?:\/\/(?:goway|dl|cdn\\.p|ads|bi)\\.reader\\.yueyouxs\\.com\/goway\/goread\/app\/book\/detail\\?bookId=[0-9]+.*",
"concurrentRate": "1500",
"customButton": false,
"customOrder": 4,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "@js:\n(function(){\n var out=[];\n var CHS={\"男频\": {\"c\": \"11\", \"cls\": [[\"都市人生\", 1100], [\"玄幻奇幻\", 1101], [\"武侠仙侠\", 1102], [\"军事历史\", 1103], [\"科幻末世\", 1104], [\"游戏体育\", 1105], [\"悬疑灵异\", 1107], [\"脑洞大开\", 1108]], \"plot\": [\"乡土\", \"系统\", \"重生\", \"热血\", \"升级流\", \"废材流\", \"洪荒\", \"无敌流\", \"医术\", \"脑洞\", \"扮猪吃虎\", \"年代\"], \"role\": [\"高手下山\", \"赘婿\", \"兵王\", \"神医\", \"保镖\", \"奶爸\", \"女总裁\", \"校花\", \"神豪\", \"至尊\", \"草根\", \"妖孽\"], \"common\": true}, \"女频\": {\"c\": \"21\", \"cls\": [[\"现代言情\", 2100], [\"古代言情\", 2101], [\"幻想言情\", 2102], [\"穿越时空\", 2104], [\"宫闱争斗\", 2105], [\"豪门总裁\", 2106], [\"婚恋爱情\", 2107], [\"经商种田\", 2108]], \"plot\": [\"甜宠\", \"先婚后爱\", \"医术\", \"马甲\", \"重生\", \"扮猪吃虎\", \"种田\", \"快穿\", \"系统\", \"娱乐圈\", \"年代\", \"穿越\"], \"role\": [\"总裁\", \"萌宝\", \"女强\", \"团宠\", \"反派\", \"王妃\", \"嫡女\", \"皇后\", \"宠妻\", \"腹黑\", \"天才\", \"农女\"], \"common\": true}, \"短篇\": {\"c\": \"41\", \"cls\": [[\"现实情感\", 4100], [\"家庭婚姻\", 4102], [\"热血青春\", 4103], [\"治愈成长\", 4104], [\"奇闻怪谈\", 4105], [\"悬疑脑洞\", 4106], [\"古风言情\", 4107]], \"plot\": [\"出轨\", \"反转\", \"婚姻\", \"家庭\", \"打脸逆袭\", \"治愈\", \"白月光\", \"虐恋\", \"重生\"], \"role\": [], \"common\": false}, \"图书\": {\"c\": \"31\", \"cls\": [[\"学习强国\", 3104], [\"文学小说\", 3102], [\"古代典籍\", 3103], [\"名家名作\", 3105], [\"出版读物\", 3101], [\"史家专著\", 3108]], \"plot\": [], \"role\": [], \"common\": false}};\n var ch='',hasIm=false;\n try{ if(typeof infoMap!=='undefined' && infoMap['频道']){ ch=String(infoMap['频道']); hasIm=true; } }catch(e){}\n if(!hasIm){ try{ var v=String(java.get('qcChannel')||''); if(v) ch=v; }catch(e){} }\n if(!CHS[ch]) ch='男频';\n var cfg=CHS[ch], cnum=cfg.c, C=cfg.cls, PLOT=cfg.plot, ROLE=cfg.role;\n\n function head(title){\n return {title:title,url:'',type:'button',action:\"java.toast('\"+title+\"')\",\n style:{layout_flexBasisPercent:1,layout_wrapBefore:true,layout_flexGrow:0}};\n }\n function sec(title,sid){\n var bd='data=§ionId='+sid+'&page=1';\n return {title:title,url:QC_url('\/goway\/goread\/app\/section\/v4\/book\/list','',bd)+','+QC_opt(bd),style:{}};\n }\n function simple(title,path,bd){\n return {title:title,url:QC_url('\/goway\/goread\/app\/'+path,'',bd)+','+QC_opt(bd),style:{}};\n }\n function paged(title,tagList,c,cs,ob,ff){\n var bd='tagList='+tagList+'&classify='+c+'&psize=20&fullFlag='+ff+'&tagTypeId=0&orderBy='+ob+'&page=1&classifySecondList='+cs;\n var js=\"(function(){var pg=1;try{if(page!=null&&String(page)!=='')pg=parseInt(String(page))||1;}catch(e){}try{var m=String(result).match(\/[?&]page=([0-9]+)\/);if(m)pg=parseInt(m[1])||1;}catch(e){}if(pg<1)pg=1;return 'https:\/\/goway.reader.yueyouxs.com'+QC_sign('\/goway\/goread\/app\/classify\/v352\/search','page='+pg,\"+JSON.stringify(bd)+\");})()\";\n var opt={\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application\/x-www-form-urlencoded\",\"User-Agent\":\"okhttp\/4.10.0\"},\"body\":bd,\"js\":js};\n return {title:title,url:'https:\/\/goway.reader.yueyouxs.com\/goway\/goread\/app\/classify\/v352\/search?page={{page}},'+JSON.stringify(opt),style:{}};\n }\n\n \/* ① 频道 select: 男频\/女频\/短篇\/图书 *\/\n out.push({title:'频道',type:'select',chars:['男频','女频','短篇','图书'],default:'男频',\n action:\"java.put('qcChannel',infoMap['频道']); java.refreshExplore();\",style:{layout_wrapBefore:true}});\n out.push({title:'状态',type:'button',action:\"java.toast('当前频道:'+(java.get('qcChannel')||'男频'))\",\n viewName:\"'当前:'+(java.get('qcChannel')||'男频')\",style:{layout_wrapBefore:true}});\n \/* ② 通用榜单只给男频\/女频(短篇\/图书的 rank\/clsTag 实测忽略 classify 恒返回男频数据, 不挂避免误导) *\/\n if(cfg.common){\n var S=[[\"🔥 热门风向标\", 3066], [\"⭐ 满级神作\", 3068], [\"📈 热门追更榜\", 2747], [\"✅ 完结精品库\", 2748], [\"🚀 异军突起\", 2751], [\"📕 火爆完本\", 3227], [\"🆕 最新好书\", 3228]];\n for(var i=0;i<S.length;i++) out.push(sec(S[i][0],S[i][1]));\n out.push(simple('🏆 热门排行','rank\/v4\/index','classify='+cnum));\n out.push(simple('🏷️ 标签精选','clsTag\/getBookList','classify='+cnum+'&page=1'));\n out.push(simple('✨ 个性化推荐','section\/v4\/recommend\/list','data=&page=1'));\n }\n \/* ③ 分类: 满格标题 + 常驻 热度\/更新\/新书 *\/\n var O=[[\"热度\", \"readers\"], [\"更新\", \"cpsUpdateTime\"], [\"新书\", \"createTime\"]];\n out.push(head('📚 '+ch+' · 题材分类'));\n for(var i=0;i<C.length;i++){\n out.push(head(C[i][0]));\n for(var k=0;k<O.length;k++) out.push(paged(O[k][0],'',cnum,String(C[i][1]),O[k][1],'-1'));\n }\n \/* ④ 情节标签 *\/\n if(PLOT.length){\n out.push(head('🎭 '+ch+' · 情节标签'));\n for(var i=0;i<PLOT.length;i++) out.push(paged(PLOT[i],PLOT[i],cnum,'','readers','-1'));\n }\n \/* ⑤ 角色标签 *\/\n if(ROLE.length){\n out.push(head('👤 '+ch+' · 角色标签'));\n for(var i=0;i<ROLE.length;i++) out.push(paged(ROLE[i],ROLE[i],cnum,'','readers','-1'));\n }\n \/* ⑥ 状态筛选(常驻有 url, 保证短篇\/图书也有非空 url 首项) *\/\n var F=[[\"全部\", \"-1\"], [\"连载\", \"0\"], [\"完结\", \"1\"]];\n out.push(head('📖 '+ch+' · 全站状态'));\n for(var k=0;k<F.length;k++) out.push(paged(F[k][0],'',cnum,'','readers',F[k][1]));\n return JSON.stringify(out);\n})()",
"header": "{\n \"User-Agent\": \"okhttp\/4.10.0\",\n \"Content-Type\": \"application\/x-www-form-urlencoded\"\n}",
"jsLib": "\/* 青橙小说 签名库 (QC) —— 静态票据 + 按 path\/query\/body 重算 sign\n 自 com.qingcheng.reader 5.0.1.1 \/ libnative-lib.so\n _s = MD5(deviceId+userId) 固定\n sign = HMAC-SHA256(KEY, path+encodedQuery+\"&\"+R0+\"&\"+排序POST参数(解一层URL编码))\n _p = URLEncode(DES\/ECB\/NoPadding(DESK, R0+\"&sign=\"+sign + \\u0001填充到8倍数)) Base64\n 注: R0 内 uth 依赖旧 time, 故 time 必须固定为抓包时刻; 服务端实测无时间窗口(40min+仍有效)\n*\/\nvar QC_KEY='NiozHhg\/lMm5ja-DVEV_jzk$,t0B4*$5';\nvar QC_DESK='snY%169j';\nvar QC_R0='utId=&deviceId=ylms&userId=y233108512&sex=unknown&tmpToken=18ed8908ad0749d2ab6e1dc91f055eec&st=4&uth=21920cda455ba0f3883dc675899c5354&oaid=&udid=';\nvar QC_COMMON='platId=2&appId=com.qingcheng.reader&channelId=qingchengxs&appVersion=5.0.1&srcChannelId=qingchengxs&time=1794411627&_s=0D8E1B4226B86B69A867999DE9F2C505&mode=1&verCode=5000101&insTs=1794411459';\nvar QC_B64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\nfunction QC_b64(x){var o='';for(var i=0;i<x.length;i+=3){var a=x[i]&255,b=i+1<x.length?x[i+1]&255:0,c=i+2<x.length?x[i+2]&255:0,n=(a<<16)|(b<<8)|c;o+=QC_B64.charAt((n>>18)&63)+QC_B64.charAt((n>>12)&63)+(i+1<x.length?QC_B64.charAt((n>>6)&63):'=')+(i+2<x.length?QC_B64.charAt(n&63):'=');}return o;}\nfunction QC_dec1(s){var o='';for(var i=0;i<s.length;i++){if(s.charAt(i)==='%'&&i+2<s.length){var h=s.slice(i+1,i+3);if(\/^[0-9a-fA-F]{2}$\/.test(h)){o+=String.fromCharCode(parseInt(h,16));i+=2;continue;}}o+=s.charAt(i);}return o;}\nfunction QC_hm(s){var m=Packages.javax.crypto.Mac.getInstance('HmacSHA256');m.init(new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_KEY).getBytes('UTF-8'),'HmacSHA256'));var d=m.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8'));var o='';for(var i=0;i<d.length;i++){var h=(d[i]&255).toString(16);o+=h.length<2?'0'+h:h;}return o;}\nfunction QC_ec(s){var c=Packages.javax.crypto.Cipher.getInstance('DES\/ECB\/NoPadding');c.init(Packages.javax.crypto.Cipher.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_DESK).getBytes('UTF-8'),'DES'));return QC_b64(c.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8')));}\nfunction QC_jurl(s){return String(Packages.java.net.URLEncoder.encode(s,'UTF-8'));}\nfunction QC_sign(path,queryExtra,body){\n var q=QC_COMMON+(queryExtra?'&'+queryExtra:'');\n var d={},ps=String(body||'').split('&');\n for(var i=0;i<ps.length;i++){var p=ps[i].indexOf('=');if(p>0)d[ps[i].slice(0,p)]=QC_dec1(ps[i].slice(p+1));}\n var ks=[];for(var k in d)ks.push(k);ks.sort();\n var so=[];for(var i=0;i<ks.length;i++)if(d[ks[i]]!=='')so.push(ks[i]+'='+d[ks[i]]);\n var plain=QC_R0+'&sign='+QC_hm(path+q+'&'+QC_R0+'&'+so.join('&'));\n var L=new Packages.java.lang.String(plain).getBytes('UTF-8').length;\n while(L%8!==0){plain+='\\u0001';L++;}\n return path+'?'+q+'&_p='+QC_jurl(QC_ec(plain));\n}\n\n\/* QC_url: 纯函数, 返回带签名的完整 URL (不含 java 绑定) *\/\nfunction QC_url(path, qe, body, host){\n return 'https:\/\/' + (host || 'goway.reader.yueyouxs.com') + QC_sign(path, qe, body);\n}\nfunction QC_opt(body){\n return JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application\/x-www-form-urlencoded\",\"User-Agent\":\"okhttp\/4.10.0\"},\"body\":body});\n}\nfunction QC_clean(s){ return String(s==null?'':s).replace(\/<[^>]*>\/g,'').replace(\/ \/g,' ').replace(\/&\/g,'&'); }\nfunction QC_post(path, qe, body, host, jv){\n return String(jv.ajax(QC_url(path,qe,body,host) + ',' + QC_opt(body)));\n}\n",
"lastUpdateTime": "1794548526828",
"loginUi": "[{\"name\": \"状态\", \"type\": \"button\", \"action\": \"QC_checkLogin(java)\", \"viewName\": \"QC_statusLabel()\"}, {\"name\": \"线路\", \"type\": \"button\", \"action\": \"QC_testMs(java)\", \"viewName\": \"QC_lineLabel()\"}, {\"name\": \"🔍 检查登录状态\", \"type\": \"button\", \"action\": \"QC_checkLogin(java)\"}, {\"name\": \"⚡ 测试官方API延时\", \"type\": \"button\", \"action\": \"QC_testMs(java)\"}, {\"name\": \"📚 测试目录·正文线路\", \"type\": \"button\", \"action\": \"QC_testDl(java)\"}, {\"name\": \"🧪 签名票据自检\", \"type\": \"button\", \"action\": \"QC_selfTest(java)\"}]",
"loginUrl": "\/* 青橙小说 签名库 (QC) —— 静态票据 + 按 path\/query\/body 重算 sign\n 自 com.qingcheng.reader 5.0.1.1 \/ libnative-lib.so\n _s = MD5(deviceId+userId) 固定\n sign = HMAC-SHA256(KEY, path+encodedQuery+\"&\"+R0+\"&\"+排序POST参数(解一层URL编码))\n _p = URLEncode(DES\/ECB\/NoPadding(DESK, R0+\"&sign=\"+sign + \\u0001填充到8倍数)) Base64\n 注: R0 内 uth 依赖旧 time, 故 time 必须固定为抓包时刻; 服务端实测无时间窗口(40min+仍有效)\n*\/\nvar QC_KEY='NiozHhg\/lMm5ja-DVEV_jzk$,t0B4*$5';\nvar QC_DESK='snY%169j';\nvar QC_R0='utId=&deviceId=ylms&userId=y233108512&sex=unknown&tmpToken=18ed8908ad0749d2ab6e1dc91f055eec&st=4&uth=21920cda455ba0f3883dc675899c5354&oaid=&udid=';\nvar QC_COMMON='platId=2&appId=com.qingcheng.reader&channelId=qingchengxs&appVersion=5.0.1&srcChannelId=qingchengxs&time=1794411627&_s=0D8E1B4226B86B69A867999DE9F2C505&mode=1&verCode=5000101&insTs=1794411459';\nvar QC_B64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\nfunction QC_b64(x){var o='';for(var i=0;i<x.length;i+=3){var a=x[i]&255,b=i+1<x.length?x[i+1]&255:0,c=i+2<x.length?x[i+2]&255:0,n=(a<<16)|(b<<8)|c;o+=QC_B64.charAt((n>>18)&63)+QC_B64.charAt((n>>12)&63)+(i+1<x.length?QC_B64.charAt((n>>6)&63):'=')+(i+2<x.length?QC_B64.charAt(n&63):'=');}return o;}\nfunction QC_dec1(s){var o='';for(var i=0;i<s.length;i++){if(s.charAt(i)==='%'&&i+2<s.length){var h=s.slice(i+1,i+3);if(\/^[0-9a-fA-F]{2}$\/.test(h)){o+=String.fromCharCode(parseInt(h,16));i+=2;continue;}}o+=s.charAt(i);}return o;}\nfunction QC_hm(s){var m=Packages.javax.crypto.Mac.getInstance('HmacSHA256');m.init(new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_KEY).getBytes('UTF-8'),'HmacSHA256'));var d=m.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8'));var o='';for(var i=0;i<d.length;i++){var h=(d[i]&255).toString(16);o+=h.length<2?'0'+h:h;}return o;}\nfunction QC_ec(s){var c=Packages.javax.crypto.Cipher.getInstance('DES\/ECB\/NoPadding');c.init(Packages.javax.crypto.Cipher.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(new Packages.java.lang.String(QC_DESK).getBytes('UTF-8'),'DES'));return QC_b64(c.doFinal(new Packages.java.lang.String(s).getBytes('UTF-8')));}\nfunction QC_jurl(s){return String(Packages.java.net.URLEncoder.encode(s,'UTF-8'));}\nfunction QC_sign(path,queryExtra,body){\n var q=QC_COMMON+(queryExtra?'&'+queryExtra:'');\n var d={},ps=String(body||'').split('&');\n for(var i=0;i<ps.length;i++){var p=ps[i].indexOf('=');if(p>0)d[ps[i].slice(0,p)]=QC_dec1(ps[i].slice(p+1));}\n var ks=[];for(var k in d)ks.push(k);ks.sort();\n var so=[];for(var i=0;i<ks.length;i++)if(d[ks[i]]!=='')so.push(ks[i]+'='+d[ks[i]]);\n var plain=QC_R0+'&sign='+QC_hm(path+q+'&'+QC_R0+'&'+so.join('&'));\n var L=new Packages.java.lang.String(plain).getBytes('UTF-8').length;\n while(L%8!==0){plain+='\\u0001';L++;}\n return path+'?'+q+'&_p='+QC_jurl(QC_ec(plain));\n}\n\n\/* ===== 运维面板 ===== *\/\n\n\/* 青橙小说 运维面板(精简版): 本源固定官方域, 无发布页线路轮换; 游客态免登录 *\/\nfunction login(){ return 'ok'; }\nfunction QC_tip(jv,msg,key,val){\n try{jv.toast(String(msg));}catch(e){}\n try{jv.longToast(String(msg));}catch(e){}\n try{if(key)jv.put(key,String(val==null?msg:val));}catch(e){}\n try{jv.reLoginView(false);}catch(e){try{jv.reUiView(false);}catch(e2){}}\n return String(msg);\n}\nfunction QC_get(jv,k,d){var v='';try{v=String(jv.get(k)||'');}catch(e){}return v||d;}\n\/* ① 检查登录状态: 本源游客态即可用, 显示票据与接口状态 *\/\nfunction QC_checkLogin(jv){\n QC_tip(jv,'⏳ 正在检查接口与票据状态…','qcStatus','检查中…');\n var body='bookId=272713&needChapter=0&needRecommend=0',ok=false,ms=0,code='?',t0=Date.now();\n try{\n var u='https:\/\/goway.reader.yueyouxs.com'+QC_sign('\/goway\/goread\/app\/book\/detail','',body);\n var o=JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application\/x-www-form-urlencoded\",\"User-Agent\":\"okhttp\/4.10.0\"},\"body\":body});\n var s=String(jv.ajax(u+','+o)); ms=Date.now()-t0;\n try{code=String(JSON.parse(s).code);}catch(e){}\n ok=(code==='0');\n }catch(e){}\n var state=ok?'✅ 游客态可用(本源无需登录)':'❌ 接口异常 code='+code;\n return QC_tip(jv,'登录状态:'+state+'|票据 _s 静态有效|延时 '+ms+'ms','qcStatus',(ok?'游客态OK':'异常')+' '+ms+'ms');\n}\n\/* ② 官方 API 线路延时测试(单域, ms 写入状态按钮) *\/\nfunction QC_testMs(jv){\n QC_tip(jv,'⏳ 正在测试官方 API 线路延时…','qcStatus','测速中…');\n var body='bookId=272713&needChapter=0&needRecommend=0',ms='失败',ok=false;\n var t0=Date.now();\n try{\n var u='https:\/\/goway.reader.yueyouxs.com'+QC_sign('\/goway\/goread\/app\/book\/detail','',body);\n var o=JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application\/x-www-form-urlencoded\",\"User-Agent\":\"okhttp\/4.10.0\"},\"body\":body});\n var s=String(jv.ajax(u+','+o));\n ok=(s.indexOf('\"code\":0')>=0&&s.indexOf('bookName')>=0);\n ms=ok?String(Date.now()-t0)+'ms':'不可用';\n }catch(e){}\n jv.put('qcSpeed',ms);\n return QC_tip(jv,(ok?'✅ 官方线路正常 ':'❌ 官方线路异常 ')+ms,'qcStatus','官方线路 '+ms);\n}\n\/* ③ 目录\/正文线路延时测试 *\/\nfunction QC_testDl(jv){\n QC_tip(jv,'⏳ 正在测试目录·正文线路延时…','qcStatus','测速中…');\n var qe='bookId=272713&chapterId=0&isAll=1',ms='失败',ok=false,t0=Date.now();\n try{\n var u='https:\/\/dl.reader.yueyouxs.com'+QC_sign('\/userCenter\/getChapterList',qe,'tmp=');\n var o=JSON.stringify({\"method\":\"POST\",\"headers\":{\"Content-Type\":\"application\/x-www-form-urlencoded\",\"User-Agent\":\"okhttp\/4.10.0\"},\"body\":\"tmp=\"});\n var s=String(jv.ajax(u+','+o));\n ok=(s.indexOf('\"code\":0')>=0&&s.indexOf('chapterId')>=0);\n ms=ok?String(Date.now()-t0)+'ms':'不可用';\n }catch(e){}\n jv.put('qcSpeedDl',ms);\n return QC_tip(jv,(ok?'✅ 目录·正文线路正常 ':'❌ 目录·正文线路异常 ')+ms,'qcStatus','DL线路 '+ms);\n}\n\/* ④ 签名票据自检(重放比对, 内联签名库已在上方) *\/\nfunction QC_selfTest(jv){\n QC_tip(jv,'⏳ 正在校验签名算法…','qcStatus','自检中…');\n var cap='8V2uOfk%2BpFEuFu1J9nzFSeDyHv%2FOQgsQenZywqH7gBHpM%2FLtd%2FKPiKPTOS7aisJR1ltB3Zvzx2aLVhM1cNqMfcb8GXmQJO2bQuNS4CQqnjgQkU0zCzziJRuwtQmEFVbtlfDwvxsOUFO6ibx%2Fbu1dZGOV4rtnAngaC7ff7RUc2JVJKnwp1%2BKAdqA8iYZUvh1OwcmKRoDc2sJsNjSR%2FTJEdK%2BOLxPDSsU93PlW37m%2FFNg1lKWycncbvRTnLfDsABhvvwxvOUxexfRg0bxifksRZLOMjNtnoxJe';\n var B='trace=20_20-17-1x265526%253FisRead%253D0%2526sectionId%253D295%2526id%253D5348&needRecommend=0&shelfBookIds=272713%2C271939%2C266764%2C275277%2C247700%2C272997%2C265526%2C269934&needChapter=0&bookId=272713';\n var mine='';\n try{\n var d={},ps=B.split('&');\n for(var i=0;i<ps.length;i++){var p=ps[i].indexOf('=');if(p>0)d[ps[i].slice(0,p)]=QC_dec1(ps[i].slice(p+1));}\n var ks=[];for(var k in d)ks.push(k);ks.sort();\n var so=[];for(var i=0;i<ks.length;i++)if(d[ks[i]]!=='')so.push(ks[i]+'='+d[ks[i]]);\n var plain=QC_R0+'&sign='+QC_hm('\/goway\/goread\/app\/book\/detail'+QC_COMMON+'&'+QC_R0+'&'+so.join('&'));\n var L=new Packages.java.lang.String(plain).getBytes('UTF-8').length;\n while(L%8!==0){plain+='\\u0001';L++;}\n mine=QC_jurl(QC_ec(plain));\n }catch(e){mine='ERR '+e;}\n var ok=(mine===cap);\n return QC_tip(jv,(ok?'✅ 签名算法自检通过(与官方密文字节级一致)':'❌ 签名自检失败:'+String(mine).slice(0,60)),'qcStatus',ok?'签名OK':'签名异常');\n}\n\/* viewName 动态文本(viewName 环境有 java 绑定) *\/\nfunction QC_statusLabel(){\n var s='';try{s=String(java.get('qcStatus')||'未检测');}catch(e){s='未检测';}\n return '状态:'+s;\n}\nfunction QC_lineLabel(){\n var a='';try{a=String(java.get('qcSpeed')||'待测试');}catch(e){a='待测试';}\n var b='';try{b=String(java.get('qcSpeedDl')||'待测试');}catch(e){b='待测试';}\n return '🟢 官方 goway '+a+' | 目录·正文 dl '+b;\n}\n",
"respondTime": 180000,
"ruleBookInfo": {
"author": "$.author",
"coverUrl": "$.coverUrl",
"init": "@js:\n(function(){\n var id = String(baseUrl).replace(\/^.*?bookId=([0-9]+).*$\/,'$1');\n if(!\/^[0-9]+$\/.test(id)){ try{ id = String(book.bookUrl||'').replace(\/^.*?bookId=([0-9]+).*$\/,'$1'); }catch(e){} }\n if(!\/^[0-9]+$\/.test(id)) return '{}';\n var body = 'bookId=' + id + '&needChapter=0&needRecommend=0';\n var raw = QC_post('\/goway\/goread\/app\/book\/detail','',body,'goway.reader.yueyouxs.com',java);\n var j = {}; try{ j = JSON.parse(raw); }catch(e){}\n var b = (j.data && j.data.book) || {};\n return JSON.stringify({\n name: QC_clean(b.bookName), author: QC_clean(b.authorName),\n kind: (b.classifyName||'') + '\/' + (b.classifySecondName||'') + '\/' + (b.tag||''),\n wordCount: b.wordsDesc||'', lastChapter: b.latestChapterName||'',\n intro: String(b.intro||'').replace(\/\\r\/g,''), coverUrl: b.bookPic||'',\n tocUrl: 'https:\/\/dl.reader.yueyouxs.com\/userCenter\/getChapterList?bookId=' + id + '&chapterId=0&isAll=1'\n });\n})()",
"intro": "$.intro",
"kind": "$.kind",
"lastChapter": "$.lastChapter",
"name": "$.name",
"tocUrl": "$.tocUrl",
"wordCount": "$.wordCount"
},
"ruleContent": {
"content": "@js:\n(function(){\n var u = String(baseUrl);\n var mb = u.match(\/bookId=([0-9]+)\/), mc = u.match(\/chapterId=([0-9]+)\/);\n if(!mb || !mc) return '';\n var body = 'inBuyView=false&ossSwitch=0&feeState=0&chapterId=' + mc[1] + '&useSrvAutoBuy=1&readCount=0&autoBuy=false&isOssed=0&bookId=' + mb[1];\n var raw = QC_post('\/userCenter\/v310\/downloadChapter','',body,'dl.reader.yueyouxs.com',java);\n var j = {}; try{ j = JSON.parse(raw); }catch(e){}\n var cu = j.data && j.data.contentUrl;\n if(!cu) return '[获取失败]' + (j.msg||'无正文直链');\n var txt = String(java.ajax(cu));\n if(txt.indexOf('<?xml')===0 || txt.indexOf('<Error')>=0) return '[获取失败]' + txt.slice(0,120);\n return txt.replace(\/\\r\/g,'').replace(\/^\\s+|\\s+$\/g,'');\n})()"
},
"ruleExplore": {
"author": "$.author",
"bookList": "@js:\n(function(){\n var raw=String(result || (typeof src!=='undefined'?src:'') || '');\n var j={};try{j=JSON.parse(raw);}catch(e){}\n var arr=[];\n if(j.data){\n if(Array.isArray(j.data)) arr=j.data;\n else if(j.data.list && Array.isArray(j.data.list)) arr=j.data.list;\n else if(j.data.bookList && Array.isArray(j.data.bookList)) arr=j.data.bookList;\n else if(j.data.rankList && Array.isArray(j.data.rankList)) arr=j.data.rankList;\n }\n var list=new Packages.java.util.ArrayList();\n for(var i=0;i<arr.length;i++){\n var b=arr[i]; if(!b) continue;\n var bid=b.bookId||b.id||b.wapBookId; if(!bid) continue;\n var nm=b.bookName||'';\n list.add(JSON.stringify({\n name:QC_clean(nm), author:QC_clean(b.authorName||''),\n coverUrl:b.bookPic||'',\n kind:(b.classifyName||'')+'\/'+(b.classifySecondName||'')+' · '+(b.wordsDesc||''),\n intro:String(b.introOrRec||b.intro||'').replace(\/\\r\/g,''),\n bookUrl:'https:\/\/goway.reader.yueyouxs.com\/goway\/goread\/app\/book\/detail?bookId='+bid\n }));\n }\n return list;\n})()",
"bookUrl": "$.bookUrl",
"coverUrl": "$.coverUrl",
"intro": "$.intro",
"kind": "$.kind",
"name": "$.name"
},
"ruleSearch": {
"author": "$.author",
"bookList": "@js:\n(function(){\n var raw = String(result || (typeof src!=='undefined'?src:'') || '');\n var j = {}; try{ j = JSON.parse(raw); }catch(e){}\n var arr = (j.data && j.data.list && Array.isArray(j.data.list)) ? j.data.list : [];\n var list = new Packages.java.util.ArrayList();\n for(var i=0;i<arr.length;i++){\n var b = arr[i];\n if(!b.id) continue;\n list.add(JSON.stringify({\n name: QC_clean(b.bookName), author: QC_clean(b.authorName),\n kind: (b.tag||'') , wordCount: b.wordsDesc||'', intro: String(b.intro||'').replace(\/\\r\/g,''),\n coverUrl: b.bookPic||'',\n bookUrl: 'https:\/\/goway.reader.yueyouxs.com\/goway\/goread\/app\/book\/detail?bookId=' + b.id\n }));\n }\n return list;\n})()",
"bookUrl": "$.bookUrl",
"coverUrl": "$.coverUrl",
"intro": "$.intro",
"kind": "$.kind",
"name": "$.name",
"wordCount": "$.wordCount"
},
"ruleToc": {
"chapterList": "@js:\n(function(){\n var id = String(baseUrl).replace(\/^.*?bookId=([0-9]+).*$\/,'$1');\n if(!\/^[0-9]+$\/.test(id)) return new Packages.java.util.ArrayList();\n var qe = 'bookId=' + id + '&chapterId=0&isAll=1';\n var txt = QC_post('\/userCenter\/getChapterList', qe, 'tmp=', 'dl.reader.yueyouxs.com', java);\n var j = {}; try{ j = JSON.parse(txt); }catch(e){}\n var arr = (j.data && Array.isArray(j.data)) ? j.data : [];\n var list = new Packages.java.util.ArrayList();\n for(var i=0;i<arr.length;i++){\n var c = arr[i];\n list.add(JSON.stringify({\n name: String(c.chapterName||''),\n url: 'https:\/\/dl.reader.yueyouxs.com\/userCenter\/v310\/downloadChapter?bookId=' + id + '&chapterId=' + c.chapterId,\n vip: (c.isFee===1 || c.vip===1)\n }));\n }\n return list;\n})()",
"chapterName": "$.name",
"chapterUrl": "$.url",
"isVip": "$.vip"
},
"searchUrl": "@js:\n(function(){\n var kw = String(key||'');\n var body = 'keyword=' + kw + '&page=' + page + '&psize=20&withRecommend=1';\n return QC_url('\/goway\/goread\/app\/search\/v4\/getBookByKeyword','',body) + ',' + QC_opt(body);\n})()",
"weight": 0
}