[
  {
    "articleStyle": 1,
    "customOrder": 4,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"\n}",
    "jsLib": "function bDe(data){\n\tconst {java} = this;\n\treturn java.base64Decode(data.match(/base64,(.*?),/)[1])\n\t}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUrl": "◎分类1◎\n【序号或链接】《列表名称》@图片链接@『简介』\n------------------\n◎分类2◎\n【序号或链接】《列表名称》@图片链接@『简介』\n❗️0、2、开始❗️\n\n❗️0、2、结束❗️",
    "ruleArticles": "<js>\njson=[];\nlistStr = bDe(baseUrl);\nlist=listStr.split('\\n');\nfor(i = 0;i<list.length;i++){\n\tlet index =/【(.*?)】/.test(list[i])?list[i].match(/【(.*?)】/)[1]:\"\";\n\tlet src = /@(.*?)@/.test(list[i])?list[i].match(/@(.*?)@/)[1]:\"\";\n\tlet text = /《(.*?)》/.test(list[i])?list[i].match(/《(.*?)》/)[1]:\"\";\n\tlet intro = /『(.*?)』/.test(list[i])?list[i].match(/『(.*?)』/)[1]:\"\";\tjson.push({index:index,src:src,text:text,intro:intro})\n\t}\nJSON.stringify(json)</js>\n$.[*]",
    "ruleDescription": "❗️0、2、开始❗️\n{{java.importScript(\"/../订阅源/调试预览.txt\")}}\n❗️0、2、结束❗️\n\n\n❗️0、3、开始❗️\n{{java.importScript(\"/../订阅源/一键导入.txt\")}}\n❗️0、3、结束❗️\n\n//发现规则\n❗️0、1、开始❗️\n {{java.importScript(\"/../订阅源/发现规则.txt\")}}\n❗️0、1、结束❗️\n\n❗️0、6、开始❗️\n{{java.importScript(\"/../订阅源/调试助手中文.html\")}}\n❗️0、6、结束❗️\n\n//调试助手\n❗️0、5、开始❗️\n{{java.importScript(\"/../订阅源/调试助手.html\")}}\n❗️0、5、结束❗️\n\n\n——————分割线————————\n<js>\nindex='{{$.index}}';\nif(index.match(/\\d+、\\d+、/)){\nreg=eval('/❗️'+index+'开始❗️[\\\\s\\\\S]+?❗️'+index+'结束❗️/g');\nreg2=eval('/❗️'+index+'..❗️/g');\nresult=result.match(reg)?result.match(reg)[0]:'<br/>'\nresult.replace(reg2,'')}else{result=''}\n</js>",
    "ruleImage": "$.src",
    "ruleLink": "$.index",
    "rulePubDate": "$.intro",
    "ruleTitle": "$.text",
    "singleUrl": false,
    "sortUrl": "@js:\nvar input = String(source.sourceComment);\nvar lines = input.split('\\n');\nvar result = [];\nvar groupName = '';\nvar content = '';\n\nfor (var i = 0; i < lines.length; i++) {\n    var line = lines[i].trim();\n    if (line === '') continue;\n\n    // 如果以 ◎ 开头，则是分组名\n    if (line.startsWith('◎')) {\n        // 如果当前分组名和内容已存在，保存上一个分组\n        if (groupName && content) {\n            var encodedContent = java.base64Encode(content); // 使用 java.base64Encode\n            result.push(`${groupName}::data:;base64,${encodedContent},{\"type\":\"\"}`);\n        }\n        groupName = line.slice(1, -1).trim(); // 去掉 ◎，设置新的分组名\n        content = ''; // 重置内容\n    } else if (line.startsWith('【')) {\n        // 如果以 【 开头，则是内容的一部分\n        content += line + '\\n';\n    }\n}\n\n// 保存最后一个分组\nif (groupName && content) {\n    var encodedContent = java.base64Encode(content); // 使用 java.base64Encode\n    result.push(`${groupName}::data:;base64,${encodedContent},{\"type\":\"\"}`);\n}\n\nresult.join(\"\\n\")",
    "sourceComment": "◎我的常用◎\n【0、3、】《📝 | 一键导入》@https://z.dwz.mk/RniuYr@『洛娅橙一键导入』\n【0、2、】《📝 | 预览调试》『html网页预览调试』\n\n【0、1、】《📝 | 发现规则》『发现一键生成 | 正则替换』\n【https://legado.miaogongzi.net/legado/dy.html】《📝 | 喵公子》『阅读相关』\n【0、5、】《📝 | 调试助手》\n【0、6、】《📝 | 调试助手中文》\n【0、0、】《📝 | 搜视pro》\n【https://www.yikm.net】《🎮 | 在线游戏》\n【https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIzMTc0NzE1MQ==&action=getalbum&album_id=1429936613618188289&scene=126#wechat_redirect】《📖 | 阅读教程》『阅读公众号』\n【https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIzMTc0NzE1MQ==&action=getalbum&album_id=1337256947799916544&scene=126#wechat_redirect】《📖 | 阅读资源》\n【http://www.yckceo.com】《常用 | 源 仓 库》\n【https://www.jianguoyun.com】《必备 | 云 备 份》『坚果云』\n【http://mail.qq.com】《登录 | QQ邮箱》\n【http://gitee.com】《登录 | G i t e e》\n◎在线工具◎\n【http://www.jsons.cn/reg/】《🛠️ | 正则替换》\n【https://netcut.cn】《🛠️ | 网络剪切板》\n【https://www.dejs.vip/2obfuscator】《🛠️ | DesJs》『Js反混淆 | Js格式化』\n【https://www.51shizhi.com/tool/js-anti-obfuscate-io】《🛠️ | obfuscator.io反混淆》『Js反混淆 | Js格式化』\n【https://tool.lu/】《🛠️ | 工具箱》\n【https://ol.woobx.cn】《🛠️ | 一个木函》\n【https://uutool.cn】《🛠️ | UU在线》\n【http://24mail.chacuo.net】《📱 | 临时邮箱》\n【https://rootsh.com/】《📱 | 十分钟邮箱》\n【https://ykjtb.com/c】《🛠️ | 一块剪切板》\n【https://note.ms】《🛠️ | note剪切板》\n◎教程资料◎\n【https://celetor.github.io/teachme】《📖 | 阅读3.0书源规则》『官方书源规则』\n【https://www.w3school.com.cn】《📕 | W3school》『web相关学习 | html、css、js』\n【https://jsoup.org/apidocs/org/jsoup/select/Selector.html】《📕 | Jsoup Selector》『类似CSS选择器 | 阅读可以用的语法@css:开头』\n【https://www.cnblogs.com/wynjauu/articles/9556396.html】《📕 | JsonPath教程》『阅读可以用的语法 @json:或 $.开头』\n【https://www.runoob.com/xpath/xpath-syntax.html】《📕 | XPath相关》『阅读可以用的语法 @XPath:或 //开头』\n【https://www.bilibili.com/video/BV1z56iY6EB8?p=4】《📕 | Js基础语法参考视频》『P4-P27为Js语法，也就是2-01至6-04』\n【https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types】《📕 | JavaScript指南》『Js语法』",
    "sourceGroup": "工具",
    "sourceIcon": "/storage/emulated/0/YueDu3.0/Hr.png",
    "sourceName": " 🔧\n网站整合",
    "sourceUrl": "网站整合2"
  },
  {
    "articleStyle": 0,
    "customOrder": 20,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n  \"User-Agent\": \"Mobile\"\n}",
    "injectJs": "// 去广告，代码来自ChatGPT\n// 查找并移除 div.wrap 元素和具有 ad-wrap 类名的元素\nvar wrapElements = document.querySelectorAll('div.wrap');\nvar adWrapElements = document.getElementsByClassName('ad-wrap');\n\nfor (var i = 0; i < wrapElements.length; i++) {\n  var wrapElement = wrapElements[i];\n  wrapElement.parentNode.removeChild(wrapElement);\n}\n\nwhile (adWrapElements.length > 0) {\n  var adWrapElement = adWrapElements[0];\n  adWrapElement.parentNode.removeChild(adWrapElement);\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.data.cards&&$.data.cards[*].card_group[*]",
    "ruleContent": "@js:\nlet id = baseUrl.match(/(\\d+)/)[1];\nlet api = `https://m.weibo.cn/statuses/extend?id=${id}`;\njava.setContent(String(java.ajax(api)));\nlet b = baseUrl;\nvar html = result;\nretweeted_status = String(java.getString(\"$.data.retweeted_status\")) ? \"<hr class='divider'>\" + java.getString(\"$.data.retweeted_status.longTextContent\") : \"\";\nresult = java.getString(\"$.data.longTextContent\")+ retweeted_status;\nallImages = [];\nif(html.indexOf('\"media_info\"') > -1) {\n    urls = JSON.parse(html.match(/\"urls\": ({[\\s\\S]+?})/)[1]);\n    media_info = JSON.parse(html.match(/\"media_info\": ({[\\s\\S]+?})/)[1]);\n\n    if(urls.mp4_720p_mp4) { a = urls.mp4_720p_mp4; }\n    else if(urls.mp4_hd_mp4) { a = urls.mp4_hd_mp4; }\n    else if(media_info.stream_url_hd) { a = media_info.stream_url_hd; }\n    else { a = media_info.stream_url; }\n\n    result = result.replace(/data-url=\"([^\"]+)\"\\s*href=\"([^\"]+)\"/, `data-url=\"$1\" href=\"${a}\"`);\n    dimg = html.match(/\"page_pic\":[\\s\\S]+?\"url\":\\s*\"([^\"]+)\"/)[1];\n\n    result += `<div class=\"media-container\"><video src=\"${a}\" controls poster=\"${dimg}\"></video></div>`;\n} else if(html.match(/\"size\":\\s*\"large\",\\s*\"url\":\\s*\"[^\"]+\"/g)) {\n    a = html.match(/\"size\":\\s*\"[^\"]+\",\\s*\"url\":\\s*\"[^\"]+\"/g);\n    var cimg = [];\n    for (i = 0; i < a.length; i++) {\n        cimg.push(a[i].match(/url\":\\s*\"([^\"]+)\"/)[1]);\n    };\n    allImages = cimg.slice();\n    \n    var galleryItems = cimg.map((img, i) => `\n        <div class=\"gallery-item\" onclick=\"showFullImage('${img.replace(/'/g, \"\\\\'\")}', ${i})\">\n            <img src=\"${img}?thumbnail=1\" loading=\"lazy\">\n            <div class=\"zoom-icon\">🔍</div>\n        </div>`).join('');\n    \n    result += `<div class=\"image-gallery\">${galleryItems}</div>`;\n}\n\n// 处理评论\nif(JSON.parse(java.ajax(`https://m.weibo.cn/comments/hotflow?id=${id}&mid=${id}&max_id_type=0`)).ok == 1) {\n    list = JSON.parse(java.ajax(`https://m.weibo.cn/comments/hotflow?id=${id}&mid=${id}&max_id_type=0`)).data.data;\n    result = `<a href=\"${b}\" class=\"original-link\">原文地址</a><div class=\"main-content\">${result}</div>`;\n    \n    var comments = list.map(item => {\n        var details = \"\";\n        if(item.pic != undefined) {\n            pic = item.pic.large.url;\n            allImages.push(pic);\n            const imgIndex = allImages.length - 1;\n            // 处理评论中的图片部分\ndetails = `\n<details class=\"comment-media\">\n    <summary>\n        <span class=\"media-preview\">📷 查看图片</span>\n    </summary>\n    <div onclick=\"showFullImage('${pic.replace(/'/g, \"\\\\'\")}', ${imgIndex})\">\n        <img src=\"${pic}?thumbnail=1\" alt=\"评论图片\">\n    </div>\n</details>`;\n\n        }\n        \n        return `\n        <div class=\"comment-item\">\n            <div class=\"comment-user\">\n                <img class=\"user-avatar\" src=\"${item.user.profile_image_url}\">\n                <span class=\"user-name\">${item.user.screen_name}</span>\n            </div>\n            <div class=\"comment-text\">${item.text}</div>\n            ${details}\n            <div class=\"comment-time\">${item.created_at.replace(/\\+0800/, \"·\")}</div>\n        </div>`;\n    }).join('');\n    \n    result += `<div class=\"comments-section\"><h3 class=\"comments-title\">评  论</h3>${comments}</div>`;\n} else {\n    result = `<a href=\"${b}\" class=\"original-link\">原文地址</a><div class=\"main-content\">${result}</div>`;\n}\n\nresult = `<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>微博详情</title>\n    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/viewerjs@1.10.5/dist/viewer.min.css\">\n    <style>\n        \n       * { margin: 0; padding: 0; box-sizing: border-box; }\n        body { \n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; \n            line-height: 1.6; color: #333; background-color: #f5f5f5; \n            padding: 15px; max-width: 750px; margin: 0 auto; \n        }\n        .original-link { \n            display: block; padding: 12px; background: #fff; border-radius: 8px; \n            margin-bottom: 10px; text-decoration: none; color: #1E88E5; \n            font-weight: 500; box-shadow: 0 1px 3px rgba(0,0,0,0.05); \n        }\n        .main-content { \n            background: #fff; padding: 15px; border-radius: 8px; \n            margin-bottom: 15px; box-shadow: 0 1px 3px rgba(0,0,0,0.05); \n        }\n        .divider { border: none; height: 1px; background-color: #eee; margin: 15px 0; }\n        .media-container { margin: 15px 0; border-radius: 8px; overflow: hidden; }\n        .media-container video { width: 100%; border-radius: 8px; }\n        .image-gallery { \n            display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px; margin: 15px 0; \n            max-width:100%\n        }\n        .gallery-item { \n            aspect-ratio: 1; overflow: hidden; border-radius: 8px; \n            position: relative; cursor: pointer; \n        }\n        .gallery-item img { \n            width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s; \n        }\n        .gallery-item:hover img { transform: scale(1.05); }\n        .zoom-icon { \n            position: absolute; top: 5px; right: 5px; background: rgba(0,0,0,0.5); \n            color: white; width: 20px; height: 20px; border-radius: 50%; \n            display: flex; align-items: center; justify-content: center; \n            font-size: 12px; opacity: 0; transition: opacity 0.3s; \n        }\n \n\n        .gallery-item:hover .zoom-icon { opacity: 1; }\n        .comments-section { \n            background: #fff; padding: 15px; border-radius: 8px; \n            box-shadow: 0 1px 3px rgba(0,0,0,0.05); \n        }\n        .comments-title { \n            font-size: 18px; margin-bottom: 15px; color: #333; \n            padding-bottom: 10px; border-bottom: 1px solid #eee; \n        }\n        .comment-item { padding: 12px 0; border-bottom: 1px solid #f0f0f0; }\n        .comment-item:last-child { border-bottom: none; }\n        .comment-user { display: flex; align-items: center; margin-bottom: 8px; }\n        .user-avatar { \n            width: 32px; height: 32px; border-radius: 50%; \n            margin-right: 10px; object-fit: cover; \n        }\n        .user-name { font-weight: 500; font-size: 15px; }\n        .comment-text { \n            margin-bottom: 8px; font-size: 15px; line-height: 1.5; word-break: break-word; \n        }\n        .comment-time { font-size: 12px; color: #999; margin-top: 5px; }\n        .comment-media { \n            margin: 8px 0; position: relative; cursor: pointer; \n            border-radius: 6px; overflow: hidden;\n            max-width:100%\n        }\n        .comment-media details {\n            margin: 8px 0;\n            border-radius: 6px;\n            overflow: hidden;\n        }\n        .comment-media summary {\n            padding: 6px 12px;\n            background: #f5f5f5;\n            border-radius: 4px;\n            cursor: pointer;\n            list-style: none;\n            font-size: 14px;\n            color: #1E88E5;\n            transition: background 0.2s;\n        }\n        .comment-media summary:hover {\n            background: #e8f0fe;\n        }\n        .comment-media summary::-webkit-details-marker {\n            display: none;\n        }\n        .comment-media div {\n            margin-top: 8px;\n            position: relative;\n            cursor: pointer;\n        }\n        .comment-media img {\n            max-width: 100%;\n            border-radius: 4px;\n            display: block;\n        }\n       \n\n        .media-preview::before {\n            content: \"⬇️ \";\n        }\n        .comment-media[open] summary .media-preview::before {\n            content: \"⬆️ \";\n        }\n        .url-icon img { vertical-align: middle; margin: 0 1px; }\n        .surl-text { color: #1E88E5; margin-right: 5px; }\n        @media (max-width: 500px) {\n            .image-gallery { grid-template-columns: repeat(2, 1fr); }\n            body { padding: 10px; }\n            .main-content, .comments-section { padding: 12px; }\n        }     \n         \n        .viewer-open {\n            overflow: hidden;\n            position: fixed;\n            width: 100%;\n        }\n    </style>\n</head>\n<body>\n    ${result}\n    <script src=\"https://cdn.jsdelivr.net/npm/viewerjs@1.10.5/dist/viewer.min.js\"></script>\n    <script>\n        function initImageViewer() {\n        \tvar option = {\n        \t          \tmaxZoomRatio: 0.9,\n                    inline: false,\n                    movable: true,\n                    zoomable: true,\n                    toolbar: {\n                        zoomIn: 1,\n                        zoomOut: 1,\n                        oneToOne: 0,\n                        reset: 1,\n                        prev: 1,\n                        next: 1,\n                        rotateLeft: 0,\n                        rotateRight: 0,\n                        flipHorizontal: 0,\n                        flipVertical: 0\n                    }\n             \n        \n                     \n                };                          \n            try {                       \n               b = new Viewer(document.querySelector('.image-gallery'),option);           document.querySelectorAll('.comment-media').forEach(x=>{new Viewer(x,option)})                         \n            } catch (e) {                       \n             //   alert(e)\n                }\n            \n        }\n        \n        // 页面加载初始化\n        if (document.readyState === 'complete') {\n            initImageViewer();\n        } else {\n            document.addEventListener('DOMContentLoaded', initImageViewer);\n        }\n    </script>\n</body>\n</html>`;\n\nresult;\n",
    "ruleImage": "{{$.mblog.page_info.page_pic.url||$.mblog.thumbnail_pic||$.mblog.user.profile_image_url||$.user.profile_image_url}},{\"headers\":{\"referer\":\"https://m.weibo.cn\"}}",
    "ruleLink": "$.mblog.id@js:\"https://m.weibo.cn/detail/\"+result",
    "ruleNextPage": "page",
    "rulePubDate": "$.mblog.created_at\n<js>date=new Date(result);\ntime=date.getTime();\nfunction formatDate2(inputTime) {\n    var date = new Date(inputTime);\n    var y = date.getFullYear();\n    var m = date.getMonth() + 1;\n    m = m < 10 ? ('0' + m) : m;\n    var d = date.getDate();\n    d = d < 10 ? ('0' + d) : d;\n    return y +'-' + m + '-' + d;\n};\n\nfunction formatDate(now) {\n    var time = formatDate2(now)\n    var date1 = new Date(now)\n    var date2 = new Date()\n    var date3 = date2.getTime() - date1.getTime()\n    var days = Math.floor(date3 / (24 * 3600 * 1000))\n    var leave1 = date3 % (24 * 3600 * 1000) \n    var hours = Math.floor(leave1 / (3600 * 1000))\n    var leave2 = leave1 % (3600 * 1000)\n    var minutes = Math.floor(leave2 / (60 * 1000))\n    var leave3 = leave2 % (60 * 1000)\n    if (days < 1 && hours < 1) { return minutes + \"分前\" } else if (days < 1) { return hours + \"小时 \" + minutes + \"分前\" } else {\n        if (days < 7) {\n            return days + \"天 \" + hours + \"小时前 \"\n        } else { return time }\n    }\n}\n\n'📅 '+formatDate(time)</js>",
    "ruleTitle": "$.mblog.text##<.*?>",
    "singleUrl": false,
    "sortUrl": "百合小说::https://m.weibo.cn/api/container/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23百合小说%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D百合小说&page_type=searchall&page={{page}}\n\n百合动漫::https://m.weibo.cn/api/container/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23百合动漫%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D百合动漫&page_type=searchall&page={{page}}\n\n百合推文::https://m.weibo.cn/api/container/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23百合推文%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D百合推文&page_type=searchall&page={{page}}\n\ngl推文::https://m.weibo.cn/api/container/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23gl推文%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3Dgl推文&page_type=searchall&page={{page}}\n\ngl小说::https://m.weibo.cn/api/container/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23gl小说%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3Dgl小说&page_type=searchall&page={{page}}\n搜索话题::https://m.weibo.cn/api/container/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23{{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的话题名称</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D{{source.getVariable()}}&page_type=searchall&page={{page}}\n",
    "sourceComment": "在【搜索话题】点击右上角三点刷新分类或下拉刷新，会弹出输入框\n\n\n按以下格式在【分类URL】添加可加入分类\n\n话题名称::https://m.weibo.cn/api/container/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23话题名称%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D话题名称&page_type=searchall&page={{page}}",
    "sourceGroup": "阅读",
    "sourceIcon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/52/6a/04/526a04f7-ccfd-612e-64cb-ece08b01b4e6/WeiboAppIcon-0-0-1x_U007epad-0-1-0-0-85-220.png/492x0w.webp",
    "sourceName": " 📖\n微博话题",
    "sourceUrl": "微博话题"
  },
  {
    "articleStyle": 1,
    "customOrder": 21,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n  \"User-Agent\": \"Mobile\"\n}",
    "injectJs": "// 去广告，代码来自ChatGPT\n// 查找并移除 div.wrap 元素和具有 ad-wrap 类名的元素\nvar wrapElements = document.querySelectorAll('div.wrap');\nvar adWrapElements = document.getElementsByClassName('ad-wrap');\n\nfor (var i = 0; i < wrapElements.length; i++) {\n  var wrapElement = wrapElements[i];\n  wrapElement.parentNode.removeChild(wrapElement);\n}\n\nwhile (adWrapElements.length > 0) {\n  var adWrapElement = adWrapElements[0];\n  adWrapElement.parentNode.removeChild(adWrapElement);\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.data.cards[*].card_group[*]||$.data.cards",
    "ruleContent": "@js:\nlet id = baseUrl.match(/(\\d+)/)[1];\nlet api = `https://m.weibo.cn/statuses/extend?id=${id}`;\njava.setContent(String(java.ajax(api)));\nlet b = baseUrl;\nvar html = result;\nretweeted_status = String(java.getString(\"$.data.retweeted_status\")) ? \"<hr class='divider'>\" + java.getString(\"$.data.retweeted_status.longTextContent\") : \"\";\nresult = java.getString(\"$.data.longTextContent\")+ retweeted_status;\nallImages = [];\nif(html.indexOf('\"media_info\"') > -1) {\n    urls = JSON.parse(html.match(/\"urls\": ({[\\s\\S]+?})/)[1]);\n    media_info = JSON.parse(html.match(/\"media_info\": ({[\\s\\S]+?})/)[1]);\n\n    if(urls.mp4_720p_mp4) { a = urls.mp4_720p_mp4; }\n    else if(urls.mp4_hd_mp4) { a = urls.mp4_hd_mp4; }\n    else if(media_info.stream_url_hd) { a = media_info.stream_url_hd; }\n    else { a = media_info.stream_url; }\n\n    result = result.replace(/data-url=\"([^\"]+)\"\\s*href=\"([^\"]+)\"/, `data-url=\"$1\" href=\"${a}\"`);\n    dimg = html.match(/\"page_pic\":[\\s\\S]+?\"url\":\\s*\"([^\"]+)\"/)[1];\n\n    result += `<div class=\"media-container\"><video src=\"${a}\" controls poster=\"${dimg}\"></video></div>`;\n} else if(html.match(/\"size\":\\s*\"large\",\\s*\"url\":\\s*\"[^\"]+\"/g)) {\n    a = html.match(/\"size\":\\s*\"[^\"]+\",\\s*\"url\":\\s*\"[^\"]+\"/g);\n    var cimg = [];\n    for (i = 0; i < a.length; i++) {\n        cimg.push(a[i].match(/url\":\\s*\"([^\"]+)\"/)[1]);\n    };\n    allImages = cimg.slice();\n    \n    var galleryItems = cimg.map((img, i) => `\n        <div class=\"gallery-item\" onclick=\"showFullImage('${img.replace(/'/g, \"\\\\'\")}', ${i})\">\n            <img src=\"${img}?thumbnail=1\" loading=\"lazy\">\n            <div class=\"zoom-icon\">🔍</div>\n        </div>`).join('');\n    \n    result += `<div class=\"image-gallery\">${galleryItems}</div>`;\n}\n\n// 处理评论\nif(JSON.parse(java.ajax(`https://m.weibo.cn/comments/hotflow?id=${id}&mid=${id}&max_id_type=0`)).ok == 1) {\n    list = JSON.parse(java.ajax(`https://m.weibo.cn/comments/hotflow?id=${id}&mid=${id}&max_id_type=0`)).data.data;\n    result = `<a href=\"${b}\" class=\"original-link\">原文地址</a><div class=\"main-content\">${result}</div>`;\n    \n    var comments = list.map(item => {\n        var details = \"\";\n        if(item.pic != undefined) {\n            pic = item.pic.large.url;\n            allImages.push(pic);\n            const imgIndex = allImages.length - 1;\n            // 处理评论中的图片部分\ndetails = `\n<details class=\"comment-media\">\n    <summary>\n        <span class=\"media-preview\">📷 查看图片</span>\n    </summary>\n    <div onclick=\"showFullImage('${pic.replace(/'/g, \"\\\\'\")}', ${imgIndex})\">\n        <img src=\"${pic}?thumbnail=1\" alt=\"评论图片\">\n    </div>\n</details>`;\n\n        }\n        \n        return `\n        <div class=\"comment-item\">\n            <div class=\"comment-user\">\n                <img class=\"user-avatar\" src=\"${item.user.profile_image_url}\">\n                <span class=\"user-name\">${item.user.screen_name}</span>\n            </div>\n            <div class=\"comment-text\">${item.text}</div>\n            ${details}\n            <div class=\"comment-time\">${item.created_at.replace(/\\+0800/, \"·\")}</div>\n        </div>`;\n    }).join('');\n    \n    result += `<div class=\"comments-section\"><h3 class=\"comments-title\">评  论</h3>${comments}</div>`;\n} else {\n    result = `<a href=\"${b}\" class=\"original-link\">原文地址</a><div class=\"main-content\">${result}</div>`;\n}\n\nresult = `<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>微博详情</title>\n    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/viewerjs@1.10.5/dist/viewer.min.css\">\n    <style>\n        \n       * { margin: 0; padding: 0; box-sizing: border-box; }\n        body { \n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; \n            line-height: 1.6; color: #333; background-color: #f5f5f5; \n            padding: 15px; max-width: 750px; margin: 0 auto; \n        }\n        .original-link { \n            display: block; padding: 12px; background: #fff; border-radius: 8px; \n            margin-bottom: 10px; text-decoration: none; color: #1E88E5; \n            font-weight: 500; box-shadow: 0 1px 3px rgba(0,0,0,0.05); \n        }\n        .main-content { \n            background: #fff; padding: 15px; border-radius: 8px; \n            margin-bottom: 15px; box-shadow: 0 1px 3px rgba(0,0,0,0.05); \n        }\n        .divider { border: none; height: 1px; background-color: #eee; margin: 15px 0; }\n        .media-container { margin: 15px 0; border-radius: 8px; overflow: hidden; }\n        .media-container video { width: 100%; border-radius: 8px; }\n        .image-gallery { \n            display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px; margin: 15px 0; \n            max-width:100%\n        }\n        .gallery-item { \n            aspect-ratio: 1; overflow: hidden; border-radius: 8px; \n            position: relative; cursor: pointer; \n        }\n        .gallery-item img { \n            width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s; \n        }\n        .gallery-item:hover img { transform: scale(1.05); }\n        .zoom-icon { \n            position: absolute; top: 5px; right: 5px; background: rgba(0,0,0,0.5); \n            color: white; width: 20px; height: 20px; border-radius: 50%; \n            display: flex; align-items: center; justify-content: center; \n            font-size: 12px; opacity: 0; transition: opacity 0.3s; \n        }\n \n\n        .gallery-item:hover .zoom-icon { opacity: 1; }\n        .comments-section { \n            background: #fff; padding: 15px; border-radius: 8px; \n            box-shadow: 0 1px 3px rgba(0,0,0,0.05); \n        }\n        .comments-title { \n            font-size: 18px; margin-bottom: 15px; color: #333; \n            padding-bottom: 10px; border-bottom: 1px solid #eee; \n        }\n        .comment-item { padding: 12px 0; border-bottom: 1px solid #f0f0f0; }\n        .comment-item:last-child { border-bottom: none; }\n        .comment-user { display: flex; align-items: center; margin-bottom: 8px; }\n        .user-avatar { \n            width: 32px; height: 32px; border-radius: 50%; \n            margin-right: 10px; object-fit: cover; \n        }\n        .user-name { font-weight: 500; font-size: 15px; }\n        .comment-text { \n            margin-bottom: 8px; font-size: 15px; line-height: 1.5; word-break: break-word; \n        }\n        .comment-time { font-size: 12px; color: #999; margin-top: 5px; }\n        .comment-media { \n            margin: 8px 0; position: relative; cursor: pointer; \n            border-radius: 6px; overflow: hidden;\n            max-width:100%\n        }\n        .comment-media details {\n            margin: 8px 0;\n            border-radius: 6px;\n            overflow: hidden;\n        }\n        .comment-media summary {\n            padding: 6px 12px;\n            background: #f5f5f5;\n            border-radius: 4px;\n            cursor: pointer;\n            list-style: none;\n            font-size: 14px;\n            color: #1E88E5;\n            transition: background 0.2s;\n        }\n        .comment-media summary:hover {\n            background: #e8f0fe;\n        }\n        .comment-media summary::-webkit-details-marker {\n            display: none;\n        }\n        .comment-media div {\n            margin-top: 8px;\n            position: relative;\n            cursor: pointer;\n        }\n        .comment-media img {\n            max-width: 100%;\n            border-radius: 4px;\n            display: block;\n        }\n       \n\n        .media-preview::before {\n            content: \"⬇️ \";\n        }\n        .comment-media[open] summary .media-preview::before {\n            content: \"⬆️ \";\n        }\n        .url-icon img { vertical-align: middle; margin: 0 1px; }\n        .surl-text { color: #1E88E5; margin-right: 5px; }\n        @media (max-width: 500px) {\n            .image-gallery { grid-template-columns: repeat(2, 1fr); }\n            body { padding: 10px; }\n            .main-content, .comments-section { padding: 12px; }\n        }     \n         \n        .viewer-open {\n            overflow: hidden;\n            position: fixed;\n            width: 100%;\n        }\n    </style>\n</head>\n<body>\n    ${result}\n    <script src=\"https://cdn.jsdelivr.net/npm/viewerjs@1.10.5/dist/viewer.min.js\"></script>\n    <script>\n        function initImageViewer() {\n        \tvar option = {\n        \t          \tmaxZoomRatio: 0.9,\n                    inline: false,\n                    movable: true,\n                    zoomable: true,\n                    toolbar: {\n                        zoomIn: 1,\n                        zoomOut: 1,\n                        oneToOne: 0,\n                        reset: 1,\n                        prev: 1,\n                        next: 1,\n                        rotateLeft: 0,\n                        rotateRight: 0,\n                        flipHorizontal: 0,\n                        flipVertical: 0\n                    }\n             \n        \n                     \n                };                          \n            try {                       \n               b = new Viewer(document.querySelector('.image-gallery'),option);           document.querySelectorAll('.comment-media').forEach(x=>{new Viewer(x,option)})                         \n            } catch (e) {                       \n             //   alert(e)\n                }\n            \n        }\n        \n        // 页面加载初始化\n        if (document.readyState === 'complete') {\n            initImageViewer();\n        } else {\n            document.addEventListener('DOMContentLoaded', initImageViewer);\n        }\n    </script>\n</body>\n</html>`;\n\nresult;\n",
    "ruleDescription": "$.user.id\n@js:\nif (result) {\n  var userInfo = `\n    <div class=\"user-card\">\n      <img src=\"{{$.user.profile_image_url}}\" class=\"user-avatar\">\n      <div class=\"user-info\">\n        <h3 class=\"username\">{{$.user.screen_name}}</h3>\n        <p class=\"user-desc\">${java.getString(\"$.desc1&&$.desc2\")}</p>\n      </div>\n    </div>\n  `;\n  \n  var textContent = `\n    <div class=\"copy-section\">\n \n      <div class=\"copy-content\" id=\"copyContent\">{{$.user.screen_name}}::https://m.weibo.cn/api/container/getIndex?containerid=107603${result}_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=107603${result}_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={\\{page}}\n      </div>\n      <button class=\"copy-btn\" onclick=\"handleCopy()\">\n        <span class=\"copy-icon\">⎘</span>\n        <span class=\"copy-text\">一键复制够粘贴至分类URL</span>\n      </button>\n      <div class=\"copy-feedback\" id=\"copyFeedback\"></div>\n    </div>\n  `;\n  \n  var copyScript = `\n    <script>\n      function handleCopy() {\n        const content = document.getElementById('copyContent');\n        const feedback = document.getElementById('copyFeedback');\n        \n        // 创建范围并选择文本\n        const range = document.createRange();\n        range.selectNode(content);\n        window.getSelection().removeAllRanges();\n        window.getSelection().addRange(range);\n        \n        try {\n          // 执行复制命令\n          const successful = document.execCommand('copy');\n          if(successful) {\n            feedback.textContent = '复制成功！';\n            feedback.style.color = '#4CAF50';\n          } else {\n            feedback.textContent = '复制失败，请手动选择文本';\n            feedback.style.color = '#F44336';\n          }\n        } catch(err) {\n          feedback.textContent = '复制错误: ' + err;\n          feedback.style.color = '#F44336';\n        }\n        \n        // 清除选择\n        window.getSelection().removeAllRanges();\n        \n        // 3秒后隐藏反馈\n        setTimeout(() => {\n          feedback.textContent = '';\n        }, 3000);\n      }\n    </script>\n  `;\n  \n  var styles = `\n    <style>\n      .user-card {\n        display: flex;\n        align-items: center;\n        padding: 15px;\n        background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);\n        border-radius: 10px;\n        margin-bottom: 20px;\n        box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n      }\n      \n      .user-avatar {\n        width: 60px;\n        height: 60px;\n        border-radius: 50%;\n        object-fit: cover;\n        border: 3px solid white;\n        box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n      }\n      \n      .user-info {\n        margin-left: 15px;\n      }\n      \n      .username {\n        margin: 0;\n        color: #333;\n        font-size: 18px;\n        font-weight: 600;\n      }\n      \n      .user-desc {\n        margin: 5px 0 0;\n        color: #666;\n        font-size: 14px;\n      }\n      \n      .copy-section {\n        padding: 20px;\n        background: white;\n        border-radius: 10px;\n        box-shadow: 0 2px 10px rgba(0,0,0,0.05);\n        margin-bottom: 20px;\n      }\n      \n      .section-title {\n        margin: 0 0 15px;\n        color: #555;\n        font-size: 15px;\n      }\n      \n      .copy-content {\n        padding: 15px;\n        background: #f8f9fa;\n        border-radius: 8px;\n        border: 1px solid #eee;\n        font-family: 'Courier New', monospace;\n        font-size: 14px;\n        line-height: 1.5;\n        word-break: break-all;\n        white-space: pre-wrap;\n        margin-bottom: 15px;\n      }\n      \n      .copy-btn {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        padding: 10px 20px;\n        background: linear-gradient(135deg, #4b6cb7 0%, #182848 100%);\n        color: white;\n        border: none;\n        border-radius: 6px;\n        font-size: 15px;\n        cursor: pointer;\n        transition: all 0.3s;\n        width: 100%;\n      }\n      \n      .copy-btn:hover {\n        transform: translateY(-2px);\n        box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n      }\n      \n      .copy-icon {\n        font-size: 18px;\n        margin-right: 8px;\n      }\n      \n      .copy-feedback {\n        height: 20px;\n        margin-top: 10px;\n        text-align: center;\n        font-size: 14px;\n        transition: all 0.3s;\n      }\n      \n      @media (max-width: 600px) {\n        .user-card {\n          flex-direction: column;\n          text-align: center;\n        }\n        \n        .user-info {\n          margin-left: 0;\n          margin-top: 10px;\n        }\n        \n        .copy-content {\n          font-size: 13px;\n          padding: 12px;\n        }\n      }\n    </style>\n  `;\n  \n  result = styles + userInfo + textContent + copyScript;\n}\n",
    "ruleImage": "{{$.mblog.page_info.page_pic.url||$.mblog.thumbnail_pic||$.mblog.user.profile_image_url||$.user.profile_image_url}},{\"headers\":{\"referer\":\"https://m.weibo.cn\"}}",
    "ruleLink": "$.mblog.id||$.user.id@js:\"https://m.weibo.cn/detail/\"+result",
    "ruleNextPage": "page",
    "rulePubDate": "$.mblog.created_at||$.desc1\n@js:\nif(/\\+0800/.test(result)){\ndate=new Date(result);\ntime=date.getTime();\nfunction formatDate2(inputTime) {\n    var date = new Date(inputTime);\n    var y = date.getFullYear();\n    var m = date.getMonth() + 1;\n    m = m < 10 ? ('0' + m) : m;\n    var d = date.getDate();\n    d = d < 10 ? ('0' + d) : d;\n    return y +'-' + m + '-' + d;\n};\n\nfunction formatDate(now) {\n    var time = formatDate2(now)\n    var date1 = new Date(now)\n    var date2 = new Date()\n    var date3 = date2.getTime() - date1.getTime()\n    var days = Math.floor(date3 / (24 * 3600 * 1000))\n    var leave1 = date3 % (24 * 3600 * 1000) \n    var hours = Math.floor(leave1 / (3600 * 1000))\n    var leave2 = leave1 % (3600 * 1000)\n    var minutes = Math.floor(leave2 / (60 * 1000))\n    var leave3 = leave2 % (60 * 1000)\n    if (days < 1 && hours < 1) { return minutes + \"分前\" } else if (days < 1) { return hours + \"小时 \" + minutes + \"分前\" } else {\n        if (days < 7) {\n            return days + \"天 \" + hours + \"小时前 \"\n        } else { return time }\n    }\n}\n\n'📅 '+formatDate(time)}else{result=result}",
    "ruleTitle": "$.mblog.text||$.user.screen_name##<.*?>",
    "singleUrl": false,
    "sortUrl": "乎肥棠瘦::https://m.weibo.cn/api/container/getIndex?containerid=1076036992385346_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076036992385346_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}\n西凌萝卜::https://m.weibo.cn/api/container/getIndex?containerid=1076032141864060_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076035239650586_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}\n\n七小皇叔On-The-Way::https://m.weibo.cn/api/container/getIndex?containerid=1076037729250971_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076037729250971_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}\n\n\nIcaRus LeBlanc::https://m.weibo.cn/api/container/getIndex?containerid=1076035034515815_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076035034515815_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}\n\n佑淮::https://m.weibo.cn/api/container/getIndex?containerid=1076036269361340_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076036269361340_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}\n砂上雪::https://m.weibo.cn/api/container/getIndex?containerid=1076035239650586_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076035239650586_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}&&Whisky老鹿::https://m.weibo.cn/api/container/getIndex?containerid=1076036537563116_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076036537563116_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}&&郭斯特::https://m.weibo.cn/api/container/getIndex?containerid=1076031907542963_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076031907542963_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}&&你好好好菌::https://m.weibo.cn/api/container/getIndex?containerid=1076032673967277_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076032673967277_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}&&薛之谦::https://m.weibo.cn/api/container/getIndex?containerid=1076031239246050_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076031239246050_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}&&TED to China::https://m.weibo.cn/api/container/getIndex?containerid=1076031666109895_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076031666109895_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}\n\n一条废狗狗狗狗::https://m.weibo.cn/api/container/getIndex?containerid=1076036055804589_-_WEIBO_SECOND_PROFILE_WEIBO&luicode=10000011&lfid=1076036055804589_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={{page}}\n搜索用户::https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D3%26q={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的用户</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}%26t%3D&page_type=searchall&page={{page}}\n",
    "sourceComment": "在【搜索用户】点击右上角三点刷新分类或下拉刷新，会弹出输入框",
    "sourceGroup": "阅读",
    "sourceIcon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/52/6a/04/526a04f7-ccfd-612e-64cb-ece08b01b4e6/WeiboAppIcon-0-0-1x_U007epad-0-1-0-0-85-220.png/492x0w.webp",
    "sourceName": " 📖\n微博博主",
    "sourceUrl": "微博博主4"
  },
  {
    "articleStyle": 0,
    "customOrder": 23,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"\n}",
    "injectJs": "function $(a) {\n  return document.querySelector(a)\n}\nfunction $$(a) {\n  return document.querySelectorAll(a)\n}\n\nhref = window.location.href;\nif(href.search(/#/) == -1) {\n  author = $$(\".authorname\");\n  html = \"\";\n  node = $$(\".read\");\n\n  // 构建HTML头部\n  html = `\n    <!DOCTYPE html>\n    <html>\n    <head>\n      <meta charset=\"UTF-8\">\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n      <style>\n        body {\n          font-family: Arial, sans-serif;\n          line-height: 1.6;\n          max-width: 800px;\n          margin: 0 auto;\n          padding: 20px;\n          color: #333;\n          background: #fff;\n        }\n        img{\n        \twidth:100%\n        \t}\n         #msgsubject {\n      font-size: 20px;\n      font-weight: bold;\n      margin-bottom: 20px;\n      padding-bottom: 10px;\n      border-bottom: 1px solid #eee;\n    }\n        .author {\n          font-size: 14px;\n          color: #666;\n          margin: 15px 0 5px 0;\n          padding: 5px 0;\n        }\n        .author .no {\n          color: #ff6b6b;\n          font-weight: bold;\n          margin-right: 5px;\n        }\n        .read {\n          margin: 10px 0 25px 0;\n          padding: 15px;\n          background-color: #f9f9f9;\n          border-radius: 5px;\n          border-left: 3px solid #ff6b6b;\n        }\n        .replybodyinner {\n          white-space: pre-wrap;\n          word-wrap: break-word;\n          line-height: 1.5;\n        }\n        hr {\n          border: 0;\n          height: 1px;\n          background-color: #eee;\n          margin: 20px 0;\n        }\n       \n      </style>\n    </head>\n    <body>\n  `;\n\n  // 添加顶部分页器\n  page = $$(\"#pager_top\")[0] ? $$(\"#pager_top\")[0].outerHTML : \"\";\n  if(page) {\n    html += `${page}`;\n  }\nnickname = $$(\".nickname\")\n  // 添加主题标题（增加额外间距）\n  zhu = $(\"#msgsubject\") ? $(\"#msgsubject\").innerText : \"\";\n  html += `<div id=\"msgsubject\">${zhu}</div>`;\n\n  // 构建内容部分（增加首条内容额外间距）\n  for(i = 0; i < author.length; i++) {\n    a = author[i].innerText.replace(/加书签|举报/g, '').replace(/☆☆☆/g, '');\n    // 提取编号和作者信息\n    const noMatch = a.match(/№(\\d+)/);\n    const no = noMatch ? noMatch[0] : '';\n    const rest = a.match(/\\d+-\\d+-\\d+ \\d+:\\d+:\\d+/)?.[0]??\"\"\n    \n    // 第一条内容增加额外上边距\n    \n    html += `\n      <div class=\"author\">\n        <span class=\"no\">${no}</span>${nickname[i].innerText} | ${rest}\n      </div>\n      <div class=\"read\">${node[i].innerHTML}</div>\n      ${i < author.length - 1 ? '<hr>' : ''}\n    `;\n  }\n\n  // 添加底部分页器\n  if(page) {\n    html += `<div class=\"pager\">${page}</div>`;\n  }\n\n  // 闭合HTML标签\n  html += `</body></html>`;\n\n  // 替换整个页面内容\n  document.documentElement.innerHTML = html;\n}\n",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUrl": "https://bbs.jjwxc.net/showmsg.php?board=55&boardpagemsg=1&id=4705#",
    "ruleArticles": "tr.boardlist",
    "ruleContent": "\n<js>\npage = java.getString(\"@@id.pager_top@html\")\nno = java.getStringList(\"@@class.authorname@font.0@text\");\nauthor = java.getStringList(\"@class.nickname@text\");\ntimes = java.getStringList(\"@class.authorname@text\")\nnode = java.getElement(\"@@class.read\");\n\n// 构建HTML头部\nhtml = `\n<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>${String(java.getString(\"@@id.msgsubject@textNodes\")).replace(/主题：/, '')}</title>\n  <style>\n    \n  </style>\n</head>\n<body>\n  ${page}\n  <div id=\"msgsubject\">${java.getString(\"@@id.msgsubject@textNodes\")}</div>\n`;\n\n// 构建内容部分\nfor(i in no) {\n  html += `\n    <div class=\"author\">\n      <font class=\"no\">${no[i]}</font> ${author[i]} | ${times[i].match(/\\d+-\\d+-\\d+ \\d+:\\d+:\\d+/)?.[0]??\"\"}\n    </div>\n    <div class=\"read\">${node[i]}</div>\n    <hr>\n  `;\n}\n\n// 添加登录提示\nlogin = java.getString('@text.登入@text');\nif(login == \"登入\") {\n  html += `<div class=\"login-notice\">点击右上角三点，登录后，刷新可查看更多帖子</div>`;\n}\n\n// 闭合HTML标签\nhtml += `${page}</body></html>`;\n\n// 返回完整的HTML\nhtml;\n</js>\n##<img src=\".*?(?:□□|9999-\\d+).*?\">|<img src=\"\">##【图片链接被屏蔽】\n<js>result = result.replace(/<br>(?:&nbsp;|\\s)*?<br>/g,'<br>')</js>\n##max-height:\\d+px;overflow: hidden;##max-height:500px;overflow: auto;",
    "ruleLink": "{{@@tag.a.0@href}}#第一页",
    "ruleNextPage": "page",
    "rulePubDate": "{{@div@text}}✪{{@a@title}} 回复数：{{@@tag.span.2@text}}",
    "ruleTitle": "【{{@td.0@text}}】{{@a.0@text}} 【{{@tag.img.0@src##.*/|\\.gif}}】\n<js>\nresult = result.replace(/【hot】/g,'🔥')\n.replace(/【new】/,'🆕')\n.replace(/【wonderful】/,'【精】')\n</js>\n##【】",
    "singleUrl": false,
    "sortUrl": "百合堂::board.php?board=55&page={{page}}\n百合堂•精华区::board.php?board=55&type=wonderful&page={{page}}\n百合堂•套红区::board.php?board=55&type=red&page={{page}}\n🗣网友交流区::board.php?board=2&page={{page}}\n🗣宠物情缘::board.php?board=40&page={{page}}\n🗣时尚·饕餮::board.php?board=16&page={{page}}\n🗣战色逆乐园::board.php?board=20&page={{page}}\n🗣妈咪宝贝::board.php?board=39&page={{page}}\n🗣读书心得::board.php?board=4&page={{page}}\n🗣动漫大家谈::board.php?board=12&page={{page}}\n🗣晋江影视区::board.php?board=14&page={{page}}\n🗣自由交易区::board.php?board=11&page={{page}}\n📝碧水江汀::board.php?board=17&page={{page}}\n📝留声花园::board.php?board=44&page={{page}}\n📝涂画乐园::board.php?board=23&page={{page}}\n📝古意茶坊::board.php?board=10&page={{page}}\n🕶耽美闲情::board.php?board=3&page={{page}}\n🕶评论专区::board.php?board=9&page={{page}}\n🕶优声由色::board.php?board=52&page={{page}}\n📢意见建议簿::board.php?board=22&page={{page}}\n📢版主交流区::board.php?board=13&page={{page}}",
    "sourceGroup": "阅读",
    "sourceIcon": "https://m-static.jjwxc.net/images/wap/logo.png",
    "sourceName": " 📖\n晋江论坛",
    "sourceUrl": "https://bbs.jjwxc.net",
    "style": "body {\n      font-family: Arial, sans-serif;\n      line-height: 1.6;\n      max-width: 800px;\n      margin: 0 auto;\n      padding: 20px;\n      color: #333;\n    }\n    #msgsubject {\n      font-size: 20px;\n      font-weight: bold;\n      margin-bottom: 20px;\n      padding-bottom: 10px;\n      border-bottom: 1px solid #eee;\n    }\n    .author {\n      font-size: 14px;\n      color: #666;\n      margin-bottom: 5px;\n    }\n    img{\n    \twidth:100%\n    \t}\n    .no {\n      color: #ff6b6b;\n      font-weight: bold;\n    }\n    .read {\n      margin-bottom: 20px;\n      padding: 15px;\n      background-color: #f9f9f9;\n      border-radius: 5px;\n      border-left: 3px solid #ff6b6b;\n    }\n    .replybodyinner {\n      white-space: pre-wrap;\n      word-wrap: break-word;\n    }\n    hr {\n      border: 0;\n      height: 1px;\n      background-color: #eee;\n      margin: 20px 0;\n    }\n    .login-notice {\n      color: #ff6b6b;\n      text-align: center;\n      margin: 20px 0;\n      padding: 10px;\n      background-color: #fff8e1;\n      border-radius: 5px;\n    }"
  },
  {
    "articleStyle": 2,
    "customOrder": 24,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n\t\"referer\":\"http://android.jjwxc.net/?v=357\",\n\t\"versionCode\":\"357\",\n\t\"versiontype\":\"reading\",\n  \"User-Agent\": \"Dalvik/2.1.0\"\n}",
    "injectJs": "\ndocument.getElementById(\"app\").remove();\n\n// 获取书籍链接\n\t\tbookid = String(window.location.href).replace(/^.*\\//,'');\n\t\tbooksrc = \"http://app-cdn.jjwxc.net/androidapi/novelbasicinfo?novelId=\"+bookid;\n\t\tconsole.log(\"前\"+booksrc)\nbooksrc = `legado://import/addToBookshelf?src=${encodeURIComponent(booksrc)}`;\n\t\n\t\t//获取书籍名称\ntitle = document.querySelector(\".big.o\").innerText.replace(/首页>/,'');\n\n//获取作者名称\nauthor = document.querySelector(\".authorname-content a\").innerText;\n\n//跳转作者url[可省略]\ndocument.querySelector(\".authorname-content a\").href;\n\n//create(搜索的内容,\"bookName or bookAuthor\",距离顶部距离,[跳转其他url])\n\ncreate(title,\"addBookshelf\",14,booksrc);\ncreate(title,\"bookName\",18)\ncreate(author,\"bookAuthor\",22)\n\n\n function create(name,type,top,url){\n \t    type = type+\"=\"+name;\n \t    url = url!=undefined?url+\"#\"+type:\"\";\n \t    \n     let \ttypebutton;\n     if(/bookName/.test(type)){\n     \t    typebutton=\"搜索书名\"\n     \t}else if(/bookAuthor/.test(type)){\n     \t\t   typebutton=\"搜索作者\"\n     \t}else{\n     \t\t\t   typebutton=\"加入书架\"\n     \t}\n    \n    \tlet Url = location.search!=\"\"?location.search.replace(/&*book[AN].*?=.*/,'')+\"&\"+type:window.location.pathname+\"?\"+type;\n    \turl = url!=\"\"?url:Url;\n    \tconsole.log(url);\n    \tA = document.createElement(\"a\");\n\t\t A.href =url.replace(/#addBookshelf.*/,'')\n\t\t     \n\t\tA.innerHTML = `<button style=\"outline:none; position:fixed; top:${top}%; right:7%; z-index:999; border-radius:5px; color:#166188;background:#fff;padding:4px;border:1px solid #000\"><b>${typebutton}</b></button>`;\n\t\t\n    \tdocument.body.appendChild(A);\n \t}\t    \n\nconsole.log(\"后\"+booksrc);\n",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.data.data[*]||$.data.recommend[*]%%$.data.find[*]\n<js>result ==\"[]\"?'[{\"title\":\"支持源作者\",\"url\":baseUrl}]':result\n</js>\n$.[*]",
    "ruleContent": "{{/data:/.test(baseUrl)?java.startBrowser(baseUrl,\"感谢你的支持\"):\"\"}}\n<title> {{$.data.booklist_desc.listname}}</title>\n<div class=\"booklist_desc\">\n    <p class=\"listname\">\n        <span class=\"level\">\n            &emsp;{{$.data.booklist_desc.level}}级&emsp;\n        </span>\n          {{$.data.booklist_desc.listname}}\n     </p>\n     <span class=\"dateline\">\n         {{$.data.booklist_desc.dateline||$.data.booklist_desc.create_time}}\n     </span>\n     <p class=\"des\">\n         荐书描述 共{{$.data.booklist_desc.booknum}}本\n     </p>\n     <div class=\"introduction\">\n           <p>{{$.data.booklist_desc.introduction}}</p>\n     </div>\n</div>\n<br>\n<br>\n\n<js>\njava.toast(\"加载中....\")\ntry{\n   function getBooklist(list){\n   \tlet html=\"\";\n   \tfor(i in list){\n    \t  $ = list[i];\n    \t  let novelid = \"https://m.jjwxc.net/book2/\"+$.novelid;\n    \t  let cover = $.cover;\n    \t  let novelname = $.novelname;\n    \t  let authorname = $.authorname;\n    \t  let novelstep_name = $.novelstep_name || $.novelstep_str;\n    \t  let novelsize = $.novelsize;\n    \t  let novel_review_score = $.novel_review_score || ($.fav_count_str+\"收藏\");\n    \t  let novelstar = $.novelstar || 0;\n    \t  let s=\"\";\n    \t  for(i=0;i<novelstar;i++){s+=\"★\"}\n    \t  novelstar=s;\n    \t  let novelintroshort = $.novelintroshort;\n    \t  let comment = $.comment || \"\";\n    \t  let novelclass_str = $.novelclass_str;\n    \t  \n\t      html +=`\n\t         <div class=\"book\">\n\t            <div class=\"bookdes\">\n\t             <div class=\"pic\">\n\t                 <img src=\"${cover}\" referrerpolicy=\"no-referrer\">\n\t             </div>\n\t             <div class=\"details>\n\t                  <p class=\"bookname\">\n\t                      <span class=\"name\">\n\t                         <a href=\"${novelid}\">${novelname}</a>\n\t                      </span>\n\t                      <br>\n\t                      <span class=\"author\">\n\t                         ——${authorname}\n\t                      </span>\n\t                  </p>\t\n\t                  <p class=\"tag\">\n\t                  ${novelsize}•${novelstep_name}•${novel_review_score}<br><br>\n\t                    ${novelintroshort}<br><br>\n\t                    ${novelclass_str}<br><br>\n\t                    ${novelstar}\n\t                  </p>             \n\t             </div>\t             \n\t             </div>\n\t             <div class=\"comment\">\n\t                 ${comment}\n\t             </div>            \n\t         </div>     \n\t         `;\n\t    }\n\t    return html\n   \t}\n\n    list = JSON.parse(src).data.novel_lists || JSON.parse(src).data.booklist_desc.recommend_novelinfo;\n     reply = \"\";\n     if(/subjectDetail/.test(baseUrl)){\n     \treply_url = \"https://app.jjwxc.org/app.jjwxc/android/reading/BookListFindBook/replyList?versionCode=357&listid={{baseUrl.match(/id=(\\d+)/)[1]}}&page=1&filter_recommend=0\";\n     \t\n    data = JSON.parse(java.ajax(reply_url));\n    l = data.data.data;\n    \n    page_count = data.data.page_count;\n    if(page_count>1){\n    \t   for(k=2;k<=page_count;k++){\n    \t  reply_url = reply_url.replace(/page=\\d+/,'page='+k);\n    \t  l = l.concat(JSON.parse(java.ajax(reply_url)).data.data);\n    \t}\n    }\n   \n    for(j in l){\n    \t    reply+='<div class=\"comment\"><span style=\"color:#3A9DBF\">'+(Number(j)+1)+'楼 </span>'+l[j].body+'</div>'+getBooklist(l[j].recommend_novelinfo)+\"<br><br>\";\n    \t}\n    \n    reply = \"<hr><br><br>全部讨论（{{$.data.booklist_desc.reply_count}}）回复<br><br>\"+reply\n     \t}\n     \n\t    html = result + '<div class=\"booklists\">'+getBooklist(list)+reply+'</div>';\n\t   \n\t    result = String(html)\n.replace(/<div class=\"comment\">\\s*<\\/div>|<span class=\"level\">\\s*&emsp;级&emsp;\\s*<\\/span>|全部讨论（0）回复/g,'');\n     result = /subjectDetail/.test(baseUrl)?result.replace(/荐书描述 共\\d+本/,'找书描述'):result\n     }catch(e){\n     \tjava.log(e)\n     \t}\n\n\n</js>",
    "ruleImage": "$.display_novelinfo[0].ebookurl||$.display_novelinfo[0].localImg\n@js:\ntry{\n\tif(/(?:postimg|bmp|alicdn|i9-static)\\./.test(result)){\n\tresult = \"https://i9-static.jjwxc.net/novelimage.php?novelid={{$.display_novelinfo[0].novelid}}\";\n\t}else{\n\t\tresult = result\n\t\t}\n\t\theader = {\n\t\t\"headers\":{\n\t\t\t\"referer\":result.match(/(^https?:\\/\\/.*?\\/)/)[1]\n\t\t\t}\n\t\t}\nresult = (result +\",\"+ JSON.stringify(header)).replace(/wx\\d+/,'wx2')\n}catch(e){\n\tjava.log(e)\n\t}\nresult",
    "ruleLink": "<js>\ndata_type = java.getString(\"$.data_type\");\nif(data_type==\"2\"){\n\t\"https://app-cdn.jjwxc.com/app.jjwxc/android/reading/Booklist/getDetail?listid={{$.listid}}\"\n\t}else if(/http/.test(baseUrl)){\n\t\t\"https://app.jjwxc.org/app.jjwxc/android/reading/BookListFindBook/subjectDetail?versionCode=357&listid={{$.listid}}\"\n\t\t}else{\n\t\t\tbaseUrl\n\t\t\t}\n</js>",
    "ruleNextPage": "<js>\nif(/rec_new_offset/.test(baseUrl)){\n\t\n\tresult = \"https://app.jjwxc.org/app.jjwxc/android/reading/BookListFindBook/square?versionCode=357&rec_new_offset={{$.data.rec_new_offset}}&find_new_offset={{$.data.find_new_offset}}&rec_edit_offset={{$.data.rec_edit_offset}}\"\n\t}else if(/page=/.test(baseUrl)){\n\t\tresult = baseUrl.replace(/page=\\d+/,\"page=\"+(Number(baseUrl.match(/page=(\\d+)/)[1])+1));\n\t\t\n\t\t\t}\n\t\t\n</js>",
    "rulePubDate": "【{{java.getString(\"$.data_type\")==1?\"🔍找书\":\"📖荐书\"}}】•{{$.level}}级 {{$.recommend_count}}本 {{$.fav_count}}收藏##•级",
    "ruleTitle": "$.subject||$.title##</*.*?>",
    "shouldOverrideUrlLoading": "if(/[\\?#&]book[AN]/.test(url)){\n\ttitle = url.match(/[\\?#&]book[AN].+?=(.*)/)[1];\n\tURLDecoder = Packages.java.net.URLDecoder;\n\tgb2312Str = URLDecoder.decode(title,\"gbk\");\n utf8Str = URLDecoder.decode(title,\"utf-8\");\n\t result = gb2312Str.length() >= utf8Str.length();\n\t title = result?decodeURI(title):gb2312Str;\n\t java.searchBook(title);\n  result = true\n\t}",
    "singleUrl": false,
    "sortUrl": "\n热门书单::https://android.jjwxc.net/app.jjwxc/android/reading/BookListFindBook/hotSubjectMore?versionCode=429\n\n书单广场::https://app.jjwxc.org/app.jjwxc/android/reading/BookListFindBook/square?versionCode=357&rec_new_offset=0&find_new_offset=0&rec_edit_offset=0&page={{page}}\n\n搜索书单::https://app.jjwxc.org/app.jjwxc/android/reading/BookListSearch/search?versionCode=357&keywords={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的内容</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&page=1&sort=fav_count\n\n搜索百合书单::https://android.jjwxc.com/app.jjwxc/android/reading/BookListSearch/search?versionCode=358&page=1&sort=fav_count&must_xx=3&could_xx=5&book_num_range=0%2C252&data_type=1%2C2&keywords={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的内容</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}\n\n支持源作者::data:text/html;base64,PGltZyBzdHlsZT0id2lkdGg6MTAwJSIgc3JjPSJhYm91dDpibGFuayIgb25lcnJvcj0idGhpcy5zcmM9YXRvYignYUhSMGNITTZMeTluYVhSbFpTNWpiMjB2WjNWaGJtVnlNREF4TVRJMUwySnZiMnR6YjNWeVkyVXZjbUYzTDIxaGMzUmxjaThsUlRVbE9VSWxRa1VsUlRjbE9Ea2xPRGN2WjNWaGJtVnlMbmRsWW5BPScpIj4KCg==,{\"type\":\"html\"}",
    "sourceComment": "//点击右上角三点，设置源变量搜索书单，或者下拉搜索",
    "sourceGroup": "阅读",
    "sourceIcon": "https://m-static.jjwxc.net/images/wap/logo.png",
    "sourceName": " 📖\n晋江书单",
    "sourceUrl": "https://app.jjwxc.org",
    "style": "a:link {color:#415E44;}\na:visited{color:#8EB28B}\n.listname{\n\tfont-size:20px;\n\theight:4px;\n\tfont-weight:bolder\n\t}\n.level{\n\tbackground:#9DD8ED;\n\tfont-size:15px;\n\tborder-radius:8px;\n\t}\n.dateline{\n\tcolor:#BABABB;\n\tfont-size:12px\n\t}\n.introduction{\n\tborder:2px dashed #3A9DBF;\n\tborder-radius:10px;\n\t}\n.introduction p{\n\ttext-indent: 3ch;\n\tmargin:5px;\n\tfont-size:18px;\n\tfont-weight:bold\n\t}\n.des{\n\tmargin-top:10px;\n\tmargin-bottom:0px;\n\tmargin-left:18px;\n\tfont-weight:bolder;\n\tcolor:#1D5F22\n\t}\n.bookdes{\n\tdisplay: flex;\n\tflex-direction:row;\n\tmargin:5px;\n\twidth:100%;\n\tposition: relative;\n\t}\n.book{\n\twidth:100%;\n\tdisplay: flex;\n\tflex-direction:column;\n\talign-items:flex-start;\n\tmargin-bottom:8px;\n\t}\n.pic{\n\twidth:25vw;\n\tmargin-right:20px;\n\t}\n.pic img{\n\tboder:1px solid #C4C4C4;\n\tborder-radius:5px;\n box-shadow: 1px 2px 2px black;\n\twidth:97%;\n\theight:auto;\n\t}\n.details{\n\twidth:72vw;\n\tmargin-left:25px;\n\t}\n\n.name{\n\tfont-size:20px;\n\tcolor:#000;\n\t}\n.author{\n\tcolor:#929292;\n\tfont-size:15px;\n\tdisplay:inline-block;\n\tposition:absolute;\n\tright:5px;\n\t}\n.tag{\n\tcolor:#929292;\n\tfont-size:12px;\n\tmargin-top:-10px;\n\t}\n.comment{\n\tpadding:10px;\n\tmargin-bottom:18px;\n\tmargin-top:-3px;\n\tbackground:#E8F6E9;\n\tborder-radius:5px;\n\twidth:100%;\n\t}"
  },
  {
    "articleStyle": 0,
    "customOrder": 25,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "@js:\nresult = JSON.stringify({\n\t\"referer\":\"http://android.jjwxc.net/?v=357\",\n\t\"versionCode\":\"357\",\n\t\"versiontype\":\"reading\",\n  \"User-Agent\": \"Dalvik/2.1.0\"\n})",
    "injectJs": "let previousUrl = \"\";\nlet currentUrl = '';\nlet currentOffset = 0;\nlet totalPages = 1;\nlet isLoading = false;\nlet hasMore = true;\nlet hasPrevious = false;\nlet scrollDebounceTimer = null;\n\nfunction encode(str) {\n    str = str.replace(/https:.*?bq=/g,'');\n    return btoa(encodeURI(str));\n}\n\nfunction decode(str) {\n    str = \"https://android.jjwxc.net/search/getSearchForKeyWords?offset=0&limit=20&bq=\" + atob(str);\n    return str;\n}\n\n// 书籍定位\nfunction recordBookPosition(novelid,offset) {\n    let previousUrl = sessionStorage.getItem('previousUrl');\n    sessionStorage.setItem('bookPosition', JSON.stringify({\n        url:previousUrl,\n        novelid: novelid,\n        offset: offset    \n    }));\n}\n\nfunction restoreBookPosition() {\n    const bookPosition = sessionStorage.getItem('bookPosition');\n    if (!bookPosition) return;\n    \n    let { url, novelid, offset, timestamp } = JSON.parse(bookPosition);\n    const pUrl = new URL(url);\n    pUrl.searchParams.set('offset', offset);\n    currentOffset = offset;\n    fetchAndRender(pUrl.toString(), function(error) {\n    if (error) {\n        return;\n    }\n    \n    const bookElement = document.querySelector(`.book[data-id=\"${novelid}\"]`);\n    if (bookElement) {\n        updateCurrentPage()\n        window.scrollTo({\n            top: bookElement.offsetTop - 100,\n            behavior: 'auto'\n        });\n    }\n});\n    \n}\n        \nfunction fetchAndRender(url, callback) {\n    showLoadingMessage();\n    isLoading = true;\n    sessionStorage.setItem('previousUrl',url);\n    fetch(url)\n        .then(response => response.json())\n        .then(jsonData => {\n            currentUrl = url;\n            totalPages = jsonData.total_page;\n            console.log(totalPages);\n            currentOffset = parseInt(new URL(url).searchParams.get('offset')) || 0;\n            hasMore = (Math.floor(currentOffset / 20) + 1) < jsonData.total_page;\n            hasPrevious = currentOffset > 0; // 设置是否有上一页\n            sessionStorage.setItem('previousUrl',url);\n            generatePageContent(jsonData,currentOffset);\n            addStyles();\n           \n            if (typeof callback === 'function') {\n                callback(null, jsonData);\n            }\n        })\n        .catch(error => {\n            console.error('加载失败:', error);\n            if (typeof callback === 'function') {\n                callback(error);\n            }\n        })\n        .finally(() => {\n            isLoading = false;\n            hideLoadingMessage();\n            bookPosition = sessionStorage.getItem('bookPosition');        \n            sessionStorage.removeItem('bookPosition');        \n            if (!bookPosition) {\n                window.scrollTo(0,0); \t\n                return;\n            }\n        });\n}\n\n// 下拉加载\nfunction initScrollListener() {    \n    window.addEventListener('scroll', handleScroll, { passive: true });\n}\n\nfunction handleScroll() {    \n    clearTimeout(scrollDebounceTimer);\n    scrollDebounceTimer = setTimeout(() => {\n        if (!isLoading) {\n            updateCurrentPage();\n        }        \n        checkScrollBoundaries();\n    }, 50);\n}\n\nfunction checkScrollBoundaries() {\n    if (isLoading) return;\n    \n    const scrollPosition = window.scrollY;\n    const documentHeight = document.body.offsetHeight;\n    const windowHeight = window.innerHeight;\n    \n    if (scrollPosition + windowHeight >= documentHeight - 100 && hasMore) {\n        loadNextPage();\n    }\n        \n    if (scrollPosition <= 100 && hasPrevious) {\n        loadPreviousPage();\n    }\n}\n\nfunction loadPreviousPage() {\n    if (isLoading) return;\n    \n    isLoading = true;\n    document.getElementById('loading').style.display = 'block';\n    \n    const newOffset = Math.max(0, currentOffset - 20);\n    const url = new URL(currentUrl);\n    url.searchParams.set('offset', newOffset);\n    \n    // 保存当前滚动位置\n    const scrollPositionBefore = window.scrollY;\n    \n    fetch(url.toString())\n        .then(response => response.json())\n        .then(jsonData => {\n                requestAnimationFrame(() => {\n                prependBookElements(jsonData, newOffset);                                \n                currentOffset = newOffset;\n                updateCurrentPage();\n                hasMore = (Math.floor(newOffset / 20) + 1) < jsonData.total_page;\n                hasPrevious = newOffset > 0;           \n                const newBooks = document.querySelectorAll('.book');\n                if (newBooks.length > 0) {              \n                    const targetBook = newBooks[jsonData.items.length - 1];\n                    if (targetBook) {\n                        const targetPosition = targetBook.offsetTop +100; \n                        window.scrollTo({\n                            top: targetPosition,\n                            behavior: 'auto'\n                        });\n                    }\n                }\n            });\n        })\n        .catch(error => {\n            console.error('加载上一页失败:', error);\n        })\n        .finally(() => {\n            isLoading = false;\n            document.getElementById('loading').style.display = 'none';\n        });\n}\n\n// 优化后的加载下一页函数\nfunction loadNextPage() {\n    if (isLoading) return;\n    \n    isLoading = true;\n    document.getElementById('loading').style.display = 'block';\n    \n    const newOffset = currentOffset + 20;\n    console.log(newOffset);\n    \n    const url = new URL(currentUrl);\n    url.searchParams.set('offset', newOffset);\n    \n    fetch(url.toString())\n        .then(response => response.json())\n        .then(jsonData => {\n            requestAnimationFrame(() => {\n                currentOffset = newOffset;\n                appendBookElements(jsonData, newOffset);\n                updateCurrentPage();\n                hasMore = (Math.floor(newOffset / 20) + 1) < jsonData.total_page;\n            });\n        })\n        .catch(error => {\n            console.error('加载下一页失败:', error);\n        })\n        .finally(() => {\n            isLoading = false;\n            document.getElementById('loading').style.display = 'none';\n        });\n}\n\nfunction createBookElement(item,offset){\nlet bookDiv = document.createElement('div');\n        bookDiv.className = 'book';\n        bookDiv.setAttribute('data-id', item.novelid);\n        bookDiv.setAttribute('data-offset', offset);\n\n        bookDiv.innerHTML = `\n            <div class=\"bookdes\">\n                <div class=\"pic\"><img src=\"${item.cover}\" referrerpolicy=\"no-referrer\"></div>\n                <div class=\"details\">\n                    <p class=\"bookname\">\n                        <span class=\"name\"><a href=\"https://m.jjwxc.net/book2/${item.novelid}\">${item.novelname}</a></span>\n                        <br>\n                        <span class=\"author\">——${item.authorname}</span>\n                    </p>\n                    <p class=\"tag\">⭐️ ${item.novelSizeformat}字•${item.novelstep === '2' ? '<span style=\"color:red\">已完结</span>' : '<span style=\"color:blue\">连载中</span>'}<br><br>📖 ${item.novelintroshort}<br><br>🔖 ${item.novelClass}<br><br>🏷 <span style=\"color:green\">${item.tags}</span></p>\n                </div>\n            </div>\n        `;\n        \n        const link = bookDiv.querySelector('a');\n        link.addEventListener('click', (e) => {\n            e.preventDefault();\n            recordBookPosition(item.novelid, offset);\n            window.location.href = link.href;\n        });\nreturn bookDiv\n}\n\nfunction prependBookElements(data, offset) {\n    const bookContainer = document.getElementById('bookContainer');\n    const fragment = document.createDocumentFragment();   \n    data.items.forEach((item, index) => {       \n        let bookDiv = createBookElement(item,offset)\n        fragment.appendChild(bookDiv);\n    });    \n    bookContainer.insertBefore(fragment, bookContainer.firstChild);\n}\n\n\n// 书籍列表生成\nfunction createBookElements(data,offset) {\n    const bookContainer = document.getElementById('bookContainer');\n    bookContainer.innerHTML = '';\n    data.items.forEach((item, index) => {\n        let bookDiv = createBookElement(item,offset)\n        bookContainer.appendChild(bookDiv);     \n    });\n}\n\nfunction appendBookElements(data,offset) {\n    const bookContainer = document.getElementById('bookContainer');\n    data.items.forEach((item, index) => {\n        let bookDiv = createBookElement(item,offset)\n        bookContainer.appendChild(bookDiv);\n    });\n}\n\n// 页面操作\nfunction updateUrlParam(key, value) {\n    const url = new URL(currentUrl);\n    url.searchParams.set(key, value);\n    url.searchParams.set('offset', 0);\n    currentOffset = 0;\n    updateCurrentPage()\n    fetchAndRender(url.toString());\n}\n\nfunction updateOffset(delta) {\n    const url = new URL(currentUrl);\n    const newOffset = Math.max(0, currentOffset + delta);\n    currentOffset = newOffset;\n    url.searchParams.set('offset', newOffset);\n    fetchAndRender(url.toString());\n}\n\nfunction jumpToPage() {\n    const pageInput = document.querySelector('.page-input');\n    const page = parseInt(pageInput.value);\n    if (isNaN(page) || page < 1 || page > totalPages) {\n        alert(`请输入有效的页码(1-${totalPages})`);\n        return;\n    }\n    \n    currentOffset = (page - 1) * 20;\n    const url = new URL(currentUrl);\n    url.searchParams.set('offset', currentOffset);\n    fetchAndRender(url.toString());\n}\n\nfunction updateCurrentPage() {\n    const books = document.querySelectorAll('.book');\n    if (books.length === 0) return;\n    \n    \n    const observer = new IntersectionObserver((entries) => {\n        entries.forEach(entry => {\n            if (entry.isIntersecting) {\n                const bookOffsetAttr = entry.target.getAttribute('data-offset');\n                \nconst bookOffset = bookOffsetAttr !== null ? parseInt(bookOffsetAttr) : currentOffset;\n\n                const currentPage = Math.floor(bookOffset / 20) + 1;\n                \n                \n                const currentDisplay = document.querySelector('.current-page').textContent;\n                if (currentDisplay !== currentPage.toString()) {\n                    document.querySelector('.current-page').textContent = currentPage;\n                    document.querySelector('.current').textContent = currentPage;\n                    currentOffset = bookOffset;\n                }\n            }\n        });\n    }, {\n        threshold: 0.5 \n    });        \n    books.forEach(book => {\n        observer.observe(book);\n    });\n    \n    return () => {\n        observer.disconnect();\n    };\n}\n\n\n// 辅助函数\nfunction showLoadingMessage() {\n    const loadingDiv = document.createElement('div');\n    loadingDiv.id = 'loading-message';\n    loadingDiv.style.position = 'fixed';\n    loadingDiv.style.top = '20px';\n    loadingDiv.style.left = '50%';\n    loadingDiv.style.transform = 'translateX(-50%)';\n    loadingDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';\n    loadingDiv.style.color = 'white';\n    loadingDiv.style.padding = '10px 20px';\n    loadingDiv.style.borderRadius = '5px';\n    loadingDiv.style.zIndex = '1000';\n    loadingDiv.textContent = '正在加载，请稍候...';\n    document.body.appendChild(loadingDiv);\n}\n\nfunction hideLoadingMessage() {\n    const loadingDiv = document.getElementById('loading-message');\n    if (loadingDiv) loadingDiv.remove();\n}\n\nfunction generateFinalUrl(formData) {\n    const variables = {};\n    for (let [key, value] of formData.entries()) {\n        const variableName = key.replace(/\\d+/g, '');\n        if (!variables[variableName]) {\n            variables[variableName] = [];\n        }\n        variables[variableName].push(value);\n    }\n\n    for (const key in variables) {\n        variables[key] = variables[key].join(',');\n    }\n\n    return `https://android.jjwxc.net/search/getSearchForKeyWords?offset=0&limit=20&bq=${variables.bq || ''}&removetags=${variables.removebq || ''}&notlikecollectionTypes=${variables.notlikecollectiontypes || ''}&fw=${variables.fw || ''}&yc=${variables.yc || ''}&xx=${variables.xx || ''}&sd=${variables.sd || ''}&lx=${variables.lx || ''}&mainview=${variables.mainview || ''}&fbsj=${variables.fbsj || ''}&novelbefavoritedcount=${variables.novelbefavoritedcount || ''}&isfinish=${variables.isfinish || ''}&collectionTypes=${variables.collectiontypes || ''}&searchkeyWords=${variables.searchkeywords || ''}`;\n}\n\n// 页面生成\nfunction generatePageContent(jsonData,offset) {\n    document.documentElement.innerHTML = `\n          <!-- 悬浮按钮组 -->\n    <div class=\"float-buttons\">\n        <div class=\"button-group\">\n                    <!-- 页码控制面板 -->\n            <div class=\"page-control\">\n                <div class=\"page-info\">\n                    <span class=\"current-page\">1</span>\n                    <div class=\"divider\"></div>\n                    <span class=\"total-pages\">${jsonData.total_page}</span>\n                </div>\n                <div class=\"page-jump\">\n                    <input type=\"number\" min=\"1\" max=\"${jsonData.total_page}\" value=\"1\" class=\"page-input\">\n                    <button class=\"go-btn\">GO</button>\n                </div>\n            </div>\n            <!-- 功能按钮（从下到上顺序） -->\n            <button class=\"func-btn home\" title=\"返回首页\">⌂</button>\n            <button class=\"func-btn bottom\" title=\"页面底部\">↓</button>\n            <button class=\"func-btn top\" title=\"页面顶部\">↑</button>\n            \n\n        </div>\n        \n        <!-- 主按钮 - 深绿色圆形 -->\n        <button class=\"main-btn\" title=\"展开功能\">\n            <span class=\"current\">1</span>\n            <div class=\"divider\"></div>\n            <span class=\"total\">${jsonData.total_page}</span>\n        </button>\n    </div>\n    \n            <div class=\"center\" style=\"text-align: center;\">\n                <select name=\"sortType\" id=\"orderstr\" style=\"width:25%\">\n                    <option value=\"2\">积分</option>\n                    <option value=\"1\">最近更新</option>\n                    <option value=\"3\">最新发表</option>\n                    <option value=\"5\">字数</option>\n                    <option value=\"4\">收藏数</option>\n                    <option value=\"10\">完结高分</option>\n                </select>\n                <span style=\"margin: 0 2px;\">|</span>\n                <select name=\"isfinish\" id=\"isfinish\" style=\"width:25%\">\n                    <option value=\"0\">无限制</option>\n                    <option value=\"1\">连载</option>\n                    <option value=\"2\">完结</option>\n                </select>\n                <span style=\"margin: 0 2px;\">|</span>\n                <button id=\"biaoqian\" style=\"width:25%\">\n                    标签管理                  \n                </button>\n            </div>\n        <div style=\"height: 60px;\"></div>\n        <br>\n        <div id=\"bookContainer\" class=\"book-container\"></div>\n        <div id=\"loading\" style=\"text-align: center; padding: 10px; display: none;\">\n            正在加载更多...\n        </div>\n    `;\n\n    const sortTypeSelect = document.getElementById(\"orderstr\");\n    const isFinishSelect = document.getElementById(\"isfinish\");\n    const urlParams = new URLSearchParams(currentUrl.split('?')[1]);\n            \n    const mainBtn = document.querySelector('.main-btn');\n    const floatButtons = document.querySelector('.float-buttons');\n    const totalPagesEl = document.querySelector('.total-pages');\n    const pageInput = document.querySelector('.page-input');\n    const pageSections = document.querySelectorAll('.page-section');\n    const homeBtn = document.querySelector('.func-btn.home');\n    const topBtn = document.querySelector('.func-btn.top');\n    const bottomBtn = document.querySelector('.func-btn.bottom');\n    \n            // 设置总页数\n        totalPages = jsonData.total_page; \n        totalPagesEl.textContent = totalPages;\n        pageInput.max = totalPages;\n        \n        // 检测是否为长页码\n        if (totalPages >= 10000) {\n            floatButtons.classList.add('long-page');\n        }\n        \n        \n        mainBtn.addEventListener('click', function(e) {\n            e.stopPropagation();\n            floatButtons.classList.toggle('expanded');\n            mainBtn.style.display = 'none';\n            \n        });\n        \n        // 点击页面其他区域收起按钮组\n        document.addEventListener('click', function() {\n            floatButtons.classList.remove('expanded');\n            mainBtn.style.display = 'flex';\n        });\n        \n        \n        document.querySelector('.button-group').addEventListener('click', function(e) {\n            e.stopPropagation();\n        });\n        \n        \n        document.querySelector('.go-btn').addEventListener('click', jumpToPage);\n        document.querySelector('#biaoqian').addEventListener('click',function() {    \n            toggleTag(sessionStorage.getItem('previousUrl'))\n        });\n\n        \n        homeBtn.addEventListener('click', function() {\n            sessionStorage.setItem('previousUrl', \"\");\n            window.location.reload();\n        });\n        \n        topBtn.addEventListener('click', function() {\n            window.scrollTo({top: 0, behavior: 'smooth'});\n            floatButtons.classList.remove('expanded');\n            mainBtn.style.display = 'flex';\n        });\n        \n        bottomBtn.addEventListener('click', function() {\n            window.scrollTo({top: document.body.scrollHeight-100, behavior: 'smooth'});\n            floatButtons.classList.remove('expanded');\n            mainBtn.style.display = 'flex';\n        });\n        \n    sortTypeSelect.value = urlParams.get('sortType') || '2';\n    isFinishSelect.value = urlParams.get('isfinish') || '0';\n    sortTypeSelect.onchange = () => updateUrlParam('sortType', sortTypeSelect.value);\n    isFinishSelect.onchange = () => updateUrlParam('isfinish', isFinishSelect.value);\n    \n      \n    initScrollListener();\n    createBookElements(jsonData,offset);\n    updateCurrentPage();\n    \n    const checkScrollable = () => {\n        if (document.body.scrollHeight <= window.innerHeight) {\n            \n            if (hasMore) {\n                loadNextPage();\n            } else if (hasPrevious) {\n                \n                loadPreviousPage();\n            }\n        }\n    };\n    \n\n    checkScrollable();\n}\n\nwindow.addEventListener('beforeunload', () => {\n    window.removeEventListener('scroll', handleScroll);\n    window.removeEventListener('resize', checkScrollable);\n});\n\n\nfunction createTag(url){    \n        const form = document.getElementsByTagName('form')[1];\n        const formData = new FormData(form);\n        \n        const finalUrl = url==undefined?generateFinalUrl(formData):url;                                           \n        const dialog = createModalDialog();               \n        const urlTextarea = document.createElement('textarea');\n        urlTextarea.value = `标签名@${encode(finalUrl)}#`;\n        urlTextarea.style.width = '90%';\n        urlTextarea.style.height = '100px';\n        urlTextarea.style.padding = '10px';\n        urlTextarea.style.margin = '10px';\n        urlTextarea.style.outline ='none';\n        urlTextarea.style.border ='1px solid #ddd';\n        urlTextarea.style.resize = 'none';\n        \n        dialog.dialog.prepend(urlTextarea);\n\n        const promptText = document.createElement('p');\n        promptText.textContent = '修改标签名，点击保存';\n        promptText.style.margin = '10px 0';\n        promptText.style.fontSize = '14px';\n        promptText.style.color = '#333';\n        dialog.dialog.prepend(promptText);\n\n        const copyButton = document.createElement('button');\n        copyButton.textContent = '保存';\n        copyButton.style.margin = '10px';\n        copyButton.style.padding = '10px 20px';\n        copyButton.style.backgroundColor = '#28a745';\n        copyButton.style.color = 'white';\n        copyButton.style.border = 'none';\n        copyButton.style.borderRadius = '5px';\n        copyButton.style.cursor = 'pointer';\n        copyButton.addEventListener('click', () => {\n            let tag = urlTextarea.value;\n            let tags = localStorage.getItem(\"setTag\");\n            localStorage.setItem(\"setTag\",tags+tag);\n            let saveTag = localStorage.getItem(\"setTag\");            \n            alert('已保存标签：'+tag);\n            document.body.removeChild(dialog.overlay);\n        });\n        dialog.dialog.appendChild(copyButton);          \n}\n\n\n//标签管理弹窗\nfunction createModalDialog(options = {}) {\n    //遮罩层\n    const overlay = document.createElement('div');\n    overlay.style.position = 'fixed';\n    overlay.style.top = '0';\n    overlay.style.left = '0';\n    overlay.style.width = '100%';\n    overlay.style.height = '100%';\n    overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';\n    overlay.style.zIndex = '1001';\n    overlay.style.display = 'flex';\n    overlay.style.justifyContent = 'center';\n    overlay.style.alignItems = 'center';\n    \n    //弹窗\n    const dialog = document.createElement('div');\ndialog.style.cssText = `\n    background-color: white;\n    padding: 10px;\n    border-radius: 10px;\n    width: 80%;\n    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);\n    text-align: center;\n    max-height: 60vh;\n`;\n\n\n    if (options.title) {\n        const title = document.createElement('h2');\n        title.textContent = options.title;\n        title.style.marginTop = '0';\n        dialog.appendChild(title);\n    }\n\n    if (options.content && Array.isArray(options.content)) {\n        options.content.forEach(element => {\n            dialog.appendChild(element);\n        });\n    }\n\n    // 创建关闭按钮\n    const closeButton = document.createElement('button');\n    closeButton.textContent = '关闭';\n    closeButton.style.margin = '10px';\n    closeButton.style.padding = '10px 20px';\n    closeButton.style.backgroundColor = '#dc3545';\n    closeButton.style.color = 'white';\n    closeButton.style.border = 'none';\n    closeButton.style.borderRadius = '5px';\n    closeButton.style.cursor = 'pointer';\n    closeButton.addEventListener('click', () => {\n        document.body.removeChild(overlay);\n        if (typeof options.onClose === 'function') {\n            options.onClose(); \n        }\n    });\n    dialog.appendChild(closeButton);\n\n    overlay.appendChild(dialog);\n    document.body.appendChild(overlay);\n\n     return {\n        dialog: dialog, \n        overlay: overlay\n    };\n}\n\nfunction createTagButton(type){   \n    const tagsWrapper = document.createElement('div');\n    tagsWrapper.style.cssText = `\n        margin: 5px;\n        padding:5px;\n        max-height:50vh;\n        overflow-y: auto;\n        display: flex;\n        flex-wrap: wrap;\n        align-items: flex-start;\n    `;\n    let url = localStorage.getItem('setTag');\n    const urls = url.split('#');\n    const buttonData = urls.filter(part => part.trim() !== '');        \n    buttonData.forEach((data, index) => {\n        const [label, url] = data.split('@');\n        const button = document.createElement('button');\n        button.textContent = decodeURIComponent(label) || `标签${index + 1}`;\n        button.style.cssText = `\n            padding: 5px 5px;\n            border-radius: 5px;\n            white-space: wrap;\n            flex-shrink: 0;\n            background-color: #2196F3;\n            color: white;\n            border: none;\n            cursor: pointer;\n            transition: all 0.3s;\n            margin-right: 10px;\n            margin-bottom: 10px;\n            min-width: 60px;\n            max-width: 100%;\n        `;\n        if(type!==0){       \n            button.addEventListener('click', () => fetchAndRender(decode(url)));\n        }else if(type===0){\n        button.addEventListener('click', () => {\n        try{\n        document.querySelectorAll(\"input\").forEach(input => {\n\n  input.checked = false;\n\n  // 2. 找到相邻的兄弟 span 并变红\n  const span = input.nextElementSibling; // 获取紧邻的下一个兄弟元素\n  if (span && span.tagName === 'SPAN') {\n    span.style.color = 'black';\n  }\n});\n\n        document.querySelectorAll('.del_choosed_tag').forEach(button => {\n    button.click();\n});              \n        let eurl = decodeURIComponent(decodeURIComponent(decode(url)));\n        eurl = eurl.toLowerCase().replace(/http.*?\\?|offset=\\d+&|limit=\\d+&|isfinish=\\d+&/g,'').split('&'); \n        for(let i=0;i<eurl.length;i++){\n            let params = eurl[i].split(\"=\");\n            let names = params[0];                 \n            let values = params[1].split(\",\");                   \n            for(let j=0;j<values.length;j++){\n                let name,input;\n      if(names===\"bq\"||names===\"removetags\"){\n      if(values[j]){\n              addBq(params[1],values[j],names)\n             }\n              }else if(/\\d+/.test(values[j])){\n                name = names+values[j];       \n                input = document.querySelector(`input[name=\"${name}\"]`);\n                if(input){\n                  if (input.nextElementSibling && input.nextElementSibling.tagName === 'SPAN') {\n    input.nextElementSibling.style.color = 'red';\n  }\n  input.checked=true\n        }        \n                \n              }else{\n              input = document.querySelector(`input[name=\"${names}\"][value=\"${values[j]}\"]`);\n              input?input.checked=true:null\n              }            \t       \n            }                                         \n        }\n       \n        }catch(e){alert(e)}              \n        });               \n     }\n        tagsWrapper.appendChild(button);        \n    });\n    return tagsWrapper\n}\n\nfunction addBq(all,v,type){\ntry{\n        \n        type === \"removetags\"?        \n          document.querySelector('.tag_label_'+v+\"~.remove_tags\").click()                  \n           :document.querySelector('.tag_label_'+v+\"~.add_tags\").click();          \n         \n      }catch(e){\n      alert(e)\n      }\n}\n\nfunction toggleTagEdit(){      \n    const dialog = createModalDialog();\n    const tagContainer = document.createElement('div');\n    const tagsWrapper = createTagButton(0);\n\n    tagContainer.style.cssText = `\n        max-height:50vh;\n        padding: 10px;\n        margin: 5px;\n        border-radius: 10px;\n        width: 90%;\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n    `;\n   \n    tagContainer.appendChild(tagsWrapper); \n    dialog.dialog.prepend(tagContainer);\n\n    dialog.overlay.addEventListener('click', () => {\n        document.body.removeChild(dialog.overlay);\n    });\n    \n}\n\n///标签选择\nfunction toggleTag(curl){   \n    // 创建弹窗    \n    const dialog = createModalDialog();\n    const tagContainer = document.createElement('div');\n    const tagsWrapper = createTagButton();\n\n    tagContainer.style.cssText = `\n        max-height:50vh;\n        padding: 10px;\n        margin: 5px;\n        border-radius: 10px;\n        width: 90%;\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n    `;\n\n    // 创建【生成标签】按钮\n    const generateBtn = document.createElement('button');\n    generateBtn.textContent = '生成';\n    generateBtn.style.cssText = `\n        padding: 10px 20px;\n        background: #4CAF50;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n        margin-bottom: 10px;\n    `;\n    dialog.dialog.appendChild(generateBtn);\n    const editBtn = document.createElement('button');\n    editBtn.textContent = '编辑';\n    editBtn.style.cssText = `\n        padding: 10px 20px;\n        margin: 6px;\n        background: #719EA5;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n        margin-bottom: 10px;\n    `;\n    dialog.dialog.appendChild(editBtn);\n     \n    tagContainer.appendChild(tagsWrapper); \n    dialog.dialog.prepend(tagContainer);\n\n    dialog.overlay.addEventListener('click', () => {\n        document.body.removeChild(dialog.overlay);\n    });\n    \n    // 【生成标签】点击事件\n    generateBtn.addEventListener('click', () => {        \n        createTag(curl)        \n    });    \n    editBtn.addEventListener('click', () => {        \n        editTag()        \n    });    \n}\n\nfunction editTag(){\n    let dialog = createModalDialog();\n    let text = localStorage.getItem('setTag');\n    const tagsWrapper = document.createElement('div');\n    tagsWrapper.style.cssText = `\n        margin: 5px;\n        padding:5px;\n        max-height:50vh;\n        overflow-y: auto;\n        display: flex;\n        flex-wrap: wrap;\n        align-items: flex-start;\n    `;        \n    const urls = text.split('#');\n    const buttonData = urls.filter(part => part.trim() !== '');        \n    buttonData.forEach((data, index) => {\n        const [label, url] = data.split('@');\n        const button = document.createElement('input');\n        button.type = \"text\";\n        button.value = label || `标签${index + 1}`;\n        button.style.cssText = `\n            padding: 5px 5px;\n            border-radius: 5px;\n            white-space: wrap;\n            flex-shrink: 0;\n            background-color: #2196F3;\n            color: white;\n            border: none;\n            cursor: pointer;\n            transition: all 0.3s;           \n            min-width: 60px;\n            max-width: 100%;\n            width:40%;\n            margin-right: 10px;\n            margin-bottom: 10px;\n        `;\n        \n        button.dataset.id = url;   \n        tagsWrapper.appendChild(button); \n    });            \n        dialog.dialog.prepend(tagsWrapper);\n        \n        const promptText = document.createElement('p');\n        promptText.textContent = '修改标签名或者删除相应文字，点击保存';\n        promptText.style.margin = '10px 0';\n        promptText.style.fontSize = '14px';\n        promptText.style.color = '#333';\n        dialog.dialog.prepend(promptText);\n\n        const copyButton = document.createElement('button');\n        copyButton.textContent = '保存';\n        copyButton.style.margin = '10px';\n        copyButton.style.padding = '10px 20px';\n        copyButton.style.backgroundColor = '#28a745';\n        copyButton.style.color = 'white';\n        copyButton.style.border = 'none';\n        copyButton.style.borderRadius = '5px';\n        copyButton.style.cursor = 'pointer';\n        copyButton.addEventListener('click', () => {\n            const allButtons = tagsWrapper.querySelectorAll('input');\n            let saveTag = \"\";        \n            allButtons.forEach(data=>{\n                if(data.value){\n                saveTag+=data.value+\"@\"+data.dataset.id+\"#\";}\n            });\n            \n            localStorage.setItem(\"setTag\",saveTag);\n            alert(\"已更新标签\");\n            document.body.removeChild(dialog.overlay);\n        });        \n        dialog.dialog.appendChild(copyButton);          \n}\n\nif(/#$/.test(window.location.href)){\n    let homeTagButton = document.createElement('button');\n    homeTagButton.textContent = '标签管理';\n    homeTagButton.style.cssText = `\n        position: fixed;\n        bottom: 20px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(homeTagButton);\n    \n    let cTagButton = document.createElement('button');\n    cTagButton.textContent = '生成标签';\n    cTagButton.style.cssText = `\n        position: fixed;\n        bottom: 50px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(cTagButton);\n    \n    \n    let eTagButton = document.createElement('button');\n    eTagButton.textContent = '复现标签';\n    eTagButton.style.cssText = `\n        position: fixed;\n        bottom: 80px;\n        right: 20px;\n        z-index: 1000;\n        padding: 5px 10px;\n        background-color: #007BFF;\n        color: white;\n        border: none;\n        border-radius: 5px;\n        cursor: pointer;\n    `;\n    document.body.appendChild(eTagButton);\n    \n    \n    homeTagButton.addEventListener('click', () => {               \n        toggleTag()\n    });\n    eTagButton.addEventListener('click', () => {               \n        toggleTagEdit()\n    });\n    cTagButton.addEventListener('click', () => {              \n        createTag()        \n    });\n    \n    \n    \n        \n    \n    const forms = document.getElementsByTagName('form')[1];\n    restoreBookPosition();\n    forms.addEventListener('submit', function(event) {\n        event.preventDefault();\n        const formData = new FormData(forms);\n        currentUrl = generateFinalUrl(formData);\n        previousUrl = currentUrl;\n        currentOffset = 0;\n        fetchAndRender(currentUrl);\n    });\n}\n\n// 书籍详情页按钮\nif (/m\\.jjwxc\\.net\\/book2\\/\\d+/.test(window.location.href)) {\n    document.getElementById(\"app\").remove();\n    const bookid = window.location.href.split('/').pop();\n    const booksrc = `legado://import/addToBookshelf?src=${encodeURIComponent(`http://app-cdn.jjwxc.net/androidapi/novelbasicinfo?novelId=${bookid}`)}`;\n    const title = document.querySelector(\".big.o\").innerText.replace(/首页>/, '');\n    const author = document.querySelector(\".authorname-content a\").innerText;\n\n    createButton(title, \"addBookshelf\", 14, booksrc);\n    createButton(title, \"bookName\", 18);\n    createButton(author, \"bookAuthor\", 22);\n}\n\nfunction createButton(name, type, top, url) {\n    const typeButton = type === \"bookName\" ? \"搜索书名\" : \n                      type === \"bookAuthor\" ? \"搜索作者\" : \"加入书架\";\n    const query = `${type}=${name}`;\n    const href = url ? `${url}#${query}` : `${window.location.pathname}?${query}`;\n    const button = document.createElement('a');\n    button.href = href.replace(/#addBookshelf.*/, '');\n    button.innerHTML = `\n        <button style=\"\n            outline: none; \n            position: fixed; \n            top: ${top}%; \n            right: 7%; \n            z-index: 999; \n            border-radius: 15px; \n            color: #166188;\n            border: 0px solid #000;\n            background: #E6F3F5;\n            padding: 4px 6px;\n            box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n        \">\n            <b>${typeButton}</b>\n        </button>\n    `;\n    document.body.appendChild(button);\n}\n\n//样式\nfunction addStyles() {\n    const style = document.createElement('style');\n    style.innerHTML = `\n    .center {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    background: white;\n    z-index: 999;\n    padding: 10px 0;\n    box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n}\n\n        a:link { color: #415E44; }\n        a:visited { color: #8EB28B; }\n        button, select, input {\n            background: #E9F5F3;\n            color: green;\n            font-weight: bold;\n            border-radius: 15px;\n            border: 0px solid #000;\n            padding: 5px 10px;\n            box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n        }\n        \n        /* 悬浮按钮容器 */\n        .float-buttons {\n            position: fixed;\n            right: 10px;\n            bottom: 10px;\n            display: flex;\n            flex-direction: column-reverse;\n            align-items: center;\n            z-index: 999;\n        }\n       \n        /* 主按钮 - 深绿色圆形 */\n        .main-btn {\n            width: 50px;\n            height: 50px;\n            border-radius: 50%;\n            background: #E9F5F3;\n            color: green;\n            border: none;\n            cursor: pointer;\n            box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            font-size: 12px;\n            outline: none;\n            -webkit-tap-highlight-color: transparent;\n            transition: all 0.3s ease;\n            padding: 5px 2px;\n            position: relative;\n        }\n        \n        /* 当前页和总页数颜色区分 */\n        .main-btn .current {\n            color: green;\n            font-weight: bold;\n            margin-bottom: 2px;\n        }\n        \n        .main-btn .total {\n            color: rgba(0, 0, 0, 0.8);\n            font-size: 0.9em;\n            margin-top: 2px;\n        }\n        \n        /* 分割线 */\n        .main-btn .divider {\n            width: 60%;\n            height: 1px;\n            background: green;\n            margin: 3px 0;\n        }\n        \n        /* 功能按钮容器 - 默认隐藏 */\n        .button-group {\n            display: none;\n            flex-direction: column-reverse;\n            align-items: center;\n        }\n        \n        /* 展开时显示 */\n        .expanded .button-group {\n            display: flex;\n        }\n        \n        /* 功能按钮样式 */\n        .func-btn {\n            width: 50px;\n            height: 50px;\n            border-radius: 50%;\n            background: #495057;\n            color: white;\n            border: none;\n            cursor: pointer;\n            box-shadow: 0 2px 6px rgba(0, 0, 0, 0.7);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 18px;\n            outline: none;\n            margin-bottom: 8px;\n        }\n        \n        /* 不同功能按钮颜色 */\n        .func-btn.home { background: #9B5F64; }\n        .func-btn.bottom { background: #8DA371; }\n        .func-btn.top { background: #67749A; }\n        \n        /* 页码控制面板 */\n        .page-control {\n            background: #E9F5F3;\n            color: white;\n            padding: 10px;\n            border-radius: 25px;\n            font-size: 14px;\n            box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            width: 30px;\n            margin-bottom: 8px;\n        }\n        \n        .page-info {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            margin-bottom: 8px;\n            font-size: 12px;\n            line-height: 1.3;\n            position: relative;\n            width: 100%;\n        }\n        \n        /* 控制面板中的分割线 */\n        .page-info .divider {\n            width: 90%;\n            height: 1px;\n            background: green;\n            margin: 4px 0;\n        }\n        \n        /* 控制面板中的页码颜色区分 */\n        .page-info .current-page {\n            color: green;\n            font-weight: bold;\n            font-size: 14px;\n        }\n        \n        .page-info .total-pages {\n            color: rgba(0, 0, 0, 0.6);\n            font-size: 11px;\n        }\n        \n        .page-jump {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            width: 100%;\n        }\n        \n        .page-jump input {\n            width: 30px;\n            padding: 6px;\n            border: none;\n            border-radius: 15px;\n            text-align: center;\n            outline: none;\n            font-size: 12px;\n            margin-bottom: 6px;\n            background: #f8f9fa;\n        }\n        \n        .page-jump button {\n            width: 30px;\n            height: 25px;\n            background: #2b8a3e;\n            color: white;\n            border: none;\n            border-radius: 15px;\n            cursor: pointer;\n            font-size: 12px;\n            transition: background 0.2s;\n        }\n        \n        .page-jump button:hover {\n            background: #2f9e44;\n        }\n        \n        /* 按钮悬停效果 */\n        .main-btn:hover, .func-btn:hover {\n            transform: translateY(-3px);\n            box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25);\n        }\n        \n        /* 按钮点击效果 */\n        .main-btn:active, .func-btn:active {\n            transform: translateY(0);\n        }\n        \n        /* 长页码时的特殊样式 */\n        .long-page .main-btn {\n            font-size: 11px;\n            padding: 3px 1px;\n        }\n        \n        .book {\n            width: 100%;\n            display: flex;\n            flex-direction: column;\n            align-items: flex-start;\n            margin-bottom: 8px;\n        }\n        .bookdes {\n            display: flex;\n            flex-direction: row;\n            margin: 5px;\n            width: 100%;\n            position: relative;\n            align-items: center;\n        }\n        .pic {\n            width: 25vw;\n            margin-right: 20px;\n            align-self: center;\n        }\n        .details {\n            width: 72vw;\n            margin-left: 20px;\n            align-self: center;\n            margin-left: auto;\n        }\n        .pic img {\n            border: 1px solid #C4C4C4;\n            border-radius: 5px;\n            box-shadow: 1px 2px 2px black;\n            width: 97%;\n            height: auto;\n        }\n        .name { font-size: 20px; color: #000; }\n        .author {\n            font-size: 15px;\n            display: inline-block;\n            position: absolute;\n            right: 8px;\n        }\n        .tag { font-size: 12px; margin-top: -10px; }\n        #loading {\n            background: rgba(0,0,0,0.1);\n            margin: 10px 0;\n        }\n    `;\n    document.head.appendChild(style);\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUi": "[\n    {\n        \"name\": \"🖨打印标签\",\n        \"type\": \"button\",\n        \"action\": \"getTag()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,        \n            \"layout_flexBasisPercent\": 0.25   \n        }\n    },\n    {\n        \"name\": \"❌删除标签，使用源变量的标签信息\",\n        \"type\": \"button\",\n        \"action\": \"clearTag()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,              \n            \"layout_flexBasisPercent\": 0.6\n        }\n    },\n    {\n        \"name\": \"☕️支持源作者\",\n        \"type\": \"button\",\n        \"action\": \"toThank()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,     \n            \"layout_flexBasisPercent\": 1\n        }\n    }\n]",
    "loginUrl": "function getTag(){\n\t   java.longToast(\"打印中...请稍候...\");\n     let \tlocal = java.webView(null,\"https://m.jjwxc.net/assort#\",\"localStorage.getItem('setTag')?localStorage.getItem('setTag'):''\");  \n    let msg = `\\n------这是源变量里的标签----\\n${source.getVariable()}\\n------这是网页里的标签------\\n${local}`\n    \tjava.log(msg);\n   \tjava.longToast(\"请查看日志查看标签，可复制用来备份\");\n\t}\n\t\nfunction clearTag(){\n\t   java.longToast(\"删除中...请稍候...\");\n     let \tlocal = java.webView(\"<script>localStorage.setItem('setTag','')</script>\",\"https://m.jjwxc.net/assort#\",null);     \t\n   \tjava.longToast(\"已删除网页保存标签\");\n\t}\nfunction toThank(){\n\tjava.startBrowser(\"data:text/html;base64,PGltZyBzdHlsZT0id2lkdGg6MTAwJSIgc3JjPSJhYm91dDpibGFuayIgb25lcnJvcj0idGhpcy5zcmM9YXRvYignYUhSMGNITTZMeTluYVhSbFpTNWpiMjB2WjNWaGJtVnlNREF4TVRJMUwySnZiMnR6YjNWeVkyVXZjbUYzTDIxaGMzUmxjaThsUlRVbE9VSWxRa1VsUlRjbE9Ea2xPRGN2WjNWaGJtVnlMbmRsWW5BPScpIj4KCg==\",\"感谢你的支持\");\t\n\t}",
    "shouldOverrideUrlLoading": "if(/[\\?#&]book[AN]/.test(url)){\n\ttitle = url.match(/[\\?#&]book[AN].+?=(.*)/)[1];\n\tURLDecoder = Packages.java.net.URLDecoder;\n\tgb2312Str = URLDecoder.decode(title,\"gbk\");\n utf8Str = URLDecoder.decode(title,\"utf-8\");\n\t result = gb2312Str.length() >= utf8Str.length();\n\t title = result?decodeURI(title):gb2312Str;\n\t java.searchBook(title);\n\t result = true\n\t}",
    "singleUrl": true,
    "sourceComment": "❗️保存标签，在网页里生成标签后保存标签。\n❗️删除标签，在网页里编辑标签，把文字删了，点保存。\n◎网页保存的标签信息消失情况：清除webView或清除应用缓存。\n◎源变量消失情况：对源URL进行了更改。\n◎当网页保存的标签信息和源变量两者都消失时，你的标签信息就会消失。\n◎每次点进网页会同步二者。\n\n❗️【编辑订阅源->右上角三点->设置源变量】里有保存的标签，可以复制下来，给其他设备使用。\n\n❗️利用源变量更新标签：\n方法一：前面加上🔼符号将复制的所有标签保存到源变量，\n如：🔼标签1@xxxxx#标签2@xxxxx#标签2@xxxxx#\n\n方法二：将复制的所有标签保存到源变量后【右上角三点->登录->删除标签】",
    "sourceGroup": "阅读",
    "sourceIcon": "https://m-static.jjwxc.net/images/wap/logo.png",
    "sourceName": "📖\n精确搜索",
    "sourceUrl": "https://m.jjwxc.net/assort#@js:\ntry{\n\t   java.longToast(\"加载中...请稍候...\");\n    let wo= String(source.getVariable());     \n    let script=`<script>\n    let wo= \\`${wo}\\`;\n    let iswo = /^🔼.*?@.*?#/.test(wo);\n    let temp = localStorage.getItem('setTag');    \n    let istemp =  /.*?@.*?#/.test(temp);\n    let saveTag = wo.replace(/^🔼/,'');\n    if(istemp)saveTag=temp;\n    if(iswo)saveTag=wo.replace(/^🔼/,'');\n  \t localStorage.setItem('setTag',saveTag);\n  \t saveTag = localStorage.getItem('setTag'); \n  \t </script>`;\n  \t let saveTag =java.webView(script,\"https://m.jjwxc.net/assort#\",\"saveTag\");\t \n   source.setVariable(saveTag);\n}catch(e){\n   \tjava.log(\"我是错误：\"+e)\n};\nresult",
    "variableComment": "\n想利用源变量更新标签请在最前面加上符号🔼或者点击【登录】里的删除标签\n\n如\n🔼新名字@xxxxx#我的标签@xxxxx#我的标签@xxxxx#\n\n"
  },
  {
    "articleStyle": 1,
    "customOrder": 27,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n\"Content-Type\": \"application/x-www-form-urlencoded;charset=utf-8\"\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUrl": "https://www.lofter.com/",
    "ruleArticles": "<js>result.replace(/null/g,'')</js>\n$.response.items[*]||$.response.posts[*]||$.data.blogs[*]\n<js>\na=result;\nbaseUrl.match(/newsearch/)?result=\"[{post:{title:'右上角三点，设置源变量确认搜索'}}]\":result=result;\nsource.getVariable()!=''?result=a:result=result\n</js>\n$.[*]",
    "ruleContent": "<js>\ncontent = String(java.getString(\"$..content\"));\nimgs = eval(String(java.getString(\"$..photoLinks\")));\nlet embed,img_height,img_width,video_first_img\ntry{\nembed = java.getString(\"$.response.posts[0].post.embed\")??\"{x:1}\";\nimg_height = java.getString(\"$.img_height\", embed);\nimg_width = java.getString(\"$.img_width\", embed);\nvideo_first_img = java.getString(\"$.video_first_img\", embed);\n}catch(e){\n\tjava.log(e)\n\t}\n// 获取视频URL\nlet videoUrl = /video_down_url\\\\\":\\\\\"(.*?)\\\\\"/.test(result) ? String(result).match(/video_down_url\\\\\":\\\\\"(.*?)\\\\\"/)[1] : \"\";\n\n// 计算视频宽高比\nlet aspectRatio = \"56.25%\"; // 默认16:9\nif (img_width && img_height) {\n    const width = parseInt(img_width);\n    const height = parseInt(img_height);\n    if (width > 0 && height > 0) {\n        aspectRatio = `${(height / width) * 100}%`;\n    }\n}\n\n// 视频容器 - 使用提供的预览图\nvideo = videoUrl ? `\n<div class=\"video-container\" data-video-url=\"${videoUrl}\" style=\"padding-bottom: ${aspectRatio}\">\n    ${video_first_img ? `\n    <div class=\"video-thumbnail\" onclick=\"playVideo(this)\">\n        <img src=\"${video_first_img}\" loading=\"lazy\" style=\"width: 100%; height: 100%; object-fit: cover;\">\n        <div class=\"play-button\">▶</div>\n    </div>\n    ` : ''}\n    <iframe src=\"${videoUrl}\" frameborder=\"0\" allowfullscreen style=\"display: none;\"></iframe>\n</div>` : \"\";\n\n// 处理图片\nimg = \"\";\nif(imgs) {\n    imgs.forEach(x => {\n        if(x) {\n            img += `<div class=\"image-container\">\n                <img src=\"${x.orign.replace(/%7C.*/g, '')}\" loading=\"lazy\">\n            </div>\\n`;\n        }\n    });\n}\n\n// 处理内容中的<p>标签\ncontent = content.replace(/<p[^>]*>\\s* * *<\\/p>/g, '').replace(/\\s{2,}/g,'').replace(/title=\"\"[^>]+|style=\"[^\"]+\"/g,'/').replace(/(<img([^>]+)>)/g,'<div class=\"image-container\">$1</div>');\ncontent = content.replace(/<p[^>]*>/g, '<p>'); // 移除p标签中的所有属性\n\n// 组合结果\nresult = `\n<title>{{$..title||$..content##</*p[^>]*>|\\s}}</title>\n${\"{{$..title}}\"?'<h3 class=\"title-card\">{{$..title}}</h3>':\"\"}\n<div class=\"post-container\">\n    <div class=\"post-content\">\n        ${content}\n    </div>\n    ${img}\n    ${video}\n</div>\n\n<script>\n// 播放视频函数\nfunction playVideo(element) {\n    const container = element.closest('.video-container');\n    const iframe = container.querySelector('iframe');\n    \n    // 显示iframe并隐藏缩略图\n    iframe.style.display = 'block';\n    element.style.display = 'none';\n    \n    // 自动播放（可能需要用户交互后才能工作）\n    try {\n        iframe.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*');\n    } catch(e) {\n        console.log('自动播放失败:', e);\n    }\n}\n</script>\n`;\n\nif(result.trim() === \"<div class=\\\"post-container\\\">\\n    <div class=\\\"post-content\\\">\\n        \\n    </div>\\n    \\n    \\n</div>\") {\n    result = \"{{$..msg}}\";\n}\n\nresult;\n\n\n</js>\n##tbc\\.##<br>&lrm;<br>",
    "ruleDescription": "@js:\nif(/newsearch\\/blog.json/.test(baseUrl)){\n    result = `\n    <title>{{$.blogNickName}}</title>\n    <div class=\"user-profile-card\">\n        <div class=\"user-header\">\n            <img src=\"{{$.bigAvaImg}}\" class=\"user-avatar\">\n            <div class=\"user-meta\">\n                <h2 class=\"username\">{{$.blogNickName}}</h2>\n                <p class=\"user-bio\">${java.getString(\"$.selfIntro\")}</p>\n            </div>\n        </div>\n        \n        <div class=\"copy-section\">\n            <div class=\"copy-content\" id=\"copyContent\">\n{{$.blogNickName}}::http://api.lofter.com/v2.0/blogHomePage.api?product=lofter-android-6.9.2,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={{$.blogName}}.lofter.com&offset={\\{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}\n            </div>\n            <button class=\"copy-btn\" onclick=\"handleCopy()\">\n                <span class=\"copy-icon\">⎘</span>\n                <span class=\"copy-text\">一键复制后粘贴到分类URL</span>\n            </button>\n            <div class=\"copy-feedback\" id=\"copyFeedback\"></div>\n        </div>\n    </div>\n\n    <style>\n        .user-profile-card{\n            max-width: 600px;\n            margin: 0 auto;\n            padding: 25px;\n            background: white;\n            border-radius: 12px;\n            box-shadow: 0 5px 15px rgba(0,0,0,0.08);\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n        }\n      \n        .user-header {\n            display: flex;\n            align-items: flex-start;\n            margin-bottom: 20px;\n        padding: 15px;\n        background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);\n        border-radius: 10px;\n        box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n        }\n        \n        .user-avatar {\n            width: 70px;\n            height: 70px;\n            border-radius: 50%;\n            object-fit: cover;\n            border: 3px solid white;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.1);\n        }\n        \n        .user-meta {\n            margin-left: 18px;\n            flex: 1;\n        }\n        \n        .username {\n            margin: 0 0 5px;\n            color: #333;\n            font-size: 20px;\n            font-weight: 600;\n        }\n        \n        .user-bio {\n            margin: 0;\n            color: #666;\n            font-size: 15px;\n            line-height: 1.5;\n        }\n        \n        .copy-section {\n            margin-top: 25px;\n        }\n        \n        .copy-content {\n            padding: 15px;\n            background: #f8f9fa;\n            border-radius: 8px;\n            border: 1px solid #eaeaea;\n            font-family: 'Courier New', monospace;\n            font-size: 14px;\n            line-height: 1.5;\n            word-break: break-all;\n            white-space: pre-wrap;\n            margin-bottom: 15px;\n            max-height: 200px;\n            overflow-y: auto;\n        }\n        \n        .copy-btn {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            padding: 12px 24px;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            border: none;\n            border-radius: 8px;\n            font-size: 15px;\n            font-weight: 500;\n            cursor: pointer;\n            transition: all 0.3s;\n            width: 100%;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n        }\n        \n        .copy-btn:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 5px 10px rgba(0,0,0,0.15);\n            background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);\n        }\n        \n        .copy-icon {\n            font-size: 18px;\n            margin-right: 8px;\n        }\n        \n        .copy-feedback {\n            height: 20px;\n            margin-top: 12px;\n            text-align: center;\n            font-size: 14px;\n            transition: all 0.3s;\n        }\n        \n        @media (max-width: 600px) {\n            .user-profile-card {\n                padding: 18px;\n                border-radius: 0;\n            }\n            \n            .user-header {\n                flex-direction: column;\n                align-items: center;\n                text-align: center;\n            }\n            \n            .user-meta {\n                margin-left: 0;\n                margin-top: 15px;\n            }\n            \n            .copy-content {\n                font-size: 13px;\n                padding: 12px;\n            }\n            \n            .copy-btn {\n                padding: 10px 15px;\n                font-size: 14px;\n            }\n        }\n    </style>\n\n    <script>\n        function handleCopy() {\n            const content = document.getElementById('copyContent');\n            const feedback = document.getElementById('copyFeedback');\n            \n            // 创建范围并选择文本\n            const range = document.createRange();\n            range.selectNode(content);\n            window.getSelection().removeAllRanges();\n            window.getSelection().addRange(range);\n            \n            try {\n                // 执行复制命令\n                const successful = document.execCommand('copy');\n                if(successful) {\n                    feedback.textContent = '复制成功！';\n                    feedback.style.color = '#4CAF50';\n                } else {\n                    feedback.textContent = '复制失败，请手动选择文本';\n                    feedback.style.color = '#F44336';\n                }\n            } catch(err) {\n                feedback.textContent = '复制错误: ' + err;\n                feedback.style.color = '#F44336';\n            }\n            \n            // 清除选择\n            window.getSelection().removeAllRanges();\n            \n            // 3秒后隐藏反馈\n            setTimeout(() => {\n                feedback.textContent = '';\n            }, 3000);\n        }\n    </script>\n    `;\n} else {\n    result = \"\";\n}\nresult\n",
    "ruleImage": "$.post.firstImageUrl||$.bigAvaImg##(http.*?(?:png|jpg))##$1###",
    "ruleLink": "@js:\nurl='{{$.post.blogId||$.blogId}}';\nid='{{$.post.id}}';\nif(url.match(/_blogid_\\d+/)){\nmain=url.match(/(_blogid_.*?)\\//)[1];\nbody=\"blogdomain=\"+main+\"&postid=\"+id;\nresult='https://api.lofter.com/oldapi/post/detail.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\n}else{\tresult=\"https://api.lofter.com/oldapi/post/detail.api?product=lofter-android-7.4.4\";\noption ={\"method\":\"POST\",\"body\":\"blogdomain=_blogid_\"+url+\".lofter.com&postid=\"+id}\nresult+\",\"+JSON.stringify(option)\n\t}",
    "ruleNextPage": "page",
    "rulePubDate": "$.post.publishTime\n@js:a=result?java.timeFormat(parseInt(result)):'';\na+\"  {{$.post.tag##,##🏷}}\"",
    "ruleTitle": "$.post.title||$.post.digest||$.blogNiceName||$.blogNickName\n<js>\na=result.replace(/^(.{0,15})/,'$1').replace(/<.*?>/g,'');\njava.put('text',a);\na</js>",
    "singleUrl": false,
    "sortUrl": "🏷标签→::/\ngl推文::https://api.lofter.com/oldapi/tagPosts.api?product=lofter-android-6.13.0&method=newTagSearch&offset={{(page-1) *22}}&limit=22&firstpermalink=null&tag=gl推文&type=new,{\"method\": \"POST\",\"body\":\"null\"}\n短视频::https://api.lofter.com/oldapi/tagPosts.api?product=lofter-android-6.11.3&method=newTagSearch&offset={{(page-1) *22}}&limit=22&firstpermalink=null&tag=短视频&type=new,{\"method\": \"POST\",\"body\":\"null\"}\ngl推文::https://api.lofter.com/oldapi/tagPosts.api?product=lofter-android-6.13.0&method=newTagSearch&offset={{(page-1) *22}}&limit=22&firstpermalink=null&tag=gl推文&type=new,{\"method\": \"POST\",\"body\":\"null\"}\n百合推文::https://api.lofter.com/oldapi/tagPosts.api?product=lofter-android-6.13.0&method=newTagSearch&offset={{(page-1) *18}}&limit=22&firstpermalink=null&tag=百合推文&type=new,{\"method\": \"POST\",\"body\":\"null\"}\n👤用户→::https://api.lofter.com/newsearch/blog.json?key={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的用户</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&limit=18&offset={{(page-1)*18}}\n\n我们都爱画电影::http://api.lofter.com/v2.0/\nblogHomePage.api?product=lofter-android-6.9.2,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=drawingmovie.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}\n\n砂上雪::http://api.lofter.com/v2.0/blogHomePage.api?product=lofter-android-6.9.2,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=taste-s.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}",
    "sourceComment": "下拉【👤用户】或刷新【👤用户】分类搜索用户",
    "sourceGroup": "阅读",
    "sourceIcon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/af/c2/00/afc200a4-978b-193a-a749-2151041ef09e/AppIcon-1x_U007ephone-0-0-0-85-220-0.png/492x0w.webp",
    "sourceName": "📖\nLofter",
    "sourceUrl": "Lofter",
    "style": ".post-container {\n        max-width: 800px;\n        margin: 0 auto;\n        padding: 20px;\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n        line-height: 1.6;\n        color: #333;\n    }\n    .title-card{\n    \tbackground-color: #f5f5f5;\n    padding: 12px 20px;\n    border-radius: 8px;\n    text-align: center;\n    margin: 5px auto;\n    max-width: 80%;\n    box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n    \t}\n    .post-content {\n        margin-bottom: 20px;\n    }\n    \n    .post-content p {\n        margin: 0 0 10px 0;\n        text-indent:1.7em;\n        word-break: break-word;\n    }\n    \n    .image-container {\n        margin: 15px 0;\n        text-align: center;\n    }\n    \n    .image-container img {\n        max-width: 100%;\n        height: auto;\n        border-radius: 8px;\n        box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n    }\n    \n    /* 视频容器样式 */\n    .video-container {\n        position: relative;\n        margin: 20px 0;\n        border-radius: 8px;\n        background: #000;\n        overflow: hidden;\n        cursor: pointer;\n    }\n    \n    /* 视频缩略图样式 */\n    .video-thumbnail {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n    }\n    \n    /* 播放按钮样式 */\n    .play-button {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        width: 60px;\n        height: 60px;\n        background-color: rgba(255, 0, 0, 0.8);\n        border-radius: 50%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        color: white;\n        font-size: 24px;\n        opacity: 0.9;\n        transition: all 0.3s;\n    }\n    \n    .video-thumbnail:hover .play-button {\n        opacity: 1;\n        transform: translate(-50%, -50%) scale(1.1);\n    }\n    \n    .video-container iframe {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        border: none;\n    }\n    \n    @media (max-width: 600px) {\n        .post-container {\n            padding: 15px;\n        }\n        \n        .play-button {\n            width: 50px;\n            height: 50px;\n            font-size: 20px;\n        }\n    }"
  },
  {
    "articleStyle": 2,
    "contentWhitelist": "",
    "customOrder": 29,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Linux; Android 8.1.0; JKM-AL00b Build/HUAWEIJKM-AL00b; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044807 Mobile Safari/537.36\"\n}",
    "injectJs": "// 获取书籍链接\nif(String(window.location.href).match(/novel-(\\d+)/)){\nbookid = String(window.location.href).match(/novel-(\\d+)/)[1];\n\t\n\tbooksrc = \"https://www.gongzicp.com/webapi/novel/novelInfo?id=\"+bookid;\n\t\n\taddbook = `legado://import/addToBookshelf?src=${encodeURIComponent(booksrc)},{origin:'https://webapi.gongzicp.com'}`;\n\t\n fetch(booksrc)\n  .then((response) => response.json())\n  .then((data) =>{\n  \ttitle = data.data.novel_name\n  \t\n  \t//获取作者名称\nauthor = data.data.author_nickname;\n\n//create(搜索的内容,\"bookName or bookAuthor\",距离顶部距离,[跳转其他url])\ncreate(title,\"addBookshelf\",14,addbook);\ncreate(title,\"bookName\",18)\ncreate(author,\"bookAuthor\",22)\n\n  \t\n  \t});\nfunction create(name,type,top,url){\n \t    type = type+\"=\"+name;\n \t    url = url!=undefined?url+\"#\"+type:\"\";\n \t    \n     let \ttypebutton;\n     if(/bookName/.test(type)){\n     \t    typebutton=\"搜索书名\"\n     \t}else if(/bookAuthor/.test(type)){\n     \t\t   typebutton=\"搜索作者\"\n     \t}else{\n     \t\t\t   typebutton=\"加入书架\"\n     \t}\n    \n    \tlet Url = location.search!=\"\"?location.search.replace(/&*book[AN].*?=.*/,'')+\"&\"+type:window.location.pathname+\"?\"+type;\n    \turl = url!=\"\"?url:Url;\n    \tA = document.createElement(\"a\");\n\t\t A.href = url.replace(/#addBookshelf.*/,'');\n\t\tA.classList.add(\"add-shelf\");\n\t\tA.innerHTML = `<button style=\"outline:none; position:fixed; top:${top}%; right:7%; z-index:999; border-radius:5px; color:#166188;background:#fff;padding:4px;border:1px solid #000\"><b>${typebutton}</b></button>`;\n    \tdocument.body.appendChild(A);\n \t}\t\n \t\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "ruleArticles": "$.data.list[*]",
    "ruleContent": "",
    "ruleImage": "$.collection_cover##\\?.*",
    "ruleLink": "https://m.gongzicp.com/home/bookView-{{$.collection_id}}.html",
    "ruleNextPage": "<js>\nif(/getList/.test(baseUrl)){\n\tresult = \"https://m.gongzicp.com/webapi/book/getList?type=3&pre={{$.data.pre}}&bid=0\"\n\t}else{\n\t\tresult = baseUrl.replace(/page=\\d+/,\"page=\"+(Number(baseUrl.match(/page=(\\d+)/)[1])+1));\n\t\t\n\t\t\t}\n\t\t\n</js>",
    "rulePubDate": "{{$.category}}•{{$.collection_list_count}}本•{{$.collection_intro}}",
    "ruleTitle": "$.collection_name",
    "shouldOverrideUrlLoading": "if(/[\\?#&]book[AN]/.test(url)){\n\ttitle = url.match(/[\\?#&]book[AN].+?=(.*)/)[1];\n\tURLDecoder = Packages.java.net.URLDecoder;\n\tgb2312Str = URLDecoder.decode(title,\"gbk\");\n utf8Str = URLDecoder.decode(title,\"utf-8\");\n\t result = gb2312Str.length() >= utf8Str.length();\n\t title = result?decodeURI(title):gb2312Str;\n\tjava.searchBook(title);\n\tresult =true\n\t}",
    "singleUrl": false,
    "sortUrl": "最新书单::https://m.gongzicp.com/webapi/book/getList?type=3&pre=0&bid=0\n热门书单::https://m.gongzicp.com/webapi/book/getList?type=2&pre=0&bid=0\n推荐书单::https://m.gongzicp.com/webapi/book/getList?type=1&pre=0&bid=0\n搜索书单::https://m.gongzicp.com/webapi/search/books?k={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的内容</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&page=1",
    "sourceComment": "设置源变量搜索书单",
    "sourceGroup": "阅读",
    "sourceIcon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/d5/10/73/d51073df-ab74-047a-42ed-31d9aa378ce0/AppIcon-0-0-1x_U007emarketing-0-8-0-0-85-220.png/492x0w.webp",
    "sourceName": " 📖\n长佩书单",
    "sourceUrl": "长佩书单",
    "style": ""
  },
  {
    "articleStyle": 0,
    "concurrentRate": "2000",
    "customOrder": 30,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n  \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36\"\n}",
    "injectJs": "// 获取基础元素\nvar baseUrl = window.location.href;\nif(/start=\\d+/.test(baseUrl) && !/page=1/.test(baseUrl)){\nvar title = document.querySelector('.article > h1');\ntitle = title ? title.outerHTML : '';\nvar topicDoc = document.querySelector('.topic-doc');\ntopicDoc = topicDoc ? topicDoc.outerHTML : '';\n\n// 获取最赞回应\nvar popularCommentsElements = document.querySelectorAll('#popular-comments .bg-img-green, #popular-comments .reply-quote .short, #popular-comments .comment-photos, #popular-comments .reply-content');\nvar popularComments = '';\nfor (var i = 0; i < popularCommentsElements.length; i++) {\n  popularComments += popularCommentsElements[i].outerHTML;\n}\n\n// 获取普通回应\nvar commentsElements = document.querySelectorAll('#comments .bg-img-green, #comments .reply-quote .short, #comments .comment-photos, #comments .reply-content');\nvar comments = '';\nfor (var j = 0; j < commentsElements.length; j++) {\n  comments += commentsElements[j].outerHTML;\n}\n\n// 获取分页器\nvar paginator = document.querySelector('.paginator');\npaginator = paginator ? paginator.outerHTML : '';\n\n// 构建新的HTML结构\nvar result = ''\n  + '<a href=\"' + baseUrl + '&page=1\">原文地址</a>'\n  + title\n  + topicDoc\n  + '<br><hr><h3>最赞回应：</h3>'\n  + popularComments\n  + '<br><hr><h3>回应：</h3>'\n  + comments\n  + paginator;\n\n// 应用内容处理规则\nif(baseUrl.match(/topic/)){\n  result = result\n    .replace(/[\\s\\S]+?◎◎◎◎◎◎◎/, '')\n    .replace(/style=\".*?\"|raw-style=\".*?\"/g, '')\n    .replace(/<div class=\"cmt-img\" >([\\s\\S]+?)<\\/div>/g, '<details><summary>查看图片</summary>$1</details>')\n    .replace(/<img/g, '<br><img')\n    .replace(/<h3>最赞回应：<\\/h3>\\s*<br><hr><h3>回应：<\\/h3>/, '');\n} else {\n  result = result.replace(/◎◎◎◎◎◎◎[\\s\\S]+/, '');\n}\n\n// 添加样式\nvar style = document.createElement('style');\nstyle.textContent = `\n.tag,a{\n  color:green;\n  text-decoration:none\n}\nimg,video{\n  width:100%;\n  height:auto\n}\nsummary{\n  color:red\n}\n.short{\n  color:#888;\n  margin-left:5px;\n  padding-left:5px;\n  border-left:2px solid green;\n}\nh3{\n  font-size:16px\n}\nh1{\n  font-size:20px\n}\n.topic-card{\n  background-color:#eee;\n  width:100%;\n  height:150px;\n  border:1px solid #ddd;\n}\n.topic-card .group-avatar img{\n  width:5%;\n  float:left\n}\n.topic-cover img{\n  width:20%;\n  float:right\n}\n.topic-bd,.group-avatar{\n  margin:0px 8px 0px 8px\n}\np{\n  text-indent:1.8em;\n  line-height:1.8em;\n}\n.bg-img-green{\n  border-top:1px solid #ddd\n}\nh4 .pubtime{\n  font-size:13px;\n  color:#666\n}\n`;\n\n// 返回处理后的结果\ndocument.documentElement.innerHTML = '<!DOCTYPE html><html><head>' + style.outerHTML + '</head><body>' + result + '</body></html>';\n}",
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "loginUrl": "https://www.douban.com",
    "ruleArticles": "class.olt@tr[!0:5]||class.result||tag.div.1",
    "ruleContent": "<js>\nresult = result.replace(\n  /<div class=\"rich-content topic-richtext\">([\\s\\S]+?)<\\/div>/g,\n  function(match, innerContent) {\n    var modifiedContent = innerContent.replace(/\\n+/g, \"</p><p data-align=\\\"left\\\">\");  \n    return `<div class=\"rich-content topic-richtext\">${modifiedContent}</div>`;\n  }\n);\njava.setContent(result);\n</js>\n<button onclick=\"copy()\">一键复制</button>\n<textarea id=\"copy\" readonly>\n{{java.get('tit')}}::https://www.douban.com/group/{{/group\\/(.*?)\\/$/.test(baseUrl)?baseUrl.match(/group\\/(.*?)\\/$/)[1]:\"\"}}/discussion?start={{\"{\\{(page-1)*25}\\}\"}}\n</textarea>\n<script>\nfunction copy(){\n  var text = document.getElementById('copy');\n    // 选中文本\n    text.select()\n    // 复制\n    document.execCommand('copy')\nalert(\"复制成功，编辑订阅源粘贴至分类url\")\n}\n</script>\n<br><br><br>\n\n<h2>{{java.get('title')}}</h2>\n{{@@class.group-tags@a@html}}\n<br><br>\n{{@@class.group-intro@html}}\n◎◎◎◎◎◎◎\n<a href=\"{{baseUrl}}\">原文地址</a>\n{{@css:.article>h1@html}}\n{{@@class.topic-doc@html}}\n<br><hr><h3>最赞回应：</h3>\n{{@css:#popular-comments .bg-img-green,#popular-comments .reply-quote .short,#popular-comments .comment-photos,#popular-comments .reply-content@html}}\n<br><hr><h3>回应：</h3>\n{{@css:#comments .bg-img-green,#comments .reply-quote .short,#comments .comment-photos,#comments .reply-content@html}}{{@class.paginator@html}}\n<js>\nif(baseUrl.match(/topic/)){\nresult.replace(/[\\s\\S]+?◎◎◎◎◎◎◎/,'').replace(/style=\".*?\"|raw-style=\".*?\"/g,'').replace(/<div class=\"cmt-img\" >([\\s\\S]+?)<\\/div>/g,'<details><summary>查看图片</summary>$1</details>').replace(/<img/g,'<br><img').replace(/<h3>最赞回应：<\\/h3>\\s*<br><hr><h3>回应：<\\/h3>/,'')\n}else if(/你的账号存在安全隐患/.test(src)){\n\tresult = \"请登录后再试\"\n\t}else{\nresult.replace(/◎◎◎◎◎◎◎[\\s\\S]+/,'')\n}\n</js>",
    "ruleImage": "img@src",
    "ruleLink": "tag.a.0@href",
    "ruleNextPage": "@js:\n\tif(!/有异常请求从你的 IP 发出/.test(result)){\n\tlet start = Number(baseUrl.match(/start=(\\d+)/)[1])+25;\n\tresult = baseUrl.replace(/start=\\d+/g,'start='+start);\n}",
    "rulePubDate": "回复:{{@@class.r-count @text}}    时间:{{@@class.time@text}}{{@@class.info@text}}##回复:    时间:",
    "ruleTitle": "class.title@a@title||h3@text||tag.div@text@js:java.put(\"tit\",result)",
    "singleUrl": false,
    "sortUrl": "GL百合小说研究所::https://www.douban.com/group/645360/discussion?start=0\n图片素材社::https://www.douban.com/group/lina0305/discussion?start=0\n小说打分器::https://www.douban.com/group/658662/discussion?start=0\n小说推荐::https://www.douban.com/group/196238/discussion?start=0\n善意的竞争::https://www.douban.com/group/751019/discussion?start=0\n\n种花后花园II百合区吃瓜组::https://www.douban.com/group/721670/discussion?start=0\n\n搜索小组::https://www.douban.com/group/search?cat=1019&q={{svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的小组</text></svg>`));if(page==1){let a=\"\";try{a=java.getVerificationCode('data:image/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()}source.setVariable(a);a}else{source.getVariable()};}}&start=0",
    "sourceComment": "访问频繁\n需登录",
    "sourceGroup": "阅读",
    "sourceIcon": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/29/35/d1/2935d132-6fdc-042d-31e2-94d6a9098d24/AppIcon-0-0-1x_U007emarketing-0-7-0-85-220.png/492x0w.webp",
    "sourceName": " 📖\n豆瓣小组",
    "sourceUrl": "豆瓣小组",
    "style": "textarea{\nwidth:100%;\nheight:50px\n}\n.group-intro{\nbackground-color:#E5ECEF;\npadding:5px\n}\n.tag{\nbackground-color:#FFD800;\nfont-size:13px;\npadding:1px;\nmargin:0px 3px 8px 0px;\nborder-radius:10px;\n}\n.tag,a{\ncolor:green;\ntext-decoration:none\n}\nimg,video{\nwidth:100%;\nheight:auto\n}\nsummary{\ncolor:red\n}\n.short{\ncolor:#888;\nmargin-left:5px;\npadding-left:5px;\nborder-left:2px solid green;\n}\nh3{\nfont-size:16px\n}\nh1{\nfont-size:20px\n}\n.topic-card{\nbackground-color:#eee;\nwidth:100%;\nheight:150px;\nborder:1px solid #ddd;\n}\n.topic-card .group-avatar img{\nwidth:5%;\nfloat:left\n}\n\n.topic-cover img{\nwidth:20%;\nfloat:right\n}\n.topic-bd,.group-avatar{\nmargin:0px 8px 0px 8px\n}\np{\ntext-indent:1.8em;\nline-height:1.8em;\n}\n.bg-img-green{\nborder-top:1px solid #ddd\n}\nh4 .pubtime{\nfont-size:13px;\ncolor:#666\n}"
  }
]