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

Discord机器人DM命令重复发送问题求助

Discord机器人/dm命令重复发送消息的排查与解决

可能的原因及对应修复方案

  1. 命令重复注册

    • 检查代码:确保@bot.tree.command装饰的dm函数没有被重复定义,也没有在多个模块中重复加载(比如多次调用load_extension加载同一个包含该命令的扩展)。
    • 检查机器人进程:确认只有一个机器人实例在运行,避免多进程同时响应命令。
    • 检查Discord开发者门户:进入你的应用→Commands→Slash Commands,查看是否存在多个同名的/dm命令,如有则删除多余条目,然后重新同步命令。
  2. sent_messages作用域问题

    • 确保sent_messages是全局作用域的字典,在机器人启动前就初始化:
      sent_messages = {}  # 放在函数外部,全局初始化
      
    • 如果该变量是函数内部定义的,每次调用命令都会重建字典,导致标记失效,无法阻止重复发送。
  3. 参数解析与交互响应优化

    • 手动解析用户ID的方式容易出错,建议直接使用discord.User作为参数类型,让Discord自动处理用户选择,同时优化交互响应的完整性:
      sent_messages = {}
      
      @bot.tree.command(name="dm", description="Send a DM to a user")
      async def dm(interaction: discord.Interaction, target_user: discord.User, message_to_send: str):
          # 限制使用频道
          if interaction.channel.id != [你的频道ID]:
              await interaction.response.send_message("此命令仅允许在指定频道使用", ephemeral=True)
              return
      
          # 检查是否已发送过消息
          if not sent_messages.get(target_user.id, False):
              try:
                  # 发送私信
                  await target_user.send(message_to_send)
                  # 发送成功提示
                  await interaction.response.send_message(f"消息已成功发送给 <@{target_user.id}>", ephemeral=False)
                  sent_messages[target_user.id] = True
              except discord.Forbidden:
                  # 处理无法发送的情况
                  await interaction.response.send_message("无法向该用户发送私信(用户可能关闭了私信或拉黑了机器人)", ephemeral=True)
          else:
              await interaction.response.send_message("已向该用户发送过消息,无需重复发送", ephemeral=True)
      

额外排查点

  • 检查是否有其他代码逻辑触发了该命令,比如自动重发机制、命令钩子等。
  • 测试时使用print(interaction)输出交互信息,确认是否有重复的交互请求被机器人接收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:00:05