🎨禁漫天堂[国内]
https://jmcomicgo.me
jiajunjin (10775)6天前
① 发布页:https://jmcomicgo.me
②❗❗❗需要在登录页面获取网址❗❗❗
③ 部分内容需要登录才会显示
④ 登录页面点击分流按钮切换站内分流,1,2,3,4代表站内分流线路
⑤ 更改发现排列在登录切换,切换后刷新发现
⑥ 复制xiaohan231大佬图片解密,支持了对未加密图片观看
⑦增加了对发布页的更新,增加了对小说支持,增加了两个分流线路支持,小说最新章节90天后解锁
②❗❗❗需要在登录页面获取网址❗❗❗
③ 部分内容需要登录才会显示
④ 登录页面点击分流按钮切换站内分流,1,2,3,4代表站内分流线路
⑤ 更改发现排列在登录切换,切换后刷新发现
⑥ 复制xiaohan231大佬图片解密,支持了对未加密图片观看
⑦增加了对发布页的更新,增加了对小说支持,增加了两个分流线路支持,小说最新章节90天后解锁
{
"bookSourceComment": "① 发布页:https:\/\/jmcomicgo.me\n \n②❗❗❗需要在登录页面获取网址❗❗❗\n\n③ 部分内容需要登录才会显示\n \n④ 登录页面点击分流按钮切换站内分流,1,2,3,4代表站内分流线路\n\n⑤ 更改发现排列在登录切换,切换后刷新发现\n\n⑥ 复制xiaohan231大佬图片解密,支持了对未加密图片观看\n\n⑦增加了对发布页的更新,增加了对小说支持,增加了两个分流线路支持,小说最新章节90天后解锁",
"bookSourceGroup": "寿横大佬最新力作",
"bookSourceName": "🎨禁漫天堂[国内]",
"bookSourceType": 2,
"bookSourceUrl": "https:\/\/jmcomicgo.me",
"customButton": true,
"customOrder": 11,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": true,
"exploreUrl": "@js:\njava.toast(\"\\n 正在进行发现页热更新...\");\neval(String(source.loginUrl));\nlet URL = Get('urls')[0];\nlet list = [];\n\nconst push = (title, url, size) => list.push({\n \"title\": title,\n \"url\": url,\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": size\n }\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 const a = java.ajax(URL + '\/login');\n const b = a.match(username)?.[0] || \"\";\n if (b ==\"\") {\n Login();\n } else {\n java.toast(\"\\n 欢迎主人 \" + b);\n }\n}\n\nconst label = sortCriteria[Get('tag')].label;\nconst sort = sortCriteria[Get('tag')].sort;\nconst _label = Category[Get('tag1')][0];\nconst _sort = Category[Get('tag1')][1];\n\npush('[▶ ' + username + ' ◀]', '', 1);\npush('→ ' + URL + ' 分流' + nums[Get('shunt')], '', 1);\npush(\n sj ? \"随机\" : \"❗❗该链接不可用,请更换链接,然后刷新❗❗\",\n `${URL}${sj}`,\n 1\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(({ D, N }) => {\n push(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 push(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 push(t, `${URL}\/${u}?o=${sort}&page={{page}}`, 0.25);\n});\n\npush('┡排行榜┦', '', 1);\ntypeList.map(([t, type]) => {\n push(t, `${URL}\/albums${_sort}?o=${sort}${type}&page={{page}}`, 0.2);\n});\n\npush('▶主题A漫◀', '', 1);\nsorts1.forEach(s => {\n push(s, `${URL}\/search\/photos${_sort}?search_query=${s}&o=${sort}&page={{page}}`, 0.25);\n});\n\npush('▶角色\/扮演◀', '', 1);\nsorts2.forEach(s => {\n push(s, `${URL}\/search\/photos${_sort}?search_query=${s}&o=${sort}&page={{page}}`, 0.25);\n});\n\npush('▶特殊PLAY◀', '', 1);\nsorts3.forEach(s => {\n push(s, `${URL}\/search\/photos${_sort}?search_query=${s}&o=${sort}&page={{page}}`, 0.25);\n});\n\npush('▶其他◀', '', 1);\nsorts4.forEach(s => {\n push(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 nums = [1, 2, 3, 4];\nconst sortCriteria = [{ label: '时间', sort: 'mr' },{ label: '阅读', sort: 'mv' },{ label: '喜爱', sort: 'tf'},{ label: '评分', sort: 'tr' }];\nconst Category = [[\"全部\",\"\"],[\"中文\",\"\/sub\/chinese\"],[\"日语\",\"\/sub\/japanese\"],[\"CG\",\"\/sub\/CG\"],[\"无码\",\"\/sub\/no_mosaic\"],[\"上色\",\"\/sub\/coloring\"]];\nconst weekDays = [{ \"D\": \"周日\", \"N\": \"7\" },{ \"D\": \"周一\", \"N\": \"1\" },{ \"D\": \"周二\", \"N\": \"2\" },{ \"D\": \"周三\", \"N\": \"3\" },{ \"D\": \"周四\", \"N\": \"4\" },{ \"D\": \"周五\", \"N\": \"5\" },{ \"D\": \"周六\", \"N\": \"6\" },{ \"D\": \"完结\", \"N\": \"0\" }];\nconst _list =[[\"同人\",\"albums\/doujin\"],[\"韩漫\",\"albums\/hanman\"],[\"English\",\"albums\/meiman\"],[\"短篇\",\"albums\/short\"],[\"单本\",\"albums\/single\"]];\nconst typeList = [[\"日榜\", \"&t=t\"],[\"周榜\", \"&t=w\"],[\"月榜\", \"&t=m\"],[\"总榜\", \"\"]];\nconst sorts1 = [\"無修正\",\"劇情向\",\"青年漫\",\"校服\",\"純愛\",\"人妻\",\"教師\",\"百合\",\"Yaoi\",\"性轉\",\"NTR\",\"女裝\",\"癡女\",\"全彩\",\"女性向\",\"完結\",\"純愛\",\"禁漫漢化組\"];\nconst sorts2 = [\"御姐\",\"熟女\",\"未成年\",\"巨乳\",\"貧乳\",\"女性支配\",\"教師\",\"女僕\",\"護士\",\"泳裝\",\"眼鏡\",\"連褲襪\",\"其他制服\",\"兔女郎\"];\nconst sorts3 = [\"群交\",\"足交\",\"束縛\",\"肛交\",\"阿黑顏\",\"藥物\",\"扶他\",\"調教\",\"野外露出\",\"催眠\",\"自慰\",\"觸手\",\"獸交\",\"亞人\",\"怪物女孩\",\"皮物\",\"附身\",\"ryona\",\"騎大車\"];\nconst sorts4 = [\"CG\",\"重口\",\"獵奇\",\"非H\",\"血腥暴力\",\"站長推薦\"];\nconst __list = [[\"其他\",\"albums\/another\/sub\/other\"],[\"COS\", \"albums\/another\/sub\/cosplay\"],[\"3D\", \"albums\/another\/sub\/3D\"],[\"小说\", \"novels\"]];\n\nfunction put(data) {\n const { java, source, cookie } = this;\n return source.setVariable(JSON.stringify(data, null, '\\t'));\n}\n\nfunction Get(e) {\n const { java, source, cookie } = this;\n var get = JSON.parse(source.getVariable());\n return get[e];\n}\n\nfunction checkLatency(urls, ctx) {\n const { java } = ctx;\n var results = [];\n var count = 0;\n for (var i = 0; i < urls.length; i++) {\n var url = urls[i].startsWith(\"http\") ? urls[i] : \"https:\/\/\" + urls[i];\n try {\n java.toast(`\\n检测可用线路:(${i + 1}\/${urls.length})`);\n var start = Date.now();\n org.jsoup.Jsoup.connect(url)\n .method(org.jsoup.Connection.Method.HEAD)\n .timeout(10000)\n .ignoreHttpErrors(true)\n .execute();\n var end = Date.now();\n var latency = end - start;\n if (latency > 0) {\n count++;\n results.push({ host: url, latency: latency });\n }\n } catch (e) {\n java.log(`${url} 检测失败:${e.message}`);\n }\n }\n results.sort(function (a, b) {\n return a.latency - b.latency;\n });\n var availableUrls = results.map(item => item.host);\n java.longToast(`\\n检测完成:共(${count}\/${urls.length})个可用线路`);\n return availableUrls;\n}",
"lastUpdateTime": "1772089152228",
"loginCheckJs": " var resultUrl = result.url();\n var resultCode = result.code();\n var resultBoDy = result.body();\n if (\/_cf_|ge_ua|verify.php\/ig.test(resultBoDy) ) {\n if (key) {\n url = baseUrl + java.ruleUrl;\n }\n cookie.removeCookie(baseUrl)\n result = java.startBrowserAwait(resultUrl, \n \t\"验证\", false);\n \/\/java.log(result.body())\n \/\/result = java.connect(resultUrl)\n }\nresult;",
"loginUi": "[\n {\n \"name\": \"账号\",\n \"type\": \"text\"\n },\n {\n \"name\": \"密码\",\n \"type\": \"text\"\n },\n {\n \"name\": \"🏮登录🏮\",\n \"type\": \"button\",\n \"action\": \"Login()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"ˇ»`ʚ 切换分流 ɞ´«ˇ\",\n \"type\": \"button\",\n \"action\": \"qh1()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"时间\",\n \"type\": \"button\",\n \"action\": \"tag(0)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"阅读\",\n \"type\": \"button\",\n \"action\": \"tag(1)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"喜爱\",\n \"type\": \"button\",\n \"action\": \"tag(2)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"评分\",\n \"type\": \"button\",\n \"action\": \"tag(3)\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.2\n }\n },\n {\n \"name\": \"分类切换\",\n \"type\": \"button\",\n \"action\": \"qh2()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"获取链接\",\n \"type\": \"button\",\n \"action\": \"url()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n },\n {\n \"name\": \"切換链接\",\n \"type\": \"button\",\n \"action\": \"qh()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n }\n]\n",
"loginUrl": "function login(){}\noriginal = {\n'url' : 'https:\/\/jmcomicgo.me\/',\n'urls' : [\n'1','2','3'\n],\n'shunt' : 0,\n'tag' : 0,\n'tag1' : 0,\n'V' : 1.1\n};\n\ntry {\n $$$ = JSON.parse(source.getVariable());\n if ($$$ == null) {\n error;\n } else {\n const tagKeyName = Object.keys($$$).find(key => key === 'V');\n if (tagKeyName === undefined || $$$.V !== 1.1) {\n error;\n }\n };\n} catch (e) {\n $$$ = original;\n put($$$);\n}\n\nfunction Login() {\n const result = JSON.parse(source.getLoginInfo());\n var username = result['账号'];\n var password = result['密码'];\n var options = {\n\t body: `username=${username}&password=${password}&submit_login=1`,\n\t method: 'POST'\n\t};\n\tif(Get('urls')[0] == 1) {\n\t\tLog('请先获取URL');\n\t\t} else if(Get('urls')[0]) {\n\t\tLog(\"\\n⏳正在登录中,请等一会,很快就好...\");\n\t\tvar request =JSON.parse(java.log(java.ajax(Get('urls')[0] +`\/login,${JSON.stringify(options)}`)))\n\t\tif(request.status == '1') {\n\t\t\tLog('✅ 登录成功')\n\t\t} else {\n\t\t\tLog('❎ 登录失败')\n\t\t\t}\n\t} else {\n\t\tLog('❌ 未获取到有效URL,请切换url');\n\t\t}\n\t}\n\nfunction tag(e) {\n if (e == undefined) {\n e = 0;\n }\n const currentLabel = sortCriteria[e].label;\n\n if (typeof tagValue === 'undefined') {\n tagValue = result?.tag || '';\n }\n $$$ = $$$ || {};\n if (e == $$$.tag) {\n return Log('【标签切换提示】\\n已经选择此标签,无需更换');\n }\n Log('【标签切换提示】\\n已经切换到[' + currentLabel + ']');\n $$$.tag = e;\n return put($$$);\n}\n\n\nfunction url() {\n\tLog(\"启动\")\n const baseUrl = java.connect(Get('url')).url();\n $$$.url = baseUrl;\n Log('开始获取链接');\n const html = java.ajax(baseUrl);\n let allUrls = [];\n ['china', 'first_line', 'second_line'].forEach(key => {\n const reg = new RegExp(`${key}\\\"><span>(.*?)<\\\\\/span`);\n const match = html.match(reg);\n if (match && match[1]) {\n allUrls.push(match[1].replace(\/\\s+\/g, \"\"));\n }\n});java.log(JSON.stringify(allUrls));\n const uniqueUrls = [];\n allUrls.forEach(url => !uniqueUrls.includes(url) && url && uniqueUrls.push(url));\n $$$.urls = uniqueUrls.length > 0 ? uniqueUrls : [];\n java.log(JSON.stringify($$$.urls));\n return put($$$);\n}\n\nfunction qh() {\n const urlCount = $$$.urls.length;\n if (urlCount === 0) {\n Log('【提示】\\n暂无站点,无法切换');\n return $$$;\n }\n if (urlCount === 1) {\n Log('【提示】\\n仅一个站点,无需切换\\n(当前站点:' + $$$.urls[0] + ')');\n return $$$;\n }\n const currentFirst = $$$.urls[0];\n $$$.urls.shift();\n $$$.urls.push(currentFirst);\n Log('【站点切换成功】\\n当前站点:\\n' +$$$.urls[0] + '(剩余备选:' + ($$$.urls.length - 1) + '个)');\n return put($$$);\n}\n\n\nfunction qh1() {\n $$$.shunt = ($$$.shunt + 1) % 4;\n Log(\"分流\" + nums[$$$.shunt]);\n return put($$$);\n}\n\nfunction qh2() {\n $$$.tag1 = ($$$.tag1 + 1) % 6;\n Log('【分类切换提示】\\n已经切换到[' + Category[$$$.tag1][0] + ']');\n return put($$$);\n}\n\nfunction Log(e) {\n if (e == undefined) {\n return;\n }\n java.longToast(e);\n}",
"respondTime": 180000,
"ruleBookInfo": {
"author": "@js:\nif (baseUrl.match(\/novel\/)){\n\t\/\/小说\ntext=java.getString('.p-t-5 li a@text');\n}else {\n\t\/\/漫画\ntext=java.getString('a.web-author-tag:nth-of-type(1)@text');\n}\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:\nif (baseUrl.match(\/novel\/)){\n\t\/\/小说\ntext=java.getString('span[data-type=tags]@a@text');\n}else {\n\t\/\/漫画\ntext=java.getString('#intro-block@[data-type=tags]@a@text');\n}\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 case \"clickCustomButton\":\n const bookId = book.getVariable(\"jmBookId\");\n if (!bookId) {\n java.longToast(\"暂无关联书籍\");\n break;\n }\n const body = \"video_id=\" + bookId + \"&page=1&series=1&with_ad_wcm=1\";\n const request = java.post(Get('urls')[0] + '\/ajax\/album_pagination', body, {}).body();\n let code = JSON.parse(request).code || \"\";\n const cctv = Get('urls')[0];\n const hasMore = code.indexOf('查看更多') !== -1;\n if (hasMore) {\n const body1 = \"video_id=\" + bookId + \"&page=2&series=1&with_ad_wcm=1\";\n const nextRequest = java.post(cctv + '\/ajax\/album_pagination', body1, {}).body();\n const nextCode = JSON.parse(nextRequest).code || \"\";\n if (!nextCode) break;\n code += nextCode;\n code = code.replace(\/查看更多\/g, '');\n }\n let fixedCode = code.replace(\/<img src=\"\/g, `<img src=\"${cctv}`);\n const 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 java.startBrowser(\"\", \"\", html);\n break;\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 result;\n} else {\n var Magua = new JavaImporter();\n Magua.importPackage(Packages.java.io, Packages.android.graphics);\n with(Magua) {\n let mac = src.match(\/photos\\\/(\\d+)?\\\/(\\d+)?\/);\n let bookId = mac[1];\n let imgId = mac[2];\n if (src.search(\"gif\") != -1 || Number(bookId) < 220980) {\n result;\n } else {\n if (Number(bookId) > 421925) {\n let md5 = java.md5Encode((bookId + imgId));\n let ascii = md5.substr( - 1).charCodeAt(0);\n var num = (ascii % 8 + 1) * 2;\n } else if (Number(bookId) >= 268850) {\n let md5 = java.md5Encode((bookId + imgId));\n let ascii = md5.substr( - 1).charCodeAt(0);\n var num = (ascii % 10 + 1) * 2;\n } else {\n var num = 10;\n }\n var img = BitmapFactory.decodeByteArray(result, 0, result.length);\n var height = img.getHeight();\n var width = img.getWidth();\n var y = Math.floor(height \/ num);\n var remainder = height % num;\n var newImg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);\n let canvas = new Canvas(newImg);\n for (let i = 1; i <= num; i++) {\n let h = i === num ? remainder: 0;\n canvas.drawBitmap(Bitmap.createBitmap(img, 0, y * (i - 1), width, y + h), 0, height - y * i - h, null);\n }\n var newbit = new ByteArrayOutputStream();\n newImg.compress(Bitmap.CompressFormat.PNG, 100, newbit);\n newbit.toByteArray();\n }\n }\n}",
"imageStyle": "FULL"
},
"ruleExplore": {},
"ruleSearch": {
"author": "@js:\nif (baseUrl.match(\/novel\/)){\n\t\/\/小说\ntext=java.getString('.title-truncate.2@text');\n}else {\n\t\/\/漫画\ntext=java.getString('.title-truncate.1@text');\n}\ntext;",
"bookList": "@js:\nvar list\nif(baseUrl.match(\/favorite\/)){\nlist=java.getElements('div.col-xs-3');\n} else if(!baseUrl.match(\/album\\\/\\d+\/)) {\nlist=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:\nif (baseUrl.match(\/novel\/)){\n\t\/\/小说\ntext=java.getString('.title-truncate.1@text');\n}else {\n\t\/\/漫画\ntext=java.getString('');\n}\ntext;",
"name": "@js:\nif (baseUrl.match(\/novel_watchlist\/)){\ntext=java.getString('.title-truncate@text');\n} else if (baseUrl.match(\/favorite\/)){\ntext=java.getString('.image-item-text@text');\n}else {\ntext=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}\n\nresult\n<\/js>",
"chapterName": "text",
"chapterUrl": "href\n@js:\nresult += \"\/?shunt=\" + nums[Get('shunt')]",
"preUpdateJs": "java.refreshTocUrl()",
"updateTime": "span@text"
},
"searchUrl": "{{Get('urls')[0]}}\/search\/photos?search_query={{key}}&search-type=photos&main_tag=0&page={{page}}",
"weight": 0
}