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

