您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Generate random passwords with Context Menu
// ==UserScript== // @name Password Generator // @name:tr Şifre Oluşturucu // @namespace https://aktolu.com/ // @version 0.6 // @description Generate random passwords with Context Menu // @description:tr Sağ tık menüsünü kullanarak rastgele şifreler oluşturun // @author Muhammed Aktolu // @match *://*/* // @icon https://static-00.iconduck.com/assets.00/security-password-icon-1959x2048-sq0rdvok.png // @grant GM_addElement // @grant GM_addStyle // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_setClipboard // ==/UserScript== /* jshint esversion: 11 */ (function() { 'use strict'; // Start Global const toast = function(text, type = 'success') { document.getElementById('myToast')?.remove(); document.getElementById('myToastStyle')?.remove(); // language=css let styleString = ` #myToast { display: inline-block !important; padding: 20px !important; opacity: .6 !important; color: white !important; background-color: black !important; position: fixed !important; top: 20px !important; right: 20px !important; z-index: 9999999999999999999999 !important; } #myToast.success { background-color: green !important; } #myToast.warning { background-color: orange !important; } #myToast.danger { background-color: darkred !important; } `; let style = multilineCss(styleString, 'myToastStyle'); let block = GM_addElement(document.body, 'div', { id: 'myToast', class: type, }); block.innerText = text; setTimeout(() => { block.remove(); style.remove(); }, 5000); } const multilineCss = function(style, id = '') { let el = GM_addStyle(style); if (id !== '') { el.id = id; } return el; } // End Global // Start Password Generator const generatePassword = function(length = 16, minPerType = 2, uppercase = true, lowercase = true, number = true, symbol = false) { let string = ''; let pass = { uppercase: true, lowercase: true, number: true, symbol: true, } let match; if (uppercase) { string += 'ABCDEFGHJKMNPQRSTUVWXYZ'; } if (lowercase) { string += 'abcdefghjkmnpqrstuvwxyz'; } if (number) { string += '23456789'; } if (symbol) { string += '!";#$%&\'()*+,-./:;<=>?@[]^_`{|}~'; } let password = Array.from(crypto.getRandomValues(new Uint32Array(length))) .map((x) => string[x % string.length]) .join(''); if (uppercase) { match = password.match(/[A-Z]/g); if (!match || match.length < minPerType) { pass.uppercase = false; } } if (lowercase) { match = password.match(/[a-z]/g); if (!match || match.length < minPerType) { pass.lowercase = false; } } if (number) { match = password.match(/\d/g); if (!match || match.length < minPerType) { pass.number = false; } } if (symbol) { match = password.match(/[^A-Za-z0-9]/g); if (!match || match.length < minPerType) { pass.symbol = false; } } if (password.match(/(.)\1/) || !pass.uppercase || !pass.lowercase || !pass.number || !pass.symbol) { return generatePassword(length, minPerType, uppercase, lowercase, number, symbol); } else { return password; } } // End Password Generator GM_registerMenuCommand('Generate Password', function() { if (document.getElementById('pgBlock')) { return false; } //let length = GM_getValue('passwordGeneratorLength', '16'); let password = generatePassword(GM_getValue('pgLength', 16), GM_getValue('pgMinPerType', 2), GM_getValue('pgUppercase', true), GM_getValue('pgLowercase', true), GM_getValue('pgNumber', true), GM_getValue('pgSymbol', false)); // language=css let styleString = ` #pgBlock { position: fixed !important; width: 100vw !important; height: 100vh !important; z-index: 999999999999999999999 !important; display: flex !important; align-items: center !important; justify-content: center !important; background-color: rgba(0, 0, 0, .9) !important; left: 0 !important; top: 0 !important; } #pgBlock * { font-family: Helvetica, Arial, sans-serif !important; font-size: 15px !important; font-weight: 300 !important; letter-spacing: 0 !important; line-height: 100% !important; color: whitesmoke !important; float: none !important; border-radius: 0 !important; } #pgBlock div { display: block !important; } #pgBlock button { background-color: red !important; padding: 10px 30px !important; border: none !important; cursor: pointer !important; } #pgBlock input { margin-inline: 0 !important; font-size: 13px !important; display: inline !important; } #pgBlock input[type="number"] { background-color: black !important; border: 1px solid whitesmoke !important; width: 60px !important; padding: 1px 0 1px 2px !important; appearance: auto !important; } #pgBlock label { margin-right: 15px !important; cursor: pointer !important; -webkit-user-select: none !important; user-select: none !important; } .pgBox { text-align: center !important; } #pgPassword { font-size: 3rem !important; margin-bottom: 15px !important; } `; let style = multilineCss(styleString); let block = GM_addElement(document.body, 'div', { id: 'pgBlock', }); // language=html block.innerHTML = `<div class="pgBox"> <div id="pgPassword"></div> <div> <button id="pgCopyPassword">Copy</button> <button id="pgCancelPassword">Cancel</button> </div> <div style="margin-top: 100px"> <div> Length: <input id="pgPasswordLength" type="number" value="`+GM_getValue('pgLength', 16)+`" style="margin-right: 60px" min="8" max="64"> Min Chars Per Type: <input id="pgPasswordMinPerType" type="number" value="`+GM_getValue('pgMinPerType', 2)+`" min="0"> </div> <div style="margin-top: 10px"> <label>Uppercase: <input id="pgUppercase" type="checkbox"`+(GM_getValue('pgUppercase', true) ? ' checked' : '')+`></label> <label>Lowercase: <input id="pgLowercase" type="checkbox"`+(GM_getValue('pgLowercase', true) ? ' checked' : '')+`></label> <label>Number: <input id="pgNumber" type="checkbox"`+(GM_getValue('pgNumber', true) ? ' checked' : '')+`></label> <label>Symbol: <input id="pgSymbol" type="checkbox"`+(GM_getValue('pgSymbol', false) ? ' checked' : '')+`></label> </div> <button id="pgReGeneratePassword" style="margin-top: 25px">Regenerate Password</button> </div> </div>`; let passwordDiv = document.getElementById('pgPassword'); let copyButton = document.getElementById('pgCopyPassword'); let cancelButton = document.getElementById('pgCancelPassword'); let passwordLengthInput = document.getElementById('pgPasswordLength'); let minPerTypeInput = document.getElementById('pgPasswordMinPerType'); let uppercaseCheckBox = document.getElementById('pgUppercase'); let lowercaseCheckBox = document.getElementById('pgLowercase'); let numberCheckBox = document.getElementById('pgNumber'); let symbolCheckBox = document.getElementById('pgSymbol'); let reGenerateButton = document.getElementById('pgReGeneratePassword'); passwordDiv.innerText = password; copyButton.addEventListener('click', () => { navigator.clipboard.writeText(password) .then(r => toast('Password has been copied successfully.')); block.remove(); style.remove(); }); cancelButton.addEventListener('click', () => { block.remove(); style.remove(); }); [passwordLengthInput, minPerTypeInput].forEach(item => { item.addEventListener('click', () => { item.select(); }); }); reGenerateButton.addEventListener('click', function() { GM_setValue('pgLength', parseInt(passwordLengthInput.value)); GM_setValue('pgMinPerType', parseInt(minPerTypeInput.value)); GM_setValue('pgUppercase', uppercaseCheckBox.checked); GM_setValue('pgLowercase', lowercaseCheckBox.checked); GM_setValue('pgNumber', numberCheckBox.checked); GM_setValue('pgSymbol', symbolCheckBox.checked); password = generatePassword(parseInt(passwordLengthInput.value), parseInt(minPerTypeInput.value), uppercaseCheckBox.checked, lowercaseCheckBox.checked, numberCheckBox.checked, symbolCheckBox.checked); passwordDiv.innerText = password; }); }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址