星期三, 九月 04, 2024

179 JavaScript 书签, 生成指定位数随机字符密码, 并自动复制到剪贴板

为什么没有用 Bitwarden 自带的密码生成功能呢? 因为这货会存储在历史记录里, 每次还得去清除掉 :'( 


需求和 Bitwarden 一样, 生成一个 18 位的密码(这个可以自己调整), 要求如下:

  • A-Z  (I O 除外, 因为它们容易和 小字母l 和 数字0 混淆)
  • a-z
  • 0-9
  • !?@+-*/=  (这些是手机上常见的符号, 没有加上 # 号是因为 Firefox 有个 Bug, 包含 # 后面的代码中的空格会被转换成 %20, 使用上没影响但是跨浏览器不方便, 所以就把 # 去掉了, 这个 Bug 在 Chrome 上不存在)
  • 这四组必须都要出现至少一次 (也就是说, 密码必定是包含 大小写字母、数字、特殊符号)
  • 点击书签即可生成, 并自动复制到剪贴板中


可读版本:

javascript: (function() {
    function shuffle(array) {
        for (let i = array.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]];
        }
        return array;
    }
    function generatePassword() {
        const lowerCharset = "abcdefghijklmnopqrstuvwxyz";
        const upperCharset = "ABCDEFGHJKLMNPQRSTUVWXYZ";
        const numberCharset = "0123456789";
        const specialCharset = "!?@+-*/=";
        const allCharset = lowerCharset + upperCharset + numberCharset + specialCharset;
        let password = [lowerCharset[Math.floor(Math.random() * lowerCharset.length)], upperCharset[Math.floor(Math.random() * upperCharset.length)], numberCharset[Math.floor(Math.random() * numberCharset.length)], specialCharset[Math.floor(Math.random() * specialCharset.length)]];
        for (let i = 4; i < 18; i++) {
            password.push(allCharset[Math.floor(Math.random() * allCharset.length)]);
        }
        return shuffle(password).join('');
    }
    const password = generatePassword();
    const textBox = document.createElement("textarea");
    textBox.value = password;
    document.body.appendChild(textBox);
    textBox.select();
    document.execCommand("copy");
    document.body.removeChild(textBox);
    alert(password);
})();


压缩版本:

javascript:(function(){function shuffle(array){for(let i=array.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[array[i],array[j]]=[array[j],array[i]];}return array;}function generatePassword(){const lowerCharset="abcdefghijklmnopqrstuvwxyz";const upperCharset="ABCDEFGHJKLMNPQRSTUVWXYZ";const numberCharset="0123456789";const specialCharset="!?@+-*/=";const allCharset=lowerCharset+upperCharset+numberCharset+specialCharset;let password=[lowerCharset[Math.floor(Math.random()*lowerCharset.length)],upperCharset[Math.floor(Math.random()*upperCharset.length)],numberCharset[Math.floor(Math.random()*numberCharset.length)],specialCharset[Math.floor(Math.random()*specialCharset.length)]];for(let i=4;i<18;i++){password.push(allCharset[Math.floor(Math.random()*allCharset.length)]);}return shuffle(password).join('');}const password=generatePassword();const textBox=document.createElement("textarea");textBox.value=password;document.body.appendChild(textBox);textBox.select();document.execCommand("copy");document.body.removeChild(textBox);alert(password);})();


注意, 存为书签使用的 JavaScript 脚本不能有注释, 至少 Firefox 不能有, 不然 // 后面的代码会被 urlencode 掉. 

存成书签, 需要使用的时候点击一下就行了, 截至发文之时, Firefox 可以在扩展页内使用(比如 moz-extension:// 或者某个扩展的新标签页), Chrome 必须在正常网页中使用(比如 https:// http://网站).

代码由 ChatGPT 生成, 版本为免费用户的 GPT-4o.