美人图 - 秀人

https://meirentu.club

分享者: jianghubailei (2226)发布时间: 6天前

今天第三次修改,接近完美
二维码导入
{
    "articleStyle": 2,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "header": "{\n\t \"User-Agent\": \"Mozilla\/5.0 (Linux; U; Android 9; zh-cn; MIX 2S Build\/PKQ1.180729.001) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/100.0.4896.127 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/16.7.35 swan-mibrowser\",\n\t \"Referer\": \"{{baseUrl}}\"\n}",
    "lastUpdateTime": 1769069467887,
    "loadWithBaseUrl": true,
    "preload": false,
    "ruleArticles": "li.i_list.list_n2",
    "ruleContent": "<!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, user-scalable=no\">\n<title>{{@@h1@text}}<\/title>\n<style>\nbody {\n    margin: 0;\n    background: #000;\n    color: #eee;\n    font-family: sans-serif;\n}\n\n#statusBar {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    z-index: 999;\n    background: rgba(0, 0, 0, 0.7);\n    color: #aaa;\n    padding: 4px 10px;\n    font-size: 12px;\n    text-align: center;\n    backdrop-filter: blur(2px);\n    pointer-events: none;\n}\n\n#imgList img {\n    display: block;\n    width: 100%;\n    height: auto;\n    margin: 0;\n}\n<\/style>\n<\/head>\n<body>\n\n<div id=\"statusBar\">加载中…<\/div>\n\n\n{{@@h1@all}}\n\n<div id=\"detail\">\n{{@@article@all}}\n{{@@class.item_info@all}}\n<\/div>\n\n\n<div id=\"imgList\"><\/div>\n\n<script>\n\/\/ === 配置 ===\nconst pageUrls = `{{@@class.page@a:not(.current)@href}}`\n  .split('\\n')\n  .map(s => s.trim())\n  .filter(Boolean);\n\nlet allImages = []; \/\/ 所有已加载的图片URL\nlet pageImageCounts = []; \/\/ 每页图片数量,用于定位页码\nlet isLoading = false;\nconst maxRetry = 2;\n\n\/\/ === DOM ===\nconst imgList = document.getElementById('imgList');\nconst statusBar = document.getElementById('statusBar');\n\n\/\/ === 工具函数 ===\nfunction showStatus(text) {\n    if (statusBar) statusBar.textContent = text;\n}\n\n\/\/ 获取某页图片(简化版,优先 iframe)\nasync function fetchPageImages(url) {\n    return new Promise((resolve, reject) => {\n        const iframe = document.createElement('iframe');\n        iframe.style.display = 'none';\n        const timeout = setTimeout(() => {\n            cleanup();\n            reject(new Error('超时'));\n        }, 8000);\n        \n        function cleanup() {\n            clearTimeout(timeout);\n            if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n        }\n        \n        iframe.onload = () => {\n            try {\n                const doc = iframe.contentDocument;\n                let imgs = doc.querySelectorAll('.content_left img') ||\n                           doc.querySelectorAll('.content img') ||\n                           doc.querySelectorAll('img');\n                const urls = Array.from(imgs).map(i => i.src).filter(Boolean);\n                cleanup();\n                resolve(urls);\n            } catch (e) {\n                cleanup();\n                reject(e);\n            }\n        };\n        iframe.onerror = () => { cleanup(); reject(new Error('加载失败')); };\n        iframe.src = url;\n        document.body.appendChild(iframe);\n    });\n}\n\n\/\/ 追加一页图片\nfunction appendPage(images) {\n    images.forEach(src => {\n        const img = document.createElement('img');\n        img.src = src;\n        img.loading = 'lazy';\n        imgList.appendChild(img);\n    });\n    allImages.push(...images);\n    pageImageCounts.push(images.length);\n}\n\n\/\/ 计算当前可视区域的图片索引\nfunction getCurrentImageIndex() {\n    const imgs = imgList.querySelectorAll('img');\n    if (imgs.length === 0) return -1;\n\n    \/\/ 优先选“中心点最接近视口垂直中心”的图片\n    let bestIndex = 0;\n    let minDistance = Infinity;\n\n    for (let i = 0; i < imgs.length; i++) {\n        const rect = imgs[i].getBoundingClientRect();\n        const centerY = rect.top + rect.height \/ 2;\n        const viewportCenter = window.innerHeight \/ 2;\n        const distance = Math.abs(centerY - viewportCenter);\n\n        \/\/ 如果图片完全不可见,跳过(可选)\n        if (rect.bottom < 0 || rect.top > window.innerHeight) {\n            continue;\n        }\n\n        if (distance < minDistance) {\n            minDistance = distance;\n            bestIndex = i;\n        }\n    }\n\n    return bestIndex;\n}\n\n\/\/ 根据图片索引计算所在页码\nfunction getPageInfo(imageIndex) {\n    if (imageIndex < 0) return { pageNum: 0, imageInPage: 0 };\n    let count = 0;\n    for (let i = 0; i < pageImageCounts.length; i++) {\n        if (imageIndex < count + pageImageCounts[i]) {\n            return {\n                pageNum: i + 1,\n                imageInPage: imageIndex - count + 1\n            };\n        }\n        count += pageImageCounts[i];\n    }\n    return { pageNum: pageImageCounts.length, imageInPage: pageImageCounts.at(-1) || 0 };\n}\n\n\/\/ 更新状态栏\nfunction updateStatusBar() {\n    const idx = getCurrentImageIndex();\n    if (idx === -1) return;\n    \n    const { pageNum, imageInPage } = getPageInfo(idx);\n    const totalPages = pageUrls.length;\n    const totalImages = allImages.length;\n    \n    showStatus(`[图片: ${idx + 1} \/ ${totalImages} | 页码: ${pageNum} \/ ${totalPages}]`);\n}\n\n\/\/ 加载下一页(仅当用户滑到底部时调用)\nasync function loadNextPage() {\n    if (isLoading || allImages.length === 0 || pageImageCounts.length >= pageUrls.length) return;\n    \n    const lastImg = imgList.lastElementChild;\n    const rect = lastImg.getBoundingClientRect();\n    \/\/ 只有当最后一张图快进入视口才加载\n    if (rect.top > window.innerHeight + 200) return;\n    \n    isLoading = true;\n    const pageIndex = pageImageCounts.length; \/\/ 下一页索引\n    let retry = 0;\n    \n    while (retry < maxRetry) {\n        try {\n            showStatus(`正在加载第 ${pageIndex + 1} 页…`);\n            const urls = await fetchPageImages(pageUrls[pageIndex]);\n            if (urls.length === 0) throw new Error('无图片');\n            appendPage(urls);\n            showStatus(`✅ 第 ${pageIndex + 1} 页加载完成`);\n            break;\n        } catch (e) {\n            retry++;\n            if (retry >= maxRetry) {\n                showStatus(`❌ 跳过第 ${pageIndex + 1} 页`);\n                pageImageCounts.push(0); \/\/ 占位\n                break;\n            }\n            await new Promise(r => setTimeout(r, 1500));\n        }\n    }\n    \n    isLoading = false;\n    \/\/ 加载完后可能需要继续监听\n    setTimeout(() => {\n        if (pageImageCounts.length < pageUrls.length) {\n            updateStatusBar();\n        }\n    }, 300);\n}\n\n\/\/ === 初始化 ===\n(async () => {\n    if (pageUrls.length === 0) {\n        showStatus('⚠️ 未获取到分页');\n        return;\n    }\n    \n    try {\n        showStatus('加载第 1 页…');\n        const urls = await fetchPageImages(pageUrls[0]);\n        appendPage(urls);\n        showStatus('✅ 首页加载完成');\n        \n        \/\/ 启动滚动监听\n        window.addEventListener('scroll', () => {\n            updateStatusBar();\n            if (!isLoading && pageImageCounts.length < pageUrls.length) {\n                loadNextPage();\n            }\n        }, { passive: true });\n        \n        \/\/ 初始状态\n        setTimeout(updateStatusBar, 300);\n        \n    } catch (e) {\n        showStatus('❌ 首页加载失败');\n    }\n})();\n<\/script>\n<\/body>\n<\/html>",
    "ruleImage": "img@data-src##$##,{\"headers\":{\n\t \"User-Agent\": \"Mozilla\/5.0 (Linux; U; Android 9; zh-cn; MIX 2S Build\/PKQ1.180729.001) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/100.0.4896.127 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/16.7.35 swan-mibrowser\",\n\t \"Referer\": \"{{baseUrl}}\"\n}}",
    "ruleLink": "a.0@href",
    "ruleNextPage": ".current+a@href",
    "rulePubDate": "{{@@span.0@text}}  {{@@span.1@text}}",
    "ruleTitle": ".meta-title@text",
    "searchUrl": "\/s\/{{key}}.html",
    "showWebLog": false,
    "singleUrl": false,
    "sortUrl": "首页::\/\n热门精选::\/hots.html\nXiuRen秀人网::\/group\/XiuRen-1.html\nMFStar模范学院::\/group\/MFStar-1.html\nMiStar魅妍社::\/group\/MiStar-1.html\nMyGirl美媛馆::\/group\/MyGirl-1.html\nImiss爱蜜社::\/group\/Imiss-1.html\nBoLoli兔几盟::\/group\/BoLoli-1.html\nYouWu尤物馆::\/group\/YouWu-1.html\nUxing优星馆::\/group\/Uxing-1.html\nMiiTao蜜桃社::\/group\/MiiTao-1.html\nFeiLin嗲囡囡::\/group\/FeiLin-1.html\nWingS影私荟::\/group\/WingS-1.html\nTaste顽味生活::\/group\/Taste-1.html\nLeYuan星乐园::\/group\/LeYuan-1.html\nHuaYan花の颜::\/group\/HuaYan-1.html\nDKGirl御女郎::\/group\/DKGirl-1.html\nMintYe薄荷叶::\/group\/MintYe-1.html\nYouMi尤蜜荟::\/group\/YouMi-1.html\nCandy糖果画报::\/group\/Candy-1.html\nMTMeng模特联盟::\/group\/MTMeng-1.html\nMicat猫萌榜::\/group\/Micat-1.html\nHuaYang花漾::\/group\/HuaYang-1.html\nXingYan星颜社::\/group\/XingYan-1.html\nXiaoYu画语界::\/group\/XiaoYu-1.html",
    "sourceGroup": "🔞图片",
    "sourceIcon": "https:\/\/meirentu.club\/static\/img\/logo.png",
    "sourceName": "美人图 - 秀人",
    "sourceUrl": "https:\/\/meirentu.club",
    "type": 0
}
广告