You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用discord.py给Discord服务器特定角色成员批量发自定义私信

没问题,我来帮你搞定这个需求!用discord.py给特定角色的所有成员批量发私信其实没那么复杂,可能你之前没注意到意图权限或者速率限制这些细节,我给你整理一套靠谱的实现方案,附带必须注意的坑。

实现方案

前提准备

在开始写代码前,你得先确认两件事:

  1. 你的Bot在Discord开发者平台的Bot设置里,开启了Server Members Intent(服务器成员意图)和Message Content Intent(消息内容意图)——这两个是获取成员列表和处理命令的关键,没开的话代码直接失效。
  2. 你的Bot在目标服务器里拥有读取成员列表发送消息的权限,最好给管理员权限避免权限不足的问题。

完整代码示例

下面是一个可直接用的命令式实现,管理员可以通过命令指定角色和私信内容,自动批量发送:

import discord
from discord.ext import commands
import asyncio

# 初始化意图,必须开启成员和消息内容意图
intents = discord.Intents.default()
intents.members = True
intents.message_content = True

# 设置Bot前缀,这里用!,你可以改成自己喜欢的
bot = commands.Bot(command_prefix="!", intents=intents)

@bot.event
async def on_ready():
    print(f"Bot已登录,账号:{bot.user}")

# 定义发送私信的命令,仅限管理员使用
@bot.command()
@commands.has_permissions(administrator=True)
async def send_role_dm(ctx, role_name: str, *, message: str):
    # 从当前服务器查找指定角色
    target_role = discord.utils.get(ctx.guild.roles, name=role_name)
    if not target_role:
        await ctx.send(f"找不到名为 `{role_name}` 的角色,请检查名称是否正确!")
        return
    
    sent_success = 0
    sent_failed = 0

    # 遍历角色下的所有成员
    for member in target_role.members:
        # 跳过机器人,避免给自己发私信
        if member.bot:
            continue
        try:
            # 发送私信
            await member.send(message)
            sent_success += 1
            # 每秒发一条,避免触发Discord的速率限制
            await asyncio.sleep(1)
        except discord.Forbidden:
            print(f"无法给 {member.name} 发私信:对方关闭了陌生人私信权限")
            sent_failed += 1
        except Exception as e:
            print(f"给 {member.name} 发私信时出错:{str(e)}")
            sent_failed += 1
    
    # 发送结果通知
    await ctx.send(f"✅ 私信发送完成!成功发送 {sent_success} 条,失败 {sent_failed} 条")

# 替换成你的Bot Token,从开发者平台复制
bot.run("YOUR_BOT_TOKEN")

关键细节说明

  • 角色查找:用discord.utils.get根据角色名查找,注意角色名要完全匹配,大小写敏感。
  • 跳过机器人:避免Bot给自己或其他Bot发私信,无意义还可能触发限制。
  • 异常捕获:处理用户关闭私信、Bot权限不足等各种失败情况,不会因为一个用户出错导致整个流程中断。
  • 速率控制:添加asyncio.sleep(1)是因为Discord对非好友的私信有限制(每分钟最多5条),每秒发一条能有效避免被限制甚至封号。

注意事项

  • 如果你的服务器成员很多,批量发送可能需要较长时间,别中途关闭Bot进程。
  • 测试时建议先用一个只有几个成员的测试角色,避免误发大量消息。
  • 不要滥用这个功能,频繁发送垃圾消息可能导致你的Bot被用户举报或Discord封禁。

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

火山引擎 最新活动