Discord机器人群发DM遇用户关闭私信停止,如何优化让其继续执行?
问题原因
你当前代码的try...except包裹了整个for循环,只要任意一次发送DM触发异常,就会直接终止整个循环,导致后续用户都无法收到消息。
修复方案
将异常捕获逻辑下移到循环内部,针对每个用户的发送操作单独做异常处理,单个用户发送失败只会跳过该用户,不会中断整个遍历流程。同时不建议使用裸except,尽量捕获具体的异常类型,避免吞掉无关错误影响排查。
优化后代码
import asyncio import discord from discord.ext import commands # 此处ad变量请替换为你实际要发送的内容 ad = "你要发送的广告内容" @client.command() async def pd(ctx): for m in client.get_all_members(): try: # 单个用户的发信逻辑放在内部的try块中 await m.send(ad) print(f"用户 {m.name}({m.id}) 成功接收消息") # 加1秒发送间隔,避免触发Discord限流导致机器人被封 await asyncio.sleep(1) except discord.Forbidden: # 仅捕获无权限发DM的异常,对应用户关闭了私信权限的场景 print(f"用户 {m.name}({m.id}) 关闭了DM权限,已跳过") except Exception as e: # 其他异常单独打印,方便排查问题,比如网络错误、内容违规等 print(f"给用户 {m.name}({m.id}) 发信失败,错误原因:{str(e)}")
额外注意事项
- 如果你只需要给当前执行指令的服务器成员发消息,可以把遍历逻辑改成
for m in ctx.guild.members:,避免跨服务器发送触发风险 - 如果你使用的是discord.py 2.0及以上版本,需要先在Discord开发者后台开启机器人的
Server Members Intent,同时初始化client时声明成员意图,否则无法正常获取完整的成员列表 - 群发DM属于Discord平台严格管控的行为,短时间发送大量消息很容易被判定为垃圾信息,导致机器人账号被封禁,请谨慎使用该功能
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

