🍊青橙小说API

网址https://goway.reader.yueyouxs.com 简介无 状态有效 浏览量191 收录时间2026-11-13 05:44
查看原始书源 JSON
[
  {
    "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=&sectionId='+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(/&nbsp;/g,' ').replace(/&amp;/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
  }
]