如何使用discord.py给Discord服务器特定角色成员批量发自定义私信
没问题,我来帮你搞定这个需求!用discord.py给特定角色的所有成员批量发私信其实没那么复杂,可能你之前没注意到意图权限或者速率限制这些细节,我给你整理一套靠谱的实现方案,附带必须注意的坑。
实现方案
前提准备
在开始写代码前,你得先确认两件事:
- 你的Bot在Discord开发者平台的Bot设置里,开启了
Server Members Intent(服务器成员意图)和Message Content Intent(消息内容意图)——这两个是获取成员列表和处理命令的关键,没开的话代码直接失效。 - 你的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




