禁漫[国内]

https://jmcomicne.net/

jiajunjin (10775)6天前

① 发布页:https://jmcomicne.net
  
②❗❗❗需要在登录页面获取网址❗❗❗

③ 部分内容需要登录才会显示
  
④ 登录页面点击分流按钮切换站内分流,1,2,3,4代表站内分流线路

⑤ 更改发现排列在登录切换,切换后刷新发现

⑥ 复制xiaohan231大佬图片解密,支持了对未加密图片观看

⑦增加了对发布页的更新,增加了对小说支持,增加了两个分流线路支持,小说最新章节90天后解锁

⑧适配lyc版,仅保证阅读∑版可用,并加上了看评论功能
二维码导入
{
    "bookSourceComment": "① 发布页:https:\/\/jmcomicne.net\n  \n②❗❗❗需要在登录页面获取网址❗❗❗\n\n③ 部分内容需要登录才会显示\n  \n④ 登录页面点击分流按钮切换站内分流,1,2,3,4代表站内分流线路\n\n⑤ 更改发现排列在登录切换,切换后刷新发现\n\n⑥ 复制xiaohan231大佬图片解密,支持了对未加密图片观看\n\n⑦增加了对发布页的更新,增加了对小说支持,增加了两个分流线路支持,小说最新章节90天后解锁\n\n⑧适配lyc版,仅保证阅读∑版可用,并加上了看评论功能",
    "bookSourceGroup": "寿横大佬最新力作",
    "bookSourceName": "禁漫[国内]",
    "bookSourceType": 0,
    "bookSourceUrl": "https:\/\/jmcomicne.net\/",
    "customButton": false,
    "customOrder": 7,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:\n\tjava.toast(\"\\n 正在进行发现页热更新...\");\neval(String(source.loginUrl));\nlet URL = Get('urls')[Get('ci')];\nlet list = [];\n\nconst push = (title, url, size) => list.push({\n\t\"title\": title,\n\t\"url\": url,\n\t\"style\": {\n\t\t\"layout_flexGrow\": 1,\n\t\t\"layout_flexBasisPercent\": size\n\t}\n});\n\nconst request = org.jsoup.Jsoup.parse(java.ajax(URL));\nconst aElements = request.select(\"li.hidden-md:nth-of-type(6) a\");\nconst sj = aElements.length > 0 ? aElements[0].attr('href').trim() : \"\";\n\nconst authInfo = JSON.parse(source.getLoginInfo());\nconst username = authInfo?.['账号'] || \"寿横\";\nconst password = authInfo?.['密码'] || \"\";\n\nif (username && password) {\n\tconst a = java.ajax(URL + '\/login');\n\tconst b = a.match(username)?.[0] || \"\";\n\tif (b == \"\") {\n\t\tLogin();\n\t} else {\n\t\tjava.toast(\"\\n 欢迎主人 \" + b);\n\t}\n}\n\nconst label = sortNames[Get('tag1')];\nconst sort = sortKeys[Get('tag1')];\nconst _label = categoryNames[Get('tag2')];\nconst _sort = categoryPaths[Get('tag2')];\n\npush('[▶ ' + username + ' ◀]', '', 1);\npush('→ ' + URL + '  分流' + SH[Get('shunt')], '', 1);\npush(\n\tsj ? \"随机\" : \"❗❗该链接不可用,请更换链接,然后刷新❗❗\",\n\t`${URL}${sj}`,\n\t1\n);\n\npush('漫画观看记录', URL + '\/user\/' + username + '\/favorite\/watchlist', 0.45);\npush('小说观看记录', URL + '\/user\/' + username + '\/favorite\/novel_watchlist', 0.45);\n\nconst today = new Date();\nconst day = today.getDay() === 0 ? 7 : today.getDay();\nconst dayOfWeek = weekDays[today.getDay()].D;\npush('本日连载 - ' + dayOfWeek, Get('url') + '\/serialization\/' + day, 1);\nweekDays.map(({\n\tD,\n\tN\n}) => {\n\tpush(D, `${URL}\/serialization\/${N}`, 0.25);\n});\n\npush(`🏷️标签--按${label}--${_label}🏷️`, `${URL}\/albums${_sort}?o=${sort}&page={{page}}`, 1);\n_list.map(([t, u]) => {\n\tpush(t, `${URL}\/${u}${_sort}?o=${sort}&page={{page}}`, 0.25);\n});\n\npush('┡其他类┦', `${URL}\/albums\/another?o=${sort}&page={{page}}`, 1);\n__list.map(([t, u]) => {\n\tpush(t, `${URL}\/${u}?o=${sort}&page={{page}}`, 0.25);\n});\n\npush('┡排行榜┦', '', 1);\ntypeList.map(([t, type]) => {\n\tpush(t, `${URL}\/albums${_sort}?o=${sort}${type}&page={{page}}`, 0.2);\n});\n\npush('▶主题A漫◀', '', 1);\nsorts1.forEach(s => {\n\tpush(s, `${URL}\/search\/photos${_sort}?search_query=${s}&o=${sort}&page={{page}}`, 0.25);\n});\n\npush('▶角色\/扮演◀', '', 1);\nsorts2.forEach(s => {\n\tpush(s, `${URL}\/search\/photos${_sort}?search_query=${s}&o=${sort}&page={{page}}`, 0.25);\n});\n\npush('▶特殊PLAY◀', '', 1);\nsorts3.forEach(s => {\n\tpush(s, `${URL}\/search\/photos${_sort}?search_query=${s}&o=${sort}&page={{page}}`, 0.25);\n});\n\npush('▶其他◀', '', 1);\nsorts4.forEach(s => {\n\tpush(s, `${URL}\/search\/photos${_sort}?search_query=${s}&o=${sort}&page={{page}}`, 0.25);\n});\n\nJSON.stringify(list);",
    "header": "{\n\t\"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/128.0.0.0 Safari\/537.36\",\n\t\"Referer\": \"baseUrl\"\n}",
    "jsLib": "const SH = ['1', '2', '3', '4'];\nconst names = ['1', '2', '3'];\nconst sortNames = ['时间', '阅读', '喜爱', '评分'];\nconst sortKeys = ['mr', 'mv', 'tf', 'tr'];\nconst categoryNames = [\"全部\", \"中文\", \"日语\", \"CG\", \"无码\", \"上色\"];\nconst categoryPaths = [\"\", \"\/sub\/chinese\", \"\/sub\/japanese\", \"\/sub\/CG\", \"\/sub\/no_mosaic\", \"\/sub\/coloring\"];\nconst weekDays = [{\n\t\"D\": \"周日\",\n\t\"N\": \"7\"\n}, {\n\t\"D\": \"周一\",\n\t\"N\": \"1\"\n}, {\n\t\"D\": \"周二\",\n\t\"N\": \"2\"\n}, {\n\t\"D\": \"周三\",\n\t\"N\": \"3\"\n}, {\n\t\"D\": \"周四\",\n\t\"N\": \"4\"\n}, {\n\t\"D\": \"周五\",\n\t\"N\": \"5\"\n}, {\n\t\"D\": \"周六\",\n\t\"N\": \"6\"\n}, {\n\t\"D\": \"完结\",\n\t\"N\": \"0\"\n}];\nconst _list = [\n\t[\"同人\", \"albums\/doujin\"],\n\t[\"韩漫\", \"albums\/hanman\"],\n\t[\"English\", \"albums\/meiman\"],\n\t[\"短篇\", \"albums\/short\"],\n\t[\"单本\", \"albums\/single\"]\n];\nconst typeList = [\n\t[\"日榜\", \"&t=t\"],\n\t[\"周榜\", \"&t=w\"],\n\t[\"月榜\", \"&t=m\"],\n\t[\"总榜\", \"\"]\n];\nconst sorts1 = [\"無修正\", \"劇情向\", \"青年漫\", \"校服\", \"純愛\", \"人妻\", \"教師\", \"百合\", \"Yaoi\", \"性轉\", \"NTR\", \"女裝\", \"癡女\", \"全彩\", \"女性向\", \"完結\", \"純愛\", \"禁漫漢化組\"];\nconst sorts2 = [\"御姐\", \"熟女\", \"未成年\", \"巨乳\", \"貧乳\", \"女性支配\", \"教師\", \"女僕\", \"護士\", \"泳裝\", \"眼鏡\", \"連褲襪\", \"其他制服\", \"兔女郎\"];\nconst sorts3 = [\"群交\", \"足交\", \"束縛\", \"肛交\", \"阿黑顏\", \"藥物\", \"扶他\", \"調教\", \"野外露出\", \"催眠\", \"自慰\", \"觸手\", \"獸交\", \"亞人\", \"怪物女孩\", \"皮物\", \"附身\", \"ryona\", \"騎大車\"];\nconst sorts4 = [\"CG\", \"重口\", \"獵奇\", \"非H\", \"血腥暴力\", \"站長推薦\"];\nconst __list = [\n\t[\"其他\", \"albums\/another\/sub\/other\"],\n\t[\"COS\", \"albums\/another\/sub\/cosplay\"],\n\t[\"3D\", \"albums\/another\/sub\/3D\"],\n\t[\"小说\", \"novels\"]\n];\n\nfunction put(data) {\n\tconst {\n\t\tjava,\n\t\tcache,\n\t\tsource,\n\t\tcookie\n\t} = this;\n\treturn source.setVariable(JSON.stringify(data, null, '\\t'));\n};\n\nfunction Get(e) {\n\tconst {\n\t\tjava,\n\t\tsource,\n\t\tcookie\n\t} = this;\n\tvar get = JSON.parse(source.getVariable());\n\treturn get[e];\n}\n\nfunction GetInfo() {\n\tconst {\n\t\tjava,\n\t\tcache,\n\t\tsource,\n\t\tcookie\n\t} = this;\n\tif (!source.getLoginInfo()) {\n\t\tvar num = parseInt(cache.get('jmlk') || 0);\n\t\tif (num > 100) {\n\t\t\tsource.putLoginInfo(loginInfo);\n\t\t\treturn;\n\t\t}\n\t\tcache.put('jmlk', num + 1, 60);\n\t}\n\treturn;\n};",
    "lastUpdateTime": "1772089370266",
    "loginCheckJs": "var resultUrl = result.url();\nvar resultCode = result.code();\nvar resultBoDy = result.body();\nif (\/_cf_|ge_ua|verify.php\/ig.test(resultBoDy)) {\n\tif (key) {\n\t\turl = baseUrl + java.ruleUrl;\n\t}\n\tcookie.removeCookie(baseUrl)\n\tresult = java.startBrowserAwait(resultUrl,\n\t\t\"验证\", false);\n\t\/\/java.log(result.body())\n\t\/\/result = java.connect(resultUrl)\n}\nresult;",
    "loginUi": "@js:\n\tvar UI = [];\nif (source) {\n\tvar addUI = [{\n\t\t\t\"name\": \"获取链接\",\n\t\t\t\"type\": \"button\",\n\t\t\t\"action\": \"url()\",\n\t\t\t\"style\": {\n\t\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\t\"layout_flexBasisPercent\": 1\n\t\t\t}\n\t\t}, {\n\t\t\tname: \"分流\",\n\t\t\tviewName: \"'分流:'\",\n\t\t\ttype: \"select\",\n\t\t\taction: \"sh(SH.indexOf(String(result['分流'])))\",\n\t\t\tchars: ['1', '2', '3', '4'],\n\t\t\tdefault: \"1\",\n\t\t\t\"style\": {\n\t\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\t\"layout_flexBasisPercent\": 0.45\n\t\t\t}\n\t\t}, {\n\t\t\tname: \"接口\",\n\t\t\tviewName: \"'接口:'\",\n\t\t\ttype: \"select\",\n\t\t\taction: \"qh(names.indexOf(String(result['接口'])))\",\n\t\t\tchars: ['1', '2', '3'],\n\t\t\tdefault: \"1\",\n\t\t\t\"style\": {\n\t\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\t\"layout_flexBasisPercent\": 0.45\n\t\t\t}\n\t\t}, {\n\t\t\t\"name\": \"账号\",\n\t\t\t\"type\": \"text\"\n\t\t}, {\n\t\t\t\"name\": \"密码\",\n\t\t\t\"type\": \"password\"\n\t\t}, {\n\t\t\t\"name\": \"🏮登录🏮\",\n\t\t\t\"type\": \"button\",\n\t\t\t\"action\": \"Login()\",\n\t\t\t\"style\": {\n\t\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\t\"layout_flexBasisPercent\": 1\n\t\t\t}\n\t\t}, {\n\t\t\tname: \"排序\",\n\t\t\tviewName: \"'排序:'\",\n\t\t\ttype: \"select\",\n\t\t\taction: \"qh1(sortNames.indexOf(String(result['排序'])))\",\n\t\t\tchars: ['时间', '阅读', '喜爱', '评分'],\n\t\t\tdefault: \"时间\",\n\t\t\t\"style\": {\n\t\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\t\"layout_flexBasisPercent\": 0.45\n\t\t\t}\n\t\t}, {\n\t\t\tname: \"分类\",\n\t\t\tviewName: \"'分类:'\",\n\t\t\ttype: \"select\",\n\t\t\taction: \"qh2(categoryNames.indexOf(String(result['分类'])))\",\n\t\t\tchars:  [\"全部\", \"中文\", \"日语\", \"CG\", \"无码\", \"上色\"],\n\t\t\tdefault: \"全部\",\n\t\t\t\"style\": {\n\t\t\t\t\"layout_flexGrow\": 1,\n\t\t\t\t\"layout_flexBasisPercent\": 0.45\n\t\t\t}\n\t\t}\n\t];\n\tUI = UI.concat(addUI);\n}\nJSON.stringify(UI);",
    "loginUrl": "original = {\n\t'rel': 'https:\/\/jmcomicne.net\/',\n\t'urls': [\n\t\t'1', '2', '3'\n\t],\n\t'ci': 0,\n\t'shunt': 0,\n\t'tag1': 0,\n\t'tag2': 0,\n\t'ver': 2.2\n};\nGetInfo();\ntry {\n\t$$$ = JSON.parse(source.getVariable());\n\tif ($$$ == null) {\n\t\terror;\n\t} else {\n\t\tconst tagKeyName = Object.keys($$$).find(key => key === 'ver');\n\t\tif (tagKeyName === undefined || $$$.ver !== 2.2) {\n\t\t\terror;\n\t\t}\n\t};\n} catch (e) {\n\t$$$ = original;\n\tput($$$);\n}\n\nfunction login(e) {\n\tif (e == undefined) {\n\t\treturn;\n\t}\n\tjava.longToast(e);\n}\n\nfunction url() {\n\tlogin(\"启动\")\n\tconst baseUrl = java.connect(Get('rel')).url();\n\t$$$.rel = baseUrl;\n\tlogin('开始获取链接');\n\tconst html = java.ajax(baseUrl);\n\tlet allUrls = [];\n\t['china', 'first_line', 'second_line'].forEach(key => {\n\t\tconst reg = new RegExp(`${key}\\\"><span>(.*?)<\\\\\/span`);\n\t\tconst match = html.match(reg);\n\t\tif (match && match[1]) {\n\t\t\tallUrls.push(match[1].replace(\/\\s+\/g, \"\"));\n\t\t}\n\t});\n\tconst uniqueUrls = [];\n\tallUrls.forEach(url => !uniqueUrls.includes(url) && url && uniqueUrls.push(url));\n\t$$$.urls = uniqueUrls\n\tjava.log(JSON.stringify($$$.urls));\n\tlogin('获取成功' + n(2) + '到日志查看链接');\n\treturn put($$$);\n}\n\nfunction n(e) {\n\tn = '\\n';\n\tfor (m = 1; m < e; m++) {\n\t\tn = n + '\\n';\n\t}\n\treturn n;\n}\n\nfunction typeSH(e) {\n\tif (e == undefined) {\n\t\te = 0;\n\t}\n\treturn SH[e];\n}\n\nfunction sh(e) {\n\tif (sh == undefined) {\n\t\tsh = result.sh;\n\t}\n\tif (e == $$$.shunt) {\n\t\treturn;\n\t}\n\tlogin('【切换分流】' + n(2) + '已经切换到分流:[' + typeSH(e) + ']');\n\t$$$.shunt = e;\n\treturn put($$$);\n}\n\nfunction qh(e) {\n\tif (Get('urls')[0] == 1) {\n\t\tlogin('请先获取URL');\n\t}\n\tif (qh == undefined) {\n\t\tqh = result.qh;\n\t}\n\tif (e == $$$.ci) {\n\t\treturn;\n\t}\n\tlogin('【切换接口】' + n(2) + '已经切换到内地:[' + names[e] + ']');\n\t$$$.ci = e;\n\treturn put($$$);\n}\n\nfunction qh1(e) {\n\tif (qh1 == undefined) {\n\t\tqh1 = result.qh1;\n\t}\n\tif (e == $$$.tag1) {\n\t\treturn;\n\t}\n\tlogin('【切换排序】' + n(2) + '已经切换到排序:[' + sortNames[e] + ']');\n\t$$$.tag1 = e;\n\treturn put($$$);\n}\n\nfunction qh2(e) {\n\tif (qh2 == undefined) {\n\t\tqh2 = result.qh2;\n\t}\n\tif (e == $$$.tag2) {\n\t\treturn;\n\t}\n\tlogin('【切换分类】' + n(2) + '已经切换到分类:[' + categoryNames[e] + ']');\n\t$$$.tag2 = e;\n\treturn put($$$);\n}\n\nfunction Login() {\n\tconst result = JSON.parse(source.getLoginInfo());\n\tvar username = result['账号'];\n\tvar password = result['密码'];\n\tvar options = {\n\t\tbody: `username=${username}&password=${password}&submit_login=1`,\n\t\tmethod: 'POST'\n\t};\n\tif (Get('urls')[0] == 1) {\n\t\tlogin('请先获取URL');\n\t} else if (Get('urls')[Get('ci')]) {\n\t\tlogin(\"\\n⏳正在登录中,请等一会,很快就好...\");\n\t\tvar request = JSON.parse(java.log(java.ajax(Get('urls')[Get('ci')] + `\/login,${JSON.stringify(options)}`)))\n\t\tif (request.status == '1') {\n\t\t\tlogin('✅ 登录成功')\n\t\t} else {\n\t\t\tlogin('❎ 登录失败')\n\t\t}\n\t} else {\n\t\tlogin('❌ 未获取到有效URL,请切换url');\n\t}\n}",
    "respondTime": 180000,
    "ruleBookInfo": {
        "author": "@js:\n\tif (baseUrl.match(\/novel\/)) {\n\t\t\/\/小说\n\t\ttext = java.getString('.p-t-5 li a@text');\n\t} else {\n\t\t\/\/漫画\n\t\ttext = java.getString('a.web-author-tag:nth-of-type(1)@text');\n\t}\ntext;",
        "coverUrl": "class.thumb-overlay.2@img@src",
        "init": "<js>\nurl = baseUrl\nnum = baseUrl.includes(\"novel\") ? 1 : 2;\njava.put(\"btype\",num);\nif(num == 2){\njmBookId = baseUrl.match(\/album\\\/(\\d+)\/)[1];\njava.put(\"jmBookId\", jmBookId);\n} \nresult\n<\/js>",
        "intro": "{{\"\\n\"}}\n&nbsp;{{@@class.train-number@text}}{{@@class.novel-cover@class.list-unstyled.0@li.0@html}}\n👍🏻{{@@class.list-style-none.d-inline-block p-r-15.-2@html}}{{@@class.novel-cover@class.list-unstyled.0@ul@li.0@html}}&nbsp;&nbsp;👁️{{@@class.list-style-none.d-inline-block p-r-15.-1@html}}{{@@class.novel-cover@class.list-unstyled.0@ul@li.1@html}}\n{{@@class.intro-collapse-content@text}}\n{{@@class.p-t-5 float-left@text##日期}}    {{@@class.p-t-5 float-right@text##日期}}\n{{@@div.p-t-5:nth-of-type(9)@text}}\n{{@@h2.p-t-5.0@text##叙述:}}",
        "kind": "@js:\n\tif (baseUrl.match(\/novel\/)) {\n\t\t\/\/小说\n\t\ttext = java.getString('span[data-type=tags]@a@text');\n\t} else {\n\t\t\/\/漫画\n\t\ttext = java.getString('#intro-block@[data-type=tags]@a@text');\n\t}\ntext;",
        "name": "{{@@h1@text}}",
        "tocUrl": "baseUrl",
        "wordCount": "{{@@class.col-lg-7@div.1@div.p-t-5:nth-of-type(1)@text}}{{@@class.novel-cover@class.list-unstyled.0@li.0@text}}"
    },
    "ruleContent": {
        "callBackJs": "switch (event) {\n\tcase \"clickCustomButton\":\n\t\tconst bookId = book.getVariable(\"jmBookId\");\n\t\tif (!bookId) {\n\t\t\tjava.longToast(\"暂无关联书籍\");\n\t\t\tbreak;\n\t\t}\n\t\tconst body = \"video_id=\" + bookId + \"&page=1&series=1&with_ad_wcm=1\";\n\t\tconst request = java.post(Get('urls')[0] + '\/ajax\/album_pagination', body, {}).body();\n\t\tlet code = JSON.parse(request).code || \"\";\n\t\tconst cctv = Get('urls')[0];\n\t\tconst hasMore = code.indexOf('查看更多') !== -1;\n\t\tif (hasMore) {\n\t\t\tconst body1 = \"video_id=\" + bookId + \"&page=2&series=1&with_ad_wcm=1\";\n\t\t\tconst nextRequest = java.post(cctv + '\/ajax\/album_pagination', body1, {}).body();\n\t\t\tconst nextCode = JSON.parse(nextRequest).code || \"\";\n\t\t\tif (!nextCode) break;\n\t\t\tcode += nextCode;\n\t\t\tcode = code.replace(\/查看更多\/g, '');\n\t\t}\n\t\tlet fixedCode = code.replace(\/<img src=\"\/g, `<img src=\"${cctv}`);\n\t\tconst html = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>书评<\/title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n    <style>\n        :root {\n    --bg: #f5f5f5;\n    --panel-bg: #fff;\n    --text-primary: #333;\n    --text-secondary: #666;\n    --text-tertiary: #999;\n    --border: #eee;\n    --accent: #ff4444;\n    --radius: 16px;\n    --shadow: 0 2px 10px rgba(0,0,0,0.06);\n    --s-sm: 8px;\n    --s-md: 12px;\n    --s-lg: 16px;\n}\n* {\n    margin: 0;\n    padding: 0;\n    box-sizing: border-box;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\nbody {\n    background: var(--bg);\n    padding: var(--s-md);\n    line-height: 1.6;\n    -webkit-font-smoothing: antialiased;\n}\n.panel {\n    background: var(--panel-bg);\n    border-radius: var(--radius);\n    margin-bottom: var(--s-lg);\n    overflow: hidden;\n    box-shadow: var(--shadow);\n    transition: transform 0.2s ease, box-shadow 0.2s ease;\n}\n.panel:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n}\n.panel-body {\n    padding: var(--s-lg);\n}\n.timeline {\n    display: flex;\n    flex-direction: column;\n    gap: var(--s-md);\n}\n.timeline-header-wrapper {\n    display: flex;\n    align-items: center;\n    gap: var(--s-md);\n}\n.timeline-avatar {\n    width: 44px;\n    height: 44px;\n    border-radius: 50%;\n    border: 1px solid var(--border);\n    object-fit: cover;\n    transition: transform 0.2s ease;\n    flex-shrink: 0;\n}\n.timeline-avatar:hover {\n    transform: scale(1.05);\n}\n.timeline-user-group {\n    display: flex;\n    align-items: center;\n    gap: var(--s-md);\n    flex: 1;\n}\n.timeline-user-info {\n    display: flex;\n    flex-direction: column;\n    gap: 2px;\n}\n.timeline-username {\n    font-size: 15px;\n    font-weight: 600;\n    color: var(--text-primary);\n}\n.timeline-user-title {\n    font-size: 11px;\n    color: var(--text-tertiary);\n}\n.timeline-user-level {\n    font-size: 11px;\n    color: var(--text-secondary);\n    background: var(--bg);\n    padding: 2px 8px;\n    border-radius: 10px;\n    white-space: nowrap;\n}\n.timeline-header-actions {\n    display: flex;\n    align-items: center;\n}\n.comment-vote {\n    font-size: 11px;\n    color: var(--accent);\n    text-decoration: none;\n    display: flex;\n    align-items: center;\n    gap: 3px;\n    transition: color 0.2s ease;\n}\n.comment-vote:hover {\n    color: #ff2222;\n}\n.timeline-meta {\n    display: flex;\n    justify-content: space-between;\n    margin: var(--s-sm) 0 var(--s-md) 0;\n    font-size: 11px;\n    color: var(--text-tertiary);\n    padding-left: calc(44px + var(--s-md));\n}\n.timeline-badge img {\n    width: 16px;\n    height: 16px;\n    margin-right: 4px;\n    vertical-align: middle;\n}\n.timeline-content {\n    font-size: 14px;\n    color: var(--text-primary);\n    margin-bottom: var(--s-md);\n    word-break: break-word;\n    padding-left: calc(44px + var(--s-md));\n}\n.timeline-info {\n    display: flex;\n    justify-content: space-between;\n    font-size: 11px;\n    color: var(--text-tertiary);\n    padding-left: calc(44px + var(--s-md));\n}\n.timeline-info-reply {\n    color: var(--text-secondary);\n    margin-right: var(--s-md);\n    cursor: pointer;\n}\n.timeline-info-other-reply {\n    color: var(--accent);\n    cursor: pointer;\n}\n.timeline-ft a {\n    color: var(--text-secondary);\n    text-decoration: none;\n    transition: color 0.2s ease;\n}\n.timeline-ft a:hover {\n    color: var(--accent);\n}\n.reply-line {\n    height: 1px;\n    background: var(--border);\n    margin: var(--s-lg) 0;\n}\n.other-timelines {\n    margin-top: var(--s-md);\n    padding-left: calc(44px + var(--s-md));\n}\n.reply-item {\n    display: flex;\n    flex-direction: column;\n    gap: var(--s-sm);\n    margin-bottom: var(--s-md);\n    padding: var(--s-md);\n    background: var(--bg);\n    border-radius: 8px;\n}\n.reply-header {\n    display: flex;\n    align-items: center;\n    gap: var(--s-md);\n}\n.reply-avatar {\n    width: 36px;\n    height: 36px;\n    border-radius: 50%;\n    border: 1px solid var(--border);\n    object-fit: cover;\n    flex-shrink: 0;\n}\n.reply-user-info {\n    display: flex;\n    flex-direction: column;\n    gap: 1px;\n}\n.reply-username {\n    font-size: 14px;\n    font-weight: 600;\n    color: var(--text-primary);\n}\n.reply-user-title {\n    font-size: 10px;\n    color: var(--text-tertiary);\n}\n.reply-meta {\n    display: flex;\n    justify-content: space-between;\n    font-size: 10px;\n    color: var(--text-tertiary);\n    margin: 0 0 var(--s-sm) calc(36px + var(--s-md));\n}\n.reply-content {\n    font-size: 13px;\n    color: var(--text-primary);\n    margin-bottom: var(--s-sm);\n    padding-left: calc(36px + var(--s-md));\n}\n.disclose {\n    background: var(--bg);\n    padding: var(--s-md);\n    border-radius: 8px;\n    margin-bottom: var(--s-md);\n    display: flex;\n    flex-direction: column;\n    gap: var(--s-sm);\n    padding-left: calc(44px + var(--s-md));\n}\n.disclose p {\n    font-size: 13px;\n    color: var(--text-secondary);\n}\n.disclose a {\n    font-size: 13px;\n    color: var(--accent);\n    text-decoration: none;\n    align-self: flex-start;\n}\n@media (max-width: 360px) {\n    body { padding: var(--s-sm); }\n    .timeline-avatar { width: 38px; height: 38px; }\n    .reply-avatar { width: 32px; height: 32px; }\n    .timeline-content, .reply-content, .disclose, .timeline-meta, .timeline-info, .reply-meta {\n        padding-left: calc(38px + var(--s-sm));\n    }\n    .other-timelines { padding-left: calc(38px + var(--s-sm)); }\n    .timeline-content { font-size: 13px; }\n    .panel-body { padding: var(--s-md); }\n    .timeline-badge img { width: 14px; height: 14px; }\n}\n@media (prefers-color-scheme: dark) {\n    :root {\n        --bg: #121212;\n        --panel-bg: #1e1e1e;\n        --text-primary: #f5f5f5;\n        --text-secondary: #bbb;\n        --text-tertiary: #888;\n        --border: #333;\n        --accent: #ff6666;\n        --shadow: 0 2px 10px rgba(0,0,0,0.2);\n    }\n}\n     <\/style>\n <\/head>\n <body>\n ${fixedCode}\n <\/body>\n <\/html>`;\n\t\tjava.startBrowser(\"\", \"\", html);\n\t\tbreak;\n}",
        "content": "{{@class.novel-content@html}}\n{{@class.row thumb-overlay-albums@tag.img@data-original}}\n@js:url = baseUrl\nif(baseUrl.includes(\"novel\")){\n\tif(!result) {\n\t\tresult =\"\\n 90天後會自動解鎖\"\n\t\t result\n\t\t} else {\n\t\t\tresult\n\t}\t} else {\nresult.split(\"\\n\").map(x=>'<img src=\"'+x+'\">').join(\"\\n\")\n}",
        "imageDecode": "if (src.search(\"qyyuapi.com\") != -1) {\n\tresult;\n} else {\n\tvar Magua = new JavaImporter();\n\tMagua.importPackage(Packages.java.io, Packages.android.graphics);\n\twith(Magua) {\n\t\tlet mac = src.match(\/photos\\\/(\\d+)?\\\/(\\d+)?\/);\n\t\tlet bookId = mac[1];\n\t\tlet imgId = mac[2];\n\t\tif (src.search(\"gif\") != -1 || Number(bookId) < 220980) {\n\t\t\tresult;\n\t\t} else {\n\t\t\tif (Number(bookId) > 421925) {\n\t\t\t\tlet md5 = java.md5Encode((bookId + imgId));\n\t\t\t\tlet ascii = md5.substr(-1).charCodeAt(0);\n\t\t\t\tvar num = (ascii % 8 + 1) * 2;\n\t\t\t} else if (Number(bookId) >= 268850) {\n\t\t\t\tlet md5 = java.md5Encode((bookId + imgId));\n\t\t\t\tlet ascii = md5.substr(-1).charCodeAt(0);\n\t\t\t\tvar num = (ascii % 10 + 1) * 2;\n\t\t\t} else {\n\t\t\t\tvar num = 10;\n\t\t\t}\n\t\t\tvar img = BitmapFactory.decodeByteArray(result, 0, result.length);\n\t\t\tvar height = img.getHeight();\n\t\t\tvar width = img.getWidth();\n\t\t\tvar y = Math.floor(height \/ num);\n\t\t\tvar remainder = height % num;\n\t\t\tvar newImg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n\t\t\tlet canvas = new Canvas(newImg);\n\t\t\tfor (let i = 1; i <= num; i++) {\n\t\t\t\tlet h = i === num ? remainder : 0;\n\t\t\t\tcanvas.drawBitmap(Bitmap.createBitmap(img, 0, y * (i - 1), width, y + h), 0, height - y * i - h, null);\n\t\t\t}\n\t\t\tvar newbit = new ByteArrayOutputStream();\n\t\t\tnewImg.compress(Bitmap.CompressFormat.PNG, 100, newbit);\n\t\t\tnewbit.toByteArray();\n\t\t}\n\t}\n}",
        "imageStyle": "FULL"
    },
    "ruleExplore": {},
    "ruleSearch": {
        "author": "@js:\n\tif (baseUrl.match(\/novel\/)) {\n\t\t\/\/小说\n\t\ttext = java.getString('.title-truncate.2@text');\n\t} else {\n\t\t\/\/漫画\n\t\ttext = java.getString('.title-truncate.1@text');\n\t}\ntext;",
        "bookList": "@js:\n\tvar list\nif (baseUrl.match(\/favorite\/)) {\n\tlist = java.getElements('div.col-xs-3');\n} else if (!baseUrl.match(\/album\\\/\\d+\/)) {\n\tlist = java.getElements('class.p-b-15');\n}\nlist;",
        "bookUrl": "tag.a.0@href",
        "coverUrl": "img@data-original||img@src",
        "intro": ".video-title@text",
        "kind": "{{@@class.tag@text}}",
        "lastChapter": "@js:\n\tif (baseUrl.match(\/novel\/)) {\n\t\t\/\/小说\n\t\ttext = java.getString('.title-truncate.1@text');\n\t} else {\n\t\t\/\/漫画\n\t\ttext = java.getString('');\n\t}\ntext;",
        "name": "@js:\n\tif (baseUrl.match(\/novel_watchlist\/)) {\n\t\ttext = java.getString('.title-truncate@text');\n\t} else if (baseUrl.match(\/favorite\/)) {\n\ttext = java.getString('.image-item-text@text');\n} else {\n\ttext = java.getString('.video-title@text');\n}\ntext;",
        "wordCount": "{{@@span.0@text##^##👍🏻 }}"
    },
    "ruleToc": {
        "chapterList": "class.btn-toolbar.0@tag.a||.reading\n<js>\nlet type = +(java.get('btype'))\nswitch (type) {\n  case 1:\n    book.type = 8;\n    break;\n  case 2:\n    book.type = 64;\n}\nresult\n<\/js>",
        "chapterName": "text",
        "chapterUrl": "href\n@js:\nresult += \"\/?shunt=\" +SH[Get('shunt')]",
        "preUpdateJs": "java.refreshTocUrl()"
    },
    "searchUrl": "{{Get('urls')[Get('ci')]}}\/search\/photos?search_query={{key}}&search-type=photos&main_tag=0&page={{page}}",
    "weight": 0
}
广告