You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何使用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

火山引擎 最新活动