批量打開 reddit 的 r/udemyfreeebies 連結

批次打開連結,自訂每批數量、是否從上次進度繼續

当前为 2025-05-01 提交的版本,查看 最新版本

// ==UserScript==
// @name         批量打開 reddit 的 r/udemyfreeebies 連結
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  批次打開連結,自訂每批數量、是否從上次進度繼續
// @license      GPL-3.0
// @match        https://*/*
// @grant        GM_registerMenuCommand
// @author       twozwu
// ==/UserScript==

(function () {
    'use strict';

    let links = [];
    let defaultPerClick = parseInt(localStorage.getItem('defaultPerClick')) || 15;
    let resumeLast = localStorage.getItem('resumeCheck') === 'true';

    function createUI() {
        const panel = document.createElement('div');
        panel.style = `
            position: fixed;
            top: 80px;
            right: 20px;
            background: #f0f0f0;
            border: 2px solid #ccc;
            border-radius: 12px;
            padding: 15px;
            z-index: 9999;
            box-shadow: 0 0 10px rgba(0,0,0,0.2);
            font-family: sans-serif;
        `;
        panel.innerHTML = `
            <h3 style="margin: 0 0 10px 0;">🔗 批量開啟設定</h3>
            <label>每批數量:
                <input id="perClick" type="number" value="${defaultPerClick}" min="1" style="width: auto;">
            </label>
            <br><br>
            <label>
                <input id="resumeCheck" type="checkbox" ${resumeLast ? 'checked' : ''}> 從上次進度繼續
            </label>
            <br><br>
            <button id="runOpener" style="padding: 5px 10px;">🚀 執行批次開啟</button>
            <button id="closePanel" style="float:right;">❌</button>
        `;
        document.body.appendChild(panel);

        document.getElementById("closePanel").onclick = () => panel.remove();
        document.getElementById("runOpener").onclick = () => {
            const perClick = parseInt(document.getElementById("perClick").value);
            const resume = document.getElementById("resumeCheck").checked;
            localStorage.setItem('defaultPerClick', perClick);
            localStorage.setItem('resumeCheck', resume); // 儲存勾選狀態
            panel.remove();
            // 關掉面板
            openLinks(perClick, resume);
        };
    }
    //createUI();
    function openLinks(perClick, resume) {
        const listItems = document.querySelectorAll('.text-neutral-content ul li');

        listItems.forEach(li => {
            const anchor = li.querySelector('a');
            if (anchor) {
                links.push(anchor.href);
            }
        });

        if (links.length === 0) {
            alert("⚠️ 找不到連結!");
            return;
        }

        let i = 0;
        const savedIndex = parseInt(localStorage.getItem('index') || '0');
        if (resume && !isNaN(savedIndex)) i = savedIndex;

        for (; i < links.length; i++) {
            if (i % perClick === 0) {
                const cont = confirm(`目前第 ${i} 個,要繼續嗎?`);
                if (!cont) {
                    localStorage.setItem('index', i);
                    break;
                }
            }

            const link = links[i];
            const win = window.open(link, "_blank", "noopener,noreferrer");
            if (win) {
                win.blur();
                window.focus();
            }
        }

        if (i >= links.length) {
            localStorage.removeItem('index');
            alert("✅ 已打開全部連結!");
        }
    }

    GM_registerMenuCommand("📂 開啟連結設定面板", createUI);
})();