🎨禁漫天堂[国内]

https://jmcomicgo.me

jiajunjin (10775)6天前

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

③ 部分内容需要登录才会显示
  
④ 登录页面点击分流按钮切换站内分流,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&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:\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
}
广告