discord.py如何获取新消息输入以终止正在运行的循环
修复方案
核心问题点
client.wait_for是异步协程方法,未添加await关键字时返回的是协程实例而非消息对象,无法直接和字符串匹配- 即使加了
await,wait_for返回的是完整消息对象,需要调用.content属性才能获取消息文本内容 - 现有写法无超时机制,会在每次循环时永久阻塞等待新消息,无法继续执行后续的消息发送逻辑
修正后可运行代码
首先确保已导入asyncio库:
import asyncio
命令逻辑部分修改为:
# 提前提取要发送的内容,避免每次循环重复处理 spam_content = message.content.replace("!spam","") for i in range(1000): await message.channel.send(spam_content) try: # 等待1秒检测停止指令,超时则继续下一轮发送 received_msg = await client.wait_for("message", timeout=1) if received_msg.content == "??": print("stopped") break except asyncio.TimeoutError: # 未收到停止指令,继续循环 continue
可选优化
如果需要限制只有触发 spam 命令的用户才能发送??终止循环,可以添加check参数过滤消息:
# 定义消息校验规则 def check(msg): # 仅校验触发命令的同用户发送的消息 return msg.author == message.author and msg.content == "??" # wait_for 方法传入check参数 received_msg = await client.wait_for("message", timeout=1, check=check)
你可以根据自己需要的消息发送间隔调整timeout的数值,比如需要每3秒发送一条就将timeout设为3,在等待间隔内同时检测停止指令即可。
内容的提问来源于stack exchange,提问作者Benedek Knever
相关产品推荐
相关产品推荐

