Kemono Auto-Uncheck

針對頑固的前端框架,強制取消 auto_import

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Kemono Auto-Uncheck
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  針對頑固的前端框架,強制取消 auto_import
// @author       Chung Paul
// @match        https://kemono.su/importer*
// @match        https://kemono.cr/importer*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    function forceUncheck() {
        const checkbox = document.getElementById('auto_import');

        // 只有當找到元素且它仍然是「勾選」狀態時才執行
        if (checkbox && checkbox.checked) {
            console.log("【腳本觸發】發現頑固的勾選框,正在執行強制取消...");

            // --- 策略 A: 點擊 Label ---
            // 很多網站只監聽 Label 的點擊,而不是 Input 本身
            const label = document.querySelector('label[for="auto_import"]');
            if (label) {
                label.click();
            }

            // --- 策略 B: React/Vue 專用滲透法 ---
            // 如果點擊 Label 之後還是勾選狀態(或是被框架改回來了),我們用底層方法
            if (checkbox.checked) {
                // 獲取 HTML 原生的屬性設定器,繞過框架的攔截
                const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'checked').set;

                if (nativeSetter) {
                    // 強制設定為 false
                    nativeSetter.call(checkbox, false);

                    // 偽造一系列事件,騙過框架讓它以為是用戶操作的
                    const eventOptions = { bubbles: true, cancelable: true, view: window };
                    checkbox.dispatchEvent(new MouseEvent('click', eventOptions));
                    checkbox.dispatchEvent(new Event('input', eventOptions));
                    checkbox.dispatchEvent(new Event('change', eventOptions));
                    checkbox.dispatchEvent(new Event('blur', eventOptions));
                }
            }
        }
    }

    // --- 執行策略:持續監控 ---
    // 網頁載入後,網站的程式碼可能會延遲 1~2 秒才去讀取 cookies 並把框勾起來
    // 所以我們要在前 5 秒內,只要看到它亮起來就立刻打下去
    let attempts = 0;
    const timer = setInterval(() => {
        forceUncheck();
        attempts++;
        if (attempts > 20) { // 監控約 10 秒後停止,節省資源
            clearInterval(timer);
        }
    }, 500); // 每 0.5 秒檢查一次

})();