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
相关产品推荐
相关产品推荐

