微博

https://m.weibo.cn#微博整合

分享者: guaner001125 (317)发布时间: 7天前

❗️注意只能使用洛娅橙大佬的改版阅读

需要登录使用

二维码导入
{
    "articleStyle": 0,
    "customOrder": -10098483,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "@js:\nJSON.stringify({\n  \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/128.0.0.0 Safari\/537.36\",\n  \"sec-ch-ua-platform\":\"\\\"Android\\\"\",\n  \"x-requested-with\":\"XMLHttpRequest\",\n  \"mweibo-pwa\":\"1\",\n  \"Referer\":\"https:\/\/m.weibo.cn\"\n  });",
    "injectJs": "var 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];  wrapElement.parentNode.removeChild(wrapElement);\n}\n\nwhile (adWrapElements.length > 0) {\n  var adWrapElement = adWrapElements[0];\n  adWrapElement.parentNode.removeChild(adWrapElement);\n}\n\naaaa = window.location.href;\n\nif(\/\\\/a\\\/\\d+\/.test(aaaa)){\n\twindow.location.href = window.location.href.replace(\/a\/,'detail')\n\t}\n\nif(\/ttarticle\/.test(aaaa)){\n\nfunction styleExtractedContent() {\n  \n  const originalContent = document.querySelector(\".main_editor\").innerHTML.replace(\/style=\"opacity.*?\"|&nbsp;\/g,'').replace(\/<br>\/g,'<br>&emsp;&emsp;');\n  document.body.innerHTML = '';\n  \n  const styledContainer = document.createElement('div');\n  styledContainer.className = 'styled-article'; \n  styledContainer.innerHTML = originalContent;\n  document.body.appendChild(styledContainer);\n  const style = document.createElement('style');\n  style.textContent = `\n    .styled-article {\n      max-width: 800px;\n      margin: 0 auto;\n      padding: 20px;\n      font-family: \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif;\n      line-height: 1.8;\n      color: #333;\n      background: #fff;\n    }\n    \n    .styled-article .title {\n      font-size: 24px;\n      font-weight: bold;\n      margin-bottom: 20px;\n      color: #222;\n      text-align: center;\n      padding-bottom: 10px;\n      border-bottom: 1px solid #eee;\n    }\n    \n    .styled-article .authorinfo {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 20px;\n      padding-bottom: 15px;\n      border-bottom: 1px solid #f5f5f5;\n    }\n    \n    .styled-article .W_face_radius {\n      width: 40px;\n      height: 40px;\n      border-radius: 50%;\n      margin-right: 10px;\n      vertical-align: middle;\n    }\n    \n    .styled-article .author1 a {\n      font-size: 16px;\n      color: #333;\n      text-decoration: none;\n    }\n    \n    .styled-article .time {\n      color: #999;\n      font-size: 14px;\n    }\n    \n    .styled-article .preface_v2 {\n      font-style: italic;\n      color: #666;\n      margin-bottom: 25px;\n      padding: 15px;\n      background: #f9f9f9;\n      border-left: 3px solid #ddd;\n    }\n    \n    .styled-article *[node-type=\"contentBody\"] p {\n      margin-bottom: 25px;\n      text-align: justify;\n      font-size: 16px;\n      color: #222; \n      text-indent: 1.7em; \n    }\n    \n    .styled-article .artical_add_box {\n      margin-top: 40px;\n      padding: 20px;\n      background: #fafafa;\n      border-radius: 8px;\n    }\n    \n    .styled-article .btn_bed a {\n      display: inline-block;\n      padding: 8px 15px;\n      background: #ff8200;\n      color: white;\n      border-radius: 4px;\n      text-decoration: none;\n    }\n    \n    \n    @media (max-width: 600px) {\n      .styled-article {\n        padding: 15px;\n      }\n      \n      .styled-article .title {\n        font-size: 20px;\n      }\n      \n      .styled-article .WB_editor_iframe_new p {\n        font-size: 15px;\n      }\n    }\n  `;\n  \n  document.head.appendChild(style);\n}\n\n\nstyleExtractedContent();\n\n\n\t\n\t\n\t}",
    "jsLib": "function aitoHtml(text) {\n    const {java} = this;\n  \n    text = text.replace(\/<think>[\\s\\S]+?<\\\/think>\/,'');\n    let lines = text.split('<br>').filter(line => line.trim() !== '');\n    let html = '';\n    let currentListType = null;\n    let inTable = false;\n    let tableContent = '';\n    let inBlock = false;\n    let blockType = '';\n    let blockContent = '';\n    \n    \n    for(let i=0;i<lines.length;i++){\n        let line = lines[i];\n        let content=\"\";\n        if(!line)continue;\n             \n        if(line.startsWith('### ')){\n            content = line.replace(\/^### \/g,'');\n            content = `<h3 class=\"ai-h3\">${content}<\/h3>`;\n            html += content\n        }\n        else if(line.startsWith('## ')){\n            content = line.replace(\/^#### \/g,'');\n            content = `<h4 class=\"ai-h4\">${content}<\/h4>`;\n            html += content\n        }\n       else if(\/^(?:\\s*- |● )\/.test(line)){\n        \t    content = line.replace(\/^\\s*- |^● \/g,''); \t    \n        \t    content = `<li class=\"ai-list\">${content}<\/li>`;                         \n            html += content\n        }\n        else if(\/^\\|.*\\|$\/.test(line) && !inTable){\n        \t    inTable = true;\n        \t    tableContent += line +\"\\n\";\n         }\n         else if(inTable){\n             if (line.match(\/^\\|.*\\|$\/)) {\n                tableContent += line + '\\n';\n            } else {\n               \n                html += processTable(tableContent.trim());\n                inTable = false;\n                tableContent = '';\n              \n                i--;\n            }\n            continue;\n         }\n         \n         else if(\/^\\d+\\.\/.test(line)){\n             content = `<p class=\"ai-listp\">${line}<\/p>`;\n             html += content\n         }\n         else{\n                content = line.replace(\/^> \/g,'');\n         \t   content = `<p class=\"ai-content\">${content}<\/p>`;\n                html += content\n         \t}\n        \n    }\n    \nhtml = `<div id=\"ai-body\">${inlineFormat(html)}<\/div>`\nreturn html\n}\n\n\nfunction processTable(content) {\n    const rows = content.split('\\n').filter(row => row.trim());\n    if (rows.length < 2) return `<pre>${content}<\/pre>`;\n    \n    let tableHTML = '<table class=\"data-table\">';\n    \n    rows.forEach((row, index) => {\n        if (row.match(\/^\\|[-:|]+\\|$\/)) return;       \n        const cells = row.split('|').filter(cell => cell.trim() !== '');\n        if (cells.length === 0) return;       \n        if (index === 0) {          \n            tableHTML += '<thead class=\"ai-thead\"><tr class=\"ai-tr\">';\n            cells.forEach(cell => {\n                tableHTML += `<th class=\"ai-th\">${inlineFormat(cell.trim())}<\/th>`;\n            });\n            tableHTML += '<\/tr><\/thead><tbody class=\"ai-tbody\">';\n        } else {\n            \/\/ 表体\n            tableHTML += '<tr class=\"ai-tbody-tr\">';\n            cells.forEach(cell => {\n                tableHTML += `<td class=\"ai-tbody-td\">${inlineFormat(cell.trim())}<\/td>`;\n            });\n            tableHTML += '<\/tr>';\n        }\n    });\n    \n    tableHTML += '<\/tbody><\/table>';\n    return tableHTML;\n}\n\nfunction inlineFormat(text) {\n    \n    let result = text.replace(\/\\*\\*(.*?)\\*\\*\/g, '<strong>$1<\/strong>');\n    \n    result = result.replace(\/```.*?```\/g,'')\n                 .replace(\/<media-block>\/g,'<div class=\"media-block\"><div class=\"media-c\">')\n                 .replace(\/<\\\/media-block>\/g,'<\/div><\/div>')\n                 .replace(\/data-scheme=\".*?mid=(\\d+)[^\"]+\"\/g,`onclick=\"openContent('$1')\"`)\n                 .replace(\/<span class=\"(?:vator|nick|arrow)\"[^>]*?>[^<]*?<\\\/span>\/g,'')\n                 .replace(\/data-width=\\d+ data-height=\\d+\/g,'')\n    return result;\n}\n\nfunction formatTime(dateStr) {\n    const date = new Date(dateStr);\n    const year = date.getFullYear();\n    const month = date.getMonth() + 1; \n    const day = date.getDate();\n    const hours = date.getHours().toString().padStart(2, '0');\n    const minutes = date.getMinutes().toString().padStart(2, '0');\n    \n    return `${year}年${month}月${day}日 ${hours}:${minutes}`;\n}\n\nfunction formatCount(count) {\n  if (count < 10000) return count.toString();  \n  const inWan = (count \/ 10000).toFixed(2);\n  return inWan.endsWith('.00') \n    ? `${inWan.split('.')[0]}万` \n    : `${inWan}万`;\n}\n\nfunction getContent($) {\n    let galleryItems = \"\",\n        videos = \"\";\n        let long_imgs = ($.pic_num ?? 0) ? ($.pics ?? []) : [];\n        let long_video = $.page_info?.type === \"video\" ? $.page_info : {};\n        if (long_imgs.length) {\n           galleryItems = long_imgs.map((img, i) => `\n               <div class=\"gallery-item\">\n               <img src=\"${img.url}\" data-original=\"${img?.large?.url}\" loading=\"lazy\">\n                <div class=\"zoom-icon\">🔍<\/div>\n                <\/div>`).join('');\n           galleryItems = `<div class=\"image-gallery\">${galleryItems}<\/div>`;\n        }\n        if (JSON.stringify(long_video) !== \"{}\") {\n             if (long_video.urls) {\n                  long_video = long_video.urls;\n                  videos = long_video.hevc_mp4_hd || long_video.mp4_720p_mp4 || long_video.mp4_hd_mp4 || long_video.mp4_ld_mp4\n             } else {\n             long_video = long_video.media_info;\n             videos = long_video.stream_url_hd || long_video.stream_url \n        }\n            videos = `<div class=\"media-container\"><video src=\"${videos}\" controls poster=\"${$.page_info.page_pic.url}\"><\/video><\/div>`\n        }\n    return `\n<div class=\"comment-item\">\n<div class=\"comment-user\">\n<img class=\"user-avatar\" src=\"${$?.user?.avatar_hd}\" onclick=\"openUser('${$?.user?.id}')\">\n<div class=\"user-info\">\n<span class=\"user-name\" onclick=\"openUser('${$?.user?.id}')\">${$?.user?.screen_name}<\/span>\n<span class=\"comment-time\">${formatTime($.created_at)}<\/span><\/div>\n<div class=\"like_counts\"><span>♡${formatCount($.attitudes_count)}<\/span><\/div>\n<\/div>\n<div class=\"comment-text\">${$.text.replace(\/https?:\\\/\\\/m.weibo.cn\\\/\\d+\\\/(\\d+)\/g,'https:\/\/m.weibo.cn\/a\/$1').replace(\/'\\\/n\\\/\/g,\"'https:\/\/m.weibo.cn\/n\/\")}<\/div>\n${videos}\n${galleryItems}\n<\/div>`;\n}\n\nfunction liveUrl(href){\n\tconst {java} = this\n\ttry{\r\n\t  let res,id,url,body,stream_info,name;\r\n  \tid = href.match(\/show\\\/(.*)\/)[1];            \r\n\t  url = \"http:\/\/weibo.com\/l\/pc\/anchor\/live?live_id=\"+id;\r\n\t  res = java.connect(url);\r\n\t  body = JSON.parse(String(res.body()));\r\n\t  if(body.error_code===27401)java.toast(\"直播不存在\");\r\n\t  if(body.error_code===0){\r\n\t\t\tstream_info = body.data.item.stream_info;\n\t\t\tif(body.data.item.status === 5)java.toast(\"当前博主可能未开播\");\r\n\t\t\thref = stream_info.replay_url ? stream_info.replay_url.origin : stream_info.pull.live_origin_hls_url;\n\t\t\tname = body.data.item.desc\n   }\r\n\nreturn {\n\t\"url\":href,\n\t\"name\":name\n\t}\n}catch(e){\n\tjava.log(e)\n\t}\n}\n\nfunction replaceLink(str){\n\tconst {java} = this;\n\tlet linkstyle = 'style=\"color:#1E88E5\"';\n\t   return String(str)\n\/\/用户链接\n\n.replace(\/href=['\"][^\"]+?weibo.(?:com|cn)\\\/(u|profile)\\\/(\\d+)['\"]\/g,`onclick='openUser(\"$1\")' ${linkstyle}`)\n.replace(\/href=['\"]([^'\"]+?weibo.(?:com|cn)\\\/n\\\/[^\"']+)['\"]\/g,`onclick='openUser(\"$1\")' ${linkstyle}`)\n\n\/\/话题链接\n\n.replace(\/href=['\"][^\"']+?(?:containerid=(?:231522|100103)type%3D1|s.weibo.com\\\/weibo\\?q=)[^\"']+?%23(.*?)%23[^'\"]*?['\"]\/g, \n    function(match, p1) {\n      \n        if(match.includes('ai.s.weibo.com\/api') || match.includes('m.s.weibo.com\/applink')) {\n            return match;\n        }\n        \n       \n        let decoded = decodeURIComponent(p1);   \n        return `onclick='openUser(\"#${decoded}#\")' ${linkstyle}`;\n    }\n)\n\n\/\/正文链接\n.replace(\/href=['\"][^'\"]*?(?:m\\.weibo\\.cn|weibo\\.com)*\\\/(?:\\d+\\\/\\d+|a|status|detail\\\/\\d+|(?:\\d+|status)\\\/[a-zA-Z\\d]{9,18})[^'\"]*?['\"]\/g,function(match, p1) {\n\t  \n   var match1 = match.match(\/\\\/(\\d+)\\??\"$\/);\r\n\t\tvar match2 = match.match(\/(?:\\d+|status)\\\/([a-zA-Z\\d]{9,13})\\??\/);\n        var id = match1 ? match1[1] : (match2 ? match2[1] : \"\");\n        if(id == \"\" || match.includes('ai.s.weibo.com\/api') || match.includes('m.s.weibo.com\/applink')){\n        \t   return match\n        \t}\n        \tjava.log(match)\n        return `onclick='openContent(\"${id}\")' ${linkstyle}`;\n    })\n\n\/\/超话链接\n.replace(\/href=['\"][^'\"]+?(?:containerid=|\\\/p\\\/)([\\da-z]{30,60})[^'\"]*?['\"]\/g,`onclick='openUser(\"$1\")' ${linkstyle}`);\n\n}\n\n\nfunction getStarHtml(t,id,name,img,intro,desc,other){\n\tconst {source,java} = this;\n\tlet url,openUrl;\n\tif(t === \"users\"){\n\t\t   url = \"https:\/\/m.weibo.cn\/u\/\"+id;\n\t\t   openUrl = \"https:\/\/m.weibo.cn\/api\/container\/getIndex?type=uid&value=\"+id+\"&containerid=107603\"+id+\"&page=1\";\n\t}else if(t === \"topics\"){\n\t\t\turl = `https:\/\/m.weibo.cn\/search?containerid=231522type%3D1%26t%3D10%26q%3D%23${id}%23`;\n\t\t\topenUrl = `https:\/\/m.weibo.cn\/api\/container\/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23${id}%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D${id}&page_type=searchall&page=1`;\n\t}else if(t === \"superTopics\"){\n\t\turl = `https:\/\/m.weibo.cn\/p\/index?containerid=${id}`;\n\t\topenUrl = `https:\/\/m.weibo.cn\/api\/container\/getIndex?containerid=${id}_-_feed&page=1`\n }\n\t\n    let desc1 = desc;\n    if(desc.trim() != \"\"){\n        desc =`<div class=\"star-url-section\">\n            <div class=\"star-url-label\">简介:<\/div>\n            <div class=\"star-url-content\" id=\"starContent\">${desc}<\/div>\n            <div class=\"star-feedback\" id=\"starFeedback\"><\/div>\n        <\/div>`\n    }\n\t\n\treturn `<title>${name}<\/title><div class=\"star-container\">\n        <div class=\"star-header\">\n            <div class=\"star-avatar-section\">\n                <img src=\"${img}\" class=\"star-avatar\">\n            <\/div>\n            <div class=\"star-info\">\n                <div class=\"starname\">${name}<\/div>\n                <div class=\"star-count\">${intro}<\/div>\n                <div class=\"star-tag\">${other}<\/div><br>\n            <\/div>\n        <\/div>\n        \n        <div class=\"star-action-buttons\">\n            <button class=\"star-action-btn\" onclick=\"handleSubscribe()\">\n                <span class=\"star-btn-icon\">👤<\/span>\n                <span>订阅<\/span>\n            <\/button>\n            <button class=\"star-action-btn\" onclick=\"handleShare()\">\n                <span class=\"star-btn-icon\">🔎<\/span>\n                <span>查看<\/span>\n            <\/button>\n            <button class=\"star-action-btn\" onclick=\"handleJump()\">\n                <span class=\"star-btn-icon\">🔗<\/span>\n                <span>原链<\/span>\n            <\/button>\n        <\/div>\n        \n      ${desc}\n    <\/div>\n    \n    <style>\n        .star-container {\n            max-width: 400px;\n            margin: 0 auto;\n            padding: 16px;\n            background: #f8f9fa;\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n            min-height: 100vh;\n        }\n        \n        .star-header {\n            display: flex;\n            align-items: flex-start;\n            margin-bottom: 20px;\n            padding: 16px;\n            background: white;\n            border-radius: 8px;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n        }\n        \n        .star-avatar-section {\n            margin-right: 12px;\n        }\n        \n        .star-avatar {\n            width: 60px;\n            height: 60px;\n            border-radius: 8px;\n            object-fit: cover;\n            border: 2px solid #e0e0e0;\n        }\n        \n        .star-info {\n            flex: 1;\n        }\n        \n        .statname {\n            font-size: 18px;\n            font-weight: 600;\n            color: #8b0000;\n            margin-bottom: 4px;\n        }\n        \n        .star-count {\n            font-size: 14px;\n            color: #666;\n            margin-bottom: 6px;\n        }\n        \n        .star-desc {\n            font-size: 14px;\n            color: #666;\n            line-height: 1.4;\n            margin-bottom: 4px;\n        }\n        \n        .star-tag {\n            font-size: 13px;\n            color: #888;\n            line-height: 1.3;\n        }\n        \n        .star-action-buttons {\n            display: flex;\n            gap: 8px;\n            margin-bottom: 20px;\n        }\n        \n        .star-action-btn {\n            flex: 1;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            padding: 12px 8px;\n            border: 1px solid #e0e0e0;\n            border-radius: 6px;\n            background: white;\n            color: #666;\n            font-size: 13px;\n            cursor: pointer;\n            transition: all 0.2s;\n        }\n        \n        .star-action-btn:hover {\n            background: #f5f5f5;\n            transform: translateY(-1px);\n        }\n        \n        .star-btn-icon {\n            font-size: 20px;\n            margin-bottom: 4px;\n        }\n        \n        .star-url-section {\n            padding: 16px;\n            background: white;\n            border-radius: 8px;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n        }\n        \n        .star-url-label {\n            font-size: 14px;\n            color: #666;\n            margin-bottom: 8px;\n            font-weight: 500;\n        }\n        \n        .star-url-content {\n            padding: 12px;\n            background: #f8f9fa;\n            border: 1px solid #e0e0e0;\n            border-radius: 4px;\n            font-family: 'Courier New', monospace;\n            font-size: 1em;\n            line-height: 1.4;\n            word-break: break-all;\n            white-space: pre-wrap;\n            margin-bottom: 12px;\n        }\n        \n        .star-feedback {\n            height: 18px;\n            text-align: center;\n            font-size: 12px;\n            font-weight: 500;\n            transition: all 0.3s;\n        }\n        \n        @media (max-width: 480px) {\n            .container {\n                padding: 12px;\n            }\n            \n            .star-header {\n                padding: 12px;\n            }\n            \n            .star-action-btn {\n                padding: 10px 6px;\n                font-size: 12px;\n            }\n            \n            .star-btn-icon {\n                font-size: 18px;\n            }\n        }\n    <\/style>\n    \n    <script>\n        function handleSubscribe() {\n            const feedback = document.getElementById('starFeedback');\n            try {\n                let u = {\n                    \"id\":\"${id}\",\n                    \"name\":\"${name}\",\n                    \"desc\":\\`${intro} ${other} ${desc1}\\`,\n                    \"avatar\":\"${img}\"\n                   };\n                let jsonData = JSON.parse(source.getVariable() || '{\"users\":[],\"topics\":[],\"superTopics\":[]}');\n                let existingUser = jsonData[\"${t}\"].find(user => String(user.id) === \"${id}\");\n    if (!existingUser) {\n        jsonData[\"${t}\"].push(u);\n        source.putVariable(JSON.stringify(jsonData))\n    }\n                \n                java.toast(\"订阅成功\");\n                 feedback.textContent = '订阅成功!';\n                feedback.style.color = '#4CAF50';\n                setTimeout(() => feedback.textContent = '', 2000);\n            } catch(err) {\n                \n                feedback.textContent = '订阅失败';\n                feedback.style.color = '#F44336';\n                setTimeout(() => feedback.textContent = '', 2000);\n            }\n        }\n        \n        function handleJump() {\n            window.open(\"${url}\");\n        }\n        \n        function handleShare() {          \n            window.openUi(\"sort\",{\"${name}\":\"${openUrl}\"})\n        }\n    <\/script>\n    `;\n\t\n\t}",
    "lastUpdateTime": 1764153277005,
    "loadWithBaseUrl": true,
    "loginUrl": "https:\/\/m.weibo.cn",
    "preload": false,
    "ruleArticles": "<js>\nif(java.getString(\"$.errno||$.ok\")==\"-100\"){\n\tlet url = java.getString(\"$.url\");\n\tjava.startBrowser(url,\"验证\");\n\tjava.toast(\"登录验证后请刷新列表\");\n\t}\nif(result ==\"\"){\t\n\tjava.startBrowser(\"https:\/\/m.weibo.cn\",\"登录\");\n\tjava.toast(\"登录验证后请刷新列表\");\n\t}\t\nif(!\/source.get\\(\"currentSearch\"\\)\/.test(baseUrl)){\n\tsource.put(\"currentSearch\",baseUrl);\n\t}\n\nresult\n<\/js>\n$.data.cards[*].card_group[*].users[*]&&data.cards[*].card_group[*]&&data.cards[*]&&$.data.statuses[*]",
    "ruleContent": "@js:\nlet jsLib = String(source.jsLib);\nif (\/huati\/.test(baseUrl)) {\n    let huati = java.hexDecodeToString(src);\n    result = `<title>刷新跳转【${huati}】<\/title><script>\n    setTimeout(function() {\n    window.openUi(\"sort\", {\"💬${huati}\":\"${encodeURI(\"https:\/\/m.weibo.cn\/api\/container\/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23\"+huati+\"%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D\"+huati+\"&page_type=searchall&page=1\")}\"});\n    window.close()\n},8);\n<\/script>`;\n}else if(\/aisearch\/.test(baseUrl)){\n\tlet aiKey = String(java.hexDecodeToString(result)).split(\"❌\");\n\tlet q = aiKey[0];\n\tlet page_id = aiKey[1];\n\theader = {\n\t\t\"Referer\":\"https:\/\/m.s.weibo.com\/\"\n\t\t}\n let body = \"query=\"+q+\"&content_type=loop&request_id=\"+Date.now()+\"&request_time=\"+Date.now()+\"&search_source=default_init&sid=h5_ai_share&page_id=\"+page_id+\"&vstyle=1&cot=1&loop_num=1&query_id=\";\n \n\tlet aiUrl = `https:\/\/ai.s.weibo.com\/api\/wis\/show.json,{\"method\":\"POST\",\"body\":\"${body}\",\"headers\":${JSON.stringify(header)}}`;\n\tlet aiAjax = java.ajax(aiUrl);\n\tlet aiData = JSON.parse(aiAjax).msg;\n\tlet script = `function openContent(id){\n    window.openUi(\"rss\",{\"微博内容\":\"https:\/\/weibo.com\/detail\/\"+id})\n}`;\n\tresult =\"<title>微博智搜<\/title><script>\"+script+\"<\/script>\"+ aitoHtml(aiData);\n\n\t} else {\n\t  java.toast(\"加载中\");\n    let id = baseUrl.match(\/.*\\\/(.*)$\/)?.[1];\n    let b = baseUrl.replace(\/weibo.com\/, 'm.weibo.cn');\n    var html = java.ajax(b);\n\n    try {\n        var render_data = html.match(\/var \\$(render_data = \\[\\{[\\s\\S]+?\\|\\| \\{\\});\/)[1];\n        eval(render_data);\n        let $ = render_data.status;\n        let longText = getContent($);\n        let retweeted_status = $.retweeted_status ?? \"\";\n        if (retweeted_status) {\n            retweeted_status = getContent(retweeted_status)\n        }\n        retweeted_status = retweeted_status ? \"<div class='retweeted_status'>\" + retweeted_status + \"<\/div>\" : \"\";\n        result = longText + retweeted_status;\n    } catch (e) {\n        result = html;\n    }\n    \/\/链接匹配\n    result = replaceLink(result);\n    result = `<a href=\"${b.replace(\/detail\/,'a')}\" class=\"original-link\">原文地址<\/a><div class=\"main-content\">${result}<\/div><div id=\"container\"><\/div>`;\n    result = `<!DOCTYPE html>\n    <html>\n    <head><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    <script>\n        \n${jsLib.match(\/(function formatTime[\\s\\S]+?)function get\/)[1]}\n \n${jsLib.match(\/(function replaceLink[\\s\\S]+?)function get\/)[1]}\n         function replaceurl(t){\n             let text = String(t)\n             .replace(\/href=(\\\\\/n\\\\\/[^\\\\s]+)\/g,'href=\\\"https:\/\/m.weibo.cn$1\\\"')\n             .replace(\/\\\\\/\\\\\/s.weibo.com\\\\\/weibo\\\\?q=\/g,\"https:\/\/m.weibo.cn\/search?containerid=100103type%3D1%26q%3D\")\n             .replace(\/https?:\\\\\/\\\\\/weibo.com\\\\\/\\\\d+\\\\\/(\\\\d+)\/g,'https:\/\/m.weibo.cn\/a\/$1').replace(\/https?:\\\\\/\\\\\/weibo.com\\\\\/p\\\\\/\/g,'https:\/\/m.weibo.cn\/p\/');\n             return text\n            }\n         function getcomments(list, isReply = false) {\n             return list.map(item => {\n                 let details = \"\";\n                 if (item.pic_num !== 0) {\n                     let pic_ids = item.url_struct[0].pic_ids; \n                     const pic = item?.url_struct[0]?.pic_infos[pic_ids]?.large?.url.replace(\/https?\/,'https');\n                     details = \\`\n                     <details class=\"comment-media\">\n                     <summary><span class=\"media-preview\">📷 查看图片<\/span><\/summary>\n                     <div class=\"comment_pic\">\n                         <img src=\"\\${pic}\" alt=\"评论图片\">\n                     <\/div>\n                     <\/details>\\`;\n                 }\n                 let replies = \"\";\n                 if (item.comments && item.comments.length > 0) {\n                     replies = \\`<div class=\"comment-replies\">\n                     \\${getcomments(item.comments, true)}\n                     \\${item.total_number > 1 ? \\`\n                     <div class=\"morerep\" onclick=\"loadComments({id:'\\${item.id}',isReply:true})\">\n                     共\\${item.total_number}条回复\n                     <\/div>\\` : ''}\n                     <\/div>\\`;\n                   }\n                   return \\`\n                   <div class=\"comment-item\">\n                       <div class=\"comment-user\">\n                           <img class=\"user-avatar\" src=\"\\${item.user.avatar_hd}\" onclick=\"openUser('\\${item?.user?.id}')\">\n                       <div class=\"user-info\">\n                           <span class=\"user-name\" onclick=\"openUser('\\${item?.user?.id}')\">\\${item.user.screen_name}<\/span>\n                           <span class=\"comment-time\">\\${formatTime(item.created_at)}<\/span>\n                       <\/div>\n                       <div class=\"like_counts\">\n                           <span>♡\\${formatCount(item.like_counts)}<\/span>\n                       <\/div>\n                       <\/div>\n                       <div class=\"comment-text\">\\${replaceLink(replaceurl(item.text).replace(\/(<img.*?>)\/g,'<span class=\"url-icon\">$1<\/span>'))}<\/div>\n                       \\${details}\n                       \\${replies}\n                       <\/div>\\`;\n                      }).join('');\n                     }\n    <\/script>\n    <\/head>\n<body>\n\n${result}\n\n<div class=\"float-buttons\">\n    <button class=\"float-btn\" id=\"toTop\" title=\"回到顶部\">↑<\/button>\n    <button class=\"float-btn\" id=\"toBottom\" title=\"回到底部\">↓<\/button>\n<\/div>\n<div id=\"starModal\" class=\"star-modal\">\n    <div class=\"star-modal-content\">\n        <span class=\"star-close-btn\" onclick=\"closestarModal()\">&times;<\/span>\n        <div class=\"star-modal-body\" id=\"star-modalBody\">         <\/div>\n     <\/div>\n<\/div>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/viewerjs@1.10.5\/dist\/viewer.min.js\"><\/script>\n<script>\n\n\/\/ 全局变量\nlet MaxId = []; \nlet repMaxId = []; \nlet currentMaxId = null;\nlet repCurrentMaxId = null;\nlet isLoading = false;\nlet repLoading = false;\nconst weiboId = \"${id}\";\nlet sortType = 0;\nlet repSortType = 0;\n\nfunction openUser(id){\n    let utype,thtml,name,img,intro,desc,other,url,jsonData;\n    if(\/^\\\\d+$|\\\\\/n\\\\\/\/.test(id)){\n        if(\/\\\\\/n\\\\\/\/.test(id)){\n            thtml = String(java.ajax(id));\n            id = thtml.match(\/uid\",\"value\":\"(\\\\d+)\"\/)[1]\n         }\n         url = \"https:\/\/m.weibo.cn\/api\/container\/getIndex?type=uid&value=\"+id;\n         jsonData = JSON.parse(String(java.ajax(url))).data.userInfo;\n         utype = \"users\";\n         name = jsonData.screen_name;\n         img = jsonData.avatar_hd;\n         intro = \"粉丝:\"+jsonData.followers_count;\n         other = jsonData.verified_reason;\n         desc = jsonData.description;\n        }else if(\/^#\/.test(id)){\n            id = id.replace(\/^#|#$\/g,'');\n            utype = \"topics\";\n            url = \"https:\/\/m.weibo.cn\/api\/container\/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23\"+id+\"%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D\"+id+\"&page_type=searchall\";\n            jsonData = JSON.parse(String(java.ajax(url))).data.cardlistInfo;\n            name = id;\n            img = jsonData.portrait;\n            intro =(jsonData.cardlist_head_cards?.[0].head_data?.midtext??\"\").replace(\/详情>\/g,'');\n            other = \"\";\n            desc = jsonData.desc;\n         }else{\n             utype = \"superTopics\";\n             url = \"https:\/\/m.weibo.cn\/api\/container\/getIndex?containerid=\"+id+\"_-_feed&page=1\";\n             jsonData = JSON.parse(String(java.ajax(url))).data.pageInfo;\n             name = jsonData.page_title;\n             img = jsonData.portrait_hd\n             intro = jsonData.desc_more[0];\n             other = \"\";\n             desc = jsonData.desc.replace(\/阅读.*?加关注签到发帖得经验值>>\/,'')+\"\\\\n\"+jsonData.desc_more[0];\n         }\n         window.run(\\`getStarHtml(\"\\${utype}\",\"\\${id}\",\"\\${name}\",\"\\${img}\",\"\\${intro}\",\\\\\\`\\${desc}\\\\\\`,\"\\${other}\");\\`)\n         .then(r=>{\n             let content = r.replace(\/<script>[\\\\s\\\\S]+<\\\\\/script>\/g,'');\n             let scriptContent = r.match(\/<script>([\\\\s\\\\S]+)<\\\\\/script>\/)[1];\n             const starmodal = document.getElementById('starModal');\n             const starmodalBody = document.getElementById('star-modalBody');\n             starmodalBody.innerHTML = content;\n             starmodal.style.display = 'flex';\n             \n             if (document.getElementById('dynamicScript')) {\n                 script = document.getElementById('dynamicScript');\n                 script.parentNode.removeChild(script);\n              }\n              script = document.createElement('script');\n              script.id = 'dynamicScript';\n              script.textContent = scriptContent;\n              document.body.appendChild(script);\n             }).catch(e=>console.log(e))\n}\n\nfunction openContent(id){\n    window.openUi(\"rss\",{\"微博内容\":\"https:\/\/weibo.com\/detail\/\"+id})\n}\n\nfunction closestarModal() {\n    const starmodal = document.getElementById('starModal');\n    starmodal.style.display = 'none';\n    const script = document.getElementById('dynamicScript');\n    script.parentNode.removeChild(script);\n}\n\ndocument.getElementById('starModal').addEventListener('click', function(e) {\n    if(e.target === document.getElementById('starModal')){\n        document.getElementById('starModal').style.display = 'none';\n       }\n})\n\n\n\/\/图片加载器\nfunction initImageViewer() {\n\tvar option = {\n\t\t url: 'data-original',\n\t \tmaxZoomRatio: 0.9,\n         inline: false,\n         movable: true,\n         zoomable: true,\n         toolbar: {\n             zoomIn: 1,\n             zoomOut: 1,\n             oneToOne: 1,\n             reset: 1,\n             prev: 1,\n             next: 1,\n             rotateLeft: 0,\n             rotateRight: 0,\n             flipHorizontal: 0,\n             flipVertical: 0\n          } \n         }; \n         try { \n             new Viewer(document.querySelector('.image-gallery'),option); \n             document.querySelectorAll('.comment-media').forEach(x=>{new Viewer(x,option)}) \n            } catch (e) {}\n}\n\n\/\/ 获取评论函数\nasync function loadComments(options = {}) {\n    const {\n        id = weiboId,\n        isReply = false,\n        isLoadMore = false,\n        targetElement = isReply ? '#reply-list' : '#container',\n        tElement = isReply ? '#reply-list .comments-list' : '.comments-list',\n        containerTemplate = null,\n        sort = isReply ? repSortType : sortType\n     } = options;\n     const loadingFlag = isReply ? repLoading : isLoading;\n     if (loadingFlag) return;\n     isReply ? repLoading = true : isLoading = true;\n     let url;\n     if (isReply) {\n         url = \\`https:\/\/weibo.com\/ajax\/statuses\/buildComments?flow=\\${sort}&is_reload=1&id=\\${id}&is_show_bulletin=2&is_mix=1&fetch_level=1&max_id=\\${isLoadMore ? repCurrentMaxId : 0}&count=20&locale=zh-CN\\`\n      } else {\n          url =\\`https:\/\/weibo.com\/ajax\/statuses\/buildComments?flow=\\${sort}&is_reload=1&id=\\${id}&is_show_bulletin=2&is_mix=0&count=20&fetch_level=0&locale=zh-CN\\`;\n          if (isLoadMore && currentMaxId) {\n              url += \\`&max_id=\\${currentMaxId}\\`;\n           }\n         }\n       try {\n           const response = await fetch(url, {\n               headers: {\n                   'Accept': 'application\/json',\n                   'X-Requested-With': 'XMLHttpRequest'\n                  },\n                  credentials: 'include'\n             });\n             const data = await response.json();\n             if (data.ok === -100) {\n                 if (\/error-message\/.test(document.querySelector(targetElement).innerHTML)) {\n                     throw new Error(\"需要登录\");\n                    }\n                  document.querySelector(targetElement).innerHTML += \\`<div class=\"error-message\">\n评论加载失败:请<a href=\"\\${data.url}\">访问首页或登录<\/a>后重试<\/div>\\`;\n                  throw new Error(\"需登录\");\n             }\n      const currentIdArray = isReply ? repMaxId : MaxId;\n      const newMaxId = data.max_id;\n      if (currentIdArray.includes(newMaxId)) {\n          throw new Error(\"没有更多内容了\");\n      }\n      if (isReply) {\n          repCurrentMaxId = newMaxId;\n          repMaxId.push(newMaxId);\n      } else {\n          currentMaxId = newMaxId;\n          MaxId.push(newMaxId);\n      }\n      \n      const commentsData = data.data;\n      if (isReply && !isLoadMore && !document.querySelector('.reply-modal')) {\n          initReplyModal(id);\n      }\n      if (isLoadMore) {\n          document.querySelector(tElement).innerHTML += getcomments(commentsData, isReply);\n        } else {\n            if (data.ok === 0) throw new Error(\"没有内容\");\n            let content = \\`<div class=\"comments-header\">\n            <div class=\"comments-title\"><h3>评论(\\${formatCount(data.total_number)})<\/h3><\/div>\n            <div class=\"sort-controls\">\n            <button id=\"sortHot\" class=\"sort-btn \\${sortType===0?'active':''}\" onclick=\"loadComments({sort:0})\">热度<\/button>\n            <button id=\"sortTime\" class=\"sort-btn \\${sortType===1?'active':''}\" onclick=\"loadComments({sort:1})\">时间<\/button><\/div>\n      <\/div>\\`;\n      const html = \\`<div class=\"comments-section\">\n      \\${isReply?\"\":content} \n      <div class=\"comments-list\">\\${getcomments(commentsData)}<\/div><\/div>\\`;\n      document.querySelector(targetElement).innerHTML = html;\n     }\n} catch (error) {\n    if (isLoadMore) {\n        showToast(\/没有更多\/.test(error.message)?error.message:\"评论加载失败\")\n       } else if (!\/没有内容|登录\/.test(error.message)) {document.querySelector(targetElement).innerHTML = \\`<div class=\"error-message\">评论加载失败: \\${error.message}<button onclick=\"loadComments(\\${JSON.stringify(options)})\">重试<\/button><\/div>\\`;\n      }\n} finally {\n    isReply ? repLoading = false : isLoading = false;\n}\n}\n\nfunction initReplyModal(id) {\n    const modal = document.createElement('div');\n    modal.className = 'reply-modal';\n    modal.dataset.commentId = id;\n    modal.innerHTML = \\`\n    <div class=\"modal-content\">\n    <div class=\"modal-header\">\n    <h4>回复列表<\/h4>\n    <div class=\"reply-sort\">\n    <button class=\"sort-btn \\${repSortType===0?'active':''}\" onclick=\"loadComments({id:'\\${id}',isReply:true,sort:0});repSortType=0\" data-sort-type=0>热度<\/button>\n    <button class=\"sort-btn \\${repSortType===1?'active':''}\" onclick=\"loadComments({id:'\\${id}',isReply:true,sort:1});repSortType=1\" data-sort-type=1>时间<\/button>\n    <span class=\"close-btn\" onclick=\"this.closest('.reply-modal').remove();repMaxId=[];repSortType=0;repCurrentMaxId=null\">×<\/span>\n    <\/div>\n<\/div>\n<div class=\"modal-body\" id=\"reply-list\"><\/div>\n<\/div>\\`;\n\ndocument.body.appendChild(modal);\nmodal.addEventListener('click', function(e) {\n    if (e.target === modal) {\n        modal.remove();\n        repMaxId = [];\n        repSortType = 0;\n        repCurrentMaxId = null;\n     }\n});\n\nconst replyList = document.querySelector(\"#reply-list\");\nif (replyList) {\n    replyList.addEventListener('scroll', () => {\n        if (replyList.scrollTop + replyList.clientHeight >= replyList.scrollHeight - 15) {\n            loadComments({id:id,isLoadMore: true, isReply: true }); \n        }\n});\n}\n}\n\nfunction showToast(message) {\n    const toast = document.createElement('div');\n    toast.textContent = message;\n    toast.style.position = 'fixed';\n    toast.style.bottom = '50px';\n    toast.style.left = '50%';\n    toast.style.transform = 'translateX(-50%)';\n    toast.style.backgroundColor = 'rgba(0,0,0,0.7)';\n    toast.style.color = 'white';\n    toast.style.padding = '5px 5px';\n    toast.style.borderRadius = '5px';\n    toast.style.zIndex = '1000';\n    document.body.appendChild(toast);\n    setTimeout(() => {\n        document.body.removeChild(toast);\n     }, 1000);\n}\n\ndocument.getElementById('toTop').addEventListener('click', function() {\n    if(document.querySelector(\"#reply-list\")){\n        document.querySelector(\"#reply-list\").scrollTo({\n            top: 0,\n            behavior: 'smooth'\n        });\n     }else{\n         window.scrollTo({\n             top: 0,\n             behavior: 'smooth'\n          });\n       }\n   });\n\ndocument.getElementById('toBottom').addEventListener('click', function() {\n    if(document.querySelector(\"#reply-list\")){\n        document.querySelector(\"#reply-list\").scrollTo({\n            top: document.querySelector(\"#reply-list\").scrollHeight,\n            behavior: 'smooth'\n         });\n     }else{\n         window.scrollTo({\n             top: document.body.scrollHeight,\n             behavior: 'smooth'\n          });\n      }\n});\n\nwindow.addEventListener('scroll', function() {\n    const toTopBtn = document.getElementById('toTop');\n    const toBottomBtn = document.getElementById('toBottom');\n    const scrollPosition = window.scrollY;\n    if (scrollPosition === 0) {\n        toTopBtn.style.opacity = '0.5';\n        toTopBtn.style.pointerEvents = 'none';\n    } else {\n        toTopBtn.style.opacity = '1';\n        toTopBtn.style.pointerEvents = 'auto';\n    }\n    if (window.innerHeight + scrollPosition >= document.body.scrollHeight - 50) {\n        toBottomBtn.style.opacity = '0.5';\n        toBottomBtn.style.pointerEvents = 'none';\n    } else {\n        toBottomBtn.style.opacity = '1';\n        toBottomBtn.style.pointerEvents = 'auto';\n    }\n});\n\ndocument.addEventListener('DOMContentLoaded', () => {\n    document.addEventListener('click', (e) => {\n        if (e.target.id === 'sortHot') {\n            if (sortType !== 0) {\n                sortType = 0;\n                e.target.classList.add('active');\n                document.getElementById('sortTime').classList.remove('active');\n                currentMaxId = null;\n                MaxId = [];\n                loadComments({sort:0}); \n             }\n           }\n      if (e.target.id === 'sortTime') {\n          if (sortType !== 1) {\n              sortType = 1;\n              e.target.classList.add('active');\n              document.getElementById('sortHot').classList.remove('active');\n              currentMaxId = null;\n              MaxId = [];\n              loadComments({sort:1}); \n           }\n        }\n\nif (e.target.classList.contains('sort-btn')) {\n    const modal = e.target.closest('.reply-modal');\n    if (modal) {\n        const id = modal.dataset.commentId;\n        repSortType = parseInt(e.target.dataset.sortType);\n        document.querySelectorAll('.reply-modal .sort-btn').forEach(btn => {\n            btn.classList.toggle('active', parseInt(btn.dataset.sortType) === repSortType);\n         });\n         repCurrentMaxId = null;\n         repMaxId = [];\n       }\n}\n});\n\nloadComments();\n\nwindow.addEventListener('scroll', () => {\n    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 50) {\n        loadComments({ isLoadMore: true });\n    }\n});\n\nfunction findScrollingElement() {\n    const elements = document.querySelectorAll('*');\n    for (const el of elements) {\n        if (el.scrollHeight > el.clientHeight && el.scrollTop > 0) {\n            return el;\n           }\n      }\n      return document.documentElement; \n}\ninitImageViewer();\n});\n\n<\/script>\n<\/body>\n<\/html>`;\n}\n\nresult",
    "ruleDescription": "<js>\nresult = \"\";\nfunction hasH(str) {\n    if(str.startsWith('#') && str.endsWith('#')){\n        return str\n    }\n    return \"\"\n}\n\nlet user = String(java.getString(\"$.screen_name||$.user.screen_name\"));\nlet s = String(java.getString(\"$.scheme\")).match(\/containerid=([\\da-z]{20,45})\/)?.[1];\nlet ht = hasH(String(java.getString(\"$.title_sub\")));\nlet id,name,img,intro,desc,other;\nif(user){\n\tid = java.getString(\"$.user.id||$.id\");\n\tname = user;\n\timg = java.getString(\"$..avatar_hd\");\n\tintro = \"粉丝:\"+java.getString(\"$..followers_count\");\n\tdesc = java.getString(\"$..description\");\n\tother = java.getString(\"$..verified_reason\");\n\tresult = getStarHtml(\"users\",id,name,img,intro,desc,other);   \n\t}else if(s || ht){\n\t\tid = s || ht;\n\t\tlet f = \/^#\/.test(id);\n\t\tid = id.replace(\/^#|#$\/g,'');\n        img = java.getString(\"$.pic||$.left_tag_img\");\n        name = String(java.getString(\"$.title_sub||$.title||$.desc\"));\n    \tname = f?name.replace(\/^#|#$\/g,''):name;\n        let desc = java.getString(\"$.desc1\");\n        let intro = java.getString(\"$.desc2||$.desc_extr||$.desc\");\n        result = getStarHtml((f?\"topics\":\"superTopics\"),id,name,img,intro,desc,\"\");   \n    \n}\nresult\n<\/js>",
    "ruleImage": "{{$.pic_middle||$..bmiddle_pic||$..bmiddle.url||$..page_pic.url||$.mblog.page_info.page_pic.url||$.mblog.user.avatar_hd||$.avatar_hd||$.user.avatar_hd||$..avatar_hd||$.left_tag_img||$.pic##.*\\n+}},{\"headers\":{\"referer\":\"https:\/\/m.weibo.cn\"}}\n<js>##thumbnail##bmiddle<\/js>",
    "ruleLink": "$.id||$.mblog.id||$.idstr||$.user.id||$.scheme\n@js:\nif(\/title=微博热搜\/.test(baseUrl)){\n\t     let huati = \"{{$.desc}}\";       \n\t     result = `http:\/\/www.baidu.com@js:'data:huati;base64,${java.base64Encode(huati)},{\"type\":\"weibo\"}'`;   \n\t}else{\t\t   \n      result = \"https:\/\/weibo.com\/detail\/\"+result\n}",
    "ruleNextPage": "@js:\npage = \"{{$.data.cardlistInfo.since_id||$.data.pageInfo.since_id}}\" || \"{{$.data.page||$.data.cardlistInfo.page}}\" || (\/%26t%3D10|100103type%3D\\d+\/.test(baseUrl)?(Number(baseUrl.match(\/page=(\\d+)\/)?.[1])+1):\"\");\nresult = baseUrl.replace(\/(&?(since_id|page)=)\\d*\/g,`$1${page}`);",
    "rulePubDate": "{{let i=String(java.getString(\"$..icon\"));let icon=\/4_0.png\/.test(i)?\"✴️\":\/1_0.png\/.test(i)?\"🆕\":\/2_0.png\/.test(i)?\"🔥\":\/3_0.png\/.test(i)?\"✅\":\/_ads_\/.test(i)?decodeURI(i.match(\/_ads_(.*?)\\.\/)[1]):\"\";icon}} {{$.created_at&&$.mblog.created_at&&$.description&&$.desc_extr&&$.desc1&&$.desc2&&$.desc}}\n@js:\nif(\/\\+0800\/.test(result) && \"{{$.screen_name}}\"==\"\"){\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}\nfunction formatCount(count) {\n  if (count < 10000) return count.toString();\n  const inWan = (count \/ 10000).toFixed(2);\n  return inWan.endsWith('.00') \n    ? `${inWan.split('.')[0]}万` \n    : `${inWan}万`;\n}\n\nresult = '📅 '+formatDate(time)+\"  📝\"+formatCount(java.getString(\"$.comments_count||$.mblog.comments_count\"))+\"  ❤️\"+formatCount(java.getString(\"$.attitudes_count||$.mblog.attitudes_count\"))+\"      @\"+java.getString(\"$.user.screen_name||$.mblog.user.screen_name\");\n}\nresult = result.replace(\/\\n\/g,' ').replace(\/.*?\\+0800.*\/,java.getString(\"$.verified_reason\")+\" \"+\"粉丝:\"+java.getString(\"$.followers_count_str\"));",
    "ruleTitle": "$.mblog.text||$.text||$.title_sub||$.title||$.screen_name||$.user.screen_name||$.desc##<.*?>|^筛选|更多热门.{2,4}$|实时微博|查看更多.*|话题主持人|更多关注.*|[他她]的微博|^相关用户((\\d+))*$|^超话社区$",
    "searchUrl": "@js:\nlet t = source.get(\"currentSearch\");\nif(\/type=uid\/.test(t)){\n\tlet id = t.match(\/value=(\\d+)\/)?.[1]\n\tresult = \"http:\/\/m.weibo.cn\/api\/container\/getIndex?disable_sug=1&diabled_eject_animation=1&disable_hot=0&trans_bg=0&disable_history=1&container_ext=profile_uid%3A\"+id+\"%7Cgps_timestamp%3A\"+Math.ceil(Date.now()\/1000)+\"&containerid=100103type%3D401%26t%3D10%26q%3D\"+key+\"&page_type=searchall&page=1\"\n\t}else if(\/containerid=[^_]+_-_\/.test(t)){\n\t\tid = t.match(\/containerid=([^_]+)\/)[1];\n\t\tresult = `https:\/\/m.weibo.cn\/api\/container\/getIndex?extparam=%7B%22topicid%22%3A%221022%3A${id}%22%2C%22pagetype%22%3A%22index%22%7D&container_ext=type%3A532%7Cdisable_history%3A1%7Ccache_need%3A0%7Cforce_ejecttype%3Apresent&containerid=100303type%3D532%26q%3D${key}%26t%3D0&page=1&count=10&new_topic_header_recommend=1&new_topic_header=1&page_type=searchall`;\n\t\t}else{\n\t\t\tjava.toast(\"此项无法搜索\")\n\t\t\t}\nresult",
    "shouldOverrideUrlLoading": "if(url == \"https:\/\/m.weibo.cn\/\"){\n  java.startBrowser(\"https:\/\/m.weibo.cn\/\",\"登录\")\n\ttrue\n}\n\nif(\/l\\\/wblive\/.test(url)){\n\ttry{\n        let liveu = liveUrl(url);\n        java.openVideoPlayer(liveu.url,liveu.name,true);\n        true\n    }catch(e){\n        java.log(e)\n\t}\n\t}\n\n\nif(\/jjwxc.*?(?:novelid=\\d+|book2(?:\\\/|%2F)\\d+)|(?:gongzicp\\.com.*?(?:novel-|novelId=|\\?id=)\\d+)\/.test(decodeURIComponent(url))){\n    url = decodeURIComponent(url);\n\tid = url.match(\/.*?(?:novel[iI]d=|novel-|book2\\\/|\\?id=)(\\d+)\/)?.[1];\n\tif(\/jjwxc\/.test(url)){\n        addurl = \"https:\/\/app-cdn.jjwxc.net\/androidapi\/novelbasicinfo?novelId=\"+id;\n    }else{\n\t\taddurl = \"https:\/\/webapi.gongzicp.com\/webapi\/novel\/novelInfo?id=\"+id\n    }\n\tjava.addBook(addurl);\n    true\n}\n\n\nif(\/ai\\.s\\.weibo|s\\.weibo\\..*?q=(?:回答:|分析:)|s\\.weibo\\..*?share_page_id\/.test(decodeURIComponent(decodeURIComponent(url)))){\n\turl = decodeURIComponent(decodeURIComponent(url));\n\tq = encodeURIComponent(url.match(\/q=(.*?)&t\/)?.[1]??url.match(\/\"mid\": \"(\\d+)\"\/)?.[1]??\"\");\n\tpage_id = url.match(\/share_page_id=(.*?)&\/)?.[1]??url.match(\/page_id\": \"([^\"]+)\",\/)?.[1]??\"\";\n\taiurl = `http:\/\/www.baidu.com@js:'data:aisearch;base64,${java.base64Encode(q+\"❌\"+page_id)},{\"type\":\"weibo\"}'`;\n\tjava.open(\"rss\",aiurl,\"微博智搜\");\n\ttrue\n\t}",
    "showWebLog": true,
    "singleUrl": false,
    "sourceComment": "v1.0 测试\n1、需要登录\n2、需要用洛雅橙大佬改版阅读最新版",
    "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": "微博",
    "sourceUrl": "https:\/\/m.weibo.cn#微博整合",
    "startHtml": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>微博订阅<\/title>\n<\/head>\n<body>\n    <div class=\"container\">\n        <div class=\"sub-options\">\n            <div class=\"category-tabs\">\n                <button class=\"category-tab active\" data-category=\"user\">博主<\/button>\n                <button class=\"category-tab\" data-category=\"super\">超话<\/button>\n                <button class=\"category-tab\" data-category=\"topic\">话题<\/button>\n            <\/div>\n            <div class=\"search-box\">\n                <input type=\"text\" placeholder=\"搜索当前列表(搜索空内容显示全部)\">\n                <button class=\"search-btn\">搜索<\/button>\n            <\/div>\n        <\/div>\n\n        \n        <div class=\"content-area\">\n            <div class=\"subscribe-list\" id=\"subscribe-list\">\n                <!-- 订阅列表-->\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- 底部按钮区域 -->\n    <div class=\"bottom-buttons\">\n        <button class=\"bottom-button\" data-type=\"search\">\n            <span class=\"bottom-button-icon\">🔍<\/span>\n            <span class=\"bottom-button-text\">搜索<\/span>\n        <\/button>\n        <button class=\"bottom-button\" data-type=\"hot\">\n            <span class=\"bottom-button-icon\">🔥<\/span>\n            <span class=\"bottom-button-text\">热搜<\/span>\n        <\/button>\n        <button class=\"bottom-button\" data-type=\"hotlist\">\n            <span class=\"bottom-button-icon\">❤️<\/span>\n            <span class=\"bottom-button-text\">热门<\/span>\n        <\/button>\n        <button class=\"bottom-button\" data-type=\"login\">\n            <span class=\"bottom-button-icon\">👤<\/span>\n            <span class=\"bottom-button-text\">登录<\/span>\n        <\/button>\n    <\/div>\n\n    <!-- 搜索弹窗 -->\n    <div class=\"search-modal\" id=\"search-modal\">\n        <div class=\"search-modal-content\">\n            <div class=\"search-modal-header\">\n                <h3 class=\"search-modal-title\">搜索<\/h3>\n                <button class=\"search-modal-close\" id=\"search-modal-close\">×<\/button>\n            <\/div>\n            <input type=\"text\" class=\"search-modal-input\" id=\"search-modal-input\" placeholder=\"输入搜索关键词\">\n            <div class=\"search-history\">\n                <div class=\"search-history-title\"><a>历史搜索<\/a> <span id=\"search-clear\" class=\"search-clear\">×清空历史<\/span><\/div>\n                \n                <div class=\"search-history-list\" id=\"search-history-list\">\n                    <!-- 历史搜索记录会通过JS动态生成 -->\n                <\/div>\n            <\/div>\n            <div class=\"search-modal-actions\">\n                <button class=\"search-modal-cancel\" id=\"search-modal-cancel\">取消<\/button>\n                <button class=\"search-modal-confirm\" id=\"search-modal-confirm\">确认<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n    <!-- 登录弹窗 -->\n    <div class=\"login-modal\" id=\"login-modal\">\n        <div class=\"login-modal-content\">\n            <div class=\"login-modal-header\">\n                <h3 class=\"login-modal-title\">登录<\/h3>\n                <button class=\"login-modal-close\" id=\"login-modal-close\">×<\/button>\n            <\/div>\n            \n            <div class=\"login-modal-actions\">\n                <button class=\"login-modal-cancel\" id=\"login-modal-cancel\">跳转登录<\/button>\n                <button class=\"login-modal-confirm\" id=\"login-modal-confirm\">退出登录<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- 备注弹窗 -->\n    <div class=\"remark-modal\" id=\"remark-modal\">\n        <div class=\"remark-modal-content\">\n            <div class=\"remark-modal-header\">\n                <h3 class=\"remark-modal-title\">设置备注<\/h3>\n                <button class=\"remark-modal-close\" id=\"remark-modal-close\">×<\/button>\n            <\/div>\n            <input type=\"text\" class=\"remark-modal-input\" id=\"remark-modal-input\" placeholder=\"输入备注\">\n            <div class=\"remark-modal-actions\">\n                <button class=\"remark-modal-cancel\" id=\"remark-modal-cancel\">取消<\/button>\n                <button class=\"remark-modal-confirm\" id=\"remark-modal-confirm\">确认<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n<\/body>\n<\/html>\n",
    "startJs": "\/\/ 模拟数据\nconst m = \"https:\/\/m.weibo.cn\";\nconst mockData = JSON.parse(source.getVariable() || '{\"users\":[],\"topics\":[],\"superTopics\":[]}');\n\n\/\/ 当前数据状态\nlet currentData = [...mockData.users];\nlet currentCategory = 'user';\nlet remarkItemId = null;\nlet searchHistory = JSON.parse(source.get('weiboSearchHistory') || '[]');\nlet selectedItemId = null;\nlet isSortMode = false;\n\nfunction saveDataToJson() {\n    \/\/ 根据当前分类更新对应的数据\n    switch(currentCategory) {\n        case 'user':\n            mockData.users = [...currentData];\n            break;\n        case 'topic':\n            mockData.topics = [...currentData];\n            break;\n        case 'super':\n            mockData.superTopics = [...currentData];\n            break;\n    }\n    \n    \/\/ 保存到变量\n    source.putVariable(JSON.stringify(mockData));\n}\n\n\/\/ 获取列表项操作URL\nfunction handleItemClick(category, item) {\n    let url,name;\n    switch(category) {\n        case 'user':\n            \/\/ 用户操作URL\n            name = \"👤\"+item.name;\n            url = `${m}\/api\/container\/getIndex?type=uid&value=${item.id}&containerid=107603${item.id}&since_id=`;\n            break;\n        case 'topic':\n            \/\/ 话题操作URL\n            name = \"💬\"+item.name;\n            url = `${m}\/api\/container\/getIndex?containerid=231522type%3D1%26t%3D10%26q%3D%23${item.name}%23&isnewpage=1&luicode=10000011&lfid=100103type%3D1%26q%3D${item.name}&page_type=searchall&page=1`;\n            break;\n        case 'super':\n            \/\/ 超话操作URL\n            name = \"💎\"+item.name;\n            url = `${m}\/api\/container\/getIndex?containerid=${item.id}_-_feed&since_id=`;\n            break;\n        \n    }\n    \n    try{\n    window.openUi(\"sort\", {\n                    [name]:url\n                });\n          }catch(e){\n              java.log(\"xx\"+e)\n          }\n}\n\n\n\/\/ 页面加载完成后初始化\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ 初始化订阅内容\n    renderSubscribeContent(currentCategory);\n    \n    \/\/ 绑定分类标签点击事件\n    const categoryTabs = document.querySelectorAll('.category-tab');\n    categoryTabs.forEach(tab => {\n        tab.addEventListener('click', function() {\n            \/\/ 移除所有标签的active类\n            categoryTabs.forEach(t => t.classList.remove('active'));\n            \/\/ 为当前标签添加active类\n            this.classList.add('active');\n            \n            const category = this.getAttribute('data-category');\n            currentCategory = category;\n            \n            \/\/ 根据分类切换数据\n            switch(category) {\n                case 'user':\n                    currentData = [...mockData.users];\n                    break;\n                case 'topic':\n                    currentData = [...mockData.topics];\n                    break;\n                case 'super':\n                    currentData = [...mockData.superTopics];\n                    break;\n            }\n            \n            renderSubscribeContent(category);\n        });\n    });\n    \n    \/\/ 绑定搜索按钮点击事件\n    const searchBtn = document.querySelector('.search-btn');\n    searchBtn.addEventListener('click', function() {\n        const searchInput = document.querySelector('.search-box input');\n        const searchText = searchInput.value.toLowerCase();\n        \n        \/\/ 过滤数据\n        const filteredData = currentData.filter(item => \n            item.name.toLowerCase().includes(searchText) || \n            item.desc.toLowerCase().includes(searchText)\n        );\n        \n        \/\/ 渲染过滤后的数据\n        renderSubscribeList(filteredData);\n    });\n    \n    \/\/ 绑定底部按钮点击事件\n    const bottomButtons = document.querySelectorAll('.bottom-button');\n    bottomButtons.forEach(button => {\n        button.addEventListener('click', function() {\n            const type = this.getAttribute('data-type');\n            handleBottomButtonClick(type);\n        });\n    });\n    \n    \/\/ 绑定搜索弹窗相关事件\n    const searchModal = document.getElementById('search-modal');\n    const searchModalClose = document.getElementById('search-modal-close');\n    const searchModalCancel = document.getElementById('search-modal-cancel');\n    const searchModalConfirm = document.getElementById('search-modal-confirm');\n    const searchModalInput = document.getElementById('search-modal-input');\n    const searchclear = document.getElementById(\"search-clear\")\n    \n      \/\/ 绑定登录弹窗相关事件\n    const loginModal = document.getElementById('login-modal');\n    const loginModalClose = document.getElementById('login-modal-close');\n    const loginModalCancel = document.getElementById('login-modal-cancel');\n    const loginModalConfirm = document.getElementById('login-modal-confirm');\n    \n    \n    \n    \/\/ 关闭弹窗\n    searchModalClose.addEventListener('click', closeModal);\n    loginModalClose.addEventListener('click', closeModal);\n    searchModalCancel.addEventListener('click', closeModal);\n    \n    \/\/ 搜索点击确认按钮\n    searchModalConfirm.addEventListener('click', function() {\n        const searchText = searchModalInput.value.trim();\n        if (searchText) {\n            \/\/ 添加到搜索历史\n            addToSearchHistory(searchText);\n            \/\/ 跳转到搜索页面\n            window.openUi(\"sort\",{\"综合\":`${getSearchUrl(1,searchText)}`,\"关注\":`${getSearchUrl(62,searchText)}`,\"热门\":`${getSearchUrl(60,searchText)}`,\"实时\":`${getSearchUrl(61,searchText)}`,\"用户\":`${getSearchUrl(3,searchText)}`,\"视频\":`${getSearchUrl(64,searchText)}`,\"图片\":`${getSearchUrl(63,searchText)}`,\"话题\":`${getSearchUrl(38,searchText)}`,\"超话\":`${getSearchUrl(98,searchText)}`});\n            closeModal();\n        }\n    });\n    \n    loginModal.addEventListener('click', function(e) {\n        closeModal();\n    });\n    \n    \/\/退出登录按钮\n    loginModalConfirm.addEventListener('click', function() {\n        java.toast(\"请稍候....\");\n        window.run('cookie.removeCookie(\"https:\/\/m.weibo.cn\")').then(r=>console.log('已退出登录'))\n        window.webViewAwait(\"\",\"https:\/\/m.weibo.cn\/logout\",\"if(String(document.cookie.includes('MLOGIN=0'))){'已退出登录'}\") .then(r=>{\n                    alert(r);\n                })\n        .catch(e=>alert(\"执行出错:\"+e));\n        \n        \n        \n    });\n    \n    \/\/跳转登录按钮\n    loginModalCancel.addEventListener('click', function() {\n        window.open(\"http:\/\/m.weibo.cn\")\n        closeModal();\n    });\n    \n    \n    \n    \/\/ 绑定备注弹窗相关事件\n    const remarkModal = document.getElementById('remark-modal');\n    const remarkModalClose = document.getElementById('remark-modal-close');\n    const remarkModalCancel = document.getElementById('remark-modal-cancel');\n    const remarkModalConfirm = document.getElementById('remark-modal-confirm');\n    const remarkModalInput = document.getElementById('remark-modal-input');\n    \n    \/\/ 关闭弹窗\n    remarkModalClose.addEventListener('click', closeRemarkModal);\n    remarkModalCancel.addEventListener('click', closeRemarkModal);\n    \n    \/\/ 点击确认按钮\n    remarkModalConfirm.addEventListener('click', function() {\n        const remarkText = remarkModalInput.value.trim();\n        if (remarkText && remarkItemId) {\n            \/\/ 更新备注\n            updateRemarkName(remarkItemId, remarkText);\n            closeRemarkModal();\n        }\n    });\n    \n    \/\/ 添加滑动切换功能\n    const contentArea = document.querySelector('.content-area');\n    let startX = 0;\n    let endX = 0;\n    \n    contentArea.addEventListener('touchstart', function(e) {\n        startX = e.touches[0].clientX;\n    }, { passive: true });\n    \n    contentArea.addEventListener('touchmove', function(e) {\n        const currentX = e.touches[0].clientX;\n        const diffX = currentX - startX;\n        \n        \/\/ 如果水平滑动距离大于垂直滑动距离,则认为是水平滑动\n        if (Math.abs(diffX) > 10) {\n            e.preventDefault();\n        }\n    }, { passive: false });\n    \n    contentArea.addEventListener('touchend', function(e) {\n        const endX = e.changedTouches[0].clientX;\n        const diffX = endX - startX;\n        const threshold = 50; \/\/ 滑动阈值\n        \n        if (Math.abs(diffX) > threshold) {\n            const currentTab = document.querySelector('.category-tab.active');\n            const tabs = Array.from(document.querySelectorAll('.category-tab'));\n            const currentIndex = tabs.indexOf(currentTab);\n            \n            if (diffX > 0 && currentIndex > 0) {\n                \/\/ 向右滑动,切换到前一个标签\n                tabs[currentIndex - 1].click();\n            } else if (diffX < 0 && currentIndex < tabs.length - 1) {\n                \/\/ 向左滑动,切换到下一个标签\n                tabs[currentIndex + 1].click();\n            }\n        }\n    }, { passive: true });\n});\n\nfunction getHotUrl(type){\n    return `${m}\/api\/container\/getIndex?containerid=${encodeURIComponent(\"106003type=25&t=3&disable_hot=1&filter_type=\"+type)}&title=微博热搜&show_cache_when_error=1&extparam=${encodeURIComponent(\"seat=1&lcate=1001&mi_cid=100103&filter_type=realtimehot&pos=0_0&c_type=30&region_relas_conf=0&dgr=0&cate=10103&display_time=\"+parseInt(Date.now()\/1000)+\"&pre_seqid=\"+Date.now()+\"020423224\")}`;\n}\n\nfunction getSearchUrl(t,k){\n    return `${m}\/api\/container\/getIndex?containerid=100103type%3D${t}%26q%3D${k}%26t%3D&page_type=searchall&page=1`;\n}\n\n\/\/ 渲染订阅内容\nfunction renderSubscribeContent(category) {\n    let data = [];\n    \n    if (category === 'user') {\n        data = [...mockData.users];\n    } else if (category === 'topic') {\n        data = [...mockData.topics];\n    } else if (category === 'super') {\n        data = [...mockData.superTopics];\n    }\n    renderSubscribeList(data);\n}\n\n\/\/ 渲染订阅列表\nfunction renderSubscribeList(data) {\n    const subscribeList = document.getElementById('subscribe-list');\n    subscribeList.innerHTML = '';\n    \n    data.forEach((item, index) => {\n        const subscribeItem = document.createElement('div');\n        subscribeItem.className = 'subscribe-item';\n        subscribeItem.setAttribute('data-id', item.id);\n        subscribeItem.setAttribute('data-index', index);\n        \n        \/\/ 如果有头像图片则显示图片,否则显示名称第一个字\n        const avatarContent = item.avatar ? \n            `<img src=\"${item.avatar}\" alt=\"${item.name}\">` : \n            item.name.charAt(0);\n        \n        \/\/ 检查是否有备注\n        const displayName = item.remarkName ?(item.name + \" (\"+item.remarkName+\")\"):item.name;\n        \n        subscribeItem.innerHTML = `\n            <div class=\"subscribe-avatar\">${avatarContent}<\/div>\n            <div class=\"subscribe-details\">\n                <div class=\"subscribe-title\">${displayName}<\/div>\n                <div class=\"subscribe-desc\">${item.desc}<\/div>\n            <\/div>\n            <div class=\"subscribe-actions\">\n                <button class=\"subscribe-action delete\" data-action=\"delete\" title=\"删除\">❎<\/button>\n                <button class=\"subscribe-action remark\" data-action=\"remark\" title=\"设置备注\">🆔<\/button>\n                <button class=\"subscribe-action sort\" data-action=\"sort\" title=\"排序\">↕️<\/button>\n            <\/div>\n        `;\n        \n        \/\/ 如果是排序模式,添加交换按钮\n        if (isSortMode) {\n            const swapButton = document.createElement('button');\n            swapButton.className = 'subscribe-action swap';\n            swapButton.setAttribute('data-action', 'swap');\n            swapButton.setAttribute('title', '交换位置');\n            swapButton.textContent = '⇄';\n            subscribeItem.querySelector('.subscribe-actions').appendChild(swapButton);\n            \n            \/\/ 如果是选中的项目,添加选中样式\n            if (item.id === selectedItemId) {\n                subscribeItem.classList.add('selected');\n            }\n        }\n        \n        subscribeList.appendChild(subscribeItem);\n    });\n    \n    \/\/ 绑定订阅操作按钮事件\n    bindSubscribeActions();\n    \n    \/\/ 绑定列表项点击事件(非排序模式下)\n    if (!isSortMode) {\n        bindItemClickEvents();\n    }\n}\n\n\/\/ 绑定列表项点击事件\nfunction bindItemClickEvents() {\n    const subscribeItems = document.querySelectorAll('.subscribe-item');\n    \n    subscribeItems.forEach(item => {\n        item.addEventListener('click', function(e) {\n            \/\/ 如果点击的是操作按钮,不执行操作\n            if (e.target.classList.contains('subscribe-action')) {\n                return;\n            }\n            \n            const itemId = this.getAttribute('data-id');\n            const currentItem = currentData.find(item => item.id === itemId);\n            \n            if (currentItem) {\n                \/\/ 执行JS操作\n                handleItemClick(currentCategory, currentItem);\n            }\n        });\n    });\n}\n\n\/\/ 绑定订阅操作按钮事件\nfunction bindSubscribeActions() {\n    const deleteButtons = document.querySelectorAll('.subscribe-action.delete');\n    const remarkButtons = document.querySelectorAll('.subscribe-action.remark');\n    const sortButtons = document.querySelectorAll('.subscribe-action.sort');\n    const swapButtons = document.querySelectorAll('.subscribe-action.swap');\n    const subscribeItems = document.querySelectorAll('.subscribe-item');\n    \n    \/\/ 删除功能\n    deleteButtons.forEach(button => {\n        button.addEventListener('click', function(e) {\n            e.stopPropagation();\n            const itemElement = this.closest('.subscribe-item');\n            const itemId = itemElement.getAttribute('data-id');\n            \n            \/\/ 确认删除\n            if (confirm('确定要删除这个订阅吗?')) {\n                deleteSubscribeItem(itemId);\n            }\n        });\n    });\n    \n    \/\/ 设置备注功能\n    remarkButtons.forEach(button => {\n        button.addEventListener('click', function(e) {\n            e.stopPropagation();\n            const itemElement = this.closest('.subscribe-item');\n            const itemId = itemElement.getAttribute('data-id');\n            const currentName = itemElement.querySelector('.subscribe-title').textContent;\n            \n            openRemarkModal(itemId, currentName);\n        });\n    });\n    \n    \/\/ 排序功能\n    sortButtons.forEach(button => {\n        button.addEventListener('click', function(e) {\n            e.stopPropagation();\n            toggleSortMode();\n        });\n    });\n    \n    \/\/ 交换位置功能\n    swapButtons.forEach(button => {\n        button.addEventListener('click', function(e) {\n            e.stopPropagation();\n            const itemElement = this.closest('.subscribe-item');\n            const itemId = itemElement.getAttribute('data-id');\n            \n            handleSwapItem(itemId);\n        });\n    });\n    \n    \/\/ 点击列表项选择功能(排序模式下)\n    if (isSortMode) {\n        subscribeItems.forEach(item => {\n            item.addEventListener('click', function(e) {\n                if (e.target.classList.contains('subscribe-action')) return;\n                \n                const itemId = this.getAttribute('data-id');\n                handleSelectItem(itemId);\n            });\n        });\n    }\n}\n\n\/\/ 切换排序模式\nfunction toggleSortMode() {\n    isSortMode = !isSortMode;\n    selectedItemId = null;\n    \n    if (isSortMode) {\n        alert('已进入排序模式,请先点击要移动的项目,再点击目标项目的交换按钮');\n    } else {\n        alert('已退出排序模式');\n    }\n    \n    \/\/ 重新渲染列表\n    renderSubscribeList(currentData);\n}\n\n\/\/ 处理选择项目\nfunction handleSelectItem(itemId) {\n    if (!isSortMode) return;\n    \n    selectedItemId = itemId;\n    \n    \/\/ 重新渲染列表以更新选中状态\n    renderSubscribeList(currentData);\n}\n\n\/\/ 处理交换位置\nfunction handleSwapItem(targetItemId) {\n    if (!isSortMode || !selectedItemId) {\n        alert('请先选择要移动的项目');\n        return;\n    }\n    \n    if (selectedItemId === targetItemId) {\n        alert('不能与自己交换位置');\n        return;\n    }\n    \n    \/\/ 找到两个项目的索引\n    const selectedIndex = currentData.findIndex(item => item.id === selectedItemId);\n    const targetIndex = currentData.findIndex(item => item.id === targetItemId);\n    \n    if (selectedIndex === -1 || targetIndex === -1) return;\n    \n    \/\/ 交换两个项目的位置\n    [currentData[selectedIndex], currentData[targetIndex]] = \n        [currentData[targetIndex], currentData[selectedIndex]];\n    \n    \/\/ 重置选择状态\n    selectedItemId = null;\n    \n    \/\/ 重新渲染列表\n    renderSubscribeList(currentData);\n    \n    \/\/ 保存数据\n    saveDataToJson();\n}\n\n\/\/ 删除订阅项\nfunction deleteSubscribeItem(itemId) {\n    \/\/ 从当前数据中删除\n    currentData = currentData.filter(item => item.id !== itemId);\n    \n    \/\/ 更新UI\n    renderSubscribeList(currentData);\n    \n    \/\/ 保存数据\n    saveDataToJson();\n}\n\n\/\/ 打开备注弹窗\nfunction openRemarkModal(itemId, currentName) {\n    remarkItemId = itemId;\n    const remarkModal = document.getElementById('remark-modal');\n    const remarkModalInput = document.getElementById('remark-modal-input');\n    \n    remarkModalInput.value = currentName;\n    remarkModal.classList.add('active');\n    remarkModalInput.focus();\n}\n\n\/\/ 关闭备注弹窗\nfunction closeRemarkModal() {\n    const remarkModal = document.getElementById('remark-modal');\n    const remarkModalInput = document.getElementById('remark-modal-input');\n    \n    remarkModal.classList.remove('active');\n    remarkModalInput.value = '';\n    remarkItemId = null;\n}\n\n\/\/ 更新备注\nfunction updateRemarkName(itemId, remarkName) {\n    \/\/ 更新当前数据中的备注\n    const itemIndex = currentData.findIndex(item => item.id === itemId);\n    if (itemIndex !== -1) {\n        currentData[itemIndex].remarkName = remarkName;\n    }\n    \n    \/\/ 更新UI\n    renderSubscribeList(currentData);\n    \n    \/\/ 保存数据\n    saveDataToJson();\n}\n\n\/\/ 处理底部按钮点击\nfunction handleBottomButtonClick(type) {\n    switch (type) {\n        case 'search':\n            \/\/ 显示搜索弹窗\n            const searchModal = document.getElementById('search-modal');\n            searchModal.classList.add('active');\n            document.getElementById('search-modal-input').focus();\n            renderSearchHistory();\n            break;\n        case 'hot':\n            \/\/ 跳转到热搜页面\n            window.openUi(\"sort\", {\"热搜\":`${getHotUrl(\"realtimehot\")}`,\"我的\":`${getHotUrl(\"mineband\")}`,\"社会\":`${getHotUrl(\"social\")}`,\"文娱\":`${getHotUrl(\"fun\")}`})\n            break;\n        case 'hotlist':\n            window.openUi(\"sort\", {\"热门\":`${m}\/api\/container\/getIndex?containerid=102803&since_id=0`,\"实时\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_8999_-_ctg1_8999_home&page=1`,\"榜单\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_600169_-_ctg1_600169&page=1`,\"同城\":`${m}\/api\/feed\/trendtop?containerid=102803_2222&page=1`,\"社会\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188&page=1`,\"科技\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_2088_-_ctg1_2088&page=1`,\"明星\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_4288_-_ctg1_4288&page=1`,\"电影\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_3288_-_ctg1_3288&page=1`,\"音乐\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_5288_-_ctg1_5288&page=1`,\"情感\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_1988_-_ctg1_1988&page=1`,\"时尚\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_4488_-_ctg1_4488&page=1`,\"美妆\":`${m}\/api\/feed\/trendtop?containerid=102803_ctg1_1588_-_ctg1_1588&page=1`});\n            break;\n        case 'login':\n            \/\/ 显示登录页面\n            const loginModal = document.getElementById('login-modal');\n            loginModal.classList.add('active');\n            \n           \/\/window.open(\"http:\/\/m.weibo.cn\/\")\n            break;\n    }\n}\n\n\n\/\/ 渲染搜索历史\nfunction renderSearchHistory() {\n    const searchHistoryList = document.getElementById('search-history-list');\n    searchHistoryList.innerHTML = '';\n    \n    if (searchHistory.length === 0) {\n        searchHistoryList.innerHTML = '<div style=\"color: #999; font-size: 14px;\">暂无搜索历史<\/div>';\n        return;\n    }\n    \n    \/\/ 显示最近10条搜索记录\n    const recentHistory = searchHistory.slice(-10).reverse();\n    \n    recentHistory.forEach(item => {\n        const historyItem = document.createElement('div');\n        historyItem.className = 'search-history-item';\n        historyItem.textContent = item;\n        \n        historyItem.addEventListener('click', function() {\n            document.getElementById('search-modal-input').value = item;\n        });\n        \n        searchHistoryList.appendChild(historyItem);\n    });\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n            const clearButton = document.querySelector('.search-clear');\n            if (clearButton) {\n                clearButton.addEventListener('click', function() {\n                    source.put('weiboSearchHistory', '');\n                    searchHistory = [];\n                    renderSearchHistory()\n                });\n            }\n        });\n\n\/\/ 添加到搜索历史\nfunction addToSearchHistory(searchText) {\n    \/\/ 移除重复项\n    searchHistory = searchHistory.filter(item => item !== searchText);\n    \/\/ 添加到历史记录\n    searchHistory.push(searchText);\n    \/\/ 限制历史记录数量\n    if (searchHistory.length > 50) {\n        searchHistory = searchHistory.slice(-50);\n    }\n    \/\/ 保存到本地存储\n    source.put('weiboSearchHistory', JSON.stringify(searchHistory));\n}\n\n\/\/ 关闭弹窗\nfunction closeModal() {\n    document.getElementById('search-modal').classList.remove('active');\n    document.getElementById('search-modal-input').value = '';\n    document.getElementById('login-modal').classList.remove('active');\n}\n",
    "startStyle": "* {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n        }\n\n        body {\n            background-color: #f5f5f5;\n            color: #333;\n            line-height: 1.5;\n            padding-bottom: 60px;\n        }\n\n        .container {\n            max-width: 480px;\n            margin: 0 auto;\n            background-color: #fff;\n            min-height: 100vh;\n            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n            display: flex;\n            flex-direction: column;\n        }\n\n        \/* 子选项区域 - 固定在顶部 *\/\n        .sub-options {\n            background-color: #f9f9f9;\n            padding: 10px 15px;\n            border-bottom: 1px solid #e6e6e6;\n            position: sticky;\n            top: 0;\n            z-index: 10;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n        }\n\n        .category-tabs {\n            display: flex;\n            justify-content: center;\n            margin-bottom: 10px;\n            gap: 10px;\n        }\n\n        .category-tab {\n            padding: 8px 15px;\n            font-size: 14px;\n            color: #666;\n            cursor: pointer;\n            border-radius: 15px;\n            background-color: #fff;\n            border: 1px solid #ddd;\n            transition: all 0.3s ease;\n        }\n\n        .category-tab.active {\n            background-color: #ff8200;\n            color: white;\n            border-color: #ff8200;\n        }\n\n        .category-tab:hover {\n            transform: translateY(-1px);\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n\n        .search-box {\n            display: flex;\n            max-width: 400px;\n            margin: 0 auto;\n        }\n\n        .search-box input {\n            flex: 1;\n            padding: 8px 10px;\n            border: 1px solid #ddd;\n            border-radius: 3px 0 0 3px;\n            font-size: 14px;\n            transition: border-color 0.3s;\n        }\n\n        .search-box input:focus {\n            outline: none;\n            border-color: #ff8200;\n        }\n\n        .search-btn {\n            background-color: #ff8200;\n            color: white;\n            border: none;\n            padding: 0 15px;\n            border-radius: 0 3px 3px 0;\n            cursor: pointer;\n            transition: background-color 0.3s;\n        }\n\n        .search-btn:hover {\n            background-color: #e67300;\n        }\n\n        \/* 内容区域 *\/\n        .content-area {\n            padding: 15px;\n            flex: 1;\n            overflow-y: auto;\n        }\n        \n        \/* 底部按钮区域 *\/\n        .bottom-buttons {\n            position: fixed;\n            bottom: 0;\n            left: 0;\n            right: 0;\n            display: flex;\n            background-color: #fff;\n            border-top: 1px solid #e6e6e6;\n            z-index: 100;\n            box-shadow: 0 -2px 10px rgba(0,0,0,0.05);\n        }\n        \n        .bottom-button {\n            flex: 1;\n            padding: 12px 5px;\n            border: none;\n            background: none;\n            font-size: 14px;\n            cursor: pointer;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            transition: all 0.3s;\n        }\n        \n        .bottom-button:hover {\n            background-color: #f5f5f5;\n        }\n        \n        .bottom-button-icon {\n            font-size: 18px;\n            margin-bottom: 4px;\n        }\n        \n        .bottom-button-text {\n            font-size: 12px;\n        }\n\n        \/* 订阅列表 *\/\n        .subscribe-list {\n            margin-top: 15px;\n        }\n\n        .subscribe-item {\n            display: flex;\n            align-items: center;\n            padding: 12px;\n            background-color: #f9f9f9;\n            border-radius: 8px;\n            margin-bottom: 10px;\n            transition: all 0.3s;\n            box-shadow: 0 2px 3px rgba(0,0,0,0.1);\n        }\n\n        .subscribe-item:hover {\n            border-left: 4px solid #ff7b00;  \n            margin-left: -4px; \n            padding-left: 4px; \n            box-shadow: 0 2px 10px rgba(0,0,0,0.15);\n        }\n\n        .subscribe-item.sort-mode {\n            background-color: #f0f0f0;\n        }\n\n        .subscribe-item.selected {\n            background-color: #ffe0b2;\n            border: 2px solid #ff8200;\n        }\n\n        .subscribe-avatar {\n            \n            box-shadow: 0 2px 5px rgba(0,0,0,0.15);\n            width: 40px;\n            height: 40px;\n            border-radius: 5px;\n            background-color: #e6e6e6;\n            margin-right: 12px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 18px;\n            color: #999;\n            overflow: hidden;\n            flex-shrink: 0;\n        }\n\n        .subscribe-avatar img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n        }\n\n        .subscribe-details {\n            flex: 1;\n            min-width: 0;\n        }\n\n        .subscribe-title {\n            font-size: 14px;\n            font-weight: 500;\n            margin-bottom: 5px;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n        }\n\n        .subscribe-desc {\n            font-size: 12px;\n            color: #999;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n        }\n\n        \/* 更新:功能按钮垂直排列 *\/\n        .subscribe-actions {\n            display: flex;\n            flex-direction: column;\n            gap: 5px;\n            flex-shrink: 0;\n            margin-left: 10px;\n        }\n\n        .subscribe-action {\n            background:none;\n            border:none;\n            padding: 4px;\n            font-size: 12px;\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            width: 12px;\n            height: 12px;\n            transition: all 0.3s;\n        }\n\n        .subscribe-action:hover {\n            transform: scale(1.1);\n        }\n\n        .subscribe-action.delete {\n            color: #ff3b30;\n            \n        }\n\n        .subscribe-action.remark {\n            color: #007aff;\n            \n        }\n\n        .subscribe-action.sort {\n            color: #34c759;\n          \n        }\n\n        .subscribe-action.swap {\n            color: #ff8200;\n           \n        }\n\n        \/* 搜索弹窗 *\/\n        .search-modal,.login-modal {\n            display: none;\n            position: fixed;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background-color: rgba(0, 0, 0, 0.5);\n            z-index: 1000;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .search-modal.active,.login-modal.active{\n            display: flex;\n        }\n\n        .search-modal-content,.login-modal-content {\n            background-color: #fff;\n            width: 90%;\n            max-width: 400px;\n            border-radius: 12px;\n            padding: 20px;\n            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n            animation: modalSlideIn 0.3s ease;\n        }\n\n        @keyframes modalSlideIn {\n            from { transform: translateY(-20px); opacity: 0; }\n            to { transform: translateY(0); opacity: 1; }\n        }\n\n        .search-modal-header,.login-modal-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 15px;\n            padding-bottom: 10px;\n            border-bottom: 1px solid #e6e6e6;\n        }\n\n        .search-modal-title,.login-modal-title {\n            font-size: 18px;\n            font-weight: 600;\n        }\n\n        .search-modal-close,.login-modal-close {\n            background: none;\n            border: none;\n            font-size: 20px;\n            cursor: pointer;\n            color: #999;\n            transition: color 0.3s;\n        }\n\n        .search-modal-close:hover {\n            color: #333;\n        }\n\n        .search-modal-input {\n            width: 100%;\n            padding: 12px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 16px;\n            margin-bottom: 15px;\n            transition: border-color 0.3s;\n        }\n\n        .search-modal-input:focus {\n            outline: none;\n            border-color: #ff8200;\n        }\n\n        .search-history {\n            margin-bottom: 20px;\n        }\n\/*\n        .search-history-title {\n            font-size: 14px;\n            color: #666;\n            margin-bottom: 10px;\n        }\n  *\/      \n        .search-history-title {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 20px;\n            padding-bottom: 15px;\n            border-bottom: 1px solid #f0f0f0;\n        }\n        .search-clear {\n            background-color: #f0f0f0;\n            color: #666;\n            padding: 8px 15px;\n            border-radius: 20px;\n            cursor: pointer;\n            font-size: 14px;\n            transition: all 0.3s ease;\n            display: flex;\n            align-items: center;\n            gap: 5px;\n        }\n        .search-clear:hover {\n            background-color: #e0e0e0;\n            transform: translateY(-2px);\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n        }\n        .search-history-list {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 8px;\n        }\n\n        .search-history-item {\n            background-color: #f5f5f5;\n            padding: 6px 12px;\n            border-radius: 15px;\n            font-size: 14px;\n            cursor: pointer;\n            transition: all 0.3s;\n        }\n\n        .search-history-item:hover {\n            background-color: #e6e6e6;\n        }\n\n        .search-modal-actions {\n            display: flex;\n            justify-content: flex-end;\n            gap: 10px;\n        }\n        \n        .login-modal-actions{\n            justify-content: center;\n            display: flex;\n            gap: 10px;\n        }\n        \n        .search-modal-cancel,.login-modal-cancel {\n            background: none;\n            border: 1px solid #ddd;\n            padding: 10px 20px;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 14px;\n            transition: all 0.3s;\n        }\n        \n        .login-modal-cancel{\n            background-color: #ff8200;\n            color: white;\n            border: none;\n        }\n        \n        .search-modal-cancel:hover {\n            background-color: #f5f5f5;\n        }\n\n        .search-modal-confirm,.login-modal-confirm{\n            background-color: #ff8200;\n            color: white;\n            border: none;\n            padding: 10px 20px;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 14px;\n            transition: background-color 0.3s;\n        }\n        \n        .login-modal-confirm{\n            background: none;\n            border: 1px solid #ddd;\n            color:#000\n        }\n        \n        .search-modal-confirm:hover {\n            background-color: #e67300;\n        }\n\n        \/* 备注弹窗 *\/\n        .remark-modal {\n            display: none;\n            position: fixed;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background-color: rgba(0, 0, 0, 0.5);\n            z-index: 1000;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .remark-modal.active {\n            display: flex;\n        }\n\n        .remark-modal-content {\n            background-color: #fff;\n            width: 80%;\n            max-width: 400px;\n            border-radius: 12px;\n            padding: 20px;\n            animation: modalSlideIn 0.3s ease;\n        }\n\n        .remark-modal-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 15px;\n            padding-bottom: 10px;\n            border-bottom: 1px solid #e6e6e6;\n        }\n\n        .remark-modal-title {\n            font-size: 18px;\n            font-weight: 600;\n        }\n\n        .remark-modal-close {\n            background: none;\n            border: none;\n            font-size: 20px;\n            cursor: pointer;\n            color: #999;\n            transition: color 0.3s;\n        }\n\n        .remark-modal-close:hover {\n            color: #333;\n        }\n\n        .remark-modal-input {\n            width: 100%;\n            padding: 12px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 16px;\n            margin-bottom: 15px;\n            transition: border-color 0.3s;\n        }\n\n        .remark-modal-input:focus {\n            outline: none;\n            border-color: #ff8200;\n        }\n\n        .remark-modal-actions {\n            display: flex;\n            justify-content: flex-end;\n            gap: 10px;\n        }\n\n        .remark-modal-cancel {\n            background: none;\n            border: 1px solid #ddd;\n            padding: 10px 20px;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 14px;\n            transition: all 0.3s;\n        }\n\n        .remark-modal-cancel:hover {\n            background-color: #f5f5f5;\n        }\n\n        .remark-modal-confirm {\n            background-color: #ff8200;\n            color: white;\n            border: none;\n            padding: 10px 20px;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 14px;\n            transition: background-color 0.3s;\n        }\n\n        .remark-modal-confirm:hover {\n            background-color: #e67300;\n        }\n\n        \/* 响应式设计 *\/\n        @media (max-width: 480px) {\n            .container {\n                max-width: 100%;\n            }\n            \n            .subscribe-action {\n                width: 12px;\n                height: 12px;\n                font-size: 12px;\n            }\n        }\n\n        @media (max-width: 360px) {\n            .subscribe-actions {\n                gap: 3px;\n            }\n            \n            .subscribe-action {\n                width: 12px;\n                height: 12px;\n                font-size: 12px;\n                padding: 4px;\n            }\n        }",
    "style": "  * { 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; \n            grid-template-columns: repeat(3, 1fr); \n            gap: 5px; \n            margin: 5px 0; \n            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        .retweeted_status{\n        background:#ECECEC;\n        padding:15px;\n        border-radius:8px;\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        .comment-replies{\n            \tbackground:#efefef;\n            \tpadding:5px 5px 5px 20px;\n            \tmargin-left:42px;\n            \tborder-radius: 8px;\n            \tbox-shadow: 0 1px 3px rgba(0,0,0,0.05);\n            \t\n        \t}\n        \t\n.comments-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom:10px\n}\n\n.comments-title {\n  margin: 0;\n  font-size: 18px; \n  color: #333; \n}\n\n.sort-controls {\n  display: flex;\n  align-items: center;\n}\n\n.sort-btn {\n  padding: 4px 12px;\n  border: 1px solid #e0e0e0;\n  background: #f5f5f5;\n  border-radius: 15px;\n  font-size: 12px;\n  cursor: pointer;\n  margin-right: 8px; \n  transition: all 0.3s;\n}\n\n\n.sort-btn:last-child {\n  margin-right: 0;\n}\n\n.sort-btn.active {\n  background: #1d9bf0;\n  color: white;\n  border-color: #1d9bf0;\n}\n\n     \n        .comment-item { padding: 12px 0;  }\n           \n        .comment-user { display: flex; align-items: flex-start; margin-bottom: 8px; }\n        .user-avatar { \n            width: 32px; height: 32px; border-radius: 50%; \n            margin-right: 10px; object-fit: cover; \n        }\n        .user-info {\n    display: flex;\n    flex-direction: column;\n}\n        .user-name { \n        font-weight: 500; \n        font-size: 15px;\n        color:#1E88E5\n          }\n        .comment-text { \n            margin-left: 42px;\n            margin-bottom: 8px; font-size: 15px; line-height: 1.5; word-break: break-word; \n        }\n        .comment-time { font-size: 12px; color: #999; }\n        .comment-media { \n            margin-left:42px;\n            margin-bottom:10px;\n            margin-top:10px;\n            margin-right:8px;\n            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.active {\n  pointer-events: none; \n}\n\n   .float-buttons {\n      position: fixed;\n      right: 20px;\n      bottom: 20px;\n      display: flex;\n      flex-direction: column;\n      gap: 10px;\n      z-index: 1001;\n    }\n    .reply-modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: rgba(0,0,0,0.5);\n  z-index: 1000;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.modal-content {\n  width: 80%;\n  max-width: 600px;\n  max-height: 80vh;\n  background: white;\n  border-radius: 8px;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #eee;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.modal-body {\n  flex: 1;\n  overflow-y: auto;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 10px;\n  text-align: center;\n}\n.loading-spinner {\n  display: none;\n  width: 20px;\n  height: 20px;\n  border: 3px solid rgba(0,0,0,0.1);\n  border-radius: 50%;\n  border-top-color: #1d9bf0;\n  animation: spin 1s linear infinite;\n  margin: 0 auto;\n}\n@keyframes spin {\n  to { transform: rotate(360deg); }\n}\n.reply-sort {\n  display: flex;\n  gap: 10px;\n  align-items: center;\n}\n.close-btn {\n  cursor: pointer;\n  font-size: 20px;\n}\n.like_counts{\ncolor:#999;\nfont-size:12px;\nmargin-left:auto;\npadding-right:8px\n}\n    .float-btn {\n      width: 25px;\n      height: 25px;\n      border-radius: 50%;\n      background: rgba(0, 0, 0, 0.5);\n      color: white;\n      border: none;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 15px;\n      transition: all 0.3s ease;\n      box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n      -webkit-tap-highlight-color: transparent !important;\n  tap-highlight-color: transparent !importan;\n  outline: none !important;\n  -webkit-tap-highlight-color: transparent !important;\n    }\n   \n.float-btn:focus,\n.float-btn:focus-visible,\n.float-btn:active,\n.float-btn:-moz-focusring {\n  outline: none !important;\n  box-shadow: none !important;\n}\n.morerep{\ntext-align:right;\ncolor:#4590B5;\nfont-size:13px\n}\n    .float-btn:hover {\n      background: rgba(0, 0, 0, 0.7);\n      transform: scale(1.1);\n    }\n       .error-message{\n       \tbackground:#eee;\n        padding:15px;\n        font-size:18px;\n       \t}\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;width:1em; height:1em}\n        .surl-text { color: #1E88E5; margin-right: 5px; }\n        @media (max-width: 500px) {\n            .image-gallery { grid-template-columns: repeat(3, 1fr); }\n            body { padding: 10px; }\n            .main-content, .comments-section { padding: 12px; }\n        }     \n         \n\n        .viewer-open {\n            overflow: hidden;\n            position: fixed;\n            width: 100%;\n        }\n        \n        \n        .star-modal {\n            display: none;\n            position: fixed;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background-color: rgba(0, 0, 0, 0.7);\n            z-index: 2000;\n            justify-content: center;\n            align-items: center;\n            animation: fadeIn 0.3s;\n        }\n        \n        .star-modal-content {\n            background: white;\n            border-radius: 12px;\n            width: 90%;\n            max-width: 500px;\n            max-height: 60vh;\n            overflow-y: auto;\n            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n            position: relative;\n            animation: slideUp 0.3s;\n        }\n        \n        .star-close-btn {\n            position: absolute;\n            top: 15px;\n            right: 20px;\n            font-size: 28px;\n            font-weight: bold;\n            color: #666;\n            cursor: pointer;\n            z-index: 10;\n            transition: color 0.3s;\n        }\n        \n        .star-close-btn:hover {\n            color: #ff4757;\n        }\n        \n        .sart-modal-body {\n            padding: 20px;\n        }\n        \n        @keyframes fadeIn {\n            from { opacity: 0; }\n            to { opacity: 1; }\n        }\n        \n        @keyframes slideUp {\n            from { \n                opacity: 0;\n                transform: translateY(50px);\n            }\n            to { \n                opacity: 1;\n                transform: translateY(0);\n            }\n        }\n        \n   #ai-body{\n       font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n            line-height: 1.6;\n            color: #333;\n            background-color: #f8fafc;\n            margin: 0;\n            padding: 20px;\n            max-width: 800px;\n            margin: 0 auto;\n       \n       \n   }\n\n\n        \n        \n        .ai-h3 {\n            color: #1565c0; \n            font-size: 1.3em;\n            font-weight: 600;\n            margin: 25px 0 15px 0;\n            padding-bottom: 8px;\n            border-bottom: 2px solid #bbdefb;\n        }\n\n        \n        .ai-content {\n            font-size: 1.05em;\n            margin: 15px 0;\n            color: #374151;\n        }\n\n        \n        .ai-listp {\n            font-weight: 600;\n            margin: 20px 0 10px 0;\n            color: #1e88e5; \n            font-size: 1.1em;\n        }\n\n        \n        .ai-list {\n            margin: 8px 0;\n            padding-left: 25px; \n            color: #4b5563;\n            list-style: none;\n            position: relative;\n            text-indent: 0; \n        }\n\n        .ai-list::before {\n            content: \"\";\n            position: absolute;\n            left: 10px; \n            top: 0.7em;\n            width: 6px;\n            height: 6px;\n            background-color: #1e88e5; \n            border-radius: 50%;\n        }\n\n        \n        .data-table {\n            width: auto; \n            border-collapse: collapse;\n            margin: 20px 0;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n            background: white;\n            border-radius: 8px;\n            overflow: hidden;\n            min-width: 100%; \n        }\n\n        \n        .ai-thead {\n            background: linear-gradient(135deg, #1565c0, #1e88e5);\n        }\n\n        .ai-th {\n            padding: 15px 12px;\n            text-align: center; \n            font-weight: 600;\n            color: white;\n            border-bottom: 2px solid #64b5f6;\n            white-space: nowrap; \n        }\n\n        \n        .ai-tbody-tr {\n            border-bottom: 1px solid #f1f5f9;\n            transition: background-color 0.2s;\n        }\n\n        .ai-tbody-tr:hover {\n            background-color: #e3f2fd;\n        }\n\n        .ai-tbody-td {\n            padding: 12px;\n            border-bottom: 1px solid #f8fafc;\n            text-align: left; \n        }\n.media-block {\n    width: 100%;\n    height: 180px;\n    background: #f8fafc;\n    overflow-x: auto;\n    overflow-y: hidden; \n}\n\n.media-c {\n    width: auto; \n    display: flex;\n    flex-wrap: nowrap; \n    gap: 10px;\n    justify-content: flex-start;\n    margin: 15px 0;\n    height: 100%;\n}\n\n.media-block div[data-type] {\n    flex: 0 0 calc(33.333% - 7px);\n    min-width: 0;\n    box-sizing: border-box;\n    height: 150px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    overflow: hidden;\n    min-width: 120px;\n    position: relative; \n}\n\n\n.media-block div[data-type=\"v\"]::after {\n    content: \"视频\"; \n    position: absolute;\n    bottom: 8px;\n    left: 8px;\n    background: rgba(0, 0, 0, 0.7); \n    color: white;\n    padding: 2px 8px;\n    border-radius: 4px;\n    font-size: 12px;\n    z-index: 2; \n}\n\n.media-block div[data-type=\"p\"]::after {\n    content: \"图片\";\n    position: absolute;\n    bottom: 8px;\n    left: 8px;\n    background: rgba(0, 0, 0, 0.7); \n    color: white;\n    padding: 2px 8px;\n    border-radius: 4px;\n    font-size: 12px;\n    z-index: 2;\n}\n\n.media-block img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    border-radius: 6px;\n    position: relative;\n    z-index: 1;\n}\n\n\n            \n            .ai-h3 {\n                font-size: 1.2em;\n            }\n            \n            .ai-th, .ai-tbody-td {\n                padding: 10px 8px;\n                font-size: 0.9em;\n            }\n            \n            .data-table {\n                display: block;\n                overflow-x: auto;\n                width: 100%; \n            }\n            \n            .ai-th {\n                white-space: normal;\n            }\n        }\n\n        \n        strong {\n            color: #1565c0; \n            font-weight: 600;\n        }\n\n        ",
    "type": 0
}
广告