🌙 书旗小说(APP接口)

https://www.shuqi.com##书旗APP

little-yellow-egg (15400)6天前

2026.11.04 基于 https://github.com/ch6vip/fqapp 书旗(shuqi)上游协议制作的 Legado 纯 APP 接口书源。

【协议】纯JS复现官方 App 加密口:2048字节 keystream 二进制 XOR + base64(data 与 x-sq-public 各自从 keystream[0] 起算)+ MD5 签名(按键名升序拼 k=v& + skey 盐)+ enc18 派生 + 36键 x-sq-public(体内 platform=an / 头内 platform=2)。黄金向量与 Rust 单测逐一比对通过。

【链路】搜索=render/search/native_v3;详情=reader/titlepage;目录=H5 /chapter?bid= 全量真章名,H5缺失(部分新书返回55字节location.replace)时降级 content.shuqireader.com/openapi/book/chapterlist(bscpubKey+MD5签名,卷数组→真章名+chapterId);正文=免签 CDN JSONP 明文(2host×2flag×2scheme,VIP章亦可),失败降级 chapterinfo ROT13+base64;发现=H5 19个榜单 + 书库分类(服务端渲染,支持分页)。
【卷名】仅当站点本身分卷(≥2卷且有卷名)时,在每卷第一章名前标注一次【卷名】;单卷/无卷名不加,章名保持原样。

【UA】必须 okhttp/3.12.13:实测 www.shuqi.com 对浏览器 UA 一律返回 1120 字节 403 拦截页(伪装成正常 HTML),headers 键名必须大写 'User-Agent'。

