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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:42:01