记录账号和密码

记录网站密码信息并自动填充

目前為 2024-08-05 提交的版本,檢視 最新版本

// ==UserScript==
// @name         记录账号和密码
// @version      0.4.2
// @description  记录网站密码信息并自动填充
// @author       niweizhuan
// @match        *://*/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @grant        GM_listValues
// @grant        GM_addStyle
// @grant        unsafeWindow
// @license      MIT
// @namespace https://bbs.tampermonkey.net.cn/
// ==/UserScript==

(function() {
    'use strict';

    // 是否自动填充密码
    var autoFillEnabled = true;
    // 如果不需要可以改为false
//*****************************************************************************************************

    // 当前显示的页面
    var currentPageIndex = 0;
    // 显示区域的 DOM 元素
    var displayAreaDiv;
    // 当前网站域名
    var currentDomain = getCurrentDomain();

    // 获取当前网站的域名
    function getCurrentDomain() {
        return window.location.hostname;
    }

    var prevPageButton;
    var nextPageButton;

    // 获取存储的数据
    function getStoredData(domain) {
        var data = GM_getValue(domain);
        return data ? JSON.parse(data) : [];
    }

    // 设置存储的数据
    function setStoredData(domain, data) {
        GM_setValue(domain, JSON.stringify(data));
    }

    // 创建显示区域
    function createDisplayArea() {
        if (displayAreaDiv) {
            document.body.removeChild(displayAreaDiv);
        }

        displayAreaDiv = document.createElement("div");
        displayAreaDiv.setAttribute("class", "passwordDisplayArea");
        displayAreaDiv.style.display = "none";
        displayAreaDiv.style.position = "fixed";
        displayAreaDiv.style.bottom = "70px";
        displayAreaDiv.style.right = "20px";
        displayAreaDiv.style.background = "skyblue";
        displayAreaDiv.style.padding = "5px";
        displayAreaDiv.style.border = "1px solid #ccc";
        displayAreaDiv.style.zIndex = "2147483647";
        displayAreaDiv.style.maxWidth = "250px";
        displayAreaDiv.style.fontSize = "14px";

        var topButtons = document.createElement("div");
        topButtons.style.display = "flex";
        topButtons.style.justifyContent = "space-between";
        topButtons.style.marginBottom = "5px";

        topButtons.appendChild(createButton("关闭", function() {
            displayAreaDiv.style.display = "none";
        }));

        topButtons.appendChild(createButton("编辑", function() {
            displayAreaDiv.style.display = "none";
            showEditPage();
        }));

        topButtons.appendChild(createButton("新建", function() {
            displayAreaDiv.style.display = "none";
            showEditPage({}, true);
        }));

        displayAreaDiv.appendChild(topButtons);

        var domainContainer = document.createElement("div");
        domainContainer.style.display = "flex";
        domainContainer.style.alignItems = "center";
        domainContainer.appendChild(createLabel("当前网站:"));
        domainContainer.appendChild(createValue(currentDomain));
        displayAreaDiv.appendChild(domainContainer);

        var accountContainer = document.createElement("div");
        accountContainer.setAttribute("class", "accountContainer");
        displayAreaDiv.appendChild(accountContainer);

        var pageControls = document.createElement("div");
        pageControls.style.display = "flex";
        pageControls.style.justifyContent = "center";
        pageControls.style.marginTop = "5px";

        prevPageButton = createButton("<", function() {
            if (currentPageIndex > 0) {
                currentPageIndex--;
                updateAccountDisplay();
            }
        });
        pageControls.appendChild(prevPageButton);

        var pageLabel = document.createElement("span");
        pageLabel.setAttribute("class", "pageLabel");
        pageLabel.style.margin = "0 10px";
        pageControls.appendChild(pageLabel);

        nextPageButton = createButton(">", function() {
            var storedData = getStoredData(currentDomain);
            if ((currentPageIndex + 1) < storedData.length) {
                currentPageIndex++;
                updateAccountDisplay();
            }
        });
        pageControls.appendChild(nextPageButton);

        displayAreaDiv.appendChild(pageControls);

        document.body.appendChild(displayAreaDiv);

        updateAccountDisplay();
    }

    // 创建按钮
    function createButton(text, clickHandler) {
        var button = document.createElement("button");
        button.textContent = text;
        button.style.cursor = "pointer";
        button.style.backgroundColor = "transparent";
        button.style.border = "none";
        button.style.fontSize = "inherit";
        button.style.color = "#333";
        button.style.margin = "0 5px";
        button.style.padding = "3px 5px";
        button.onclick = clickHandler;
        button.ontouchend = clickHandler;
        return button;
    }

    // 创建标签
    function createLabel(text) {
        var label = document.createElement("p");
        label.textContent = text;
        label.style.margin = "0";
        return label;
    }

    // 创建值显示
    function createValue(text) {
        var value = document.createElement("p");
        value.textContent = text;
        value.style.margin = "0 5px";
        return value;
    }

    // 创建没有信息的文本
    function createNoInfoText(text) {
        var noInfoText = document.createElement("p");
        noInfoText.textContent = text;
        noInfoText.style.margin = "0";
        return noInfoText;
    }

    // 创建复制按钮
    function createCopyButton(text, copyText) {
        var button = document.createElement("button");
        button.textContent = text;
        button.style.cursor = "pointer";
        button.style.backgroundColor = "transparent";
        button.style.border = "none";
        button.style.fontSize = "inherit";
        button.style.color = "#333";
        button.style.marginLeft = "5px";
        button.style.padding = "3px 5px";
        button.onclick = function() {
            copyTextToClipboard(copyText, button);
        };
        button.ontouchend = button.onclick;
        return button;
    }

    // 复制文本到剪贴板
    function copyTextToClipboard(text, button) {
        navigator.clipboard.writeText(text).then(function() {
            var originalText = button.textContent;
            button.textContent = "已复制";
            setTimeout(function() {
                button.textContent = originalText;
            }, 2000);
        }).catch(function(err) {
            console.error('复制失败:', err);
        });
    }

    // 填充编辑页面字段
    function populateEditFieldsWithCurrentAccount() {
        var storedData = getStoredData(currentDomain);
        var currentAccount = storedData[currentPageIndex];

        var usernameField = document.getElementById("editUsername");
        var passwordField = document.getElementById("editPassword");

        usernameField.value = currentAccount.username || "";
        passwordField.value = currentAccount.password || "";
    }

    // 更新账号显示
    function updateAccountDisplay() {
        var storedData = getStoredData(currentDomain);
        var accountContainer = displayAreaDiv.querySelector(".accountContainer");
        accountContainer.innerHTML = "";

        if (storedData.length > 0) {
            var accountInfo = storedData[currentPageIndex];
            var accountRow = document.createElement("div");
            accountRow.style.display = "flex";
            accountRow.style.justifyContent = "space-between";
            accountRow.appendChild(createLabel("账号:"));
            accountRow.appendChild(createCopyButton("复制", accountInfo.username || "[无账号信息]"));
            accountContainer.appendChild(accountRow);
            accountContainer.appendChild(createValue(accountInfo.username || "[无账号信息]"));
            var passwordRow = document.createElement("div");
            passwordRow.style.display = "flex";
            passwordRow.style.justifyContent = "space-between";
            passwordRow.appendChild(createLabel("密码:"));
            passwordRow.appendChild(createCopyButton("复制", accountInfo.password));
            accountContainer.appendChild(passwordRow);
            accountContainer.appendChild(createValue(accountInfo.password));
            fillCredentials(accountInfo.username, accountInfo.password);
        } else {
            accountContainer.appendChild(createLabel("账号:"));
            accountContainer.appendChild(createNoInfoText("[无账号信息]"));
            accountContainer.appendChild(createLabel("密码:"));
            accountContainer.appendChild(createNoInfoText("[无密码信息]"));
        }

        displayAreaDiv.querySelector(".pageLabel").textContent = (currentPageIndex + 1) + "/" + Math.ceil(storedData.length);
        prevPageButton.style.display = currentPageIndex > 0 ? "inline" : "none";
        nextPageButton.style.display = (currentPageIndex + 1) < storedData.length ? "inline" : "none";
    }

    // 显示编辑页面
    function showEditPage(accountInfo = {}, isNew = false) {
        var editDiv = document.createElement("div");
        editDiv.setAttribute("class", "passwordEditArea");
        editDiv.style.position = "fixed";
        editDiv.style.bottom = "70px";
        editDiv.style.right = "20px";
        editDiv.style.background = "white";
        editDiv.style.padding = "10px";
        editDiv.style.border = "1px solid #ccc";
        editDiv.style.zIndex = "2147483647";
        editDiv.style.maxWidth = "250px";
        editDiv.style.fontSize = "14px";
        editDiv.innerHTML = `
        <p><label>账号:<input type="text" id="editUsername" style="width: 100%;"></label></p>
        <p><label>密码:<input type="password" id="editPassword" style="width: 100%;"></label></p>
        <div style="display: flex; justify-content: space-between; margin-top: 10px;">
            <button id="cancelEdit">取消</button>
            <button id="saveEdit">${isNew ? '创建' : '保存'}</button>
            ${!isNew ? '<button id="deleteEntry">删除</button>' : ''}
        </div>
    `;

        document.body.appendChild(editDiv);

        if (!isNew) {
            populateEditFieldsWithCurrentAccount();
        }

        document.getElementById("cancelEdit").onclick = function() {
            document.body.removeChild(editDiv);
        };

        document.getElementById("saveEdit").onclick = function() {
            var username = document.getElementById("editUsername").value.trim();
            var password = document.getElementById("editPassword").value;

            if (!validateInput(username, password)) {
                return;
            }

            var storedData = getStoredData(currentDomain);

            if (isNew) {
                storedData.push({ username, password });
            } else {
                storedData[currentPageIndex] = { username, password };
            }

            setStoredData(currentDomain, storedData);
            document.body.removeChild(editDiv);
            currentPageIndex = 0;
            updateAccountDisplay();
        };

        if (!isNew) {
            document.getElementById("deleteEntry").onclick = function() {
                var storedData = getStoredData(currentDomain);
                storedData.splice(currentPageIndex, 1);
                setStoredData(currentDomain, storedData);
                document.body.removeChild(editDiv);
                currentPageIndex = 0;
                updateAccountDisplay();
            };
        }
    }

    // 自动填充账号和密码
    function fillCredentials(username, password) {
        if (autoFillEnabled) {
            var editAreaExists = document.querySelector(".passwordEditArea");
            if (editAreaExists) {
                return;
            }

            var usernameField = document.querySelector("input[type='text'], input[type='email']");
            var passwordField = document.querySelector("input[type='password']");
            if (usernameField && passwordField) {
                usernameField.value = username;
                passwordField.value = password;
            }
        }
    }

    // 验证输入
    function validateInput(username, password) {
        return true; // 暂时不使用详细的验证逻辑
    }

    // 创建控制按钮
    function createControlButton() {
        var controlButton = document.createElement("button");
        controlButton.textContent = "显示账号和密码";
        controlButton.style.position = "fixed";
        controlButton.style.bottom = "10px";
        controlButton.style.right = "10px";
        controlButton.style.fontSize = "10px";
        controlButton.style.cursor = "pointer";
        controlButton.style.zIndex = "2147483647";
        controlButton.onclick = function() {
            displayAreaDiv.style.display = displayAreaDiv.style.display === "none" ? "block" : "none";
            if (displayAreaDiv.style.display === "block") {
                updateAccountDisplay();
            }
        };

        document.body.appendChild(controlButton);
    }

    createControlButton();
    createDisplayArea();

})();

QingJ © 2025

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