如何使用discord.py实现机器人批量发送私信给多个用户?
批量给玩家发送Discord私信的实现方案
当然可以!不管是用列表存储玩家信息,还是通过for循环逐个发送消息,都是完全可行的方案。我结合discord.py的实际使用场景,给你详细说下具体怎么操作:
一、先搞定玩家的存储
其实不建议用纯字符串存储玩家(比如只存用户名),因为用户名可能重复,而且调用起来不方便。更稳妥的是两种方式:
- 存储discord.User对象:直接把用户的对象存起来,后续发消息时可以直接调用
send()方法,最省心。 - 存储用户ID(整数):如果需要持久化存储(比如重启机器人后还能保留玩家列表),存ID更合适,后续可以通过
bot.get_user(user_id)获取用户对象。
举个报名的例子,把玩家加入列表:
# 初始化玩家列表 players = [] # 报名命令:把当前用户加入玩家列表 @bot.command(name="join") async def join_game(ctx): # 用User对象存储的情况 if ctx.author not in players: players.append(ctx.author) await ctx.send(f"{ctx.author.mention} 已成功加入监考游戏!") else: await ctx.send(f"{ctx.author.mention} 你已经在游戏里啦~") # 如果是存用户ID的情况,代码可以改成这样: # @bot.command(name="join") # async def join_game(ctx): # user_id = ctx.author.id # if user_id not in players: # players.append(user_id) # await ctx.send(f"{ctx.author.mention} 报名成功!")
二、用for循环批量发送私信
有了玩家列表之后,遍历列表逐个发消息就很简单了。记得加上异常处理,避免因为用户关闭私信、机器人权限不足等情况导致程序崩溃。
情况1:存储的是User对象
@bot.command(name="send_notice") async def send_all_notices(ctx): # 遍历每个玩家 for player in players: try: # 发送私密消息 await player.send("📢 监考游戏通知:即将开始考试,请做好准备!") print(f"已成功给 {player.name} 发送私信") except discord.Forbidden: # 对方关闭了私信权限 await ctx.send(f"⚠️ 无法给 {player.name} 发送私信,对方可能屏蔽了机器人或关闭了私信功能!") except discord.HTTPException as e: # 其他发送错误 await ctx.send(f"❌ 给 {player.name} 发送消息时出错:{str(e)}")
情况2:存储的是用户ID
如果存的是ID,需要先通过ID获取用户对象再发消息:
@bot.command(name="send_notice") async def send_all_notices(ctx): for user_id in players: # 通过ID获取用户对象 player = bot.get_user(user_id) if not player: await ctx.send(f"⚠️ 无法找到ID为 {user_id} 的用户!") continue try: await player.send("📢 监考游戏通知:考试即将开始,请保持专注!") print(f"已成功给 {player.name} 发送私信") except discord.Forbidden: await ctx.send(f"⚠️ 无法给 {player.name} 发送私信!") except discord.HTTPException as e: await ctx.send(f"❌ 发送消息失败:{str(e)}")
一些注意事项
- 确保机器人和玩家在同一个服务器,或者玩家允许接收陌生人的私信(服务器内的玩家一般默认允许)。
- 如果需要持久化玩家列表(重启机器人不丢失),可以把用户ID存到文件(比如JSON)或者数据库里,下次启动时读取加载。
- 避免短时间内发送大量消息,防止触发Discord的API频率限制。
内容的提问来源于stack exchange,提问作者GooeyGreenMuffins




