You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.py如何收集用户输入实现自定义密码生成功能

discord.py 收集用户输入适配密码生成功能

控制台用的input()是同步阻塞方法,不能直接套在discord.py的异步逻辑里,用框架自带的wait_for方法监听用户消息就能实现分步收集输入的效果,完全适配你现有的密码生成核心逻辑。

前置配置

初始化机器人实例时必须开启消息内容权限,否则无法读取用户发送的普通消息:

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)

实现逻辑

  • 编写触发指令(示例用前缀指令!genpass,也可以自己改成斜杠命令)
  • 触发后先发送引导文案,提示用户输入密码长度
  • 通过wait_for监听当前触发用户在当前频道发送的下一条消息,加校验规则过滤无关消息,同时校验输入是否为合法正整数,设置超时避免流程无限挂起
  • 拿到合法的密码长度存入passLength变量后,再引导用户输入生成密码的总数量,走同样的校验逻辑,拿到值存入passCount变量
  • 复用你写好的密码生成逻辑,把原来控制台print的内容改成拼接成消息发送到频道即可

完整可运行代码

import random
import discord
from discord.ext import commands

# 原有密码可用字符集定义
chars = "qwertyuiopasdfghjklzxcvbnm!@#$%^&*()1234567890QWERTYUIOPASDFGHJKLZXCVBNM?/"

# 机器人初始化
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)

@bot.command(name='genpass')
async def gen_pass(ctx):
    # 引导输入密码长度
    await ctx.send("你想要的密码长度是多少?")
    
    # 输入校验规则:仅接收触发指令的用户在当前频道发送的数字内容
    def input_check(msg):
        return msg.author == ctx.author and msg.channel == ctx.channel and msg.content.isdigit()

    # 等待长度输入,超时时间60秒
    try:
        length_input = await bot.wait_for('message', check=input_check, timeout=60)
        passLength = int(length_input.content)
        if passLength < 1:
            await ctx.send("密码长度不能小于1,请重新触发指令操作")
            return
    except TimeoutError:
        await ctx.send("输入超时,请重新触发指令操作")
        return

    # 引导输入生成数量
    await ctx.send("你想要生成多少个密码?")

    # 等待数量输入
    try:
        count_input = await bot.wait_for('message', check=input_check, timeout=60)
        passCount = int(count_input.content)
        if passCount < 1:
            await ctx.send("密码生成数量不能小于1,请重新触发指令操作")
            return
    except TimeoutError:
        await ctx.send("输入超时,请重新触发指令操作")
        return

    # 复用原有密码生成逻辑
    pwd_list = []
    for _ in range(passCount):
        password = ""
        for _ in range(passLength):
            password += random.choice(chars)
        pwd_list.append(f"`{password}`")
    
    # 发送生成结果
    await ctx.send("已为你生成密码:\n" + "\n".join(pwd_list))

# 替换为你自己的机器人Token
bot.run("YOUR_BOT_TOKEN")

补充说明

  • 校验规则会自动过滤其他用户、其他频道的无关消息,不会出现输入被干扰的问题
  • 所有输入都做了合法性判断,不会因为用户输入非数字内容触发类型转换报错
  • 生成的密码统一放在一条消息里返回,避免多密码场景下刷屏
  • 如果需要用斜杠命令实现,只需要把指令装饰器换成对应斜杠命令装饰器,把上下文响应方法换成交互响应方法即可,输入收集的逻辑完全通用

内容的提问来源于stack exchange,提问作者DrippyDino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:27:35