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

discord.py机器人while循环未按终止条件停止运行问题求助

discord.py循环不终止问题修复方案

核心问题点

  • 变量作用域异常:代码中的limit、content均未作为命令参数传入,也未在函数内声明全局变量引用。异步场景下全局limit如果被其他任务修改,会导致countdown == limit的精确匹配条件永远无法触发。
  • 无异常处理逻辑:await user.send()执行时如果遇到用户关闭私信、触发Discord风控限制等情况会抛出异常,后续countdown累加的代码不会执行,计数永远达不到阈值。
  • 终止条件容错性差:使用==做精确匹配,一旦出现计数跳变就会跳过终止条件,进入死循环。
  • 废弃参数使用:discord.py v2.x及以上版本已经废弃pass_context参数,虽不影响核心逻辑但会产生告警。

修复后代码

# 需提前导入asyncio库
import asyncio

@bot.command()
# 将limit、content作为命令入参,避免全局变量冲突
async def spm_dm(ctx, user: discord.Member, limit: int, content: str):
    countdown = 0
    await ctx.send(":white_check_mark:")
    while True:
        try:
            await user.send(content)
        except Exception as e:
            await ctx.send(f"消息发送失败,错误:{str(e)}")
        finally:
            # 无论发送成功失败都累加计数,避免卡循环
            countdown += 1
        # 改用大于等于判断,提高容错性
        if countdown >= limit:
            await ctx.send("循环已终止,原因:已达到预设消息发送数量")
            break
        # 新增延时避免触发Discord消息频率限制导致封号
        await asyncio.sleep(1)

使用时直接在Discord频道发送命令即可,示例:!spm_dm @目标用户 5 测试消息内容,代表给目标用户发5条测试消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:57:04