🍅番茄听书(APP)

https://fanqienovel.com##听书版

laizhiyu (6509)4天前

测试软件:legado-E,legado-team其他自测或者自己AI兼容
四个书源,参考开源项目项目制作,感谢大佬的开源开源项目:https://github.com/ch6vip/fqapp
    本书源把开源项目移植成为书源,也是本地版,没有什么经过服务器转接之类的,所以且用且珍惜,什么时候接口被封或者换之类的,我也没办法呀

纯AI制作,无一点人工,所以会有各种bug,有bug自己反馈给AI修复,本人还要玩游戏。
二维码导入
{
    "bookSourceComment": "无需登录;音频流为 CENC-AES-CTR 加密,由书源在本地逐样本解密并写入缓存文件后交由阅读音频播放器播放。首次播放需等待下载与解密(约 15~30 秒)。登录界面可切换朗读音色。",
    "bookSourceGroup": "听书,番茄,AI",
    "bookSourceName": "🍅番茄听书(APP)",
    "bookSourceType": 1,
    "bookSourceUrl": "https:\/\/fanqienovel.com##听书版",
    "bookUrlPattern": "https?:\/\/fanqienovel[.]com\/page\/[0-9]+",
    "concurrentRate": "1\/1200",
    "customButton": false,
    "customOrder": 1,
    "enabled": true,
    "enabledCookieJar": false,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:(function(){var rows=[];rows.push({title:\"📻 听书频道\",url:\"\"});rows.push({title:\"🎧 爆款网文听听看\",url:\"https:\/\/fanqienovel.com?t=listen&p=1\"});rows.push({title:\"\",url:\"\"});rows.push({title:\"🎙 朗读音色(点击切换)\",url:\"\"});var tk=JSON.parse(FQ_atoneKinds(java));for(var j=0;j<tk.length;j++)rows.push(tk[j]);return JSON.stringify(rows);})()",
    "jsLib": "var FQ_H=String.fromCharCode(35,35);var FQ_SH=String.fromCharCode(35);var FQ_SL=String.fromCharCode(47);var FQ_Q=String.fromCharCode(39);var FQ_DQ=String.fromCharCode(34);var FQ_SP=String.fromCharCode(32);var FQ_MUA='Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/136.0.0.0 Mobile Safari\/537.36';var FQ_FUA='com.ss.android.article.news\/13400 (Linux; U; Android 10; zh_CN; tb8788p1_64_bsp; Build\/QQ3A.200805.001)';var FQ_FIXED='TdTC5rgxYgkOUrPHpnM7pByyRiuCmrWKGWs521cXdST0m69\/COjWjSanLjfBqVovHwWlGJKu8pSXMrYqOKrdWA==';var FQ_HOST='https:\/\/api5-normal-sinfonlineb.fqnovel.com';var FQ_WEB='https:\/\/fanqienovel.com';var FQ_MSG_DETAIL=String.fromCharCode(35814,24773,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_TOC=String.fromCharCode(30446,24405,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_CT=String.fromCharCode(27491,25991,33719,21462,22833,36133,65292,35831,37325,35797);var FQ_MSG_LOCK=String.fromCharCode(128274);var FQ_MSG_EMPTY=String.fromCharCode(26412,31456,26242,26080,20869,23481,65292,35831,25442,28304);var FQ_IMG=String.fromCharCode(123,123,105,109,97,103,101,95,100,111,109,97,105,110,125,125);var FQ_MSG_PAY=String.fromCharCode(26412,31456,20026,20184,36153,31456,33410,65292,32593,39029,29256,26080,27861,20813,36153,38405,35835);function FQ_j2s(b){try{return String(new Packages.java.lang.String(b,Packages.java.nio.charset.Charset.forName('ISO-8859-1')));}catch(e){var s='';for(var i=0;i<b.length;i++){var v=b[i];if(v<0)v+=256;s+=String.fromCharCode(v);}return s;}}function FQ_s2j(s){return new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('ISO-8859-1'));}function FQ_hex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_unhex(h){var r='';for(var i=0;i<h.length;i+=2)r+=String.fromCharCode(parseInt(h.substr(i,2),16));return r;}function FQ_sm3(s){var rotl=function(x,n){n=n&31;return ((x<<n)|(x>>>(32-n)))>>>0;};var len=s.length,bitLen=len*8,arr=[];for(var i=0;i<len;i++)arr.push(s.charCodeAt(i)&255);arr.push(0x80);while(arr.length%64!==56)arr.push(0);var hi=Math.floor(bitLen\/4294967296),lo=bitLen>>>0;arr.push((hi>>>24)&255,(hi>>>16)&255,(hi>>>8)&255,hi&255);arr.push((lo>>>24)&255,(lo>>>16)&255,(lo>>>8)&255,lo&255);var V=[0x7380166f,0x4914b2b9,0x172442d7,0xda8a0600,0xa96f30bc,0x163138aa,0xe38dee4d,0xb0fb0e4e];for(var b=0;b<arr.length;b+=64){var W=[];for(var i=0;i<16;i++)W.push(((arr[b+i*4]<<24)|(arr[b+i*4+1]<<16)|(arr[b+i*4+2]<<8)|arr[b+i*4+3])>>>0);for(var j=16;j<68;j++){var x=(W[j-16]^W[j-9]^rotl(W[j-3],15))>>>0;x=(x^rotl(x,15)^rotl(x,23))>>>0;W.push((x^rotl(W[j-13],7)^W[j-6])>>>0);}var W1=[];for(var j=0;j<64;j++)W1.push((W[j]^W[j+4])>>>0);var A=V[0],B=V[1],C=V[2],D=V[3],E=V[4],F=V[5],G=V[6],H=V[7];for(var j=0;j<64;j++){var Tj=(j<16)?0x79cc4519:0x7a879d8a;var SS1=rotl((rotl(A,12)+E+rotl(Tj,j&31))>>>0,7);var SS2=(SS1^rotl(A,12))>>>0;var FFj=(j<16)?((A^B^C)>>>0):(((A&B)|(A&C)|(B&C))>>>0);var GGj=(j<16)?((E^F^G)>>>0):(((E&F)|((~E)&G))>>>0);var TT1=(FFj+D+SS2+W1[j])>>>0;var TT2=(GGj+H+SS1+W[j])>>>0;D=C;C=rotl(B,9);B=A;A=TT1;H=G;G=rotl(F,19);F=E;E=(TT2^rotl(TT2,9)^rotl(TT2,17))>>>0;}V[0]=(V[0]^A)>>>0;V[1]=(V[1]^B)>>>0;V[2]=(V[2]^C)>>>0;V[3]=(V[3]^D)>>>0;V[4]=(V[4]^E)>>>0;V[5]=(V[5]^F)>>>0;V[6]=(V[6]^G)>>>0;V[7]=(V[7]^H)>>>0;}var out='';for(var i=0;i<8;i++)out+=('0000000'+V[i].toString(16)).slice(-8);return out;}function FQ_md5(s){var d=Packages.java.security.MessageDigest.getInstance('MD5');var b=FQ_s2j(s);d.update(b);return FQ_hex(d.digest());}function FQ_b64(s){return String(Packages.java.util.Base64.getEncoder().encodeToString(FQ_s2j(s)));}function FQ_b64d(s){return FQ_j2s(Packages.java.util.Base64.getDecoder().decode(String(s)));}function FQ_aesCbc(data,key,iv){var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES\/CBC\/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(FQ_s2j(key),'AES'),new Packages.javax.crypto.spec.IvParameterSpec(FQ_s2j(iv)));return FQ_j2s(c.doFinal(FQ_s2j(data)));}function FQ_pad(s){var p=16-(s.length%16);if(p===0)p=16;var o=s;for(var i=0;i<p;i++)o+=String.fromCharCode(p);return o;}function FQ_w(lo,hi){return {lo:lo>>>0,hi:hi>>>0};}function FQ_xor(){var lo=0,hi=0;for(var i=0;i<arguments.length;i++){lo^=arguments[i].lo;hi^=arguments[i].hi;}return FQ_w(lo,hi);}function FQ_n64(v){return FQ_w(~v.lo,~v.hi);}function FQ_add(a,b){var lo=(a.lo+b.lo)>>>0;return FQ_w(lo,(a.hi+b.hi+(lo<a.lo?1:0))>>>0);}function FQ_rol(v,c){var s=((c%64)+64)%64;if(s===0)return FQ_w(v.lo,v.hi);if(s<32)return FQ_w((v.lo<<s)|(v.hi>>>(32-s)),(v.hi<<s)|(v.lo>>>(32-s)));if(s===32)return FQ_w(v.hi,v.lo);var r=s-32;return FQ_w((v.hi<<r)|(v.lo>>>(32-r)),(v.lo<<r)|(v.hi>>>(32-r)));}function FQ_ror(v,c){return FQ_rol(v,64-(c%64));}function FQ_r64(s,o){o=o||0;return FQ_w((s.charCodeAt(o)|(s.charCodeAt(o+1)<<8)|(s.charCodeAt(o+2)<<16)|(s.charCodeAt(o+3)<<24))>>>0,(s.charCodeAt(o+4)|(s.charCodeAt(o+5)<<8)|(s.charCodeAt(o+6)<<16)|(s.charCodeAt(o+7)<<24))>>>0);}function FQ_w64le2(l,r){var o='';for(var i=0;i<4;i++)o+=String.fromCharCode((l.lo>>>(i*8))&255);for(var i2=0;i2<4;i2++)o+=String.fromCharCode((l.hi>>>(i2*8))&255);for(var i3=0;i3<4;i3++)o+=String.fromCharCode((r.lo>>>(i3*8))&255);for(var i4=0;i4<4;i4++)o+=String.fromCharCode((r.hi>>>(i4*8))&255);return o;}var FQ_SZ=FQ_w(0x046d678b,0x3dc94c3a);function FQ_zbit(i){return FQ_w(i<32?((FQ_SZ.lo>>>i)&1):((FQ_SZ.hi>>>(i-32))&1),0);}var FQ_SK='fc78e0a9657a0c748ce51559903ccf03510e51d3cff232d71343e88a321c5304';var FQ_AK='d31e3718288a1027baab59f146a09a9c';var FQ_AIV='ea180a0336ed352fcd24e4d50018ae54';function FQ_srk(key){var w=[];for(var i=0;i<4;i++)w.push(FQ_r64(key,i*8));for(var x=4;x<72;x++){var m=FQ_xor(FQ_ror(w[x-1],3),w[x-3]);m=FQ_xor(m,FQ_ror(m,1));w.push(FQ_xor(FQ_n64(w[x-4]),m,FQ_zbit((x-4)%62),FQ_w(3,0)));}return w;}function FQ_sEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<keys.length;i++){var o=r;var nl=FQ_w(FQ_rol(r,1).lo&FQ_rol(r,8).lo,FQ_rol(r,1).hi&FQ_rol(r,8).hi);r=FQ_xor(l,nl,FQ_rol(r,2),keys[i]);l=o;}return FQ_w64le2(l,r);}function FQ_ev(v){var o='';while(v>=0x80){o+=String.fromCharCode((v%0x80)|0x80);v=Math.floor(v\/0x80);}o+=String.fromCharCode(v);return o;}function FQ_pbv(f,v){return FQ_ev(f*8)+FQ_ev(v);}function FQ_pbb(f,v){var e=(typeof v==='number')?String.fromCharCode(v):String(v);return FQ_ev(f*8+2)+FQ_ev(e.length)+e;}function FQ_argusBean(q,stub,ts,dev,iid,aid,rv){var bi=(\/^[0-9a-f]{32}$\/i.test(stub))?FQ_unhex(stub):FQ_unhex('00000000000000000000000000000000');var bh=FQ_unhex(FQ_sm3(bi).substr(0,12));var qh=(q==='')?FQ_unhex(FQ_sm3(FQ_unhex('00000000000000000000000000000000')).substr(0,12)):FQ_unhex(FQ_sm3(q).substr(0,12));var nest=FQ_pbv(1,1)+FQ_pbv(2,1)+FQ_pbv(3,1)+FQ_pbv(7,0xC792ECCC);var s23=FQ_pbb(1,'NX551J')+FQ_pbv(2,8196)+FQ_pbv(4,0x80E0D800);return FQ_pbv(1,1077940818)+FQ_pbv(2,2)+FQ_pbv(3,rv)+FQ_pbb(4,String(aid))+FQ_pbb(5,dev)+FQ_pbb(6,'1611921764')+FQ_pbb(7,FQ_qp(q,'version_name'))+FQ_pbb(8,'v04.04.05-ov-android')+FQ_pbv(9,134744640)+FQ_pbb(10,FQ_unhex('0000000000000000'))+FQ_pbv(11,0)+FQ_pbv(12,ts*2)+FQ_pbb(13,bh)+FQ_pbb(14,qh)+FQ_pbb(15,nest)+FQ_pbb(16,iid)+FQ_pbb(20,'none')+FQ_pbv(21,738)+FQ_pbb(23,s23)+FQ_pbv(25,2);}function FQ_argus(q,stub,ts,dev,iid,aid,rv){var pb=FQ_pad(FQ_argusBean(q,stub,ts,dev,iid,aid,rv));var keys=FQ_srk(FQ_unhex(FQ_SK));var enc='';for(var o=0;o<pb.length;o+=16)enc+=FQ_sEnc(pb.substr(o,16),keys);var magic=FQ_unhex('f2f7fcfff2f7fcff');var un=magic+enc+FQ_unhex('eafb2cfe8568519154');var buf=un.substr(0,8);for(var i=8;i<un.length;i++)buf+=String.fromCharCode((un.charCodeAt(i)^magic.charCodeAt(i%8))&255);var rev='';for(var j=buf.length-1;j>=0;j--)rev+=buf.charAt(j);var fin=FQ_pad(rev+'ao');var ct=FQ_aesCbc(fin,FQ_unhex(FQ_AK),FQ_unhex(FQ_AIV));return FQ_b64(FQ_unhex('f281')+ct);}function FQ_lrk(rp,aid){var dg=FQ_md5(rp+String(aid));var w=[];for(var i=0;i<34;i++)w.push(FQ_w(0,0));w[0]=FQ_r64(dg,0);w[1]=FQ_r64(dg,8);w[2]=FQ_r64(dg,16);w[3]=FQ_r64(dg,24);var b0=w[0],b8=w[1],q=[w[2],w[3]];for(var x=0;x<0x22;x++){var x9=b0;var x8=b8;x8=FQ_ror(x8,8);x8=FQ_add(x8,x9);x8=FQ_xor(x8,FQ_w(x,0));q.push(x8);x8=FQ_xor(x8,FQ_rol(x9,3));w[x+1]=x8;b0=x8;b8=q.shift();}return w;}function FQ_lEnc(blk,keys){var l=FQ_r64(blk,0),r=FQ_r64(blk,8);for(var i=0;i<34;i++){r=FQ_xor(keys[i],FQ_add(l,FQ_ror(r,8)));l=FQ_xor(r,FQ_ror(l,61));}return FQ_w64le2(l,r);}function FQ_ladon(ts,lic,aid,rp){var data=String(ts)+'-'+lic+'-'+aid;var pad2=16-(data.length%16);var pd=data;for(var i=0;i<pad2;i++)pd+=String.fromCharCode(pad2);var ks=FQ_lrk(rp,aid);var ct='';for(var o=0;o<pd.length;o+=16)ct+=FQ_lEnc(pd.substr(o,16),ks);return FQ_b64(rp+ct);}function FQ_sign(q,stub,ts,dev,iid,aid,rv){var h={'x-ss-req-ticket':String(ts*1000),'x-khronos':String(ts),'x-argus':FQ_argus(q,stub,ts,dev,iid,aid,rv),'x-ladon':FQ_ladon(ts,1611921764,aid,String.fromCharCode(1,2,3,4))};if(stub)h['x-ss-stub']=stub;return h;}function FQ_qp(q,k){var ps=String(q||'').split('&');for(var i=0;i<ps.length;i++){var e=ps[i].indexOf('=');if(e>0&&ps[i].substring(0,e)===k)return ps[i].substring(e+1);}return '';}function FQ_qs(url){var t=String(url||'');var i=t.indexOf('?');if(i<0)return '';var j=t.indexOf('#',i);return t.slice(i+1,j<0?t.length:j);}function FQ_qp(url,n){var e=String(n);var ps=FQ_qs(url).split('&');for(var i=0;i<ps.length;i++){if(!ps[i])continue;var s=ps[i].indexOf('=');var k=s<0?ps[i]:ps[i].substr(0,s);if(k===e)return s<0?'':ps[i].substr(s+1);}return '';}function FQ_now(){return Math.floor(new Date().getTime()\/1000);}function FQ_ua(){return 'com.dragon.read\/66732 (Linux; U; Android 10; zh_CN; Pixel 4 XL; Build\/QD1A.190821.007;tt-ok\/3.12.13.4-tiktok)';}function FQ_hpost(url,bodyStr,headers){var arr=FQ_s2j(bodyStr);var c=new Packages.java.net.URL(url).openConnection();c.setRequestMethod('POST');c.setDoOutput(true);for(var k in headers)c.setRequestProperty(k,headers[k]);c.setConnectTimeout(20000);c.setReadTimeout(25000);var out=c.getOutputStream();out.write(arr,0,arr.length);out.flush();out.close();var code=c.getResponseCode();var is=(code>=400)?c.getErrorStream():c.getInputStream();var sb='';if(is){var enc=String(c.getHeaderField('Content-Encoding')||'');var stream=is;if(enc.indexOf('gzip')>=0)stream=new Packages.java.util.zip.GZIPInputStream(is);var rd=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(stream,'UTF-8'));var line;while((line=rd.readLine())!=null)sb+=String(line);rd.close();}return {code:code,body:sb};}function FQ_gz(s){var bos=new Packages.java.io.ByteArrayOutputStream();var g=new Packages.java.util.zip.GZIPOutputStream(bos);var b=new Packages.java.lang.String(s).getBytes(Packages.java.nio.charset.Charset.forName('UTF-8'));g.write(b,0,b.length);g.close();var arr=bos.toByteArray();var out='';for(var i=0;i<arr.length;i++){var v=arr[i]&255;if(i===8)v=2;if(i===9)v=3;out+=String.fromCharCode(v);}return out;}function FQ_ttEnc(data){var rnd='';for(var i=0;i<32;i++)rnd+=String.fromCharCode(Math.floor(Math.random()*256));var md=Packages.java.security.MessageDigest.getInstance('SHA-512');md.update(FQ_s2j(rnd));var inner=md.digest();var md2=Packages.java.security.MessageDigest.getInstance('SHA-512');md2.update(inner);md2.update(FQ_s2j(FQ_b64d(FQ_FIXED)));var hv=md2.digest();var keyB=Packages.java.util.Arrays.copyOfRange(hv,0,16);var ivB=Packages.java.util.Arrays.copyOfRange(hv,16,32);var md3=Packages.java.security.MessageDigest.getInstance('SHA-512');md3.update(FQ_s2j(data));var dh=md3.digest();var C=Packages.javax.crypto.Cipher;var c=C.getInstance('AES\/CBC\/NoPadding');c.init(C.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(keyB,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(ivB));return String.fromCharCode(0x74,0x63,0x05,0x10,0,0)+rnd+FQ_j2s(c.doFinal(FQ_s2j(FQ_pad(FQ_j2s(dh)+data))));}function FQ_alnum(n){var ch='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';var s='';for(var i=0;i<n;i++)s+=ch.charAt(Math.floor(Math.random()*ch.length));return s;}function FQ_uuid(){return String(Packages.java.util.UUID.randomUUID());}function FQ_getPool(sv){var p=String(sv.get('fqPool')||'');if(!p){return [];}var out=[];var arr=p.split('|');for(var i=0;i<arr.length;i++){var kv=arr[i].split(',');if(kv.length>=2&&kv[0])out.push({d:kv[0],i:kv[1],o:kv[2]||'',c:kv[3]||''});}return out;}function FQ_savePool(sv,pool){var a=[];for(var i=0;i<pool.length;i++)a.push(pool[i].d+','+pool[i].i+','+(pool[i].o||'')+','+(pool[i].c||''));sv.put('fqPool',a.join('|'));}function FQ_registerOne(){var openudid=FQ_alnum(16),cdid=FQ_uuid(),clientudid=FQ_uuid();var ua='com.dragon.read\/65132 (Linux; U; Android 10; zh_CN; MI 12; Build\/MMB29M; Cronet\/TTNetVersion:9ac8d95c 2024-11-25 QuicVersion:3f326df4 2024-11-14)';var header={display_name:'番茄小说',update_version_code:'65132',manifest_version_code:'65132',aid:1967,channel:'xiaomi_1967_64',package:'com.dragon.read',app_version:'6.5.1.32',version_code:'65132',sdk_version:'v04.04.05-ov-android',sdk_target_version:29,os:'Android',os_version:'10',os_api:'29',device_model:'MI 12',device_brand:'Xiaomi',device_manufacturer:'Google',device_category:'phone',cpu_abi:'arm64-v8a',release_build:FQ_uuid(),density_dpi:'560',display_density:'mdpi',resolution:'1440x2392',language:'zh',mac:'11:22:33:44:55:66',timezone:8,access:'wifi',not_request_sender:0,carrier:'CHINA MOBILE',mcc_mnc:'46007',rom:'EMUI-'+FQ_alnum(13),rom_version:FQ_alnum(2),sig_hash:FQ_md5(FQ_uuid()),openudid:openudid,clientudid:clientudid,sim_serial_number:[],region:'CN',tz_name:'Asia\/Shanghai',tz_offset:28800,sim_region:'cn'};var js=JSON.stringify({magic_tag:'ss_app_log',header:header,_gen_time:new Date().getTime()});var post=FQ_ttEnc(FQ_gz(js));var ts=FQ_now();var P=[['tt_data','a'],['os_api','29'],['device_type','MI 12'],['ssmix','a'],['manifest_version_code','65132'],['dpi','560'],['version_name','6.5.1.32'],['ts',String(ts)],['cpu_support64','true'],['app_type','normal'],['appTheme','light'],['ac','wifi'],['host_abi','arm64-v8a'],['update_version_code','65132'],['channel','xiaomi_1967_64'],['_rticket',String(new Date().getTime())],['device_platform','android'],['version_code','65132'],['cdid',cdid],['os','android'],['is_android_pad','0'],['openudid',openudid],['package','com.dragon.read'],['resolution','1440*2392'],['os_version','10'],['language','zh'],['device_brand','Xiaomi'],['need_personal_recommend','1'],['aid','1967'],['minor_status','0'],['app_name','novel'],['mcc_mnc','46007']];P.sort(function(a,b){return a[0]<b[0]?-1:(a[0]>b[0]?1:0);});var qs='';for(var i=0;i<P.length;i++){if(i)qs+='&';qs+=P[i][0]+'='+encodeURIComponent(P[i][1]);}var r=FQ_hpost('https:\/\/log.snssdk.com\/service\/2\/device_register\/?'+qs,post,{'Content-Type':'application\/octet-stream;tt-data=a','accept-encoding':'gzip','user-agent':ua,'connection':'Keep-Alive'});var Q=String.fromCharCode(34);var m=r.body.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.body.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));return {d:m[1],i:m2?m2[1]:'',o:openudid,c:cdid};}function FQ_ensure(sv,n){var pool=FQ_getPool(sv);var need=(n||3)-pool.length;var added=0;for(var i=0;i<need;i++){  var d=FQ_registerOne();  if(d){pool.push(d);added++;FQ_savePool(sv,pool);}}return pool;}function FQ_api(jv,sv,path,q,host,aid){var pool=FQ_ensure(sv,2);if(!pool.length)throw new Error('设备池为空,请检查网络后重试');var dev=pool[0].d,iid=pool[0].i;var qq=q+'&iid='+iid+'&device_id='+dev;var url=(host||FQ_HOST)+path+'?'+qq;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,iid,aid||1967,Math.floor(Math.random()*2000000000));h['User-Agent']=FQ_ua();return String(jv.ajax(url+','+JSON.stringify({headers:h})));}function FQ_web(jv,url,ua){var h={'User-Agent':ua||FQ_MUA};return String(jv.ajax(url+','+JSON.stringify({headers:h})));}var QC=String.fromCharCode(34);function FQ_state(txt){var t=String(txt||'');var i=t.indexOf('window.__INITIAL_STATE__=');if(i<0)return null;var st0=t.indexOf('{',i);if(st0<0)return null;var seg=t.substring(st0);var depth=0,end=-1,instr=false,esc=false;for(var k=0;k<seg.length;k++){var ch=seg.charAt(k);if(instr){if(esc)esc=false;else if(ch===String.fromCharCode(92))esc=true;else if(ch===QC)instr=false;continue;}if(ch===QC)instr=true;else if(ch==='{')depth++;else if(ch==='}'){depth--;if(depth===0){end=k+1;break;}}}if(end<0)return null;try{return JSON.parse(seg.substring(0,end));}catch(e){return null;}}function FQ_tag(s){var t=String(s||'');return t.split('<em>').join('').split('<\/em>').join('').split('<').join('&lt;');}function FQ_search(jv,sv,kw,page){var off=((page||1)-1)*10;var suf='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=fqapp&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https:\/\/api.fanqiesdk.com\/api\/novel\/channel\/homepage\/search\/search\/v1\/?q='+encodeURIComponent(kw)+'&offset='+off+suf;var raw=FQ_web(jv,url,FQ_FUA);var out=[];try{var d=JSON.parse(raw);var rd=(d.data&&d.data.ret_data)||[];for(var i=0;i<rd.length;i++){var it=rd[i];out.push({name:FQ_tag(it.title),author:FQ_tag(it.author||''),kind:FQ_tag(it.category||''),intro:FQ_tag(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+it.book_id+FQ_SH+it.book_id,bookId:String(it.book_id)});}}catch(e){}return out;}function FQ_homeList(jv,sv){var raw=FQ_web(jv,'https:\/\/fanqienovel.com\/','Mozilla\/5.0 (Linux; Android 10; K) AppleWebKit\/537.36');var d=FQ_state(raw);var out=[];if(!d)return out;var hm=d.home||{};var groups=['weekList','editorList','updateList','newbookList','boyList','girlList','readRankList','newRankList','fantasyList','topRankList'];var seen={};for(var g=0;g<groups.length;g++){var arr=hm[groups[g]]||[];for(var i=0;i<arr.length;i++){var it=arr[i];var bid=String(it.bookId||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.bookName||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+bid+FQ_SH+bid});}}return out;}function FQ_rankList(jv,sv,rankId){var raw=FQ_web(jv,FQ_WEB+FQ_SL.concat('api',FQ_SL,'rank',FQ_SL,'list?rank_id=')+(rankId||1)+'&offset=0&count=20');var out=[];try{var d=JSON.parse(raw);var l=(d.data&&d.data.list)||[];for(var i=0;i<l.length;i++){var it=l[i];var bid=String(it.bookId||'');out.push({name:String(it.bookName||''),author:String(it.author||''),kind:'排行榜',intro:String(it.abstract||''),coverUrl:String(it.thumbUri||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+bid+FQ_SH+bid,bookId:bid});}}catch(e){}return out;}function FQ_getDev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_regAndSave(sv){var r=FQ_regTest();var Q=String.fromCharCode(34);var m=r.match(new RegExp(Q+'device_id_str'+Q+':'+Q+'([0-9]+)'+Q));if(!m)return null;var m2=r.match(new RegExp(Q+'install_id_str'+Q+':'+Q+'([0-9]+)'+Q));var d=m[1],i=m2?m2[1]:'';sv.put('fqdev',d);sv.put('fqiid',i);return {d:d,i:i};}function FQ_bigBytes(n){var h=String(n.toString(16));if(h.length%2===1)h='0'+h;if(h.length>384)h=h.substring(h.length-384);return FQ_unhex(h);}function FQ_b64eJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';var out='';var i=0;var n=str.length;while(i<n){var c1=str.charCodeAt(i++)&255;var c2=(i<n)?str.charCodeAt(i++)&255:NaN;var c3=(i<n)?str.charCodeAt(i++)&255:NaN;var e1=c1>>2;var e2=((c1&3)<<4)|(isNaN(c2)?0:(c2>>4));var e3=isNaN(c2)?64:(((c2&15)<<2)|(isNaN(c3)?0:(c3>>6)));var e4=isNaN(c3)?64:(c3&63);out+=CH.charAt(e1)+CH.charAt(e2)+(e3===64?'=':CH.charAt(e3))+(e4===64?'=':CH.charAt(e4));}return out;}function FQ_b64dJS(str){var CH='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';var out='';var buf=0,bits=0;for(var i=0;i<str.length;i++){var c=str.charAt(i);if(c==='=')break;var v=CH.indexOf(c);if(v<0)continue;buf=(buf<<6)|v;bits+=6;if(bits>=8){bits-=8;out+=String.fromCharCode((buf>>bits)&255);}}return out;}function FQ_b64d2(s){try{return Packages.java.util.Base64.getDecoder().decode(String(s));}catch(e){return FQ_s2j(FQ_b64dJS(String(s)));}}function FQ_b64e2(b){try{return String(Packages.java.util.Base64.getEncoder().encodeToString(b));}catch(e){return FQ_b64eJS(FQ_j2s(b));}}function FQ_bytesHex(b){var str=FQ_j2s(b);var s='';for(var i=0;i<str.length;i++){var v=str.charCodeAt(i)&255;s+=(v<16?'0':'')+v.toString(16);}return s;}function FQ_cmGet(jv,bookId,itemIds,dev,iid){var CMP='ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff';var P=new Packages.java.math.BigInteger(CMP,16);var pk=new Packages.java.math.BigInteger(256,new Packages.java.security.SecureRandom());pk=pk.mod(P.subtract(Packages.java.math.BigInteger.ONE));var pub=Packages.java.math.BigInteger.valueOf(2).modPow(pk,P);var iv=new Packages.java.security.SecureRandom().generateSeed(16);var rk=FQ_b64d2('rCXGfd2POMGzeiNIgo4iLg==');var CC=Packages.javax.crypto.Cipher;var c1=CC.getInstance('AES\/CBC\/PKCS5Padding');c1.init(CC.ENCRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(rk,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(iv));var ct1=c1.doFinal(FQ_s2j(FQ_bigBytes(pub)));var key=FQ_b64e2(FQ_s2j(FQ_j2s(iv)+FQ_j2s(ct1)));var body=JSON.stringify({book_id:bookId,item_ids:itemIds,key:key});var url='https:\/\/novelfm-hl.snssdk.com\/novelfm\/playerapi\/full\/mget\/v1\/?aid=3040&app_name=novelapp&channel=0&device_id='+dev+'&device_platform=android&device_type=UGFFI55&iid='+iid+'&os_version=0&version_code=58932&version_name=5.8.9.32';var ts=FQ_now();var stub=FQ_md5(body);var hh=FQ_sign(FQ_qs(url),stub,ts,dev,iid,3040,Math.floor(Math.random()*2000000000));hh['User-Agent']='com.dragon.read';hh['Content-Type']='application\/json; charset=utf-8';var resp=FQ_hpost(url,body,hh);var dd=JSON.parse(resp.body);var infos=dd.data.item_infos;var out={};for(var iid2 in infos){var it=infos[iid2];if(!it||!it.key||!it.content){continue;}var srvHex=FQ_bytesHex(FQ_b64d2(String(it.key)));var srvN=new Packages.java.math.BigInteger(srvHex,16);var shared=srvN.modPow(pk,P);var shHex=String(shared.toString(16));if(shHex.length%2===1)shHex='0'+shHex;if(shHex.length>384)shHex=shHex.substring(shHex.length-384);var aesKey=Packages.java.util.Arrays.copyOfRange(FQ_s2j(FQ_unhex(shHex.substring(0,64))),0,32);var cb=FQ_b64d2(String(it.content));var civ=Packages.java.util.Arrays.copyOfRange(cb,0,16);var cct=Packages.java.util.Arrays.copyOfRange(cb,16,cb.length);var c2=CC.getInstance('AES\/CBC\/PKCS5Padding');c2.init(CC.DECRYPT_MODE,new Packages.javax.crypto.spec.SecretKeySpec(aesKey,'AES'),new Packages.javax.crypto.spec.IvParameterSpec(civ));var ptArr=c2.doFinal(cct);out[iid2]=String(new Packages.java.lang.String(ptArr,'UTF-8'));}return out;}function FQ_dev(sv){var d=String(sv.get('fqdev')||'');var i=String(sv.get('fqiid')||'');return {d:d,i:i};}function FQ_search(jv,sv,kw,page){var off=String((parseInt(page||'1')-1)*10);var q='q='+encodeURIComponent(kw)+'&offset='+off+'&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid='+FQ_alnum(16)+'&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';var url='https:\/\/api.fanqiesdk.com\/api\/novel\/channel\/homepage\/search\/search\/v1\/?'+q;var UAK=String.fromCharCode(85,115,101,114,45,65,103,101,110,116);var hd={};hd[UAK]=FQ_FUA;var r=String(jv.ajax(url+','+JSON.stringify({headers:hd})));var d=JSON.parse(r);var items=(d.data&&d.data.ret_data)?d.data.ret_data:[];var out=[];for(var i=0;i<items.length;i++){var it=items[i];var t=String(it.title||'').split('<em>').join('').split('<\/em>').join('');out.push({name:t,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+String(it.book_id)});}return out;}function FQ_toc(jv,sv,bookId){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var url='https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/directory\/all_items\/v?book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&device_id='+dev+'&'+base;var ts=FQ_now();var h=FQ_sign(FQ_qs(url),'',ts,dev,'',1967,Math.floor(Math.random()*2000000000));h['User-Agent']='Mozilla\/5.0 (Linux; Android 13)';var r=String(jv.ajax(url+','+JSON.stringify({headers:h})));var d=JSON.parse(r);var cats=(d.data&&d.data.catalog_data)?d.data.catalog_data:[];var out=[];for(var i=0;i<cats.length;i++){var c=cats[i];out.push({name:String(c.catalog_title||('第'+(i+1)+'章')),url:String(c.item_id)});}return out;}function FQ_explore(jv,sv,kind,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var tt={'推荐':2,'经典':3,'知识':4,'听书':5,'看剧':6,'视频':7,'短篇':8,'漫画':9,'买书':10};var tabType=tt[kind]||2;var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'\/reading\/bookapi\/bookmall\/tab\/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+bid+FQ_SH+bid});}}}return out;}function FQ_pickBooks(jv,sv,catId,algo,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='cell_id=7098235271900037133&offset='+off+'&client_template=2&client_req_type=2&tab_type=2&req_rank_category_id='+catId+'&req_rank_algo='+(algo||101)+'&'+base;var raw=FQ_api(jv,sv,'\/reading\/bookapi\/bookmall\/cell\/change\/v1\/',q);var d=JSON.parse(raw);var cv=(d.data&&d.data.cell_view)||{};var bd=cv.book_data||[];var out=[];for(var i=0;i<bd.length;i++){var it=bd[i];var bid=String(it.book_id||'');if(!bid)continue;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+bid+FQ_SH+bid});}return out;}function FQ_tabBooks(jv,sv,tabType,page){var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';var off=((parseInt(page||'1')-1)*16);var q='tab_type='+tabType+'&offset='+off+'&client_template=0&'+base;var raw=FQ_api(jv,sv,'\/reading\/bookapi\/bookmall\/tab\/v',q);var d=JSON.parse(raw);var ti=d.data.tab_item||[];var out=[];var seen={};for(var t=0;t<ti.length;t++){var cells=ti[t].cell_data||[];for(var c=0;c<cells.length;c++){var bd=cells[c].book_data||[];for(var b=0;b<bd.length;b++){var it=bd[b];var bid=String(it.book_id||'');if(!bid||seen[bid])continue;seen[bid]=1;out.push({name:String(it.book_name||''),author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+bid+FQ_SH+bid});}}}return out;}var FQ_AHOST='https:\/\/api5-sinfonlineb.novelfm.com';\nvar FQ_APATH='\/novelfm\/playerapi\/video_model\/mget\/v1';\nvar FQ_AQUERY='os=android&aid=3040&ssmix=a&manifest_version_code=632&dpi=440&device_brand=Redmi&language=zh&os_api=35&comment_tag_c=5&vip_state=0&host_abi=arm64-v8a&category_style=1&need_personal_recommend=1&rom_version=miui_V816_OS3.0.1.0.VMRCNXM&device_platform=android&device_type=UGFFI55&app_name=novelapp&version_code=58932&version_name=5.8.9.32&channel=0';\nvar FQ_CACHE='\/storage\/emulated\/0\/Android\/data\/com.legado.app.release\/cache';\nvar FQ_TONES=[{i:0,n:'默认(推荐)'},{i:1,n:'甜美少女音'},{i:2,n:'清亮青叔音'},{i:4,n:'成熟大叔音'},{i:5,n:'开朗青年音'},{i:6,n:'温柔淑女音'},{i:51,n:'青年音'},{i:74,n:'大叔音升级版'},{i:96,n:'升级版96'},{i:97,n:'升级版(多角色)'},{i:26,n:'音色26'},{i:27,n:'音色27'},{i:28,n:'音色28'},{i:29,n:'音色29'},{i:30,n:'音色30'},{i:31,n:'音色31'},{i:63,n:'音色63'},{i:64,n:'音色64'},{i:67,n:'音色67'},{i:68,n:'音色68'},{i:71,n:'音色71'},{i:100,n:'音色100'},{i:105,n:'音色105'}];\nvar FQ_ACSP=Packages.java.nio.charset.Charset.forName('ISO-8859-1');\nfunction FQ_AS2B(x){return new Packages.java.lang.String(String(x)).getBytes(FQ_ACSP);}\nfunction FQ_atone(sv){var v=String(sv.get('fqTone')||'0');var n=parseInt(v,10);return isNaN(n)?0:n;}\nfunction FQ_atoneName(sv){var t=FQ_atone(sv);for(var i=0;i<FQ_TONES.length;i++)if(FQ_TONES[i].i===t)return FQ_TONES[i].n;return t?('音色'+t):'默认(推荐)';}\nfunction FQ_asetTone(sv,v){var n=parseInt(String(v),10);if(isNaN(n))n=0;sv.put('fqTone',String(n));return FQ_atoneName(sv);}\nfunction FQ_atoneNext(sv){var t=FQ_atone(sv);var idx=0;for(var i=0;i<FQ_TONES.length;i++)if(FQ_TONES[i].i===t){idx=i;break;}idx=(idx+1)%FQ_TONES.length;sv.put('fqTone',String(FQ_TONES[idx].i));return FQ_atoneName(sv);}\nfunction FQ_apop(x){var c=0;while(x){c+=x&1;x>>>=1;}return c;}\nfunction FQ_akey(spadeB64){\n  var raw=FQ_b64d2(String(spadeB64).replace(\/-\/g,'+').replace(\/_\/g,'\/'));\n  var len=raw.length;\n  if(len<3)return '';\n  var v8=len-((raw[0]^raw[1]^raw[2])&255)+47;\n  v8=Math.min(v8,len-1);\n  if(v8<33)return '';\n  var w=[];\n  for(var i=0;i<v8;i++)w.push(raw[1+i]&255);\n  var a=85,b=246;\n  for(var i2=0;i2<v8;i2++){\n    var old=w[i2];\n    var prev=(i2&1)?a:b;\n    if(i2&1)a=old;else b=old;\n    w[i2]=(-21-FQ_apop(i2)+(prev^old))&255;\n  }\n  var s='';\n  for(var i3=1;i3<33;i3++)s+=String.fromCharCode(w[i3]);\n  return s;\n}\nfunction FQ_aboxes(bytes,p,end){\n  var out=[],q=p;\n  while(q+8<=end){\n    var sz=(bytes[q]&255)*16777216+((bytes[q+1]&255)<<16)+((bytes[q+2]&255)<<8)+(bytes[q+3]&255);\n    if(sz<8||q+sz>bytes.length)break;\n    var t='';for(var i=0;i<4;i++)t+=String.fromCharCode(bytes[q+4+i]&255);\n    out.push({t:t,p:q,s:sz});\n    q+=sz;\n  }\n  return out;\n}\nfunction FQ_afind(bytes,typ){\n  var res=[];\n  (function walk(p,end){\n    var bs=FQ_aboxes(bytes,p,end);\n    for(var i=0;i<bs.length;i++){\n      if(bs[i].t===typ)res.push(bs[i]);\n      if('moov,trak,mdia,minf,stbl,dinf'.indexOf(bs[i].t)>=0)walk(bs[i].p+8,bs[i].p+bs[i].s);\n    }\n  })(0,Math.min(bytes.length,400000));\n  return res;\n}\nfunction FQ_au32(bytes,p){return (bytes[p]&255)*16777216+((bytes[p+1]&255)<<16)+((bytes[p+2]&255)<<8)+(bytes[p+3]&255);}\nfunction FQ_aaudio(sv,jv,bookId,itemId){\n  var pool=FQ_ensure(sv,2);\n  if(!pool.length)throw new Error('设备池为空,请重试');\n  var dev=pool[0].d,iid=pool[0].i;\n  var tone=FQ_atone(sv);\n  var qs=FQ_AQUERY+'&iid='+iid+'&device_id='+dev;\n  var body=JSON.stringify({audio_type:0,bgm_used:0,book_id:bookId,device_score:0,item_ids:[itemId],multi_shift:false,source:'default',tone_id:tone,user_select_start_para:0,user_select_start_para_off:0});\n  var ts=FQ_now(),stub=FQ_md5(body);\n  var hd=FQ_sign(qs,stub,ts,dev,iid,3040,Math.floor(Math.random()*2000000000));\n  hd['User-Agent']='com.dragon.read';\n  hd['Content-Type']='application\/json; charset=utf-8';\n  var r=FQ_hpost(FQ_AHOST+FQ_APATH+'?'+qs,body,hd);\n  var d=JSON.parse(r.body);\n  var rows=(d.data&&d.data.video_model_datas)||[];\n  if(!rows.length){\n    var m=String(d.message||'');\n    throw new Error(m?('音频接口:'+m):'该章节暂无音频,请换书籍或音色');\n  }\n  var vmRaw=String(rows[0].video_model||'');\n  if(!vmRaw||vmRaw.length<10){\n    throw new Error('该章节暂无朗读音频(本书可能只有文本版)。请换一本书或在发现页找带音频的书');\n  }\n  var mdl;\n  try{mdl=JSON.parse(vmRaw);}catch(e){throw new Error('音频数据解析失败,请重试或换章节');}\n  var vl=(mdl.video_list)||{};\n  var st=vl['0']||vl[Object.keys(vl)[0]];\n  if(!st||!st.main_url)throw new Error('未获取到音频直链');\n  var size=(st.video_meta&&st.video_meta.size)||0;\n  if(size>22000000)throw new Error('音频文件过大('+Math.floor(size\/1048576)+'MB),请换音色或章节');\n  var enc=st.encrypt_info||{};\n  var url=String(st.main_url);\n  var ck='fqA_'+bookId+'_'+itemId+'_'+tone;\n  var cached=String(sv.get(ck)||'');\n  if(cached){\n    try{var tb=jv.readFile(cached);if(tb&&tb.length>100000)return 'file:\/\/'+FQ_CACHE+cached;}catch(e){}\n  }\n  var outHex=String(jv.ajax(url+','+JSON.stringify({headers:{},type:'hex'})));\n  if(!outHex||outHex.length<2000)throw new Error('音频下载失败');\n  var bytes=Packages.cn.hutool.core.util.HexUtil.decodeHex(outHex);\n  outHex='';\n  if(bytes.length<1000)throw new Error('音频文件异常');\n  if(enc&&enc.encrypt&&enc.spade_a){\n    var keyHex=FQ_akey(enc.spade_a);\n    if(!keyHex)throw new Error('密钥派生失败');\n    var sk=new Packages.javax.crypto.spec.SecretKeySpec(FQ_AS2B(FQ_unhex(keyHex)),'AES');\n    var C=Packages.javax.crypto.Cipher;\n    var cp=C.getInstance('AES\/CTR\/NoPadding');\n    var Arr=Packages.java.util.Arrays,Sys=Packages.java.lang.System,Iv=Packages.javax.crypto.spec.IvParameterSpec;\n    var stsz=FQ_afind(bytes,'stsz')[0],stco=FQ_afind(bytes,'stco')[0],stsc=FQ_afind(bytes,'stsc')[0],senc=FQ_afind(bytes,'senc')[0];\n    if(!stsz||!stco||!stsc||!senc)throw new Error('音频结构解析失败');\n    var b1=stsz.p+8,b2=stco.p+8,b3=stsc.p+8,b4=senc.p+8;\n    var cnt=FQ_au32(bytes,b1+8),nch=FQ_au32(bytes,b2+4),nent=FQ_au32(bytes,b3+4);\n    var ent=[];\n    for(var j=0;j<nent;j++)ent.push([FQ_au32(bytes,b3+8+j*12),FQ_au32(bytes,b3+8+j*12+4)]);\n    var idx=0,eI=0;\n    for(var c=0;c<nch&&idx<cnt;c++){\n      var off=FQ_au32(bytes,b2+8+c*4);\n      while(eI+1<nent&&ent[eI+1][0]<=c+1)eI++;\n      var spc=ent[eI][1];\n      for(var k=0;k<spc&&idx<cnt;k++){\n        var sz=FQ_au32(bytes,b1+12+idx*4);\n        if(off+sz>bytes.length){c=nch;break;}\n        var io=b4+8+idx*8;\n        var s16='';\n        for(var i=0;i<8;i++)s16+=String.fromCharCode(bytes[io+i]&255);\n        for(var i=0;i<8;i++)s16+=String.fromCharCode(0);\n        cp.init(C.DECRYPT_MODE,sk,new Iv(FQ_AS2B(s16)));\n        Sys.arraycopy(cp.doFinal(Arr.copyOfRange(bytes,off,off+sz)),0,bytes,off,sz);\n        off+=sz;idx++;\n      }\n    }\n  }\n  var mend=Math.min(bytes.length,400000);\n  for(var q=0;q+4<=mend;q++){\n    var c0=bytes[q]&255,c1=bytes[q+1]&255,c2=bytes[q+2]&255,c3=bytes[q+3]&255;\n    if(c0===0x65&&c1===0x6e&&c2===0x63&&c3===0x61){bytes[q]=0x6d;bytes[q+1]=0x70;bytes[q+2]=0x34;bytes[q+3]=0x61;q+=3;}\n    else if(c0===0x73&&c1===0x69&&c2===0x6e&&c3===0x66){\n      if(q>=4){\n        var ssz=FQ_au32(bytes,q-4);\n        if(ssz>=8&&ssz<50000&&q-4+ssz<=bytes.length){\n          bytes[q]=0x66;bytes[q+1]=0x72;bytes[q+2]=0x65;bytes[q+3]=0x65;\n          for(var j=q+4;j<q-4+ssz;j++)bytes[j]=0;\n          q=q-4+ssz-1;\n        }\n      }\n    }\n  }\n  var hex=String(Packages.cn.hutool.core.util.HexUtil.encodeHexStr(bytes));\n  bytes=null;\n  var DQ=String.fromCharCode(34);\n  var opt='{'+DQ+'type'+DQ+':'+DQ+'m4a'+DQ+'}';\n  var fname='https:\/\/x\/'+'fa'+tone+'_'+String(itemId).substring(0,18)+'.m4a';\n  var path=String(jv.downloadFile(hex,fname+','+opt));\n  hex='';\n  try{Packages.java.lang.System.gc();}catch(e){}\n  sv.put(ck,path);\n  FQ_atrim(sv,jv,ck);\n  return 'file:\/\/'+FQ_CACHE+path;\n}\nfunction FQ_atrim(sv,jv,lastKey){\n  var keys=String(sv.get('fqAKeys')||'').split(',');\n  var nk=[];\n  for(var i=0;i<keys.length;i++)if(keys[i]&&String(sv.get(keys[i])||''))nk.push(keys[i]);\n  if(lastKey&&nk.indexOf(lastKey)<0)nk.push(lastKey);\n  while(nk.length>6){\n    var k=nk.shift();\n    var p=String(sv.get(k)||'');\n    if(p){try{jv.deleteFile(p);}catch(e){}}\n    sv.put(k,'');\n  }\n  sv.put('fqAKeys',nk.join(','));\n}\nfunction FQ_atoneBtn(sv,jv){\n  var n=FQ_atoneNext(sv);\n  jv.toast('已切换音色:'+n);\n  return n;\n}\nfunction FQ_atoneReset(sv,jv){\n  FQ_asetTone(sv,0);\n  jv.toast('音色已重置为默认(推荐)');\n  return 'default';\n}\nfunction FQ_atoneShow(sv,jv){\n  var n=FQ_atoneName(sv);\n  jv.toast('当前音色:'+n+'(ID '+FQ_atone(sv)+')');\n  return n;\n}\nfunction FQ_abase(dev,iid){\n  return 'ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=72432&version_name=7.2.4.32&device_platform=android&os=android&ssmix=a&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=36&os_version=16&manifest_version_code=72432&resolution=1280*2620&dpi=520&update_version_code=72432&host_abi=arm64-v8a&dragon_device_type=phone&pv_player=72432&compliance_status=0&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&rom_version=miui_V816_OS3.0.9.0.WOLCNXM&iid='+iid+'&device_id='+dev;\n}\nfunction FQ_abook(sv,jv,bookId){\n  var pool=FQ_ensure(sv,2);\n  if(!pool.length)throw new Error('设备池为空,请重试');\n  var dev=pool[0].d,iid=pool[0].i;\n  var raw=FQ_api(jv,sv,'\/reading\/bookapi\/audio\/detail\/','version=v3&book_id='+bookId+'&'+FQ_abase(dev,iid));\n  var j=JSON.parse(raw);\n  var bd=(j.data)||{};\n  var out={\n    name:String(bd.book_name||''),\n    author:String(bd.author||''),\n    kind:String(bd.category||''),\n    intro:String(bd.abstract||bd.book_abstract_v2||''),\n    coverUrl:String(bd.thumb_url||bd.expand_thumb_url||''),\n    serial:String(bd.serial_count||''),\n    tones:String(bd.tones||''),\n    tts:String(bd.tts_status||''),\n    dur:String(bd.duration||''),\n    bookId:bookId\n  };\n  return JSON.stringify(out);\n}\nfunction FQ_atoc(sv,jv,bookId){\n  var pool=FQ_ensure(sv,2);\n  if(!pool.length)throw new Error('设备池为空,请重试');\n  var dev=pool[0].d,iid=pool[0].i;\n  var raw=FQ_api(jv,sv,'\/reading\/bookapi\/directory\/all_items\/v','book_type=0&item_data_list_md5=&catalog_data_md5=&book_id='+bookId+'&book_info_md5=&need_version=true&'+FQ_abase(dev,iid));\n  var d=JSON.parse(raw);\n  var dd=d.data||{};\n  var cats=dd.catalog_data||dd.item_data_list||[];\n  var out=[];\n  for(var i=0;i<cats.length;i++){\n    var c=cats[i];\n    var t=String(c.catalog_title||c.title||('第'+(i+1)+'章'));\n    out.push({name:t,url:'https:\/\/fanqienovel.com\/page\/'+bookId+'#'+String(c.item_id||c.catalog_id)});\n  }\n  return out;\n}\nfunction FQ_alisten(jv,sv,page){\n  var base='ac=wifi&channel=xiaomi_1967_64&aid=1967&app_name=novelapp&version_code=65132&version_name=6.5.1.32&device_platform=android&os=android&ssmix=a&device_type=FRD-AL10&device_brand=honor&language=zh&os_api=28&os_version=9&manifest_version_code=65132&resolution=1080*1920&dpi=480&update_version_code=65132&pv_player=65132&need_personal_recommend=1&player_so_load=1&is_android_pad_screen=0&host_abi=arm64-v8a&dragon_device_type=phone&compliance_status=0';\n  var off=((parseInt(page||'1')-1)*16);\n  var raw=FQ_api(jv,sv,'\/reading\/bookapi\/bookmall\/tab\/v','tab_type=5&offset='+off+'&client_template=0&'+base);\n  var d=JSON.parse(raw);\n  var ti=d.data.tab_item||[];\n  var out=[],seen={};\n  (function walk(n){\n    if(!n||typeof n!=='object')return;\n    if(n.book_data){var a=n.book_data;for(var i=0;i<a.length;i++){var b=a[i]||{};var bid=String(b.book_id||'');if(!bid||seen[bid])continue;seen[bid]=1;\n      out.push({name:String(b.book_name||''),author:String(b.author||''),kind:String(b.category||''),intro:String(b.abstract||''),coverUrl:String(b.thumb_url||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+bid+'#'+bid});}}\n    if(n.cell_data)for(var j=0;j<n.cell_data.length;j++)walk(n.cell_data[j]);\n  })({cell_data:ti});\n  return out;\n}\nfunction FQ_acheck(sv,jv){\n  var pool=FQ_ensure(sv,2);\n  var out={pool:pool.length,tone:FQ_atoneName(sv)};\n  try{\n    var b=FQ_abook(sv,jv,'7672933250976730174');\n    var o=JSON.parse(b);\n    out.name=o.name;out.serial=o.serial;out.tones=o.tones;\n    out.ok=true;\n  }catch(e){out.ok=false;out.err=String(e).substring(0,150);}\n  jv.longToast('设备池:'+out.pool+' 个\\n当前音色:'+out.tone+'\\n测试书籍:'+(out.name||('失败 '+out.err)));\n  return JSON.stringify(out);\n}\nfunction FQ_aclear(sv,jv){\n  var keys=String(sv.get('fqAKeys')||'').split(',');\n  var n=0;\n  for(var i=0;i<keys.length;i++){\n    var k=keys[i];\n    if(!k)continue;\n    var p=String(sv.get(k)||'');\n    if(p){try{jv.deleteFile(p);n++;}catch(e){}}\n    sv.put(k,'');\n  }\n  sv.put('fqAKeys','');\n  jv.toast('已清空音频缓存('+n+' 个文件)');\n  return n;\n}\nfunction FQ_ahelp(sv,jv){\n  jv.longToast('番茄听书使用说明:\\n\\n1. 本源匿名可用,无需登录\\n2. 音频流为 CENC 加密,首次播放需下载并本地解密(约 15~30 秒)\\n3. 之后同一章节命中缓存,秒播\\n4. 只有提供朗读版的书才有音频,纯文本书会提示无音频\\n5. 可在此界面切换朗读音色\\n6. 缓存仅保留最近 6 个章节');\n  return 'help';\n}\n\/* ---- 听书搜索:相关度排序 + 过滤噪声 ---- *\/\nfunction FQ_asearch2(jv,sv,kw,page){\n  var l=FQ_asrch(jv,kw,page);\n  if(!l.length)return l;\n  var DQ=String.fromCharCode(34);\n  var SQ=String.fromCharCode(39);\n  var STRIP=String.fromCharCode(92,115)+'|'+String.fromCharCode(44,65292,12290,65281,63,65311,65306,65307,59,65307)+'|'+SQ+'|'+DQ+'|'+String.fromCharCode(65288,65289,40,41,123,125,91,93);\n  function strip(s){var x=String(s||'');var re=new RegExp('['+STRIP+']','g');return x.replace(re,'');}\n  var k=strip(kw);\n  var scored=[];\n  for(var i=0;i<l.length;i++){\n    var b=l[i];\n    var nm=String(b.name||'');\n    var clean=strip(nm);\n    var sc=0;\n    if(clean===k)sc=100;                       \/\/ 完全相同\n    else if(clean.indexOf(k)>=0)sc=80;         \/\/ 名称包含关键词\n    else if(String(b.author||'')===kw)sc=70;   \/\/ 作者名精确匹配\n    else if(String(b.author||'').indexOf(k)>=0)sc=60;\n    else if(nm.indexOf(k)>=0)sc=50;\n    else if(String(b.intro||'').indexOf(k)>=0)sc=30;\n    else sc=0;\n    b._sc=sc;\n    scored.push(b);\n  }\n  scored.sort(function(a,b){return b._sc-a._sc;});\n  var out=[];\n  for(var j=0;j<scored.length;j++){\n    if(scored[j]._sc>0)out.push(scored[j]);\n  }\n  return out.length?out:scored;\n}\n\n\/* ---- 听书专用搜索:自带完整请求(规避 {{key}} 未编码问题) ---- *\/\nvar FQ_SSUF='&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=0123456789abcdef&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm';\nvar FQ_SBASE='https:\/\/api.fanqiesdk.com\/api\/novel\/channel\/homepage\/search\/search\/v1\/';\nfunction FQ_asrch(jv,kw,page){\n  var k=String(kw||'').trim();\n  if(!k)return [];\n  var off=(parseInt(page||'1',10)-1)*10;\n  if(isNaN(off)||off<0)off=0;\n  var url=FQ_SBASE+'?q='+encodeURIComponent(k)+'&offset='+off+FQ_SSUF;\n  var UAK=String.fromCharCode(85,115,101,114,45,65,103,101,110,116);\n  var hd={};hd[UAK]='com.ss.android.article.news\/13400';\n  var raw=String(jv.ajax(url+','+JSON.stringify({headers:hd})));\n  var out=[];\n  try{\n    var d=JSON.parse(raw);\n    var rd=(d.data&&d.data.ret_data)||[];\n    for(var i=0;i<rd.length;i++){\n      var it=rd[i]||{};\n      var nm=String(it.title||'').split('<em>').join('').split('<\/em>').join('');\n      out.push({name:nm,author:String(it.author||''),kind:String(it.category||''),intro:String(it.abstract||''),coverUrl:String(it.thumb_url||''),bookUrl:'https:\/\/fanqienovel.com\/page\/'+String(it.book_id)+'#'+String(it.book_id),bookId:String(it.book_id)});\n    }\n  }catch(e){}\n  return out;\n}\n\n\/* ---- 登录界面:静态生成音色按钮列表(每个音色一个按钮,不访问 source) ---- *\/\nfunction FQ_atoneRows(){\n  var rows=[];\n  rows.push({name:'📖 使用说明(点击查看)',type:'button',action:'FQ_ahelpSafe(java)'});\n  rows.push({name:'🎵 查看当前音色',type:'button',action:'FQ_toneShowSafe(java)'});\n  for(var i=0;i<FQ_TONES.length;i++){\n    var t=FQ_TONES[i];\n    rows.push({name:'🎙 '+t.n,type:'button',action:'FQ_toneSetSafe(java,'+t.i+')'});\n  }\n  rows.push({name:'↩️ 恢复默认音色',type:'button',action:'FQ_toneResetSafe(java)'});\n  rows.push({name:'🔍 检查连通\/设备状态',type:'button',action:'FQ_checkSafe(java)'});\n  rows.push({name:'🗑 清空音频缓存',type:'button',action:'FQ_clearSafe(java)'});\n  return JSON.stringify(rows);\n}\n\/* ---- 发现页:音色选择(ExploreKind 版本) ---- *\/\nfunction FQ_atoneKinds(jv){\n  var rows=[];\n  var cur=0;try{cur=parseInt(String(jv.get('fqTone')||'0'),10)||0;}catch(e){}\n  for(var i=0;i<FQ_TONES.length;i++){\n    var t=FQ_TONES[i];\n    var mark=(t.i===cur)?'✅':'🎙';\n    rows.push({title:mark+' '+t.n,type:'button',action:'FQ_toneSetSv(java,'+t.i+')',style:{layout_flexGrow:1}});\n  }\n  return JSON.stringify(rows);\n}\n\/* ---- 发现页:搜索区(text 输入 + 按钮搜索,双通道取词) ---- *\/\n\/* ---- 指定音色(登录界面) ---- *\/\nfunction FQ_toneSetSafe(jv,id){\n  var nm='音色'+id;\n  try{nm=FQ_toneNameById(id);}catch(e0){}\n  var ok=false;\n  try{jv.put('fqTone',String(id));ok=true;}catch(e1){}\n  \/\/ 三重提示:toast \/ longToast \/ 按钮名回显\n  try{jv.toast('已切换音色:'+nm);}catch(e2){}\n  try{jv.longToast('🎙 已切换音色:'+nm+'\\n(返回本书后重新进入章节生效)');}catch(e3){}\n  try{jv.put('fqLastMsg','🎙 当前音色:'+nm);}catch(e4){}\n  try{jv.reLoginView(false);}catch(e5){try{jv.reUiView(false);}catch(e6){}}\n  return ok?'ok':'fail';\n}\n\/* ---- 指定音色(发现页) ---- *\/\nfunction FQ_toneSetSv(jv,id){\n  try{\n    jv.put('fqTone',String(id));\n    jv.toast('✅ 已切换音色:'+FQ_toneNameById(id));\n  }catch(e){try{jv.toast('切换失败:'+e);}catch(e2){}}\n  return 'ok';\n}\n\/* ---- 搜索词绑定(发现页 text 输入框 600ms 防抖后触发) ---- *\/\nfunction FQ_toneNameById(id){\n  var s=String(id);\n  for(var i=0;i<FQ_TONES.length;i++)if(String(FQ_TONES[i].i)===s)return FQ_TONES[i].n;\n  return '音色'+s;\n}function FQ_toneShowSafe(jv){\n  var cur='0',name='默认(推荐)';\n  try{cur=String(jv.get('fqTone')||'0');name=FQ_toneNameById(cur);}catch(e){name='读取失败';}\n  try{jv.toast('当前音色:'+name);}catch(e2){}\n  try{jv.longToast('🎵 当前音色:'+name+'(ID '+cur+')');}catch(e3){}\n  try{jv.put('fqLastMsg','🎵 当前音色:'+name);}catch(e4){}\n  try{jv.reLoginView(false);}catch(e5){try{jv.reUiView(false);}catch(e6){}}\n  return 'ok';\n}\n\/* ---- 登录界面 Safe 包装(只用 java 绑定,不依赖 infoMap\/source) ---- *\/\nfunction FQ_ahelpSafe(jv){\n  try{jv.longToast('📻 番茄听书使用说明\\n\\n1. 本源匿名可用,无需登录\\n2. 音频流为 CENC 加密,首次播放需下载并本地解密(约 15~30 秒)\\n3. 之后同一章节命中缓存,秒播\\n4. 只有提供朗读版的书才有音频\\n5. 点下方音色按钮可切换朗读音色\\n6. 缓存仅保留最近 6 个章节');}\n  catch(e){}\n  return 'help';\n}\nfunction FQ_toneResetSafe(jv){\n  try{jv.put('fqTone','0');}catch(e){}\n  try{jv.toast('已恢复默认音色(推荐)');}catch(e2){}\n  try{jv.longToast('↩️ 已恢复默认音色(推荐)\\n(返回本书后重新进入章节生效)');}catch(e3){}\n  try{jv.put('fqLastMsg','🎵 当前音色:默认(推荐)');}catch(e4){}\n  try{jv.reLoginView(false);}catch(e5){try{jv.reUiView(false);}catch(e6){}}\n  return 'ok';\n}\nfunction FQ_checkSafe(jv){\n  try{\n    var pool=[];\n    try{pool=FQ_getPool(jv);}catch(e0){}\n    var tone='默认(推荐)';\n    try{tone=FQ_toneNameById(String(jv.get('fqTone')||'0'));}catch(e1){}\n    jv.longToast('🔍 状态检查\\n\\n设备池:'+pool.length+' 个\\n当前音色:'+tone+'\\n\\n若搜索或播放异常,可先点「清空音频缓存」再重试。');\n  }catch(e){try{jv.toast('检查失败:'+e);}catch(e2){}}\n  return 'ok';\n}\nfunction FQ_clearSafe(jv){\n  var n=0;\n  try{\n    var keys=String(jv.get('fqAKeys')||'').split(',');\n    for(var i=0;i<keys.length;i++){\n      var k=keys[i];\n      if(!k)continue;\n      var p=String(jv.get(k)||'');\n      if(p){try{jv.deleteFile(p);n++;}catch(e){}}\n      try{jv.put(k,'');}catch(e2){}\n    }\n    try{jv.put('fqAKeys','');}catch(e3){}\n  }catch(e4){}\n  try{jv.toast('已清空音频缓存('+n+' 个文件)');}catch(e5){}\n  try{jv.longToast('🗑 已清空音频缓存\\n\\n删除文件数:'+n);}catch(e6){}\n  return 'ok';\n}\n",
    "lastUpdateTime": "1791895990544",
    "loginUi": "<js>FQ_atoneRows()<\/js>",
    "loginUrl": "\/* 登录界面函数集(非空,保证 SourceLoginDialog 的 JS 环境完整) *\/\nfunction FQ_ahelpSafe(sv,jv){try{return FQ_ahelp(sv,jv);}catch(e){try{jv.longToast('番茄听书:匿名可用,无需登录。首次播放需等待下载解密约15~30秒。');}catch(e2){}return 'help';}}\nfunction FQ_toneBtnSafe(sv,jv){try{return FQ_atoneBtn(sv,jv);}catch(e){try{jv.toast('音色切换失败:'+e);}catch(e2){}return 'err';}}\nfunction FQ_toneShowSafe(sv,jv){try{return FQ_atoneShow(sv,jv);}catch(e){try{jv.toast('读取音色失败:'+e);}catch(e2){}return 'err';}}\nfunction FQ_toneResetSafe(sv,jv){try{return FQ_atoneReset(sv,jv);}catch(e){try{jv.toast('重置失败:'+e);}catch(e2){}return 'err';}}\nfunction FQ_checkSafe(sv,jv){try{return FQ_acheck(sv,jv);}catch(e){try{jv.longToast('检查失败:'+e);}catch(e2){}return 'err';}}\nfunction FQ_clearSafe(sv,jv){try{return FQ_aclear(sv,jv);}catch(e){try{jv.toast('清空失败:'+e);}catch(e2){}return 'err';}}\nfunction login(){return 'no-login-needed';}\n",
    "respondTime": 54306,
    "ruleBookInfo": {
        "author": "$.author",
        "coverUrl": "$.coverUrl",
        "init": "@js:(function(){var m=String(baseUrl).match(\/([0-9]{15,})\/);var bid=m?m[1]:'';if(!bid)throw new Error('无效书籍ID');var s=JSON.parse(FQ_abook(source,java,bid));s.tocUrl='https:\/\/fanqienovel.com\/page\/'+bid;return JSON.stringify(s);})()",
        "intro": "$.intro",
        "kind": "$.kind",
        "name": "$.name",
        "tocUrl": "$.tocUrl"
    },
    "ruleContent": {
        "content": "@js:(function(){var m=String(baseUrl).match(\/([0-9]{15,})\/);var bid=m?m[1]:'';var m2=String(baseUrl).match(\/#([0-9]+)$\/);var item=m2?m2[1]:'';if(!bid||!item)throw new Error('参数错误');return FQ_aaudio(source,java,bid,item);})()",
        "subContent": "@js:(function(){var t=String(source.get('fqTone')||'0');for(var i=0;i<FQ_TONES.length;i++)if(String(FQ_TONES[i].i)===t)return FQ_TONES[i].n;return '默认(推荐)';})()"
    },
    "ruleExplore": {
        "author": "$.author",
        "bookList": "@js:(function(){var u=String(baseUrl||'');var pg=1;try{pg=parseInt(FQ_qp(u,'p'),10);if(isNaN(pg)||pg<1)pg=1;}catch(e){}var l=[];if(u.indexOf('t=listen')>=0){l=FQ_alisten(java,source,pg);}else{var kw='';try{if(typeof key!=='undefined'&&key)kw=String(key);}catch(e){}if(!kw){try{kw=decodeURIComponent(FQ_qp(u,'k')||'');}catch(e2){kw=FQ_qp(u,'k');}}l=kw?FQ_asearch2(java,source,kw,pg):[];}var out=[];for(var i=0;i<l.length;i++)out.push(JSON.stringify(l[i]));return out;})()",
        "bookUrl": "$.bookUrl",
        "coverUrl": "$.coverUrl",
        "intro": "$.intro",
        "kind": "$.kind",
        "name": "$.name"
    },
    "ruleSearch": {
        "author": "$.author",
        "bookList": "@js:(function(){var kw='';try{if(typeof key!=='undefined'&&key)kw=String(key);}catch(e){}if(!kw){try{kw=decodeURIComponent(FQ_qp(String(baseUrl),'q')||'');}catch(e2){kw=FQ_qp(String(baseUrl),'q');}}var pg=1;try{pg=parseInt(FQ_qp(String(baseUrl),'offset'),10);pg=isNaN(pg)?1:(pg\/10+1);}catch(e){}var l=FQ_asearch2(java,source,kw,pg);var out=[];for(var i=0;i<l.length;i++){var b=l[i];out.push(JSON.stringify({name:b.name,author:b.author,kind:b.kind,intro:b.intro,coverUrl:b.coverUrl,bookUrl:b.bookUrl}));}return out;})()",
        "bookUrl": "$.bookUrl",
        "checkKeyWord": "我靠风水中医术",
        "coverUrl": "$.coverUrl",
        "intro": "$.intro",
        "kind": "$.kind",
        "name": "$.name"
    },
    "ruleToc": {
        "chapterList": "@js:(function(){var m=String(baseUrl).match(\/([0-9]{15,})\/);var bid=m?m[1]:'';if(!bid)throw new Error('无效书籍ID');var l=FQ_atoc(source,java,bid);if(!l.length)throw new Error('目录获取失败');book.setType(32);var out=[];for(var i=0;i<l.length;i++)out.push(JSON.stringify(l[i]));return out;})()",
        "chapterName": "$.name",
        "chapterUrl": "$.url"
    },
    "searchUrl": "https:\/\/api.fanqiesdk.com\/api\/novel\/channel\/homepage\/search\/search\/v1\/?q={{key}}&offset={{(page-1)*10}}&enterfrom_aid=&enter_from=inner_search&app_name=news_article&version_name=7.0.8&app_version=7.0.8&channel=tt_huawei2019_yz&version_code=708&device_platform=android&parent_enterfrom=novel_list&novel_host=&aid=13&scm_version=1.0.0.4112&device_type=25053RT47C&device_brand=Redmi&language=zh&os_api=35&os_version=15&openudid=0123456789abcdef&update_version_code=70899&plugin=0&tma_jssdk_version=1.10.0.0&rom_version=miui__os2.0.209.0.volcnxm",
    "weight": 0
}
广告