荔枝短剧🔞
https://liz04.com
nuo-an (15232)10/28 21:59
荔枝短剧 liz04.com 视频书源 v1.4(2026-10-28 测速结果显示到线路按钮)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【站点】AI成人短剧站,Nuxt3 SSR。主站 liz01.com,线路 liz01~liz10.com,liz04.com 为官方「永久入口」。发布页 /road/。
【搜索】GET /api/v1/search?keyword=&page=&size=20(服务端 JSON,真分页)
【发现】topic 频道 + 全站排序 + 日/周/月榜 + 分类 + 标签,共 50+ 入口
【目录】GET /api/v1/drama/{id}/episodes,一次返回全量剧集
【播放】剧集页内联 JSON-LD contentUrl → /api/v1/cdn/(video|external)/manifest.m3u8?t=&sign=
· m3u8 为 AES-128,播放器自动处理
· 目录中「未更新」集为站点尚未放出,非书源问题
【登录】游客可正常搜索/发现/播放。登录仅用于收藏、追剧、观看记录。
· 登录界面含:发布页输入框 + 从发布页获取网址 + 测速选线 + 切换线路 + 检查登录状态 + UA 设置
【UA】已在 header 与所有 @js 请求中固定为 Chrome/Android UA,避免被 CDN 拦截
【限频】concurrentRate=1500(1.5 秒/次),避免触发风控
【v1.2 修复】
① 封面不显示:header 的 Accept 改为图片优先(image/avif,image/webp,image/apng,image/*,*/*;q=0.8)
—— Glide 会复用书源 header 请求图床,text/html 开头的 Accept 可能被图床按内容协商分流
② 视频不播放:ruleContent.content 改为只返回纯 URL(原来带「📺 标题」行污染了播放地址)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
首次使用建议:书源菜单 → 登录 → 🚀从发布页获取网址 → ⚡测速选最快线路
线路失效时:登录界面直接切换 liz01~liz10,或重新抓发布页
【v1.3 修复:封面不显示真根因 = 图床整站 AES 加密】
站点所有封面都是加密图(Content-Type: application/octet-stream,无图片魔数),
浏览器靠 Worker 用 window.__NUXT__.config.public 的 imageAesKeyHex/imageAesIvHex
做 AES-128-CBC/NoPadding 解密后显示。Legado 用 coverDecodeJs 钩子同法解密:
· 已内置当前 key/iv(全站固定,多图取样验证)
· 魔数双保险:已是明文图片则原样透传
· key 轮换自愈:解密失败自动从首页 __NUXT__.config 重新提取 key/iv
· coverUrl 统一追加 ?lzcv=3 版本参数:绕过 Glide 密文磁盘缓存与 failUrl 进程黑名单
⚠ 修复前浏览过的旧书封面可能仍不显示:在书籍详情刷新一下(或重新添加),
新 URL 带版本参数会强制重新下载+解密。
【v1.4 登录界面:测速结果填到各线路按钮】
· 10 个「切 lizNN.com」按钮用 viewName 动态文本,实时显示各自测速结果
· 点「⚡ 测速选最快线路」后:每条线路 ms/超时/内容异常 写入按钮,最快线路加 ⚡ 前缀
· 切换线路后自动刷新面板,「📡 当前线路」同步更新
【v1.5 修复:Legado-E 版封面不显示】
根因:legado-E 的 java.hexDecodeToByteArray 调用抛异常(方法可见但一调就炸),
coverDecodeJs 整体 try/catch 返回 null → 封面解密失败 → 全部封面不显示(LT 版无此问题)。
修法:key/iv 改为 base64 常量 + java.base64DecodeToByteArray;
自愈分支的 hex→bytes 改为纯 JS hex→base64 再解码,彻底不依赖 hexDecodeToByteArray。
双版本实测:LT 版 AES 向量回归通过;E 版 App 内 imageDecode 通道实测
硬编码 key 分支与自愈分支均解出真实封面(864×1152)。
{
"bookSourceComment": "荔枝短剧 liz04.com 视频书源 v1.4(2026-10-28 测速结果显示到线路按钮)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n【站点】AI成人短剧站,Nuxt3 SSR。主站 liz01.com,线路 liz01~liz10.com,liz04.com 为官方「永久入口」。发布页 \/road\/。\n【搜索】GET \/api\/v1\/search?keyword=&page=&size=20(服务端 JSON,真分页)\n【发现】topic 频道 + 全站排序 + 日\/周\/月榜 + 分类 + 标签,共 50+ 入口\n【目录】GET \/api\/v1\/drama\/{id}\/episodes,一次返回全量剧集\n【播放】剧集页内联 JSON-LD contentUrl → \/api\/v1\/cdn\/(video|external)\/manifest.m3u8?t=&sign=\n · m3u8 为 AES-128,播放器自动处理\n · 目录中「未更新」集为站点尚未放出,非书源问题\n【登录】游客可正常搜索\/发现\/播放。登录仅用于收藏、追剧、观看记录。\n · 登录界面含:发布页输入框 + 从发布页获取网址 + 测速选线 + 切换线路 + 检查登录状态 + UA 设置\n【UA】已在 header 与所有 @js 请求中固定为 Chrome\/Android UA,避免被 CDN 拦截\n【限频】concurrentRate=1500(1.5 秒\/次),避免触发风控\n【v1.2 修复】\n ① 封面不显示:header 的 Accept 改为图片优先(image\/avif,image\/webp,image\/apng,image\/*,*\/*;q=0.8)\n —— Glide 会复用书源 header 请求图床,text\/html 开头的 Accept 可能被图床按内容协商分流\n ② 视频不播放:ruleContent.content 改为只返回纯 URL(原来带「📺 标题」行污染了播放地址)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n首次使用建议:书源菜单 → 登录 → 🚀从发布页获取网址 → ⚡测速选最快线路\n线路失效时:登录界面直接切换 liz01~liz10,或重新抓发布页\n【v1.3 修复:封面不显示真根因 = 图床整站 AES 加密】\n 站点所有封面都是加密图(Content-Type: application\/octet-stream,无图片魔数),\n 浏览器靠 Worker 用 window.__NUXT__.config.public 的 imageAesKeyHex\/imageAesIvHex\n 做 AES-128-CBC\/NoPadding 解密后显示。Legado 用 coverDecodeJs 钩子同法解密:\n · 已内置当前 key\/iv(全站固定,多图取样验证)\n · 魔数双保险:已是明文图片则原样透传\n · key 轮换自愈:解密失败自动从首页 __NUXT__.config 重新提取 key\/iv\n · coverUrl 统一追加 ?lzcv=3 版本参数:绕过 Glide 密文磁盘缓存与 failUrl 进程黑名单\n ⚠ 修复前浏览过的旧书封面可能仍不显示:在书籍详情刷新一下(或重新添加),\n 新 URL 带版本参数会强制重新下载+解密。\n【v1.4 登录界面:测速结果填到各线路按钮】\n · 10 个「切 lizNN.com」按钮用 viewName 动态文本,实时显示各自测速结果\n · 点「⚡ 测速选最快线路」后:每条线路 ms\/超时\/内容异常 写入按钮,最快线路加 ⚡ 前缀\n · 切换线路后自动刷新面板,「📡 当前线路」同步更新\n\n【v1.5 修复:Legado-E 版封面不显示】\n 根因:legado-E 的 java.hexDecodeToByteArray 调用抛异常(方法可见但一调就炸),\n coverDecodeJs 整体 try\/catch 返回 null → 封面解密失败 → 全部封面不显示(LT 版无此问题)。\n 修法:key\/iv 改为 base64 常量 + java.base64DecodeToByteArray;\n 自愈分支的 hex→bytes 改为纯 JS hex→base64 再解码,彻底不依赖 hexDecodeToByteArray。\n 双版本实测:LT 版 AES 向量回归通过;E 版 App 内 imageDecode 通道实测\n 硬编码 key 分支与自愈分支均解出真实封面(864×1152)。\n",
"bookSourceGroup": "视频,R18,AI",
"bookSourceName": "荔枝短剧🔞",
"bookSourceType": 4,
"bookSourceUrl": "https:\/\/liz04.com",
"bookUrlPattern": "https?:\/\/liz\\d{2}\\.com\/drama\/\\d+(?:-[a-z0-9\\-]+)?(?:\/|$)",
"concurrentRate": "1500",
"coverDecodeJs": "(function(){try{\nfunction mg(b){var x=(b[0]+256)%256;var y=(b[1]+256)%256;var z=(b[2]+256)%256;return (x===255&&y===216)||(x===137&&y===80&&z===78)||(x===71&&y===73&&z===70)||(x===82&&y===73&&z===70);}\nfunction h2b(hex){\n var C='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n var i=0,L=hex.length,o='';\n while(i<L){\n var b1=parseInt(hex.substr(i,2),16); i+=2;\n var b2=i<L?parseInt(hex.substr(i,2),16):-1; i+=2;\n var b3=i<L?parseInt(hex.substr(i,2),16):-1; i+=2;\n o+=C.charAt(b1>>2);\n o+=C.charAt(((b1&3)<<4)|((b2<0?0:b2)>>4));\n if(b2<0){o+='==';break;}\n o+=C.charAt(((b2&15)<<2)|((b3<0?0:b3)>>6));\n if(b3<0){o+='=';break;}\n o+=C.charAt(b3&63);\n }\n return java.base64DecodeToByteArray(o);\n}\nvar enc=null;\nvar isStream=false;\ntry{ isStream=(typeof result.read==='function'); }catch(e0){}\nif(isStream){\n var baos=new Packages.java.io.ByteArrayOutputStream();\n var buf=new Packages.java.lang.String('00000000000000000000000000000000').getBytes();\n var n=result.read(buf);\n while(n>0){baos.write(buf,0,n);n=result.read(buf);}\n enc=baos.toByteArray();\n}else{enc=result;}\nif(!enc||enc.length<8){return enc;}\nif(mg(enc)){return enc;}\nif(enc.length%16!==0){return enc;}\nvar Cipher=Packages.javax.crypto.Cipher;\nvar SKS=Packages.javax.crypto.spec.SecretKeySpec;\nvar IVS=Packages.javax.crypto.spec.IvParameterSpec;\nfunction dec(kb,vb){var c=Cipher.getInstance('AES\/CBC\/NoPadding');c.init(2,new SKS(kb,'AES'),new IVS(vb));return c.doFinal(enc);}\nvar out=null;\ntry{\n var kb0=java.base64DecodeToByteArray('6hnCHoXXaNpBZfWWSriGsg==');\n var vb0=java.base64DecodeToByteArray('9NU+y8JzkB4NnNeEgjPHAg==');\n if(kb0&&kb0.length===16&&vb0&&vb0.length===16){out=dec(kb0,vb0);}\n}catch(e1){}\nif(out&&mg(out)){return out;}\nvar host='https:\/\/liz04.com';\ntry{var hs=String(source.get('lizhost')||'');if(hs.indexOf('http')===0){host=hs;}}catch(e2){}\nvar pg='';\ntry{pg=String(java.ajax(host+'\/,'+JSON.stringify({timeout:8000,headers:{'User-Agent':'Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36'}})));}catch(e3){return enc;}\nvar mk=pg.match(\/imageAesKeyHex[^a-z0-9]{1,6}([0-9a-f]{32})\/);\nvar mi=pg.match(\/imageAesIvHex[^a-z0-9]{1,6}([0-9a-f]{32})\/);\nif(!mk||!mi){return enc;}\nvar out2=null;\ntry{out2=dec(h2b(mk[1]),h2b(mi[1]));}catch(e4){return enc;}\nif(out2&&mg(out2)){return out2;}\nreturn enc;\n}catch(e){return null;}})()",
"customButton": false,
"customOrder": 1,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "@js:(function(){\nfunction LZ_base(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_hdr(){\n return {'User-Agent':LZ_ua(),'Accept':'application\/json, text\/plain, *\/*','Referer':LZ_base()+'\/'};\n}\nfunction LZ_opt(){\n return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n if(!t) return null;\n try{\n var o=JSON.parse(t);\n return (o&&typeof o==='object')?o:null;\n }catch(e){ return null; }\n}\nfunction LZ_items(o){\n if(!o) return [];\n var d=o.data;\n if(!d) return [];\n if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n if(d.items&&d.items.length>=0) return d.items;\n if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n if(Array.isArray(d)) return d;\n return [];\n}\nfunction LZ_tagstr(tags){\n if(!tags||!tags.length) return '';\n var a=[];\n for(var i=0;i<tags.length;i++){\n var n=tags[i]?tags[i].name:null;\n if(n&&String(n).length>0) a.push(String(n));\n }\n return a.join(' ');\n}\nfunction LZ_isAbs(u){\n return typeof u==='string'&&(u.indexOf('http:\/\/')==0||u.indexOf('https:\/\/')==0||u.indexOf('\/\/')==0);\n}\nfunction LZ_abs(u){\n if(!u) return '';\n var s=String(u);\n if(s.indexOf('\/\/')==0) return 'https:'+s;\n if(s.indexOf('http')==0) return s;\n if(s.charAt(0)=='\/') return LZ_base()+s;\n return LZ_base()+'\/'+s;\n}\nfunction LZ_did(u){\n var s=String(u||'').split(',')[0];\n var m=s.match(\/\\\/drama\\\/([0-9]+)\/);\n return m?m[1]:'';\n}\n\nvar b=LZ_base();\nvar rows=[];\nfunction push(t,u,grow){\n rows.push({title:t,url:u,style:(grow?{layout_flexGrow:1}:{layout_flexBasisPercent:1})});\n}\n\/\/ ---- 分组标题(空 url 的按钮 Legado 会忽略,仅作视觉分组用 title 带前缀)----\npush('📺 精选频道','');\npush('精选·最热',b+'\/api\/v1\/topic\/lizhi-picked?tab=hot&page={{page}}&size=24',1);\npush('精选·最新',b+'\/api\/v1\/topic\/lizhi-picked?tab=new&page={{page}}&size=24',1);\npush('精选·收藏',b+'\/api\/v1\/topic\/lizhi-picked?tab=fav&page={{page}}&size=24',1);\npush('精选·点赞',b+'\/api\/v1\/topic\/lizhi-picked?tab=like&page={{page}}&size=24',1);\npush('🎬 原创频道','');\npush('原创·最热',b+'\/api\/v1\/topic\/lizhi-original?tab=hot&page={{page}}&size=24',1);\npush('原创·最新',b+'\/api\/v1\/topic\/lizhi-original?tab=new&page={{page}}&size=24',1);\npush('原创·收藏',b+'\/api\/v1\/topic\/lizhi-original?tab=fav&page={{page}}&size=24',1);\npush('🔥 全站排序','');\npush('全部·最新',b+'\/api\/v1\/drama\/list?sort=latest&page={{page}}&size=24',1);\npush('全部·最热',b+'\/api\/v1\/drama\/list?sort=hot&page={{page}}&size=24',1);\npush('全部·收藏',b+'\/api\/v1\/drama\/list?sort=fav&page={{page}}&size=24',1);\npush('全部·点赞',b+'\/api\/v1\/drama\/list?sort=like&page={{page}}&size=24',1);\npush('全部·随机',b+'\/api\/v1\/drama\/list?sort=random&page={{page}}&size=24',1);\npush('🆕 近期上新','');\npush('7天内上新',b+'\/api\/v1\/drama\/list?sort=latest&publishedWithinDays=7&page={{page}}&size=24',1);\npush('14天内上新',b+'\/api\/v1\/drama\/list?sort=latest&publishedWithinDays=14&page={{page}}&size=24',1);\npush('30天内上新',b+'\/api\/v1\/drama\/list?sort=latest&publishedWithinDays=30&page={{page}}&size=24',1);\npush('🏆 排行榜','');\npush('日榜',b+'\/api\/v1\/rank?period=day',1);\npush('周榜',b+'\/api\/v1\/rank?period=week',1);\npush('月榜',b+'\/api\/v1\/rank?period=month',1);\npush('📁 荔枝原创分类','');\npush('原创-都市',b+'\/api\/v1\/drama\/list?categoryId=376&page={{page}}&size=24',1);\npush('原创-情感',b+'\/api\/v1\/drama\/list?categoryId=377&page={{page}}&size=24',1);\npush('原创-古风',b+'\/api\/v1\/drama\/list?categoryId=378&page={{page}}&size=24',1);\npush('原创-玄幻',b+'\/api\/v1\/drama\/list?categoryId=379&page={{page}}&size=24',1);\npush('原创-悬疑',b+'\/api\/v1\/drama\/list?categoryId=380&page={{page}}&size=24',1);\npush('原创-漫剧',b+'\/api\/v1\/drama\/list?categoryId=381&page={{page}}&size=24',1);\npush('📂 荔枝精选分类','');\npush('精选-COS',b+'\/api\/v1\/drama\/list?categoryId=486&page={{page}}&size=24',1);\npush('精选-都市',b+'\/api\/v1\/drama\/list?categoryId=383&page={{page}}&size=24',1);\npush('精选-情感',b+'\/api\/v1\/drama\/list?categoryId=384&page={{page}}&size=24',1);\npush('精选-古风',b+'\/api\/v1\/drama\/list?categoryId=385&page={{page}}&size=24',1);\npush('精选-玄幻',b+'\/api\/v1\/drama\/list?categoryId=386&page={{page}}&size=24',1);\npush('精选-悬疑',b+'\/api\/v1\/drama\/list?categoryId=387&page={{page}}&size=24',1);\npush('精选-漫剧',b+'\/api\/v1\/drama\/list?categoryId=388&page={{page}}&size=24',1);\npush('精选-更新',b+'\/api\/v1\/drama\/list?categoryId=389&page={{page}}&size=24',1);\npush('🏷 热门标签','');\npush('都市',b+'\/api\/v1\/drama\/list?tagIds=147&page={{page}}&size=24',1);\npush('爱情',b+'\/api\/v1\/drama\/list?tagIds=156&page={{page}}&size=24',1);\npush('甜宠',b+'\/api\/v1\/drama\/list?tagIds=157&page={{page}}&size=24',1);\npush('家庭',b+'\/api\/v1\/drama\/list?tagIds=159&page={{page}}&size=24',1);\npush('古装',b+'\/api\/v1\/drama\/list?tagIds=408&page={{page}}&size=24',1);\npush('悬疑',b+'\/api\/v1\/drama\/list?tagIds=178&page={{page}}&size=24',1);\npush('乱伦',b+'\/api\/v1\/drama\/list?tagIds=112&page={{page}}&size=24',1);\npush('绿帽',b+'\/api\/v1\/drama\/list?tagIds=215&page={{page}}&size=24',1);\npush('NTR',b+'\/api\/v1\/drama\/list?tagIds=223&page={{page}}&size=24',1);\npush('人妻',b+'\/api\/v1\/drama\/list?tagIds=205&page={{page}}&size=24',1);\npush('熟女',b+'\/api\/v1\/drama\/list?tagIds=197&page={{page}}&size=24',1);\npush('校园',b+'\/api\/v1\/drama\/list?tagIds=158&page={{page}}&size=24',1);\npush('穿越',b+'\/api\/v1\/drama\/list?tagIds=404&page={{page}}&size=24',1);\npush('重生',b+'\/api\/v1\/drama\/list?tagIds=405&page={{page}}&size=24',1);\npush('复仇',b+'\/api\/v1\/drama\/list?tagIds=403&page={{page}}&size=24',1);\npush('动作',b+'\/api\/v1\/drama\/list?tagIds=152&page={{page}}&size=24',1);\npush('职场',b+'\/api\/v1\/drama\/list?tagIds=200&page={{page}}&size=24',1);\npush('奇幻',b+'\/api\/v1\/drama\/list?tagIds=181&page={{page}}&size=24',1);\npush('科幻',b+'\/api\/v1\/drama\/list?tagIds=175&page={{page}}&size=24',1);\npush('灵异',b+'\/api\/v1\/drama\/list?tagIds=180&page={{page}}&size=24',1);\npush('喜剧',b+'\/api\/v1\/drama\/list?tagIds=396&page={{page}}&size=24',1);\npush('已完结',b+'\/api\/v1\/drama\/list?tagIds=191&page={{page}}&size=24',1);\npush('本周上新',b+'\/api\/v1\/drama\/list?tagIds=189&page={{page}}&size=24',1);\npush('女性成长',b+'\/api\/v1\/drama\/list?tagIds=401&page={{page}}&size=24',1);\npush('男同',b+'\/api\/v1\/drama\/list?tagIds=406&page={{page}}&size=24',1);\npush('女同',b+'\/api\/v1\/drama\/list?tagIds=407&page={{page}}&size=24',1);\nreturn JSON.stringify(rows);})()",
"header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36\", \"Accept\": \"image\/avif,image\/webp,image\/apng,image\/*,*\/*;q=0.8\", \"Accept-Language\": \"zh-CN,zh;q=0.9\"}",
"lastUpdateTime": "1793195949363",
"loginCheckJs": "\n(function(){\n try{\n var b='https:\/\/liz04.com';\n try{ var s=String(source.get('lizhost')||''); if(s.length>6) b=s; }catch(e){}\n var ck='';\n try{ ck=String(java.getCookie(b,null)||''); }catch(e2){}\n var logged=(ck&&(ck.indexOf('token')>=0||ck.indexOf('litchi.session')>=0));\n if(!logged){ return result; }\n \/\/ 已登录:确保带 Authorization 头(如站点用 Bearer token)\n try{\n var hm=java.getHeaderMap();\n if(hm&&ck.indexOf('token')>=0){\n var tk=ck.match(\/token=([^;]+)\/);\n if(tk&&!hm.get('Authorization')) hm.put('Authorization','Bearer '+tk[1]);\n }\n }catch(e3){}\n return result;\n }catch(e4){ return result; }\n})()\n",
"loginUi": "[{\"name\": \"🌐 线路与发布页\", \"type\": \"text\"}, {\"name\": \"发布页地址\", \"type\": \"input\", \"viewName\": \"source.get('lizroad')||'https:\/\/liz04.com\/road\/'\", \"action\": \"LZ_saveRoad()\"}, {\"name\": \"🚀 从发布页获取网址\", \"type\": \"button\", \"action\": \"LZ_fromRoad()\"}, {\"name\": \"⚡ 测速选最快线路\", \"type\": \"button\", \"action\": \"LZ_speed()\"}, {\"name\": \"📡 当前线路\", \"type\": \"text\", \"viewName\": \"(source.get('lizhost')||'https:\/\/liz04.com')\"}, {\"name\": \"切 liz01.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz01.com')\", \"viewName\": \"'切 liz01.com '+(source.get('lizsp01')||'')\"}, {\"name\": \"切 liz02.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz02.com')\", \"viewName\": \"'切 liz02.com '+(source.get('lizsp02')||'')\"}, {\"name\": \"切 liz03.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz03.com')\", \"viewName\": \"'切 liz03.com '+(source.get('lizsp03')||'')\"}, {\"name\": \"切 liz04.com(永久入口)\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz04.com')\", \"viewName\": \"'切 liz04.com(永久入口) '+(source.get('lizsp04')||'')\"}, {\"name\": \"切 liz05.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz05.com')\", \"viewName\": \"'切 liz05.com '+(source.get('lizsp05')||'')\"}, {\"name\": \"切 liz06.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz06.com')\", \"viewName\": \"'切 liz06.com '+(source.get('lizsp06')||'')\"}, {\"name\": \"切 liz07.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz07.com')\", \"viewName\": \"'切 liz07.com '+(source.get('lizsp07')||'')\"}, {\"name\": \"切 liz08.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz08.com')\", \"viewName\": \"'切 liz08.com '+(source.get('lizsp08')||'')\"}, {\"name\": \"切 liz09.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz09.com')\", \"viewName\": \"'切 liz09.com '+(source.get('lizsp09')||'')\"}, {\"name\": \"切 liz10.com\", \"type\": \"button\", \"action\": \"LZ_setLine('https:\/\/liz10.com')\", \"viewName\": \"'切 liz10.com '+(source.get('lizsp10')||'')\"}, {\"name\": \"🧭 账号与登录\", \"type\": \"text\"}, {\"name\": \"🔄 检查登录状态\", \"type\": \"button\", \"action\": \"LZ_checkLogin()\"}, {\"name\": \"🔑 打开登录页\", \"type\": \"button\", \"action\": \"LZ_openLogin()\"}, {\"name\": \"⚙️ 请求头 UA\", \"type\": \"text\"}, {\"name\": \"自定义 UA\", \"type\": \"input\", \"viewName\": \"source.get('lizua')||''\", \"action\": \"LZ_saveUa()\"}, {\"name\": \"💾 保存 UA\", \"type\": \"button\", \"action\": \"LZ_saveUa(source.get('lizua')||'')\"}, {\"name\": \"♻️ 恢复默认 UA\", \"type\": \"button\", \"action\": \"LZ_resetUa()\"}]",
"loginUrl": "\nfunction LZ_toast(m){ try{ java.toast(String(m)); }catch(e){} }\n\n\/\/ ---------- 基础工具 ----------\nfunction LZ_base2(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua2(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_req(u,ms){\n var t0=Date.now();\n try{\n var r=java.ajax(u+','+JSON.stringify({timeout:ms||8000,headers:{'User-Agent':LZ_ua2(),'Accept':'text\/html,application\/xhtml+xml,*\/*;q=0.8'}}));\n var dt=Date.now()-t0;\n var s=(r==null)?'':String(r);\n return {ok:true,ms:dt,len:s.length,html:s,url:u};\n }catch(e){\n return {ok:false,ms:(Date.now()-t0),len:0,html:'',err:String(e&&e.message?e.message:e),url:u};\n }\n}\n\n\/\/ ---------- 发布页抓线路 ----------\n\/\/ \/road\/ 页脚与 NUXT 数据里都带 liz01~liz10.com 线路\nfunction LZ_pickDomains(html){\n var out=[];\n if(!html) return out;\n var re=\/https?:\\\/\\\/(liz\\d{2}\\.com)\/g;\n var m;\n while((m=re.exec(html))!=null){\n var u='https:\/\/'+m[1];\n if(out.indexOf(u)<0) out.push(u);\n }\n return out;\n}\n\n\/\/ ---------- 按钮:从发布页获取网址 ----------\nfunction LZ_fromRoad(){\n var pub=String(source.get('lizroad')||'').trim();\n if(pub.length<6){ pub='https:\/\/liz04.com\/road\/'; }\n if(pub.indexOf('http')!=0){ pub='https:\/\/'+pub.replace(\/^\\\/+\/,''); }\n if(pub.charAt(pub.length-1)!='\/') pub=pub+'\/';\n LZ_toast('正在读取发布页:'+pub);\n var r=LZ_req(pub,12000);\n if(!r.ok||r.len<500){\n LZ_toast('✖ 发布页读取失败,请检查网络或手动输入发布页地址');\n return 'fail';\n }\n var ds=LZ_pickDomains(r.html);\n if(ds.length==0){\n LZ_toast('✖ 发布页中未解析到线路地址');\n return 'fail';\n }\n \/\/ 去重 + 只保留 http\/https\n var list=[];\n for(var i=0;i<ds.length;i++){ if(list.indexOf(ds[i])<0) list.push(ds[i]); }\n source.put('lizlines',list.join(','));\n LZ_toast('✔ 已从发布页获取 '+list.length+' 条线路,点「⚡ 测速选最快」自动选择');\n return 'ok';\n}\n\n\/\/ ---------- 测速结果辅助 ----------\nfunction LZ_spKey(host){\n var m=String(host||'').match(\/liz(\\d{2})\\.com\/);\n if(m) return 'lizsp'+m[1];\n return 'lizsp_'+String(host||'').replace(\/[^a-z0-9]\/gi,'').substring(0,8);\n}\nfunction LZ_spClear(){\n for(var p=1;p<=10;p++){ try{ source.put('lizsp'+('0'+p).slice(-2),''); }catch(e){} }\n}\nfunction LZ_refresh(){\n try{ java.reLoginView(); return true; }catch(e){}\n try{ java.reUiView(); return true; }catch(e2){}\n return false;\n}\n\n\/\/ ---------- 按钮:测速选最快 ----------\nfunction LZ_speed(){\n var raw=String(source.get('lizlines')||'');\n var list=[];\n if(raw.length>6){\n var a=raw.split(',');\n for(var i=0;i<a.length;i++){\n var s=String(a[i]||'').trim();\n if(s.length>6){ if(s.indexOf('http')!=0) s='https:\/\/'+s; list.push(s.replace(\/\\\/+$\/,'')); }\n }\n }\n if(list.length==0){\n list=['https:\/\/liz04.com','https:\/\/liz03.com','https:\/\/liz01.com','https:\/\/liz02.com','https:\/\/liz05.com','https:\/\/liz06.com','https:\/\/liz07.com','https:\/\/liz08.com','https:\/\/liz09.com','https:\/\/liz10.com'];\n }\n LZ_spClear();\n LZ_toast('正在测速 '+list.length+' 条线路…');\n var best=null,bestMs=999999;\n var msg=[];\n for(var i=0;i<list.length;i++){\n var host=list[i];\n var r=LZ_req(host+'\/',8000);\n var tag='';\n if(r.ok&&r.len>2000){\n tag=r.ms+'ms';\n if(r.ms<bestMs){ bestMs=r.ms; best=host; }\n }else if(r.ok){ tag='内容异常'; }\n else{ tag='超时'; }\n try{ source.put(LZ_spKey(host),tag); }catch(e){}\n msg.push(host.replace('https:\/\/','')+' '+tag);\n }\n if(best){\n source.put('lizhost',best);\n try{ source.put(LZ_spKey(best),'⚡'+source.get(LZ_spKey(best))); }catch(e2){}\n var ok=LZ_refresh();\n LZ_toast('⚡ 最快:'+best.replace('https:\/\/','')+' '+bestMs+'ms'+(ok?'\\n结果已填到各线路按钮':'\\n请重新打开登录面板查看结果'));\n return 'ok';\n }\n LZ_refresh();\n LZ_toast('✖ 所有线路均不可达\\n'+msg.join(' \/ '));\n return 'fail';\n}\n\n\/\/ ---------- 按钮:切换线路 ----------\nfunction LZ_setLine(d){\n if(!d){ LZ_toast('✖ 线路为空'); return 'fail'; }\n var s=String(d).trim();\n if(s.indexOf('http')!=0) s='https:\/\/'+s;\n s=s.replace(\/\\\/+$\/,'');\n source.put('lizhost',s);\n LZ_refresh();\n LZ_toast('✔ 已切换到 '+s);\n return 'ok';\n}\n\n\/\/ ---------- 按钮:检查登录状态 ----------\nfunction LZ_checkLogin(){\n var b=LZ_base2();\n var ck='';\n try{ ck=String(java.getCookie(b,null)||''); }catch(e){}\n if(!ck||ck.indexOf('token')<0){\n if(ck.indexOf('litchi.session')<0){\n LZ_toast('ℹ 当前为游客状态(未登录)\\n搜索 \/ 发现 \/ 播放均可正常使用\\n登录仅用于收藏、追剧、观看记录同步');\n return 'guest';\n }\n }\n \/\/ 尝试拉取用户信息\n var r=LZ_req(b+'\/api\/v1\/user\/profile',8000);\n if(r.ok&&r.html){\n var t=r.html;\n if(t.indexOf('\"success\":true')>=0||t.indexOf('\"success\": true')>=0){\n var nm=t.match(\/\"(?:nickName|nickname|loginName|userName)\"\\s*:\\s*\"([^\"]*)\"\/);\n LZ_toast('✔ 已登录'+(nm?(':'+nm[1]):'')+'\\n收藏\/追剧\/观看记录已同步');\n return 'ok';\n }\n }\n LZ_toast('ℹ 当前为游客状态(未登录)\\n搜索 \/ 发现 \/ 播放均可正常使用\\n登录仅用于收藏、追剧、观看记录同步');\n return 'guest';\n}\n\n\/\/ ---------- 按钮:打开登录页 ----------\nfunction LZ_openLogin(){\n try{\n java.startBrowser(LZ_base2()+'\/user','荔枝短剧 · 登录');\n LZ_toast('已打开登录页,登录成功后返回点「🔄 检查登录状态」');\n }catch(e){\n LZ_toast('✖ 无法打开浏览器:'+String(e&&e.message?e.message:e));\n }\n}\n\n\/\/ ---------- 按钮:保存 UA ----------\nfunction LZ_saveUa(u){\n var s=String(u||'').trim();\n if(s.length<20){ LZ_toast('✖ UA 太短,未保存'); return 'fail'; }\n source.put('lizua',s);\n LZ_toast('✔ 已保存自定义 UA');\n return 'ok';\n}\nfunction LZ_resetUa(){\n source.put('lizua','');\n LZ_toast('✔ 已恢复默认 UA');\n return 'ok';\n}\n\n\/\/ ---------- 按钮:保存发布页 ----------\nfunction LZ_saveRoad(u){\n var s=String(u||'').trim();\n if(s.length<6){ LZ_toast('✖ 发布页地址太短,未保存'); return 'fail'; }\n if(s.indexOf('http')!=0) s='https:\/\/'+s.replace(\/^\\\/+\/,'');\n if(s.charAt(s.length-1)!='\/') s=s+'\/';\n source.put('lizroad',s);\n LZ_toast('✔ 发布页已保存:'+s);\n return 'ok';\n}\nfunction LZ_resetRoad(){\n source.put('lizroad','');\n LZ_toast('✔ 已恢复默认发布页 https:\/\/liz04.com\/road\/');\n return 'ok';\n}\n\n\/\/ ---------- 登录动作(V1 静态协议要求) ----------\nfunction login(){ return ''; }\n",
"respondTime": 180000,
"ruleBookInfo": {
"author": "b",
"coverUrl": "g",
"init": "@js:(function(){\nfunction LZ_base(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_hdr(){\n return {'User-Agent':LZ_ua(),'Accept':'application\/json, text\/plain, *\/*','Referer':LZ_base()+'\/'};\n}\nfunction LZ_opt(){\n return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n if(!t) return null;\n try{\n var o=JSON.parse(t);\n return (o&&typeof o==='object')?o:null;\n }catch(e){ return null; }\n}\nfunction LZ_items(o){\n if(!o) return [];\n var d=o.data;\n if(!d) return [];\n if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n if(d.items&&d.items.length>=0) return d.items;\n if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n if(Array.isArray(d)) return d;\n return [];\n}\nfunction LZ_tagstr(tags){\n if(!tags||!tags.length) return '';\n var a=[];\n for(var i=0;i<tags.length;i++){\n var n=tags[i]?tags[i].name:null;\n if(n&&String(n).length>0) a.push(String(n));\n }\n return a.join(' ');\n}\nfunction LZ_isAbs(u){\n return typeof u==='string'&&(u.indexOf('http:\/\/')==0||u.indexOf('https:\/\/')==0||u.indexOf('\/\/')==0);\n}\nfunction LZ_abs(u){\n if(!u) return '';\n var s=String(u);\n if(s.indexOf('\/\/')==0) return 'https:'+s;\n if(s.indexOf('http')==0) return s;\n if(s.charAt(0)=='\/') return LZ_base()+s;\n return LZ_base()+'\/'+s;\n}\nfunction LZ_cov(u){\n var s=LZ_abs(u);\n if(!s) return '';\n return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n var s=String(u||'').split(',')[0];\n var m=s.match(\/\\\/drama\\\/([0-9]+)\/);\n return m?m[1]:'';\n}\nvar id=LZ_did(String(baseUrl||''));if(!id) return '{}';var t=LZ_get(LZ_base()+'\/api\/v1\/drama\/'+id);var o=LZ_json(t);var d=(o&&o.data)?o.data:null;if(!d) return '{}';var tags=LZ_tagstr(d.tags);var cat=String(d.categoryName||'');var kind=tags;if(cat&&kind.indexOf(cat)<0) kind=(kind?cat+' '+kind:cat);if(!kind) kind=cat;var pub=d.publishedEpisodeCount||0;var tot=d.totalEpisodes||0;var st=d.partial?'连载中':'已完结';var ex=String(d.coverProgress||'');var sc=d.score?('评分 '+d.score+' 分'):'';var head=[];if(st)head.push(st);if(ex)head.push(ex);if(sc)head.push(sc);var intro=(head.length?head.join(' · ')+String.fromCharCode(10,10):'')+String(d.description||'');return JSON.stringify({a:String(d.title||''),b:'荔枝短剧',c:kind,d:(tot?('更新至'+pub+'集 \/ 全'+tot+'集'):''),e:'',f:intro,g:LZ_cov(d.coverUrl),h:LZ_base()+'\/api\/v1\/drama\/'+id+'\/episodes'});})()",
"intro": "f",
"kind": "c",
"lastChapter": "e",
"name": "a",
"tocUrl": "h",
"wordCount": "d"
},
"ruleContent": {
"content": "@js:(function(){\nfunction LZ_base(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_hdr(){\n return {'User-Agent':LZ_ua(),'Accept':'application\/json, text\/plain, *\/*','Referer':LZ_base()+'\/'};\n}\nfunction LZ_opt(){\n return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n if(!t) return null;\n try{\n var o=JSON.parse(t);\n return (o&&typeof o==='object')?o:null;\n }catch(e){ return null; }\n}\nfunction LZ_items(o){\n if(!o) return [];\n var d=o.data;\n if(!d) return [];\n if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n if(d.items&&d.items.length>=0) return d.items;\n if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n if(Array.isArray(d)) return d;\n return [];\n}\nfunction LZ_tagstr(tags){\n if(!tags||!tags.length) return '';\n var a=[];\n for(var i=0;i<tags.length;i++){\n var n=tags[i]?tags[i].name:null;\n if(n&&String(n).length>0) a.push(String(n));\n }\n return a.join(' ');\n}\nfunction LZ_isAbs(u){\n return typeof u==='string'&&(u.indexOf('http:\/\/')==0||u.indexOf('https:\/\/')==0||u.indexOf('\/\/')==0);\n}\nfunction LZ_abs(u){\n if(!u) return '';\n var s=String(u);\n if(s.indexOf('\/\/')==0) return 'https:'+s;\n if(s.indexOf('http')==0) return s;\n if(s.charAt(0)=='\/') return LZ_base()+s;\n return LZ_base()+'\/'+s;\n}\nfunction LZ_did(u){\n var s=String(u||'').split(',')[0];\n var m=s.match(\/\\\/drama\\\/([0-9]+)\/);\n return m?m[1]:'';\n}\nvar u=String(baseUrl||'').split(',')[0];var h='';try{ h=String(java.ajax(u+','+JSON.stringify({'headers':{'User-Agent':LZ_ua(),'Accept':'text\/html,application\/xhtml+xml,*\/*;q=0.8','Referer':LZ_base()+'\/'}}))); }catch(e){ return ''; }if(!h||h.length<200) return '';var i=h.indexOf('contentUrl');if(i<0) return '';i=h.indexOf(':',i);if(i<0) return '';i=i+1;while(i<h.length&&h.charAt(i)!='\"'&&h.charAt(i)!=\"'\") i++;if(i>=h.length) return '';i=i+1;var j=i;while(j<h.length&&h.charAt(j)!='\"'&&h.charAt(j)!=\"'\") j++;if(j<=i) return '';var m=[null,h.substring(i,j)];if(!m) return '';var cu=m[1];cu=cu.replace(\/\\\\u002F\/g,'\/');if(cu.indexOf('http')!=0){ if(cu.charAt(0)=='\/') cu=LZ_base()+cu; else cu=LZ_base()+'\/'+cu;}return cu;})()"
},
"ruleExplore": {
"author": "$.author",
"bookList": "@js:(function(){\nfunction LZ_base(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_hdr(){\n return {'User-Agent':LZ_ua(),'Accept':'application\/json, text\/plain, *\/*','Referer':LZ_base()+'\/'};\n}\nfunction LZ_opt(){\n return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n if(!t) return null;\n try{\n var o=JSON.parse(t);\n return (o&&typeof o==='object')?o:null;\n }catch(e){ return null; }\n}\nfunction LZ_items(o){\n if(!o) return [];\n var d=o.data;\n if(!d) return [];\n if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n if(d.items&&d.items.length>=0) return d.items;\n if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n if(Array.isArray(d)) return d;\n return [];\n}\nfunction LZ_tagstr(tags){\n if(!tags||!tags.length) return '';\n var a=[];\n for(var i=0;i<tags.length;i++){\n var n=tags[i]?tags[i].name:null;\n if(n&&String(n).length>0) a.push(String(n));\n }\n return a.join(' ');\n}\nfunction LZ_isAbs(u){\n return typeof u==='string'&&(u.indexOf('http:\/\/')==0||u.indexOf('https:\/\/')==0||u.indexOf('\/\/')==0);\n}\nfunction LZ_abs(u){\n if(!u) return '';\n var s=String(u);\n if(s.indexOf('\/\/')==0) return 'https:'+s;\n if(s.indexOf('http')==0) return s;\n if(s.charAt(0)=='\/') return LZ_base()+s;\n return LZ_base()+'\/'+s;\n}\nfunction LZ_cov(u){\n var s=LZ_abs(u);\n if(!s) return '';\n return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n var s=String(u||'').split(',')[0];\n var m=s.match(\/\\\/drama\\\/([0-9]+)\/);\n return m?m[1]:'';\n}\nvar raw='';try{ raw=String(result||''); }catch(e0){}if(raw.length<10){ try{ raw=String(src||''); }catch(e1){} }if(raw.length<10) return [];var o=LZ_json(raw);var isRank=false;try{ isRank=(String(baseUrl||'').indexOf('\/api\/v1\/rank')>=0); }catch(e2){}var its=[];if(isRank){var r=o&&o.data?o.data.items:null;if(r){for(var i=0;i<r.length;i++){ if(r[i]&&r[i].drama) its.push(r[i].drama); }}}else{ its=LZ_items(o); }var out=[];for(var i=0;i<its.length;i++){var it=its[i];if(!it)continue;out.push(JSON.stringify({name:String(it.title||''),author:'荔枝短剧',kind:LZ_tagstr(it.tags),wordCount:(it.totalEpisodes?('全'+it.totalEpisodes+'集'):''),lastChapter:(it.publishedEpisodeCount?('更新至'+it.publishedEpisodeCount+'集'):''),intro:String(it.description||''),coverUrl:LZ_cov(it.coverUrl),bookUrl:LZ_base()+'\/drama\/'+it.id+'\/'}));}return out;})()",
"bookUrl": "$.bookUrl",
"coverUrl": "$.coverUrl",
"intro": "$.intro",
"kind": "$.kind",
"lastChapter": "$.lastChapter",
"name": "$.name",
"wordCount": "$.wordCount"
},
"ruleSearch": {
"author": "$.author",
"bookList": "@js:(function(){\nfunction LZ_base(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_hdr(){\n return {'User-Agent':LZ_ua(),'Accept':'application\/json, text\/plain, *\/*','Referer':LZ_base()+'\/'};\n}\nfunction LZ_opt(){\n return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n if(!t) return null;\n try{\n var o=JSON.parse(t);\n return (o&&typeof o==='object')?o:null;\n }catch(e){ return null; }\n}\nfunction LZ_items(o){\n if(!o) return [];\n var d=o.data;\n if(!d) return [];\n if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n if(d.items&&d.items.length>=0) return d.items;\n if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n if(Array.isArray(d)) return d;\n return [];\n}\nfunction LZ_tagstr(tags){\n if(!tags||!tags.length) return '';\n var a=[];\n for(var i=0;i<tags.length;i++){\n var n=tags[i]?tags[i].name:null;\n if(n&&String(n).length>0) a.push(String(n));\n }\n return a.join(' ');\n}\nfunction LZ_isAbs(u){\n return typeof u==='string'&&(u.indexOf('http:\/\/')==0||u.indexOf('https:\/\/')==0||u.indexOf('\/\/')==0);\n}\nfunction LZ_abs(u){\n if(!u) return '';\n var s=String(u);\n if(s.indexOf('\/\/')==0) return 'https:'+s;\n if(s.indexOf('http')==0) return s;\n if(s.charAt(0)=='\/') return LZ_base()+s;\n return LZ_base()+'\/'+s;\n}\nfunction LZ_cov(u){\n var s=LZ_abs(u);\n if(!s) return '';\n return s+((s.indexOf('?')<0)?'?':'&')+'lzcv=3';\n}\nfunction LZ_did(u){\n var s=String(u||'').split(',')[0];\n var m=s.match(\/\\\/drama\\\/([0-9]+)\/);\n return m?m[1]:'';\n}\nvar raw='';try{ raw=String(result||''); }catch(e0){}if(raw.length<10){ try{ raw=String(src||''); }catch(e1){} }if(raw.length<10) return [];var o=LZ_json(raw);var its=LZ_items(o);var out=[];for(var i=0;i<its.length;i++){var it=its[i];if(!it)continue;var id=it.id;out.push(JSON.stringify({name:String(it.title||''),author:'荔枝短剧',kind:LZ_tagstr(it.tags),wordCount:(it.totalEpisodes?('全'+it.totalEpisodes+'集'):''),lastChapter:(it.publishedEpisodeCount?('更新至'+it.publishedEpisodeCount+'集'):''),intro:String(it.description||''),coverUrl:LZ_cov(it.coverUrl),bookUrl:LZ_base()+'\/drama\/'+id+'\/'}));}return out;})()",
"bookUrl": "$.bookUrl",
"coverUrl": "$.coverUrl",
"intro": "$.intro",
"kind": "$.kind",
"lastChapter": "$.lastChapter",
"name": "$.name",
"wordCount": "$.wordCount"
},
"ruleToc": {
"chapterList": "@js:(function(){\nfunction LZ_base(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_hdr(){\n return {'User-Agent':LZ_ua(),'Accept':'application\/json, text\/plain, *\/*','Referer':LZ_base()+'\/'};\n}\nfunction LZ_opt(){\n return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n if(!t) return null;\n try{\n var o=JSON.parse(t);\n return (o&&typeof o==='object')?o:null;\n }catch(e){ return null; }\n}\nfunction LZ_items(o){\n if(!o) return [];\n var d=o.data;\n if(!d) return [];\n if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n if(d.items&&d.items.length>=0) return d.items;\n if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n if(Array.isArray(d)) return d;\n return [];\n}\nfunction LZ_tagstr(tags){\n if(!tags||!tags.length) return '';\n var a=[];\n for(var i=0;i<tags.length;i++){\n var n=tags[i]?tags[i].name:null;\n if(n&&String(n).length>0) a.push(String(n));\n }\n return a.join(' ');\n}\nfunction LZ_isAbs(u){\n return typeof u==='string'&&(u.indexOf('http:\/\/')==0||u.indexOf('https:\/\/')==0||u.indexOf('\/\/')==0);\n}\nfunction LZ_abs(u){\n if(!u) return '';\n var s=String(u);\n if(s.indexOf('\/\/')==0) return 'https:'+s;\n if(s.indexOf('http')==0) return s;\n if(s.charAt(0)=='\/') return LZ_base()+s;\n return LZ_base()+'\/'+s;\n}\nfunction LZ_did(u){\n var s=String(u||'').split(',')[0];\n var m=s.match(\/\\\/drama\\\/([0-9]+)\/);\n return m?m[1]:'';\n}\nvar u=String(baseUrl||'').split(',')[0];if(u.indexOf('\/episodes')<0){ u=LZ_base()+'\/api\/v1\/drama\/'+LZ_did(u)+'\/episodes,'+LZ_opt();}var t=LZ_get(u);var o=LZ_json(t);var its=(o&&Array.isArray(o.data))?o.data:[];var out=[];for(var i=0;i<its.length;i++){var e=its[i];if(!e)continue;var no=e.epNo||(i+1);var ok=(e.available===true&&e.episodeId!=null);var nm=String(e.title||('第'+no+'集'));if(!ok) nm=nm+'(未更新)';out.push(JSON.stringify({name:nm,url:LZ_base()+'\/drama\/'+LZ_did(u)+'\/ep-'+no+'\/',isVip:(ok?false:true)}));}return out;})()",
"chapterName": "$.name",
"chapterUrl": "$.url",
"isVip": "$.isVip"
},
"searchUrl": "@js:(function(){\nfunction LZ_base(){\n var b='';\n try{ b=String(source.get('lizhost')); }catch(e){}\n if(b.length<8||b.indexOf('http')!=0) b='https:\/\/liz04.com';\n return b.replace(\/\\\/+$\/,'');\n}\nfunction LZ_ua(){\n var u='';\n try{ u=String(source.get('lizua')); }catch(e){}\n if(u.length<20) u='Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Mobile Safari\/537.36';\n return u;\n}\nfunction LZ_hdr(){\n return {'User-Agent':LZ_ua(),'Accept':'application\/json, text\/plain, *\/*','Referer':LZ_base()+'\/'};\n}\nfunction LZ_opt(){\n return JSON.stringify({'headers':LZ_hdr()});\n}\nfunction LZ_get(u){\n try{ return String(java.ajax(u+','+LZ_opt())); }catch(e){ return ''; }\n}\nfunction LZ_json(t){\n if(!t) return null;\n try{\n var o=JSON.parse(t);\n return (o&&typeof o==='object')?o:null;\n }catch(e){ return null; }\n}\nfunction LZ_items(o){\n if(!o) return [];\n var d=o.data;\n if(!d) return [];\n if(d.page&&d.page.items&&d.page.items.length>=0) return d.page.items;\n if(d.items&&d.items.length>=0) return d.items;\n if(d.result&&d.result.page&&d.result.page.items) return d.result.page.items;\n if(Array.isArray(d)) return d;\n return [];\n}\nfunction LZ_tagstr(tags){\n if(!tags||!tags.length) return '';\n var a=[];\n for(var i=0;i<tags.length;i++){\n var n=tags[i]?tags[i].name:null;\n if(n&&String(n).length>0) a.push(String(n));\n }\n return a.join(' ');\n}\nfunction LZ_isAbs(u){\n return typeof u==='string'&&(u.indexOf('http:\/\/')==0||u.indexOf('https:\/\/')==0||u.indexOf('\/\/')==0);\n}\nfunction LZ_abs(u){\n if(!u) return '';\n var s=String(u);\n if(s.indexOf('\/\/')==0) return 'https:'+s;\n if(s.indexOf('http')==0) return s;\n if(s.charAt(0)=='\/') return LZ_base()+s;\n return LZ_base()+'\/'+s;\n}\nfunction LZ_did(u){\n var s=String(u||'').split(',')[0];\n var m=s.match(\/\\\/drama\\\/([0-9]+)\/);\n return m?m[1]:'';\n}\nvar b=LZ_base();var kw='';try{kw=String(key);}catch(e){}var pg=1;try{pg=Math.max(1,parseInt(page,10)||1);}catch(e2){}return b+'\/api\/v1\/search?keyword='+encodeURIComponent(kw)+'&page='+pg+'&size=20,'+LZ_opt();})()",
"weight": 0
}