Auto import ID number

when opening PDF auto import ID number.

// ==UserScript==
// @name         Auto import ID number
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  when opening PDF auto import ID number.
// @author       Adokun
// @match        https://mail.google.com/*
// @grant        none
// ==/UserScript==

// 將IDNumber改成自己的身分證
const IDNumber = "A1234567890";

function handlePasswordDialog(dialogElement) {
    observer.disconnect();
    setTimeout(() => {
        try {
            const driveInfoElement = document.querySelector('#drive-active-item-info');
            if (!driveInfoElement) {
                console.warn("警告:未找到元素 #drive-active-item-info。");
                return;
            }
            const fileInfo = JSON.parse(driveInfoElement.innerText);
            if (fileInfo && typeof fileInfo.title === 'string' && /\.pdf$/i.test(fileInfo.title)) {
                const passwordInput = dialogElement.querySelector('[type="password"]');
                if (passwordInput) {
                    // console.log(`偵測到 PDF 檔案:${fileInfo.title}。正在嘗試自動填入密碼。`);
                    passwordInput.value = IDNumber; // 填入密碼。
                    passwordInput.dispatchEvent(new Event('change')); // 觸發 'change' 事件,模擬使用者輸入。
                    // console.log("密碼欄位已成功填入並觸發 change 事件。");
                }
                else {
                    console.warn("警告:在 PDF 密碼對話框中未找到密碼輸入元素。");
                }
            }
        }
        catch (error) {
            console.error("錯誤:處理 PDF 密碼對話框時發生問題。", error);
        }
        finally {
            // 無論是否發生錯誤,都重新連接觀察器,繼續監聽 DOM 變化。
            observer.observe(document.body, { childList: true, subtree: true, attributes: true });
        }
    }, 1500);
}
// 創建一個 MutationObserver 實例來監聽 DOM 樹的變化。
// MutationObserver 比 DOMSubtreeModified 更加高效和推薦。
const observer = new MutationObserver((mutationsList) => {
    for (const mutation of mutationsList) {
        if (mutation.type === 'childList' || mutation.type === 'attributes') {
            // 檢查被修改的目標元素本身是否為對話框。
            const targetElement = mutation.target instanceof Element ? mutation.target : null;
            if (targetElement && targetElement.getAttribute('role') === 'dialog' && targetElement.classList.contains('aLF-aPX-axU')) {
                handlePasswordDialog(targetElement);
                return;
            }
            // 檢查所有新加入的節點,看是否有符合條件的對話框。
            mutation.addedNodes.forEach(node => {
                if (node instanceof Element && node.getAttribute('role') === 'dialog' && node.classList.contains('aLF-aPX-axU')) {
                    handlePasswordDialog(node);
                    return;
                }
            });
        }
    }
});
// 開始觀察整個 document body,監聽其子節點、所有後代子樹以及屬性的變化。
observer.observe(document.body, { childList: true, subtree: true, attributes: true });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址