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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:15:03