.:. 草榴社區 » 技術討論區 » [技术贴]原油猴脚本“CL社区收藏夹”修正版,期待技术大佬继续优化
--> 本頁主題: [技术贴]原油猴脚本“CL社区收藏夹”修正版,期待技术大佬继续优化 字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
总加速师


級別:騎士 ( 10 )
發帖:1372
威望:159 點
金錢:134 USD
貢獻:9000 點
註冊:2020-06-23


[技术贴]原油猴脚本“CL社区收藏夹”修正版,期待技术大佬继续优化



很久前社区某个大佬开发过一个脚本“CL社区收藏夹”,非常喜欢,后来停更了,插件失效。因本人不懂技术,无力,甚是想念该插件。昨日用gpt优化尝试,没想到可用,主要优化了图片下载,甚是喜爱这功能。
借此,再次呼唤原开发大佬,期待您的继续更新优化,原帖地址如下:https://openuserjs.org/scripts/zhangsan/CL%E7%A4%BE%E5%8C%BA%E6%94%B6%E8%97%8F%E5%A4%B9

顺便发个码,夹子绕行,新手请熟读版规,得码者跟帖回复下,否则举报取消。
c212*75*90*4a3a7     05-21 13:57
“*”隐藏3个相同字母,字母范围,前10

具体操作,将代码复制,打开油猴,点击 已安装脚本,随便一个脚本点击 操作下的 编辑,删除现有代码,把复制的代码粘贴到编辑器中,点击编辑器左上角保存,生成新的脚本,即可正常使用。
目前谷歌测试良好,
代码如下:

// ==UserScript==
// @name        CL社区收藏夹 最终增强稳定版
// @namespace    http://tampermonkey.net/
// @version      3.8
// @description  收藏 + 导入导出 + 仅下载1楼图片 + 顺序下载 + 正确楼主ID + 版块名命名
// @author      niuhe + ChatGPT
// @match        http*://*/htm_data/*
// @match        http*://*/htm_mob/*
// @match        http*://*/profile.php?action=favor
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_listValues
// @grant        GM_setClipboard
// @grant        GM_download
// @grant        GM_deleteValue
// ==/UserScript==