【登录】游客态完全可用,无需登录;登录界面仅提供状态检查/线路测速/切换/重置设备身份。
【限频】concurrentRate=1/3000 且搜索规则内置 3 秒最小间隔,避免触发风控。
【兼容】LegadoTeam 官方版 + legado-E(全纯JS,不依赖 BouncyCastle/android.util.Base64)。
【注意】目录 H5 页约 1.2MB/本;搜索接口不支持分页(page 参数是模块名常量)。
二维码导入
{
    "bookSourceComment": "2026.11.04 基于 https:\/\/github.com\/ch6vip\/fqapp 书旗(shuqi)上游协议制作的 Legado 纯 APP 接口书源。\n\n【协议】纯JS复现官方 App 加密口:2048字节 keystream 二进制 XOR + base64(data 与 x-sq-public 各自从 keystream[0] 起算)+ MD5 签名(按键名升序拼 k=v& + skey 盐)+ enc18 派生 + 36键 x-sq-public(体内 platform=an \/ 头内 platform=2)。黄金向量与 Rust 单测逐一比对通过。\n\n【链路】搜索=render\/search\/native_v3;详情=reader\/titlepage;目录=H5 \/chapter?bid= 全量真章名,H5缺失(部分新书返回55字节location.replace)时降级 content.shuqireader.com\/openapi\/book\/chapterlist(bscpubKey+MD5签名,卷数组→真章名+chapterId);正文=免签 CDN JSONP 明文(2host×2flag×2scheme,VIP章亦可),失败降级 chapterinfo ROT13+base64;发现=H5 19个榜单 + 书库分类(服务端渲染,支持分页)。\n【卷名】仅当站点本身分卷(≥2卷且有卷名)时,在每卷第一章名前标注一次【卷名】;单卷\/无卷名不加,章名保持原样。\n\n【UA】必须 okhttp\/3.12.13:实测 www.shuqi.com 对浏览器 UA 一律返回 1120 字节 403 拦截页(伪装成正常 HTML),headers 键名必须大写 'User-Agent'。\n\n【登录】游客态完全可用,无需登录;登录界面仅提供状态检查\/线路测速\/切换\/重置设备身份。\n【限频】concurrentRate=1\/3000 且搜索规则内置 3 秒最小间隔,避免触发风控。\n【兼容】LegadoTeam 官方版 + legado-E(全纯JS,不依赖 BouncyCastle\/android.util.Base64)。\n【注意】目录 H5 页约 1.2MB\/本;搜索接口不支持分页(page 参数是模块名常量)。",
    "bookSourceGroup": "书旗,小说,APP,AI",
    "bookSourceName": "🌙 书旗小说(APP接口)",
    "bookSourceType": 0,
    "bookSourceUrl": "https:\/\/www.shuqi.com##书旗APP",
    "bookUrlPattern": "https?:\/\/(?:www\\.shuqi\\.com|shuqi\\.com|www\\.shuqireader\\.com|c1\\.shuqireader\\.com|c2\\.shuqireader\\.com)\/(?:book\/[0-9]+\\.html|reader\\?bid=[0-9]+(?:&cid=[0-9]+)?|httpserver\/filecache\/get_book_content_[0-9]+_[0-9]+_[0-9]+_0_0\\.html)",
    "concurrentRate": "1\/3000",
    "customButton": false,
    "customOrder": 1,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:\n(function(){\n var B='';try{B=String(source.get('sqWeb')||'')}catch(e){};if(!B||B==='null')B='https:\/\/www.shuqi.com';B=B.replace(\/\\\/$\/,'');\n var rows=[];\n function head(t){rows.push({title:t,url:'',style:{layout_flexBasisPercent:1,layout_wrapBefore:true,layout_justifySelf:'flex_start'}});}\n function add(t,u){rows.push({title:t,url:u+'&page={{page}}',style:{layout_flexGrow:1}});}\n head('📊 男频榜单');\n add('男频点击榜',B+'?rank=boyClick');add('男频收藏榜',B+'?rank=boyStore');\n add('男频订阅榜',B+'?rank=boyOrder');add('男频人气榜',B+'?rank=boyhot');\nadd('男频完结榜',B+'?rank=boyEnd');\n add('男频更新榜',B+'?rank=boyUpdate');\n head('💕 女频榜单');\n add('女频点击榜',B+'?rank=girlClick');add('女频收藏榜',B+'?rank=girlStore');\n add('女频订阅榜',B+'?rank=girlOrder');add('女频人气榜',B+'?rank=girlhot');\nadd('女频完结榜',B+'?rank=girlEnd');\n add('女频更新榜',B+'?rank=girlUpdate');\n head('🏆 全站榜单');\n add('全站完结榜',B+'?rank=allEnd');\n add('全站字数榜',B+'?rank=allWords');add('全站点击榜',B+'?rank=allClick');\n add('全站收藏榜',B+'?rank=allStore');add('全站订阅榜',B+'?rank=allOrder');\n head('📚 书库·频道');\n add('全部书库',B+'?sqs=1');add('男频书库',B+'?sz=1');add('女频书库',B+'?sz=2');\n head('📚 书库·分类');\n add('都市',B+'?fc=7');add('社会生活',B+'?fc=15');add('玄幻',B+'?fc=29');\n add('科幻',B+'?fc=34%2C102');add('悬疑',B+'?fc=41%2C108');add('历史',B+'?fc=45');\n add('体育',B+'?fc=54');add('武侠',B+'?fc=58');add('游戏',B+'?fc=63');\n add('仙侠',B+'?fc=67%2C98');add('同人',B+'?fc=71');add('现代言情',B+'?fc=76');\n add('古代言情',B+'?fc=86');add('玄幻言情',B+'?fc=94');add('幻想言情',B+'?fc=122');\n add('浪漫青春',B+'?fc=127');\n head('📚 书库·状态\/字数\/更新');\n add('连载',B+'?st=1');add('完结',B+'?st=2');\n add('30万以下',B+'?wd=11');add('30~50万',B+'?wd=12');add('50~100万',B+'?wd=13');\n add('100~200万',B+'?wd=14');add('200万以上',B+'?wd=15');\n add('3天内更新',B+'?tm=3');add('7天内更新',B+'?tm=7');\n add('半月内更新',B+'?tm=15');add('一月内更新',B+'?tm=30');\n return JSON.stringify(rows);\n})()",
    "header": "{\"User-Agent\": \"okhttp\/3.12.13\"}",
    "jsLib": "var SQ_KSB64 = \"QAwnzM9laLzStxk3jlPL517JAu73dQemPSrdOnAdiisooFf\/leYyXjc+8Az7oJ94j+pdGzsxGh6jmOs+f7HMz+6qEhMo\/nxkrOvr72JIyqouvb0EMsAPWAZvS14X6TM3f9ulxMC4BOBxHBE6MF5rflH9KXEAQUjsww4Ef5\/\/yCuiqPjQyNbKWZAy6mMdLvzXWa8wl2V1t4nUDJgJbaxBDXNPpu1K6M6yxHC9QbDXzhyOcn6R2ZXAkETdxZP28P4qjKDMNNg4tjxlWV5r+iMVveR\/WlY6VdLMXRHHceteh9yu8KKSJ60WKb74Jp2a+ZSbT0sxbJ1Pm3\/0GPGdLP4\/NJTaZ\/Z32U8S2JlaUBq6XHB5dwDvmChP86fHFvctkkY2XWRAZYKvAyscO3BX40v\/fAtgfBKbwZZQn4PU\/3C+svDdLITilbO8wEkIedR\/2xtz4BZDgylGN5B33zAZCbIvOhL6u8YxrRhIPEIVwK4kS+\/GxlHOg7ycGbMxx6WSdF4XtlKTk5cbam3+kcmUe4OIwCwYYq6IKaoO0O93AgL0O7bI4\/oGlRqvns\/1AhVP5Lv8qPELw5vCWe7ZAfqPUzFf3V6kRQMSk9gM\/MicDcwrO9+Jp68P0MrC5QvUAS\/QMr8vkL96UIj3qID17DFtf+v5JMCm37\/45\/rhw4yjccpMlYMD1xtl1VvByAE3IXTQJi7I0T2eHGwldAGEnmQxgjxCTy3MRJNqsodjx3y1o+4sLLRODqdbmgKGalsI7VTCgdn7D7gdWUKHWbM4ueFqB1zOoSvjmpi65MINtk2OkJwQUgXF8CEsbV57v382ri2IuJ2d3owaKVHB9x8X12L4tjxasn9EqKgStA9dwhQ7dhlFDKnHJ3F7nwKB\/lnzsbgC0zH\/fcqLPA8Q34aAb87IQz\/F65M0g1oS3JJ9goAOJFDWSjWxZ5SrtrKm5zs9IHoJ18GAzQBZ7gDYm3oaFIHOAZiYISEPOWDqdDWYHGm2Mb7stADWdJ7c961sipFrosEu5HEoSDS2IhiADJbtRsYl6yhL+xyMvVICLtynr9hxwnu7dpINxyfCbwvQEI2nz6QBeUlfvDJgf9bOaExdQ3Hcjj\/FMabfizUQEeYFSr40iW0ciIyjEwSddunLKtRHfQXULpVTGL6Gy6kFKLW9CEgQxNqNENE1SZWBq55f3gCLnac5tqiyqOFzycm879YE0u7ZuCB7usVEpIizT8xdg2VKv5kkfwX4un4T9xvhb0NG1GMVvd0WIw3Tidb7NjzPqdpMfdhZEMJfUmU\/HNUugH8BQw1KakZwqodYjcCwm1WDOqnnug42yFvAy8Ih7q40b6cmjWYYLrvm7NW9dNDdVpGnNvYmgZkyvAi\/fMrGVul+FGOkz3kchtqFyuDQM0a0cI43PbZxUDQU1jttZUB\/3j5845ibFl4\/gL2A0\/6dwz3AraAlTRmqQrAoqF1h2oXY8IKF5CgaCjGcOcwrlCIkEebTfAvgrbccoof\/IFNUFEZ9fcJ0wT6iZ9eSND6uJgg8pcbwHoy4pc2dft8tkN3ksHMRM3XFgScYQQRXVGuh14nbG6CH4piIC07lzb3ItgfIrQI97+9uLvWHrex7FnwDJOmQQIuUjdlrcfBdvMh0yVsESZQAzuDzqFiSBaSECqmmuSPifxcYpQqOLsXwheX2el1ojv5TsyUVvB3avEtyBADAa\/V+XdNBqAwnbOftakdTto9pR52FxRVmHFzJzF0hGuMOz2XqIFvqNsbTPdWfdjT1riKyD1bxRboS356818\/uN3EL6hqw4opXBLst6IoxALq0wB3h0k9Gt5TYJ8DgzmolSCeWRMVtgr8bwqhsIMDlncPcbJOhb24DPL5yosQitCt4ifkweGcDhIQN7Q1ilQLAmbV7KFQYyjmhbVwQnyemcaUYINNYPPyFoSaYwbo5XPKVwo5QubpYb9HMMM5d7EjqC3jrK6AzZ0\/vfILWwHvuYDpgAHSuY+TnJdGvmvOIlURYvxC6NQZObwRX2fcsUd0nfvG9IS4W5sSg1mE+PR7FQoLKGU1dEFEFyScx0r0FopHLcDWRPLRZPUjA0wUE4Migk8HgXRC8lD09rZ1SmBtZNyaAc62GO8NcrHWF2u0viNMA7RHDlwkUhf\/pgnvqFxRI6UuWY877Keoi9oaDbBcGpLUXiNK9ixNZk2UPvWYMfYNFg2yemBg0tT6Pkj7EwHKDkHz\/I+uYlfak1MirdQJGckI9bzfN57L2j+G4ocuImVwC\/StMhR2gRwdDo7Z7o3MUOmoy5XQWPehFfpDAoPpnwPupCM52r4QhLWYntvc\/uhN9YSvthcWQdDOxKbI2GtFBzrq8X7SoGandqr1ijv4WFMrvbygo57GVN56Ka5NvBf3wIxrzYQpOSbwVczRh\/Sztmj9r3NtKCrOY8\/pqzX1nNThujmIW3SFJBbxEa1I0N6ZrORMjEe8afJcG33vcifgAbdJOan9Me9uIiDzBN9kS+iR29VtkIMWRNBSWI\/eg+PZJAzoSYgtQmpYAscnB7OeEh2OCSegTjuXn9KKBiHKMiFldmhwDdtofsD4qL25FafrgJom76jSH0vAJ17QotQ1t0URNtj8AR68Bty9EBfnUJ0MSW3Rqjg\/CjITS22JB\/UzrquNzIAyAyv305DW3yTaZ1tzTpe6eJyLAVMAyxtcy3iWgiOFBvDl2R0cLICeAIH9aKR6+h1KfJ8JNgNKcH\/DvZXcBL58=\";\nvar SQ_SKEY = \"467694bd8912441cae8498b3c7e4282c\";\nvar SQ_SQSV = \"1.0\";\nvar SQ_UID = \"8158804976\";\nvar SQ_CIUID = \"8000000\";\nvar SQ_HOST = \"https:\/\/ocean.shuqireader.com\";\nvar SQ_UA = \"okhttp\/3.12.13\";\nvar SQ_H5UA = \"okhttp\/3.12.13\";\nvar SQ_B64C = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/\";\nvar SQ_PUB = [\n[\"soft_id\",\"1\"],[\"user_id\",SQ_UID],[\"userId\",SQ_UID],[\"ver\",\"261013\"],\n[\"subVer\",\"sqrelease\"],[\"appVer\",\"12.7.0.268\"],[\"theme\",\"day\"],[\"platform\",\"an\"],\n[\"placeid\",\"1069\"],[\"sdk\",\"32\"],[\"cpu\",\"x86_64\"],[\"pkg_cpu\",\"arm64-v8a\"],[\"wh\",\"900x1600\"],\n[\"msv\",\"3\"],[\"vc\",\"5d73\"],[\"mod\",\"BVL-AN16\"],[\"manufacturer\",\"HONOR\"],[\"brand\",\"HONOR\"],\n[\"net_type\",\"wifi\"],[\"net_type_str\",\"wifi\"],[\"first_placeid\",\"src1069\"],[\"aak\",\"a3a840\"],\n[\"utype\",\"pre_vip\"],[\"net\",\"4\"],[\"net_env\",\"4\"],[\"permissionType\",\"0\"],[\"personalized\",\"1\"],\n[\"contentRecom\",\"1\"],[\"scene_code\",\"\"],[\"rom\",\"12\"],[\"sqUniqDeviceId\",\"\"],[\"utdid\",\"\"],\n[\"sn\",\"\"],[\"umidtoken\",\"\"],[\"otdd\",\"\"]];\nvar SQ_ORDER = [\"soft_id\",\"user_id\",\"userId\",\"ver\",\"subVer\",\"appVer\",\"theme\",\"platform\",\"placeid\",\n\"sdk\",\"cpu\",\"pkg_cpu\",\"wh\",\"msv\",\"enc\",\"vc\",\"mod\",\"manufacturer\",\"brand\",\"net_type\",\"net_type_str\",\n\"first_placeid\",\"aak\",\"utype\",\"net\",\"net_env\",\"permissionType\",\"personalized\",\"contentRecom\",\n\"scene_code\",\"rom\",\"sqUniqDeviceId\",\"utdid\",\"sn\",\"umidtoken\",\"otdd\"];\nvar SQ_NOSIGN = [\"sign\",\"key\",\"_public\",\"_reqid\",\"_beta\",\"_\",\"X\",\"XNEBULAXMLHTTPREQUEST\",\"callbackUrl\"];\nfunction SQ_b64d(s){s=String(s).replace(\/[^A-Za-z0-9+\\\/=]\/g,\"\");var o=[],i=0,c1,c2,c3,c4;\n while(i<s.length){c1=SQ_B64C.indexOf(s.charAt(i++));c2=SQ_B64C.indexOf(s.charAt(i++));\n  c3=SQ_B64C.indexOf(s.charAt(i++));c4=SQ_B64C.indexOf(s.charAt(i++));\n  if(c2<0)break;o.push(((c1<<2)|(c2>>4))&255);\n  if(c3>=0){o.push((((c2&15)<<4)|(c3>>2))&255);\n   if(c4>=0)o.push((((c3&3)<<6)|c4)&255);}}\n return o;}\nfunction SQ_b64e(bs){var o=\"\",i=0,L=bs.length,a,b,c,n;\n while(i<L){a=bs[i++]&255;b=i<L?bs[i++]&255:-1;c=i<L?bs[i++]&255:-1;\n  n=(a<<16)|((b<0?0:b)<<8)|(c<0?0:c);\n  o+=SQ_B64C.charAt((n>>18)&63)+SQ_B64C.charAt((n>>12)&63)+\n     (b<0?\"=\":SQ_B64C.charAt((n>>6)&63))+(c<0?\"=\":SQ_B64C.charAt(n&63));}\n return o;}\nfunction SQ_u8(s){var o=[],i=0,c,c2,cp;s=String(s);\n for(i=0;i<s.length;i++){c=s.charCodeAt(i);\n  if(c<128)o.push(c);\n  else if(c<2048)o.push(192|(c>>6),128|(c&63));\n  else if(c>=0xD800&&c<=0xDBFF&&i+1<s.length){c2=s.charCodeAt(++i);\n   cp=0x10000+((c-0xD800)<<10)+(c2-0xDC00);\n   o.push(240|(cp>>18),128|((cp>>12)&63),128|((cp>>6)&63),128|(cp&63));}\n  else o.push(224|(c>>12),128|((c>>6)&63),128|(c&63));}\n return o;}\nfunction SQ_u8s(bs){var s=\"\",i=0,c,b1,b2,b3,cp;\n while(i<bs.length){c=bs[i++]&255;\n  if(c<128)s+=String.fromCharCode(c);\n  else if(c<224){b1=bs[i++]&255;s+=String.fromCharCode(((c&31)<<6)|(b1&63));}\n  else if(c<240){b1=bs[i++]&255;b2=bs[i++]&255;s+=String.fromCharCode(((c&15)<<12)|((b1&63)<<6)|(b2&63));}\n  else{b1=bs[i++]&255;b2=bs[i++]&255;b3=bs[i++]&255;\n   cp=(((c&7)<<18)|((b1&63)<<12)|((b2&63)<<6)|(b3&63))-0x10000;\n   s+=String.fromCharCode(0xD800+(cp>>10),0xDC00+(cp&1023));}}\n return s;}\nfunction SQ_uri(s){return encodeURIComponent(String(s));}\nfunction SQ_pubEnc(s){return SQ_uri(s).replace(\/\\+\/g,\"%20\").replace(\/\\*\/g,\"%2A\").replace(\/%7E\/g,\"~\");}\nfunction SQ_md5(str){\n var bs=SQ_u8(String(str)),i,j,L=bs.length;\n var SA=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,\n  5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,\n  4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,\n  6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21];\n var KT=[];for(i=0;i<64;i++)KT[i]=Math.floor(Math.abs(Math.sin(i+1))*4294967296);\n function rol(x,c){return (x<<c)|(x>>>(32-c));}\n function add(a,b){var l=(a&65535)+(b&65535),h=(a>>>16)+(b>>>16)+(l>>>16);return ((h<<16)|(l&65535))>>>0;}\n var bitLen=L*8;\n bs.push(128);\n while(bs.length%64!==56)bs.push(0);\n var hi=Math.floor(bitLen\/4294967296),lo=bitLen>>>0;\n bs.push(lo&255,(lo>>>8)&255,(lo>>>16)&255,(lo>>>24)&255,\n        hi&255,(hi>>>8)&255,(hi>>>16)&255,(hi>>>24)&255);\n var a0=0x67452301,b0=0xefcdab89,c0=0x98badcfe,d0=0x10325476;\n for(i=0;i<bs.length;i+=64){\n  var M=[];for(j=0;j<16;j++){var q=i+j*4;M[j]=(bs[q]|(bs[q+1]<<8)|(bs[q+2]<<16)|(bs[q+3]<<24))>>>0;}\n  var A=a0,B=b0,C=c0,D=d0,F,g,tmp;\n  for(j=0;j<64;j++){\n   if(j<16){F=(B&C)|((~B)&D);g=j;}\n   else if(j<32){F=(D&B)|((~D)&C);g=(5*j+1)%16;}\n   else if(j<48){F=B^C^D;g=(3*j+5)%16;}\n   else{F=C^(B|(~D));g=(7*j)%16;}\n   F=add(add(add(A,F),KT[j]),M[g]);\n   tmp=D;D=C;C=B;B=add(B,rol(F,SA[j]));A=tmp;}\n  a0=add(a0,A);b0=add(b0,B);c0=add(c0,C);d0=add(d0,D);}\n function hx(n){var s=\"\",k;for(k=0;k<4;k++){var v=(n>>>(k*8))&255;s+=(v<16?\"0\":\"\")+v.toString(16);}return s;}\n return hx(a0)+hx(b0)+hx(c0)+hx(d0);}\nfunction SQ_enc18(uid,ts){ts=String(ts);while(ts.length<13)ts=\"2\"+ts;if(ts.length>13)ts=ts.slice(0,13);\n var n=Number(uid)||0;if(n===0)n=24697;\n var k=Number(ts.charAt(1)+ts.charAt(3)+ts.charAt(5)+ts.charAt(8)+ts.charAt(6))||0;\n var p=k===0?12347*n:k*n;\n var tail=String(p).slice(-5);\n return tail+ts;}\nfunction SQ_sign(pairs){var a=[],i,k,v;\n for(i=0;i<pairs.length;i++){k=pairs[i][0];v=pairs[i][1];\n  if(SQ_NOSIGN.indexOf(k)>=0)continue;a.push([k,String(v)]);}\n var has=false;for(i=0;i<a.length;i++)if(a[i][0]===\"sqSv\")has=true;\n if(!has)a.push([\"sqSv\",SQ_SQSV]);\n a.sort(function(x,y){return x[0]<y[0]?-1:(x[0]>y[0]?1:0);});\n var raw=\"\";for(i=0;i<a.length;i++)raw+=a[i][0]+\"=\"+SQ_uri(a[i][1])+\"&\";\n raw+=\"skey=\"+SQ_SKEY;return SQ_md5(raw);}\nfunction SQ_pubStr(uid,enc,dev){var m={},i,k;\n for(i=0;i<SQ_PUB.length;i++)m[SQ_PUB[i][0]]=SQ_PUB[i][1];\n for(k in dev)if(dev.hasOwnProperty(k))m[k]=dev[k];\n m.user_id=uid;m.userId=uid;m.platform=\"2\";m.enc=enc;\n var o=\"\";for(i=0;i<SQ_ORDER.length;i++){k=SQ_ORDER[i];\n  if(m[k]!==undefined)o+=k+\"=\"+SQ_pubEnc(m[k])+\"&\";}\n return o;}\nfunction SQ_xorB64(bytes){var ks=SQ_KS(),o=[],i,n=bytes.length<ks.length?bytes.length:ks.length;\n for(i=0;i<n;i++)o.push((bytes[i]&255)^(ks[i]&255));\n return SQ_b64e(o);}\nvar SQ_KS_CACHE=null;\nfunction SQ_KS(){if(!SQ_KS_CACHE)SQ_KS_CACHE=SQ_b64d(SQ_KSB64);return SQ_KS_CACHE;}\nfunction SQ_rnd(n,hex){var C=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",H=\"0123456789abcdef\",s=\"\";\n for(var i=0;i<n;i++)s+=(hex?H:C).charAt(Math.floor(Math.random()*(hex?16:62)));return s;}\nfunction SQ_newDev(){return {sqUniqDeviceId:SQ_rnd(22,0),utdid:SQ_rnd(28,0),sn:SQ_rnd(16,1),\n umidtoken:SQ_rnd(40,1),otdd:SQ_rnd(22,0)};}\nfunction SQ_dev(S){var v=\"\";try{v=String(S.get(\"sqDev\")||\"\");}catch(e){}\n if(v&&v.length>10&&v!==\"null\"){try{var d=JSON.parse(v);if(d&&d.sn)return d;}catch(e2){}}\n var d2=SQ_newDev();try{S.put(\"sqDev\",JSON.stringify(d2));}catch(e3){}return d2;}\nfunction SQ_req(path,biz,uid,S,ts){uid=uid||SQ_UID;ts=ts||String(Date.now());\n var dev=SQ_dev(S);var enc=SQ_enc18(uid,ts);\n var m={},i,k,v;\n for(i=0;i<SQ_PUB.length;i++)m[SQ_PUB[i][0]]=SQ_PUB[i][1];\n for(k in dev)if(dev.hasOwnProperty(k))m[k]=dev[k];\n m.user_id=uid;m.userId=uid;m.platform=\"an\";m.enc=enc;m.timestamp=ts;\n for(i=0;i<biz.length;i++)m[biz[i][0]]=String(biz[i][1]);\n m.isTeenMode=\"0\";m.sqSv=SQ_SQSV;\n var pairs=[];for(k in m)if(m.hasOwnProperty(k))pairs.push([k,m[k]]);\n m.sign=SQ_sign(pairs);m.key=\"sq_app_gateway\";\n var plain=SQ_u8(JSON.stringify(m));\n var body=\"data=\"+SQ_uri(SQ_xorB64(plain));\n var pub=SQ_pubStr(uid,enc,dev);\n var hdr={\"content-type\":\"application\/x-www-form-urlencoded\",\"user-agent\":SQ_UA,\n  \"x-sq-req-platform\":\"an\",\"x-sq-s-key\":\"23011413\",\"x-sq-sv\":\"3.0\",\n  \"x-sq-public\":SQ_xorB64(SQ_u8(pub)),\"x-sq-req-encrypt\":\"sdk\",\n  \"x-sq-req-encrypt-param\":\"x-sq-public\",\"x-sq-api-encrypt\":\"1\"};\n return {url:SQ_HOST+path,option:{method:\"POST\",body:body,headers:hdr,timeout:15000}};}\nfunction SQ_post(Jv,S,path,biz,uid){var r=SQ_req(path,biz,uid,S);\n var raw=String(Jv.ajax(r.url+\",\"+JSON.stringify(r.option)));\n try{return JSON.parse(raw);}catch(e){throw new Error(\"书旗接口返回异常: \"+raw.slice(0,120));}}\nfunction SQ_get(Jv,url,ua){var o={timeout:12000,headers:{\"User-Agent\":ua||SQ_H5UA}};\n return String(Jv.ajax(url+\",\"+JSON.stringify(o)));}\nvar SQ_WEB = \"https:\/\/www.shuqi.com\";\nvar SQ_WEB_ALT = [\"https:\/\/www.shuqi.com\",\"https:\/\/shuqi.com\"];\nvar SQ_CDN_ALT = [\"https:\/\/c1.shuqireader.com\",\"https:\/\/c2.shuqireader.com\"];\nvar SQ_ALL_LINES = SQ_WEB_ALT.concat(SQ_CDN_ALT);\nvar SQ_CDN_HOSTS = [\"c1.shuqireader.com\",\"c2.shuqireader.com\"];\nvar SQ_CDN_FLAGS = [\"3111111111\",\"2111111111\"];\nvar SQ_P_SEARCH = \"\/sqan\/render\/render\/search\/native_v3\";\nvar SQ_P_TITLE = \"\/sqan\/sqapi\/bff\/api\/v1\/reader\/titlepage\";\nvar SQ_P_CHINFO = \"\/sqan\/sqapi\/bff\/api\/v1\/reader\/chapterinfo\";\nfunction SQ_S(x){return \"\"+(x===undefined||x===null?\"\":x);}\nfunction SQ_trim(s){return SQ_S(s).replace(\/^\\s+|\\s+$\/g,\"\");}\nfunction SQ_plain(s){return SQ_trim(SQ_S(s).replace(\/<[^>]*>\/g,\"\").replace(\/&nbsp;\/g,\" \").replace(\/&amp;\/g,\"&\").replace(\/&lt;\/g,\"<\").replace(\/&gt;\/g,\">\").replace(\/&quot;\/g,'\"').replace(\/\\s+\/g,\" \"));}\nfunction SQ_wan(v){var n=Number(v)||0;if(n>=1e8)return (Math.round(n\/1e6)\/100)+\"亿字\";if(n>=1e4)return (Math.round(n\/1e3)\/10)+\"万字\";return n>0?n+\"字\":\"\";}\nfunction SQ_status(v){return SQ_S(v)===\"2\"?\"完结\":\"连载\";}\nfunction SQ_tagStr(m){var a=m.tags||m.tagList||[];var o=[],i;\n if(typeof a===\"string\")return SQ_plain(a);\n for(i=0;i<a.length;i++){var t=a[i];o.push(SQ_plain(typeof t===\"string\"?t:(t&&(t.tagName||t.name))||\"\"));}\n return o.filter(function(x){return x}).join(\",\");}\nfunction SQ_bid(u){var s=SQ_S(u),m;\n m=s.match(\/get_book_content_([0-9]{1,12})_([0-9]{1,20})_\/);if(m)return m[1];\n m=s.match(\/(?:\\\/book\\\/|\\\/sqbook\\\/|bid=|bookId=)([0-9]{1,12})\/);return m?m[1]:\"\";}\nfunction SQ_cid(u){var s=SQ_S(u),m;\n m=s.match(\/get_book_content_[0-9]{1,12}_([0-9]{1,20})_\/);if(m)return m[1];\n m=s.match(\/(?:cid=|sqch\\\/\\d+\\\/)([0-9]{1,20})\/);return m?m[1]:\"\";}\nfunction SQ_bookUrl(id,S){try{return SQ_web(S)+\"\/book\/\"+id+\".html\"}catch(e){return SQ_WEB_ALT[0]+\"\/book\/\"+id+\".html\";}}\nfunction SQ_chUrl(bid,cid,S){try{return SQ_cdnHost(S)+\"\/httpserver\/filecache\/get_book_content_\"+bid+\"_\"+cid+\"_3111111111_0_0.html\"}catch(e){return SQ_CDN_ALT[0]+\"\/httpserver\/filecache\/get_book_content_\"+bid+\"_\"+cid+\"_3111111111_0_0.html\";}}\nfunction SQ_gv(S,k,d){var v=\"\";try{v=SQ_S(S.get(k)||\"\");}catch(e){}\n if(!v||v===\"null\"||v===\"undefined\")v=d||\"\";return SQ_S(v);}\nfunction SQ_web(S){\n var w=SQ_gv(S,\"sqWeb\",SQ_WEB).replace(\/\\\/$\/,\"\");\n var ok=false,i;for(i=0;i<SQ_WEB_ALT.length;i++)if(w===SQ_WEB_ALT[i])ok=true;\n if(!ok)w=SQ_WEB_ALT[0];\n return w;}\nfunction SQ_cdnHost(S){\n var c=SQ_gv(S,\"sqCdn\",\"https:\/\/c1.shuqireader.com\").replace(\/\\\/$\/,\"\");\n var ok2=false,i;for(i=0;i<SQ_CDN_ALT.length;i++)if(c===SQ_CDN_ALT[i])ok2=true;\n if(!ok2)c=SQ_CDN_ALT[0];\n return c;}\nfunction SQ_put(S,k,v){try{S.put(k,SQ_S(v));}catch(e){try{java.put(k,SQ_S(v));}catch(e2){}}}\nfunction SQ_webGet(Jv,url){var o={timeout:12000,headers:{\"User-Agent\":SQ_UA}};\n return SQ_S(Jv.ajax(url+\",\"+JSON.stringify(o)));}\nfunction SQ_api(Jv,S,path,biz,uid){return SQ_post(Jv,S,path,biz,uid);}\nfunction SQ_searchUrl(Jv,S,kw,pg){\n var biz=[[\"page\",\"searchResultV3\"],[\"query\",SQ_S(kw)],[\"timestamp\",String(Date.now())]];\n var r=SQ_req(SQ_P_SEARCH,biz,null,S);\n return r.url+\",\"+JSON.stringify(r.option);\n}\nfunction SQ_searchBooks(resp,S){S=S||{get:function(){return \"\"}};\n var d={};try{d=(resp&&typeof resp===\"object\")?resp:JSON.parse(SQ_S(resp));}catch(e){return [];}\n var mods=(d.data&&d.data.moduleInfos)||[],out=[],seen={},i;\n for(i=0;i<mods.length;i++){\n  var b=mods[i]&&mods[i].book;if(!b||!b.bookId)continue;\n  var id=SQ_S(b.bookId);if(seen[id])continue;seen[id]=1;\n  var kind=[];\n  var bottom=SQ_plain(b.bottomText||\"\");if(bottom)kind.push(bottom);\n  var tags=SQ_tagStr(b);if(tags)kind.push(tags);\n  out.push({name:SQ_plain(b.bookName||b.displayBookName),author:SQ_plain(b.authorName),\n   bookUrl:SQ_bookUrl(id,S),coverUrl:SQ_S(b.imgUrl||\"\"),\n   intro:SQ_plain(b.desc),kind:kind.join(\",\"),wordCount:SQ_wan(b.wordCount),\n   lastChapter:\"\",status:SQ_status(b.state)});\n }\n return out;\n}\nfunction SQ_detail(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl);if(!bid)throw new Error(\"书旗:无效书籍ID\");\n var info=null;\n try{var r=SQ_api(Jv,S,SQ_P_TITLE,[[\"bookId\",bid]]);\n  var b=(r&&r.data&&r.data.bookInfo)||null;\n  if(b&&b.bookName){\n   var score=(r.data&&r.data.scoreInfo)||{};\n   var kind=[SQ_S(b.secCateName||\"\"),SQ_tagStr(b),SQ_status(b.serialState),score.bookScore?score.bookScore+\"分\":\"\",SQ_wan(b.wordCount)].filter(function(x){return x});\n   info={name:SQ_plain(b.bookName),author:SQ_plain(b.authorName),\n    intro:SQ_plain(b.briefIntro||b.desc||b.intro),kind:kind.join(\",\"),\n    coverUrl:SQ_S(b.coverUrl||b.imgUrl||\"\"),wordCount:SQ_wan(b.wordCount),\n    lastChapter:SQ_plain((b.lastChapter&&b.lastChapter.chapterName)||b.latestChapterName||\"\"),\n    tocUrl:SQ_bookUrl(bid,S)};\n  }\n }catch(e){}\n if(!info){\n  try{var h=SQ_webGet(Jv,SQ_web(S)+\"\/book\/\"+bid+\".html\");\n   var ti=(h.match(\/<title>([\\s\\S]{0,160}?)<\\\/title>\/)||[])[1]||\"\";\n   var mt=ti.match(\/《([^》]+)》\/);var nm=mt?mt[1]:\"\";\n   var au=(h.match(\/作者[::]\\s*([^<\\s,,]{1,20})\/)||[])[1]||\"\";\n   var iv=(h.match(\/简介[::]?([\\s\\S]{0,400}?)<\\\/p>\/)||[])[1]||\"\";\n   info={name:nm||\"书籍\"+bid,author:au,intro:SQ_plain(iv),kind:\"\",coverUrl:\"\",wordCount:\"\",lastChapter:\"\",tocUrl:SQ_bookUrl(bid,S)};\n  }catch(e2){throw new Error(\"书旗:详情获取失败 \"+bid);}\n }\n return info;\n}\nfunction SQ_h5Rows(seg,bid,S){\n var rows=[],seen={},re=\/href=\"\\\/reader\\?bid=\\d+&(?:amp;)?cid=(\\d+)\"[^>]*>([\\s\\S]*?)<\\\/a>\/g,m;\n while((m=re.exec(seg))!==null){\n  var cid=m[1];if(seen[cid])continue;seen[cid]=1;\n  var inner=SQ_S(m[2]).replace(\/<i[^>]*>[\\s\\S]*?<\\\/i>\/gi,\" \").replace(\/<[^>]*>\/g,\" \");\n  inner=SQ_plain(inner).replace(\/^\\d+[.、]\\s*\/,\"\");\n  if(!inner)continue;\n  rows.push({pos:m.index,title:inner,url:SQ_chUrl(bid,cid,S)});\n  if(rows.length>20000)break;\n }\n return rows;\n}\nfunction SQ_volMark(name,title){\n var vn=SQ_S(name);if(!vn)return title;\n if(SQ_S(title).indexOf(vn)>=0)return title;\n return \"【\"+vn+\"】\"+title;\n}\nfunction SQ_openToc(Jv,S,bid){\n var KEY=\"37e81a9d8f02596e1b895d07c171d5c9\",UID=\"8000000\";\n var ts=String(Math.floor(Date.now()\/1000));\n var q=\"bookId=\"+bid+\"&user_id=\"+UID+\"&timestamp=\"+ts+\"&sign=\"+SQ_md5(String(bid)+ts+UID+KEY);\n var raw=\"\";\n try{raw=SQ_webGet(Jv,\"https:\/\/content.shuqireader.com\/openapi\/book\/chapterlist?shuqi_h5=205&platform=0&\"+q);}catch(e){}\n if(!raw||raw.length<200){try{raw=SQ_webGet(Jv,\"https:\/\/ocean.shuqireader.com\/api\/bcspub\/qswebapi\/book\/chapterlist?_=&\"+q);}catch(e2){}}\n var d={};try{d=JSON.parse(raw);}catch(e3){return [];}\n if(String(d.state)!==\"200\"&&String(d.status)!==\"200\")return [];\n var dt=d.data||{},cls=dt.chapterList||[],vols=[],i,j;\n for(i=0;i<cls.length;i++){\n  var v=cls[i]||{},a=v.volumeList||v.chapterList||v.chapter||[],rows=[];\n  for(j=0;j<a.length;j++){\n   var c=a[j]||{},cid=SQ_S(c.chapterId||c.cid||\"\");\n   if(!cid)continue;\n   var nm=SQ_plain(c.chapterName||c.name||c.title||\"\");\n   if(!nm)nm=\"第\"+(rows.length+1)+\"章\";\n   rows.push({title:nm,url:SQ_chUrl(bid,cid,S)});\n   if(rows.length>20000)break;\n  }\n  if(rows.length)vols.push({name:SQ_plain(v.volumeName||v.name||\"\"),rows:rows});\n }\n if(!vols.length)return [];\n var multi=vols.length>=2,out=[];\n for(i=0;i<vols.length;i++){\n  var vv=vols[i],vname=multi?vv.name:\"\";\n  for(j=0;j<vv.rows.length;j++){\n   var t=vv.rows[j].title;\n   if(j===0&&vname)t=SQ_volMark(vname,t);\n   out.push({title:t,url:vv.rows[j].url});\n  }\n }\n return out;\n}\nfunction SQ_toc(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl);if(!bid)throw new Error(\"书旗:无效书籍ID\");\n var h=\"\";\n try{h=SQ_webGet(Jv,SQ_web(S)+\"\/chapter?bid=\"+bid);}catch(e){}\n if(h.length>5000&&h.indexOf(\"cid=\")>=0){\n  var rows=SQ_h5Rows(h,bid,S);\n  if(rows.length){\n   var marks=[],vm=\/<div class=\"vol_name\"[^>]*>\\s*<span>([\\s\\S]*?)<\\\/span>\/g,mm;\n   while((mm=vm.exec(h))!==null)marks.push({pos:mm.index,name:SQ_plain(mm[1])});\n   var out=[],k,vi,fk,firstSet={};\n   if(marks.length>=2){\n    for(vi=0;vi<marks.length;vi++){\n     fk=-1;\n     for(k=0;k<rows.length;k++)if(rows[k].pos>=marks[vi].pos&&(vi+1>=marks.length||rows[k].pos<marks[vi+1].pos)){fk=k;break;}\n     if(fk>=0&&marks[vi].name)firstSet[fk]=marks[vi].name;\n    }\n   }\n   for(k=0;k<rows.length;k++){\n    var t=rows[k].title;\n    if(firstSet[k])t=SQ_volMark(firstSet[k],t);\n    out.push({title:t,url:rows[k].url});\n   }\n   return out;\n  }\n }\n return SQ_openToc(Jv,S,bid);\n}\nfunction SQ_cdnParse(body){\n var s=SQ_S(body),i=s.indexOf(\"(\"),j=s.lastIndexOf(\")\"),inner=i>0&&j>i?s.slice(i+1,j):s;\n try{var a=JSON.parse(inner);var c=SQ_S(a&&a[0]&&a[0].content);\n  if(!c)return \"\";\n  return SQ_trim(c.replace(\/<br\\s*\\\/?>\/gi,\"\\n\").replace(\/&nbsp;\/g,\" \").replace(\/<[^>]*>\/g,\"\")\n   .replace(\/&amp;\/g,\"&\").replace(\/&lt;\/g,\"<\").replace(\/&gt;\/g,\">\").replace(\/&quot;\/g,'\"'));\n }catch(e){return \"\";}\n}\nfunction SQ_rot13(s){return SQ_S(s).replace(\/[a-zA-Z]\/g,function(c){var b=c<=\"Z\"?65:97;return String.fromCharCode((c.charCodeAt(0)-b+13)%26+b);});}\nfunction SQ_ciDecode(s){var r=SQ_rot13(s).replace(\/\\s+\/g,\"\");\n try{return SQ_u8s(SQ_b64d(r)).replace(\/<br\\s*\\\/?>\/gi,\"\\n\");}catch(e){return \"\";}}\nfunction SQ_content(Jv,S,rawUrl){\n var bid=SQ_bid(rawUrl),cid=SQ_cid(rawUrl);\n if(!bid||!cid)throw new Error(\"书旗:章节地址无效\");\n var note=[],i,f,h,sch,url,txt;\n var pref=SQ_cdnHost(S).split(\"\/\/\")[1];\n var hs=SQ_CDN_HOSTS.slice();\n hs.sort(function(a,b){return (a===pref?-1:0)-(b===pref?-1:0)});\n for(sch=0;sch<2;sch++){\n  var scheme=sch===0?\"https\":\"http\";\n  for(h=0;h<hs.length;h++){\n   for(f=0;f<SQ_CDN_FLAGS.length;f++){\n    url=scheme+\":\/\/\"+hs[h]+\"\/httpserver\/filecache\/get_book_content_\"+bid+\"_\"+cid+\"_\"+SQ_CDN_FLAGS[f]+\"_0_0.html\";\n    try{var b=SQ_webGet(Jv,url);txt=SQ_cdnParse(b);\n     if(txt.length>30)return txt;note.push(SQ_CDN_HOSTS[h]+\"\/\"+SQ_CDN_FLAGS[f]+\":空\");\n    }catch(e){note.push(SQ_CDN_HOSTS[h]+\"\/\"+SQ_CDN_FLAGS[f]+\":失败\");}\n   }\n  }\n }\n try{var cr=SQ_api(Jv,S,SQ_P_CHINFO,[[\"bookId\",bid],[\"chapterId\",cid]],SQ_CIUID);\n  var enc=SQ_S(cr&&cr.data&&cr.data.chapter&&cr.data.chapter.content);\n  if(enc){var dec=SQ_ciDecode(enc);if(dec.length>30)return dec;}\n }catch(e){note.push(\"chapterinfo:\"+SQ_S(e).slice(0,40));}\n throw new Error(\"书旗:本章正文不可用(\"+(cid)+\")。\"+(note.length?note.slice(0,3).join(\"; \"):\"可能需登录或为付费章\"));\n}\nfunction SQ_explore(Jv,S,rawUrl,pg){\n var u=SQ_S(rawUrl);\n var mp=u.match(\/[?&]page=([0-9]+)\/);var p=mp?Number(mp[1]):(Number(pg)||1);\n var path=\"\",m;\n if((m=u.match(\/[?&]rank=([A-Za-z]+)\/)))path=\"\/ranklist?rank=\"+m[1]+\"&page=\"+p;\n else if(\/[?&](?:sz|fc|wd|tm|st|store|sqs)=\/.test(u)||u.indexOf(\"\/store\")>=0){\n  var q=u.indexOf(\"?\")>=0?u.slice(u.indexOf(\"?\")+1).replace(\/&amp;\/g,\"&\"):\"\";\n  q=q.replace(\/[?&]?page=[0-9]+\/g,\"\").replace(\/^&+|&+$\/g,\"\");\n  var keep=[],kv=q.split(\"&\"),i0;\n  for(i0=0;i0<kv.length;i0++){if(\/^(sz|fc|wd|tm|st)=\/.test(kv[i0]))keep.push(kv[i0]);}\n  path=\"\/store?\"+(keep.length?keep.join(\"&\")+\"&\":\"\")+\"page=\"+p;\n }\n else path=\"\/rank?page=\"+p;\n var web=SQ_web(S);\n var h=\"\";\n try{h=SQ_webGet(Jv,web+path);}catch(e){}\n if(h.length<2000)return [];\n var out=[],seen={},re,i2;\n if(path.indexOf(\"\/ranklist\")===0||path.indexOf(\"\/rank?\")===0){\n  re=\/<li class=\"clearfix\">([\\s\\S]*?)<\\\/li>\/g;\n  var mm;\n  while((mm=re.exec(h))!==null){\n   var li=SQ_S(mm[1]);\n   var mb=li.match(\/\\\/book\\\/(\\d+)\\.html\/);if(!mb||seen[mb[1]])continue;seen[mb[1]]=1;\n   var title=(li.match(\/<h3>([\\s\\S]*?)<\\\/h3>\/)||[])[1]||\"\";\n   var img=(li.match(\/<img[^>]*src=\"([^\"]+)\"\/)||[])[1]||\"\";\n   var au=(li.match(\/class=\"bkuser-icon\"[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\\/a>\/)||[])[1]||\"\";\n   var cate=(li.match(\/class=\"bkcate-icon\">([\\s\\S]*?)<\\\/span>\/)||[])[1]||\"\";\n   var des=(li.match(\/class=\"ranklist-des\">([\\s\\S]*?)<\\\/p>\/)||[])[1]||\"\";\n   var tags=(li.match(\/class=\"ranklist-tag\">([\\s\\S]*?)<\\\/p>\/)||[])[1]||\"\";\n   var tg=SQ_plain(tags.replace(\/<[^>]*>\/g,\" \"));\n   out.push({name:SQ_plain(title),author:SQ_plain(au),bookUrl:SQ_bookUrl(mb[1],S),\n    coverUrl:SQ_S(img),intro:SQ_plain(des),kind:[SQ_plain(cate),tg].filter(function(x){return x}).join(\",\")});\n  }\n }else{\n  var lis=h.split('<li');\n  for(i2=1;i2<lis.length;i2++){\n   var li=SQ_S(lis[i2].split('<\/li>')[0]);\n   if(li.indexOf('store-tag')<0)continue;\n   var mb2=li.match(\/\\\/book\\\/(\\d+)\\.html\/);if(!mb2||seen[mb2[1]])continue;seen[mb2[1]]=1;\n   var nm=(li.match(\/<h3[^>]*>([\\s\\S]*?)<\\\/h3>\/)||[])[1]||'';\n   if(!nm){var mt2=li.match(\/<a[^>]*href=\"\\\/book\\\/\\d+\\.html\"[^>]*title=\"([^\"]*)\"\/);if(mt2)nm=mt2[1];}\n   var im=(li.match(\/<img[^>]*class=\"cover\"[^>]*src=\"([^\"]+)\"\/)||li.match(\/<img[^>]*src=\"([^\"]+)\"\/)||[])[1]||'';\n   var des=(li.match(\/class=\"store-des\">([\\s\\S]*?)<\\\/p>\/)||[])[1]||'';\n   var au=(li.match(\/class=\"store-tag[^>]*>[\\s\\S]*?<a[^>]*>([\\s\\S]*?)<\\\/a>\/)||[])[1]||'';\n   au=SQ_plain(au).replace(\/^作者[::]\\s*\/,'');\n   var cate=(li.match(\/class=\"store-tag[^>]*>[\\s\\S]*?<span>([\\s\\S]*?)<\\\/span>\/)||[])[1]||'';\n   if(!nm)continue;\n   out.push({name:SQ_plain(nm),author:au,bookUrl:SQ_bookUrl(mb2[1],S),coverUrl:SQ_S(im),\n    intro:SQ_plain(des),kind:SQ_plain(cate)});\n  }\n }\n return out;\n}\nfunction SQ_speedKey(host){return \"sqsp_\"+SQ_S(host).replace(\/[^a-z0-9]\/gi,\"\").slice(0,24);}\nfunction SQ_speedTest(Jv,S){\n var res=[],i,best=\"\",bm=99999999;\n for(i=0;i<SQ_ALL_LINES.length;i++){\n  var host=SQ_ALL_LINES[i];\n  var isCdn=SQ_CDN_ALT.indexOf(host)>=0;\n  var probe=isCdn?host+\"\/httpserver\/filecache\/get_book_content_34078_2180322_3111111111_0_0.html\"\n                  :host+\"\/ranklist?rank=boyClick\";\n  var t0=Date.now(),ok=false,ms=0;\n  try{var h=SQ_webGet(Jv,probe);\n   ms=Date.now()-t0;\n   ok=isCdn?(h.indexOf(\"success_jsonpCallback\")>=0&&h.indexOf(\"\\\\u3000\")>=0)\n           :(h.length>5000&&h.indexOf(\"ranklist-ul\")>=0&&h.indexOf(\"访问被拒绝\")<0);\n  }catch(e){ms=Date.now()-t0;}\n  var st=ok?ms+\"ms\":\"超时\/不支持\";\n  SQ_put(S,SQ_speedKey(host),st);\n  res.push({host:host,kind:isCdn?\"CDN\":\"H5\",ms:ms,ok:ok,st:st});\n  if(ok&&!isCdn&&ms<bm){bm=ms;best=host;}\n }\n if(best){SQ_put(S,SQ_speedKey(best),\"⚡\"+bm+\"ms\");SQ_put(S,\"sqWeb\",best);}\n return {best:best,bm:bm,rows:res};\n}\nfunction SQ_setWeb(S,host){SQ_put(S,\"sqWeb\",SQ_S(host).replace(\/\\\/$\/,\"\"));return SQ_S(host);}\nfunction SQ_checkLogin(Jv,S){\n var out={needLogin:false,ok:false,detail:\"\"};\n try{var r=SQ_api(Jv,S,SQ_P_TITLE,[[\"bookId\",\"34078\"]]);\n  out.ok=!!(r&&r.data&&r.data.bookInfo);\n  out.detail=out.ok?\"游客态可用(无需登录)\":\"接口异常\";\n }catch(e){out.detail=SQ_S(e).slice(0,80);}\n return out;\n}",
    "lastUpdateTime": "1794079877053",
    "loginCheckJs": "(function(){var b='';try{b=String(result.body())}catch(e){try{b=String(result)}catch(e2){}};if(b.indexOf('403 - 访问被拒绝')>=0){throw new Error('⚠️ 书旗 H5 站点 403 拦截(UA\/线路异常),请点登录界面「测试延时」切换线路');}return result;})()",
    "loginUi": "[{\"name\": \"📖 书旗小说(APP接口) · 游客态可用,无需登录\", \"type\": \"button\", \"action\": \"SQ_uiHelp(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔍 检查登录状态(游客态连通性)\", \"type\": \"button\", \"action\": \"SQ_uiCheck(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🌐 网址发布页\", \"type\": \"text\", \"key\": \"sqPubUrl\", \"hint\": \"书旗无独立发布页;如需自定义上游线路可填网址(可选)\", \"default\": \"https:\/\/www.shuqi.com\/\"}, {\"name\": \"📥 一键从发布页获取网址路线\", \"type\": \"button\", \"action\": \"SQ_uiFetchPub(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🌐 当前线路\", \"type\": \"button\", \"action\": \"SQ_uiShowWeb(java)\", \"viewName\": \"'🌐 当前线路:'+(source.get('sqWeb')||'https:\/\/www.shuqi.com')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"⏱ 测试延时(逐站测速,结果写入下方按钮)\", \"type\": \"button\", \"action\": \"SQ_uiSpeed(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 H5 主站 www.shuqi.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https:\/\/www.shuqi.com')\", \"viewName\": \"'🔘 H5 主站 www.shuqi.com '+(source.get('sqsp_httpswwwshuqicom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 H5 裸域 shuqi.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https:\/\/shuqi.com')\", \"viewName\": \"'🔘 H5 裸域 shuqi.com '+(source.get('sqsp_httpsshuqicom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 CDN c1.shuqireader.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https:\/\/c1.shuqireader.com')\", \"viewName\": \"'🔘 CDN c1.shuqireader.com '+(source.get('sqsp_httpsc1shuqireadercom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔘 CDN c2.shuqireader.com\", \"type\": \"button\", \"action\": \"SQ_uiSetLine(java,'https:\/\/c2.shuqireader.com')\", \"viewName\": \"'🔘 CDN c2.shuqireader.com '+(source.get('sqsp_httpsc2shuqireadercom')||'未测速')\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"🔄 重置设备身份(接口异常时点此)\", \"type\": \"button\", \"action\": \"SQ_uiResetDev(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}, {\"name\": \"ℹ️ 关于 \/ UA 与限频说明\", \"type\": \"button\", \"action\": \"SQ_uiAbout(java)\", \"style\": {\"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1, \"layout_wrapBefore\": true}}]",
    "loginUrl": "function SQ_T(jv,msg){try{jv.longToast(msg);return;}catch(e){}try{jv.toast(msg);}catch(e2){}}\nfunction SQ_PUB(jv){try{return String(jv.get('sqPubUrl')||'')}catch(e){return ''}}\nfunction SQ_SET(jv,k,v){try{jv.put(k,String(v))}catch(e){}}\nfunction SQ_GET(jv,k){try{return String(jv.get(k)||'')}catch(e){return ''}}\nfunction SQ_HOSTS(){return ['https:\/\/www.shuqi.com','https:\/\/shuqi.com','https:\/\/c1.shuqireader.com','https:\/\/c2.shuqireader.com']}\nfunction SQ_KEY(h){return 'sqsp_'+String(h).replace(\/[^a-z0-9]\/gi,'').slice(0,24)}\nfunction SQ_AJAX(jv,u,ms){var o={timeout:ms||8000,headers:{'User-Agent':'okhttp\/3.12.13'}};\n return String(jv.ajax(u+','+JSON.stringify(o)));}\nfunction SQ_PARSE(h){\n var out=[],re=\/href=[\"'](https?:\\\/\\\/[a-z0-9.-]*shuqi[a-z0-9.-]*)[\"']\/gi,m,seen={};\n while((m=re.exec(h))!==null){var u=m[1].replace(\/\\\/$\/,'');if(!seen[u]){seen[u]=1;out.push(u)}}\n return out;}\nfunction SQ_uiHelp(jv){SQ_T(jv,'ℹ️ 书旗小说书源:上游为书旗官方 App 加密接口(游客态),无需账号登录。\\n搜索\/详情\/目录\/正文\/发现均可用;VIP 章正文来自免签 CDN 缓存。');}\nfunction SQ_uiAbout(jv){SQ_T(jv,'ℹ️ UA 固定 okhttp\/3.12.13(站点对浏览器 UA 返回 403 拦截页)。\\n已内置搜索最小间隔 3 秒与 concurrentRate 限速,请勿连续高频搜索以免触发风控。\\n兼容 LegadoTeam 官方版与 legado-E。');}\nfunction SQ_uiCheck(jv){\n SQ_T(jv,'⏳ 正在检查登录状态与接口连通性…');\n try{\n  var o={timeout:10000,headers:{'User-Agent':'okhttp\/3.12.13','content-type':'application\/x-www-form-urlencoded'}};\n  var h=SQ_AJAX(jv,'https:\/\/www.shuqi.com\/ranklist?rank=boyClick',10000);\n  if(h.length>5000&&h.indexOf('访问被拒绝')<0){\n   SQ_T(jv,'✅ 游客态可用,无需登录(H5 榜单连通,'+h.length+' 字节)\\n书源接口正常,可直接搜索阅读。');return;}\n  SQ_T(jv,'⚠️ H5 站点返回异常(可能被限频),但加密接口仍可尝试;如搜索失败请稍后重试。');\n }catch(e){SQ_T(jv,'❌ 检查失败:'+String(e).slice(0,120)+'\\n请检查网络或点「测试延时」切换线路。');}\n}\nfunction SQ_uiFetchPub(jv){\n var pub=SQ_PUB(jv);if(!pub){SQ_T(jv,'⚠️ 请先在上方「网址发布页」输入框填写网址');return;}\n SQ_T(jv,'⏳ 正在从发布页获取网址路线:'+pub);\n try{\n  var h=SQ_AJAX(jv,pub,10000);\n  var ls=SQ_PARSE(h);\n  if(!ls.length){SQ_T(jv,'ℹ️ 书旗为官方固定域名,无独立网址发布页;未从该页解析到线路。\\n已保留内置 4 条官方线路,可直接点「测试延时」后切换。');return;}\n  SQ_SET(jv,'sqPubLines',ls.join('\\n'));\n  SQ_T(jv,'✅ 发布页解析完成,共 '+ls.length+' 条线路:\\n'+ls.slice(0,8).join('\\n')+'\\n(书源规则仍使用官方接口域名,线路仅用于 H5 榜单\/目录)');\n }catch(e){SQ_T(jv,'❌ 发布页获取失败:'+String(e).slice(0,120)+'\\n内置线路仍可用。');}\n}\nfunction SQ_uiSpeed(jv){\n SQ_T(jv,'⏳ 开始逐站测速(2 条 H5 + 2 条 CDN,约 5~30 秒),请稍候…');\n var hs=SQ_HOSTS(),msg='📊 测速结果:',best='',bm=99999999,i;\n for(i=0;i<hs.length;i++){\n  var h=hs[i],isCdn=h.indexOf('c1.')>=0||h.indexOf('c2.')>=0;\n  var probe=isCdn?h+'\/httpserver\/filecache\/get_book_content_34078_2180322_3111111111_0_0.html'\n                 :h+'\/ranklist?rank=boyClick';\n  var t0=Date.now(),st='超时\/不支持',ok=false,ms=0;\n  try{var r=SQ_AJAX(jv,probe,8000);ms=Date.now()-t0;\n   ok=isCdn?(r.indexOf('success_jsonpCallback')>=0&&r.indexOf('\\\\u3000')>=0)\n           :(r.length>5000&&r.indexOf('ranklist-ul')>=0&&r.indexOf('访问被拒绝')<0);\n   st=ok?ms+'ms':'内容异常\/不支持';}catch(e){ms=Date.now()-t0;st='失败';}\n  SQ_SET(jv,SQ_KEY(h),st);\n  msg+='\\n'+(i+1)+'. ['+(isCdn?'CDN':'H5')+'] '+h.split('\/\/')[1]+' → '+st;\n  if(ok&&!isCdn&&ms<bm){bm=ms;best=h;}\n }\n if(best){SQ_SET(jv,SQ_KEY(best),'⚡'+bm+'ms');SQ_SET(jv,'sqWeb',best);\n  msg+='\\n—— 最快 H5:'+best.split('\/\/')[1]+' ('+bm+'ms),已自动切换';}\n else msg+='\\n—— 无可用 H5 线路,保持原线路(加密接口搜索不受影响)';\n SQ_T(jv,msg);\n try{jv.reLoginView();}catch(e){try{jv.reUiView();}catch(e2){}}\n}\nfunction SQ_uiSetLine(jv,host){\n var isCdn=host.indexOf('c1.')>=0||host.indexOf('c2.')>=0;\n SQ_T(jv,'⏳ 正在切换'+(isCdn?' CDN 正文':' H5 站点')+'线路:'+host+' …');\n SQ_SET(jv,isCdn?'sqCdn':'sqWeb',host);\n var probe=isCdn?host+'\/httpserver\/filecache\/get_book_content_34078_2180322_3111111111_0_0.html'\n                :host+'\/ranklist?rank=boyClick';\n var t0=Date.now(),ok=false,ms=0;\n try{var r=SQ_AJAX(jv,probe,8000);ms=Date.now()-t0;\n  ok=isCdn?(r.indexOf('success_jsonpCallback')>=0&&r.indexOf('\\\\u3000')>=0)\n          :(r.length>5000&&r.indexOf('ranklist-ul')>=0&&r.indexOf('访问被拒绝')<0);}catch(e){}\n SQ_SET(jv,SQ_KEY(host),ok?ms+'ms':'不可用');\n SQ_T(jv,ok?('✅ 已切换'+(isCdn?' CDN 正文':' H5 站点')+':'+host+'('+ms+'ms)\\n'+(isCdn?'章节正文将优先走该 CDN;':'发现页\/目录\/详情将走该域;')+'加密接口不受影响。')\n           :('⚠️ 已写入:'+host+'\\n但该线路当前不可达,可点「测试延时」重新选线,或切回主站。'));\n try{jv.reLoginView();}catch(e){try{jv.reUiView();}catch(e2){}}\n}\nfunction SQ_uiShowWeb(jv){SQ_T(jv,'🌐 当前 H5 线路:'+SQ_GET(jv,'sqWeb')+'\\n📦 当前 CDN 线路:'+SQ_GET(jv,'sqCdn'));}\nfunction SQ_uiSetWeb(jv,host){SQ_uiSetLine(jv,host);}\nfunction SQ_uiResetDev(jv){\n SQ_T(jv,'⏳ 正在重置设备身份…');\n try{jv.put('sqDev','');SQ_T(jv,'✅ 设备身份已重置,下次请求将生成新游客设备(可解决偶发接口异常)。');}\n catch(e){SQ_T(jv,'❌ 重置失败:'+String(e).slice(0,100));}\n}\nfunction SQ_uiTokens(jv){return SQ_GET(jv,'sqPubLines');}\nfunction login(){return 'ok';}",
    "respondTime": 36356,
    "ruleBookInfo": {
        "author": "$.author",
        "coverUrl": "$.coverUrl",
        "init": "@js:\n(function(){return JSON.stringify(SQ_detail(java,source,String(baseUrl)));})()",
        "intro": "$.intro",
        "kind": "$.kind",
        "lastChapter": "$.lastChapter",
        "name": "$.name",
        "tocUrl": "$.tocUrl",
        "wordCount": "$.wordCount"
    },
    "ruleContent": {
        "content": "@js:\n(function(){return SQ_content(java,source,String(baseUrl));})()"
    },
    "ruleExplore": {
        "author": "$.author",
        "bookList": "@js:\n(function(){var l=SQ_explore(java,source,String(baseUrl),1);var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()",
        "bookUrl": "$.bookUrl",
        "coverUrl": "$.coverUrl",
        "intro": "$.intro",
        "kind": "$.kind",
        "name": "$.name"
    },
    "ruleSearch": {
        "author": "$.author",
        "bookList": "@js:\n(function(){var d='';try{d=(typeof result==='string')?result:String(result)}catch(e){};var l=SQ_searchBooks(d,source);var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()",
        "bookUrl": "$.bookUrl",
        "checkKeyWord": "凡人修仙传",
        "coverUrl": "$.coverUrl",
        "intro": "$.intro",
        "kind": "$.kind",
        "lastChapter": "$.lastChapter",
        "name": "$.name",
        "wordCount": "$.wordCount"
    },
    "ruleToc": {
        "chapterList": "@js:\n(function(){var l=[];try{l=SQ_toc(java,source,String(baseUrl))}catch(e){return [];}var o=[],i;for(i=0;i<l.length;i++)o.push(JSON.stringify(l[i]));return o;})()",
        "chapterName": "$.title",
        "chapterUrl": "$.url"
    },
    "searchUrl": "@js:\n(function(){var kw='';try{kw=String(key)}catch(e){var m=String(baseUrl).match(\/[?&](?:q|key|kw)=([^&]*)\/);if(m){try{kw=decodeURIComponent(m[1])}catch(e2){kw=m[1]}}};var pg=(typeof page!=='undefined'&&page)?Number(page):1;var last=0;try{last=Number(String(source.get('sqSearchTs')||'0'))||0}catch(e3){};var now=Date.now();var wait=3000-(now-last);if(wait>0&&wait<3000){var _done=false;try{java.sleep(wait);_done=true}catch(eS){};if(!_done){var _t=Date.now();while(Date.now()-_t<wait){}}}try{source.put('sqSearchTs',String(Date.now()))}catch(e4){};if(pg>1){return [];}return SQ_searchUrl(java,source,kw,pg);})()",
    "weight": 0
}
广告