【问题标题】:Generate random string in JavaScript (for a Discord bot)在 JavaScript 中生成随机字符串(用于 Discord 机器人)
【发布时间】:2021-02-10 05:27:31
【问题描述】:

所以,我希望在 discord.js 中创建一个密码生成器函数,并且我想包含 [az][AZ][0-9],而所有这些都是可选的(我想要用户能够确定密码中包含的内容,例如他们想要小写和大写还是只需要一个)。我一直在尝试解决这个问题,但不能完全正确(我对这一切都很陌生)。

这是我目前所拥有的:

if (message.content === `${prefix}pwgen`) {
        const random = (length = 8) => {
            
            let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        
            
            let str = '';
            for (let i = 0; i < length; i++) {
                str += chars.charAt(Math.floor(Math.random() * chars.length));
            }
        
            return str;
        
        };

这是我从https://attacomsian.com/blog/javascript-generate-random-string 获得的一些代码,但显然,在这里,他使用 console.log 从代码块中获取结果,但在这里我希望能够让用户在 Discord 上发送一个数字所以机器人会生成一个该长度的随机字符串,然后让机器人在 Discord 中返回它。我怎样才能做到这一点?谢谢!

【问题讨论】:

标签: javascript node.js discord discord.js


【解决方案1】:

不是完美的解决方案,但应该像魅力一样工作。

注意:这不包括大写字符。

function generate (count = 20) {
  let password = ''
  while (password.length < count) {
    password += Math.random().toString(36).substr(2)
  }
  return password.substr(0, count)
}

console.log(generate(10), generate(20), generate(15))

【讨论】:

  • 嗯,好的,谢谢!所以现在,我应该可以这样做了: message.channel.send (`Your generated password is ${password});正确的?还是我做错了什么?
  • 是的,这段代码按原样工作。我把它改成了可执行文件,所以你可以看到
  • 完美运行,谢谢!不过,我如何能够修改它以包含大写字母并让用户选择是否包含它们?还是我需要修改代码块?
【解决方案2】:

我想添加一个不使用 Math.random 来获取随机数的替代解决方案。使用加密模块应该提供更好的随机性:

function genPassword (length = 14) {
  var randChars = Array(length).fill().map(getRandomChar)
  var pw = randChars.join('')
  return pw
}

function getRandomChar () {
  var crypt = window.crypto || window.msCrypto
  var target = new Uint8Array(1)
  var randNr = crypt.getRandomValues(target)
  var sevenBitRandNr = randNr >> 1
  if (sevenBitRandNr < 48
     || sevenBitRandNr >= 122
     || (sevenBitRandNr >= 58 && sevenBitRandNr <= 64)
     || (sevenBitRandNr >=91 && sevenBitRandNr <= 96)) {
    return getRandomChar()
  }
  return String.fromCharCode(sevenBitRandNr)
}

console.log(genPassword(20))

这确实提供了大写和小写以及数字。

【讨论】:

  • 绝对比我的原始解决方案更好:p
  • 我认为您的方法仍然需要在这种情况下提及!虽然crypto模块现在得到了广泛的支持,但仍然有浏览器不支持它。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多