(function () {

    'use strict';

    const url = location.href;

    const isCollectionPage =
        url.includes("profile.php?action=favor");

    // =====================================
    // 工具
    // =====================================

    function $(selector) {

        return document.querySelector(selector);
    }

    function safeName(str) {

        return str
            .replace(/[\\/:*?"<>|]/g, "_")
            .replace(/\s+/g, " ")
            .trim();
    }

    function getText(selector, fallback = "") {

        const el = $(selector);

        return el
            ? el.textContent.trim()
            : fallback;
    }

    function genKey(url) {

        try {

            return new URL(url).pathname;

        } catch {

            return url;
        }
    }

    function getTagContainer() {

        return $(".tiptop")
            || $(".guide")
            || $("h3")
            || document.body;
    }

    function addSeparator() {

        const span =
            document.createElement("span");

        span.innerText = " | ";

        getTagContainer()
            .appendChild(span);
    }

    function createBtn(
        text,
        color = "#2F5FA1"
    ) {

        const a =
            document.createElement("a");

        a.href = "javascript:void(0)";

        a.innerText = text;

        a.style.margin = "0 5px";
        a.style.color = color;
        a.style.cursor = "pointer";
        a.style.fontWeight = "bold";

        return a;
    }

    // =====================================
    // 获取标题
    // =====================================

    function getTitle() {

        let title =

            getText("h4")
            || getText(".f18")
            || document.title;

        title = title
            .replace(" [复制链接]", "")
            .trim();

        return safeName(title);
    }

    // =====================================
    // 获取楼主ID
    // =====================================

    function getAuthor() {

        try {

            const node =
                document.querySelector("th b");

            if (
                node &&
                node.textContent.trim()
            ) {

                const username =
                    node.textContent.trim();

                console.log(
                    "成功读取楼主:",
                    username
                );

                return safeName(username);
            }

        } catch (err) {

            console.log(
                "读取楼主失败:",
                err
            );
        }

        return "未知用户";
    }

    // =====================================
    // 获取版块名称
    // =====================================

    function getForumName() {

        try {

            const links =
                document.querySelectorAll('a[href*="thread"]');

            for (const node of links) {

                const text =
                    node.textContent.trim();

                if (
                    text &&
                    text.length < 30 &&
                    !text.includes("版規") &&
                    !text.includes("返回")
                ) {

                    console.log(
                        "成功读取版块:",
                        text
                    );

                    return safeName(text);
                }
            }

        } catch (err) {

            console.log(
                "读取版块失败:",
                err
            );
        }

        return "未知版块";
    }

    const title = getTitle();

    const author = getAuthor();

    const forumName = getForumName();

    // =====================================
    // 收藏数据
    // =====================================

    const saveUrl = url
        .replace(location.host, "**")
        .replace("htm_data", "htm_mob");

    const key = genKey(saveUrl);

    const content = JSON.stringify({

        title,
        author,
        forumName,
        url: saveUrl,
        time: Date.now()

    });

    // =====================================
    // 收藏按钮
    // =====================================

    function addFavoriteBtn() {

        addSeparator();

        const saved =
            GM_getValue(key);

        const btn = createBtn(

            saved
                ? "已收藏"
                : "收藏",

            saved
                ? "#ff0000"
                : "#2F5FA1"
        );

        btn.addEventListener("click", () => {

            if (GM_getValue(key)) {

                GM_deleteValue(key);

                btn.innerText = "收藏";

                btn.style.color = "#2F5FA1";

            } else {

                GM_setValue(key, content);

                btn.innerText = "已收藏";

                btn.style.color = "#ff0000";
            }
        });

        getTagContainer()
            .appendChild(btn);
    }

    // =====================================
    // 导出
    // =====================================

    function exportCollection() {

        addSeparator();

        const btn =
            createBtn("导出");

        btn.addEventListener("click", () => {

            const keys =
                GM_listValues();

            const data = [];

            keys.forEach(k => {

                data.push(
                    GM_getValue(k)
                );
            });

            const blob = new Blob(

                [data.join("\n")],

                {
                    type: "text/plain"
                }
            );

            const link =
                document.createElement("a");

            link.href =
                URL.createObjectURL(blob);

            link.download =
                "favorite.dat";

            link.click();

            alert("导出成功");
        });

        getTagContainer()
            .appendChild(btn);
    }

    // =====================================
    // 导入
    // =====================================

    function importCollection() {

        addSeparator();

        const input =
            document.createElement("input");

        input.type = "file";

        input.accept = ".dat";

        input.style.width = "90px";

        input.addEventListener("change", e => {

            const file =
                e.target.files[0];

            if (!file) return;

            const reader =
                new FileReader();

            reader.onload = () => {

                const arr =
                    reader.result.split("\n");

                arr.forEach(line => {

                    if (!line.trim()) return;

                    try {

                        const obj =
                            JSON.parse(line);

                        GM_setValue(

                            genKey(obj.url),

                            line
                        );

                    } catch {}
                });

                alert("导入成功");
            };

            reader.readAsText(file);
        });

        getTagContainer()
            .appendChild(input);
    }

    // =====================================
    // 下载图片(顺序下载)
    // =====================================

    async function downloadImages() {

        addSeparator();

        const btn =
            createBtn("下载图片");

        btn.addEventListener("click", async () => {

            let firstFloor =

                document.querySelector(".tpc_content")
                || document.querySelector(".tpc_cont");

            if (!firstFloor) {

                alert("未找到1楼正文");

                return;
            }

            const imgList =
                firstFloor.querySelectorAll("img");

            let images = [];

            imgList.forEach(img => {

                let src =

                    img.getAttribute("ess-data")
                    || img.getAttribute("data-src")
                    || img.src;

                if (!src) return;

                // 排除头像/LOGO/GIF
                if (

                    src.includes("face")
                    || src.includes("avatar")
                    || src.includes("logo")
                    || src.includes("icon")
                    || src.includes(".gif")

                ) {

                    return;
                }

                // 仅图片
                if (
                    /\.(jpg|jpeg|png|webp)$/i
                    .test(src)
                ) {

                    images.push(src);
                }
            });

            // 去重
            images =
                [...new Set(images)];

            if (images.length === 0) {

                alert("未找到图片");

                return;
            }

            // 复制链接
            GM_setClipboard(
                images.join("\n")
            );

            // 文件夹名
            const folderName =
                `${author}_${forumName}_${title}`;

            const ok = confirm(

                `检测到 ${images.length} 张图片\n\n`
                + `保存目录:${folderName}\n\n`
                + `是否开始下载?`
            );

            if (!ok) return;

            let i = 1;

            // 顺序下载
            for (const img of images) {

                let ext = "jpg";

                try {

                    ext = new URL(img)
                        .pathname
                        .split(".")
                        .pop();

                } catch {}

                const filename =
                    `${folderName}/${i}.${ext}`;

                console.log(
                    "开始下载:",
                    filename
                );

                // 等待当前图片完成
                await new Promise(resolve => {

                    GM_download({

                        url: img,

                        name: filename,

                        saveAs: false,

                        timeout: 60000,

                        onload: () => {

                            console.log(
                                "下载完成:",
                                filename
                            );

                            resolve();
                        },

                        onerror: (e) => {

                            console.log(
                                "下载失败:",
                                filename,
                                e
                            );

                            resolve();
                        },

                        ontimeout: () => {

                            console.log(
                                "下载超时:",
                                filename
                            );

                            resolve();
                        }
                    });
                });

                i++;

                // 下载间隔
                await new Promise(r =>
                    setTimeout(r, 1000)
                );
            }

            alert("全部下载任务完成");
        });

        getTagContainer()
            .appendChild(btn);
    }

    // =====================================
    // 收藏页
    // =====================================

    function showCollectionPage() {

        const keys =
            GM_listValues();

        const list = [];

        keys.forEach(k => {

            try {

                const obj =
                    JSON.parse(
                        GM_getValue(k)
                    );

                list.push(obj);

            } catch {}
        });

        list.sort((a, b) =>
            b.time - a.time
        );

        const html = list.map((item, index) => {

            const realUrl = item.url
                .replace("**", location.host)
                .replace("htm_mob", "htm_data");

            return `

            <div style="
                padding:12px;
                border-bottom:1px solid #ddd;
            ">

                <a href="${realUrl}"
                  target="_blank"
                  style="
                    font-size:16px;
                    color:#2F5FA1;
                    font-weight:bold;
                  ">

                  ${index + 1}. ${item.title}

                </a>

                <div style="
                    color:#666;
                    margin-top:6px;
                    font-size:13px;
                ">

                    ${item.author}

                </div>

            </div>
            `;

        }).join("");

        document.body.innerHTML = `

        <div style="
            max-width:900px;
            margin:auto;
            background:#fff;
        ">

            <h2 style="
                padding:15px;
            ">
                本地收藏夹 (${list.length})
            </h2>

            ${html}

        </div>
        `;
    }

    // =====================================
    // 主逻辑
    // =====================================

    if (!isCollectionPage) {

        addFavoriteBtn();

        exportCollection();

        importCollection();

        downloadImages();

    } else {

        showCollectionPage();
    }

    console.log(
        "CL社区收藏夹最终增强稳定版加载成功"
    );

})();

赞(57)
DMCA / ABUSE REPORT | TOP Posted: 05-21 15:39 樓主 引用 | 發表評論
ISI


級別:俠客 ( 9 )
發帖:2444
威望:245 點
金錢:1862 USD
貢獻:0 點
註冊:2020-09-09


谢谢分享
TOP Posted: 05-21 15:47 #1樓 引用 | 點評
文团


級別:俠客 ( 9 )
發帖:1108
威望:111 點
金錢:502 USD
貢獻:333 點
註冊:2026-01-17

感谢分享
TOP Posted: 05-21 15:48 #2樓 引用 | 點評
东光太郎


級別:騎士 ( 10 )
發帖:7619
威望:487 點
金錢:26458 USD
貢獻:333 點
註冊:2025-03-06

感谢分享
TOP Posted: 05-21 15:55 #3樓 引用 | 點評
归来的奥特曼


級別:騎士 ( 10 )
發帖:7220
威望:297 點
金錢:25995 USD
貢獻:999 點
註冊:2025-02-20

感谢分享
TOP Posted: 05-21 16:11 #4樓 引用 | 點評
楚郡


級別:聖騎士 ( 11 )
發帖:1846
威望:443 點
金錢:8911 USD
貢獻:12222 點
註冊:2025-06-06

这个就叫专业


點評

    TOP Posted: 05-21 16:11 #5樓 引用 | 點評
    果缤纷


    級別:俠客 ( 9 )
    發帖:1948
    威望:237 點
    金錢:3914 USD
    貢獻:300 點
    註冊:2025-12-09

    感谢分享
    TOP Posted: 05-21 16:22 #6樓 引用 | 點評
    结构


    級別:風雲使者 ( 13 )
    發帖:2040
    威望:624 點
    金錢:14463133 USD
    貢獻:398000 點
    註冊:2015-01-01

    这么久了还没人来报到吗?


    點評

      TOP Posted: 05-21 17:06 #7樓 引用 | 點評
      苏筱熙


      級別:天使 ( 14 )
      發帖:145036
      威望:62903 點
      金錢:129808 USD
      貢獻:69 點
      註冊:2012-09-01

      支持哦
      ------------------------
      TOP Posted: 05-21 17:32 #8樓 引用 | 點評
      茎深


      級別:天使 ( 14 )
      發帖:45971
      威望:64975 點
      金錢:780662 USD
      貢獻:118806 點
      註冊:2023-11-21

      高科技
      ------------------------
      TOP Posted: 05-21 18:03 #9樓 引用 | 點評
      逗一乐


      級別:精靈王 ( 12 )
      發帖:3582
      威望:1711 點
      金錢:7556 USD
      貢獻:19888 點
      註冊:2013-10-01

      试了下就收藏功能有效,感谢分享
      ------------------------
      TOP Posted: 05-21 18:14 #10樓 引用 | 點評
      kaovjj


      級別:新手上路 ( 8 )
      發帖:275
      威望:28 點
      金錢:1324 USD
      貢獻:0 點
      註冊:2015-02-24


      我自己也单独弄了个CL的图片视频下载程序,粘贴网址就能解析一楼的图片 、动图、视频出来 ,然后下载的时候修改这些文件的哈希值,按照网页标题创建文件夹保存,同时网址也会保存到数据库,遇到重复的网址会提示,避免帖子重复下载


      點評

        TOP Posted: 05-21 18:33 #11樓 引用 | 點評
        如意大戟霸


        級別:俠客 ( 9 )
        發帖:1028
        威望:188 點
        金錢:8320 USD
        貢獻:0 點
        註冊:2024-08-30

        不懂就问,这是啥?
        TOP Posted: 05-21 18:48 #12樓 引用 | 點評
        go4u


        級別:騎士 ( 10 )
        發帖:2164
        威望:275 點
        金錢:1658 USD
        貢獻:1500 點
        註冊:2015-08-20

        发码好人
        TOP Posted: 05-21 19:12 #13樓 引用 | 點評
        怪蛋


        級別:精靈王 ( 12 )
        發帖:21255
        威望:2460 點
        金錢:2229211 USD
        貢獻:0 點
        註冊:2008-08-13

        谢谢发贴分享
        TOP Posted: 05-21 19:33 #14樓 引用 | 點評
        stephenlee


        級別:精靈王 ( 12 )
        發帖:13520
        威望:1979 點
        金錢:86787 USD
        貢獻:1338 點
        註冊:2011-06-06

        不明觉厉
        ------------------------
        TOP Posted: 05-21 21:14 #15樓 引用 | 點評
        李黑


        級別:聖騎士 ( 11 )
        發帖:2171
        威望:321 點
        金錢:6274 USD
        貢獻:24700 點
        註冊:2024-09-02

        谢谢分享,支持了。
        TOP Posted: 05-21 21:46 #16樓 引用 | 點評
        博博妞


        級別:聖騎士 ( 11 )
        發帖:5479
        威望:615 點
        金錢:33955 USD
        貢獻:8104 點
        註冊:2022-05-02


        支持一下,技术贴
        TOP Posted: 05-21 22:15 #17樓 引用 | 點評
        FuzeBlitz


        級別:聖騎士 ( 11 )
        發帖:6509
        威望:651 點
        金錢:10208 USD
        貢獻:3913 點
        註冊:2022-04-02

        感谢分享
        TOP Posted: 05-21 23:06 #18樓 引用 | 點評
        ytinfo


        級別:聖騎士 ( 11 )
        發帖:5668
        威望:601 點
        金錢:2309 USD
        貢獻:3127 點
        註冊:2013-12-15

        大佬威武。支持一下。
        TOP Posted: 05-21 23:14 #19樓 引用 | 點評
        拉奥


        級別:騎士 ( 10 )
        發帖:1793
        威望:350 點
        金錢:9697 USD
        貢獻:796 點
        註冊:2023-04-13

        感谢分享
        TOP Posted: 05-22 06:52 #20樓 引用 | 點評
        火土迎日


        級別:俠客 ( 9 )
        發帖:1097
        威望:110 點
        金錢:1643 USD
        貢獻:0 點
        註冊:2025-12-31

        感谢分享
        TOP Posted: 05-22 07:08 #21樓 引用 | 點評
        伊洛河畔


        級別:俠客 ( 9 )
        發帖:1030
        威望:104 點
        金錢:3578 USD
        貢獻:100 點
        註冊:2025-02-19

        感谢分享,大哥有心人
        TOP Posted: 05-22 07:42 #22樓 引用 | 點評
        lyse


        級別:精靈王 ( 12 )
        發帖:9206
        威望:971 點
        金錢:7046 USD
        貢獻:3928 點
        註冊:2015-11-05


        谢谢楼主辛苦了,谢谢楼主辛苦了,谢谢楼主辛苦了,谢谢楼主辛苦了
        TOP Posted: 05-22 13:49 #23樓 引用 | 點評
        这是个问题啊


        級別:風雲使者 ( 13 )
        發帖:71449
        威望:7200 點
        金錢:194 USD
        貢獻:113219 點
        註冊:2021-01-01

        感谢分享
        TOP Posted: 05-22 14:02 #24樓 引用 | 點評

        .:. 草榴社區 -> 技術討論區

        快速回帖 頂端
        內容
        HTML 代碼不可用

        使用簽名
        Wind Code自動轉換

        按 Ctrl+Enter 直接提交