禁漫[国内]
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 {{@@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}} 👁️{{@@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
}