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

如何区分机器人与真实用户并仅向真实用户发送消息?

Discord服务器全员消息发送功能的代码优化

原代码存在的问题

  • 机器人判断逻辑错误:if member is member.bot: 写法错误,member.bot本身就是布尔值,应该直接用if member.bot:;后续重复的if member is not member.bot:完全多余,因为前面已经通过continue跳过了机器人账号。
  • 打印语句位置错误:print('A BOT') 放在continue之后,永远不会执行,无法输出跳过机器人的提示。
  • 拼写错误:提示文本里的'Pls provide a massage'应为'Pls provide a message'。
  • 异常处理过于宽泛:直接用except:会捕获所有异常,不利于排查具体问题。
  • 频道消息刷屏:循环中每发送一条私信就向命令频道发一条通知,容易造成消息泛滥。

优化后的代码

import discord
from discord.ext import commands

@commands.command(name="message",
                  description="向服务器所有成员发送消息",
                  pass_context=True)
@commands.has_permissions(administrator=True)
@commands.bot_has_permissions(administrator=True)          
async def msg(self, ctx, *, message_content=None):
    if message_content is not None:
        members = ctx.guild.members
        success_list = []
        fail_list = []
        
        for member in members:
            # 跳过机器人账号
            if member.bot:
                print(f"已跳过机器人:{member.name}")
                continue
                
            try:
                # 发送私信,私信中@成员无实际作用,可根据需求移除该部分
                await member.send(f"{message_content}\n{member.mention}")
                success_list.append(member.name)
            except discord.Forbidden:
                fail_list.append(f"{member.name}(无发送权限)")
            except discord.HTTPException:
                fail_list.append(f"{member.name}(发送请求失败)")
            except Exception as e:
                fail_list.append(f"{member.name}(未知错误:{str(e)})")
        
        # 统一发送结果通知
        result_msg = "消息发送任务完成:\n"
        if success_list:
            result_msg += f"✅ 成功发送至:{', '.join(success_list)}\n"
        if fail_list:
            result_msg += f"❌ 发送失败:{', '.join(fail_list)}"
        
        await ctx.send(result_msg)
    else:
        await ctx.channel.send('请提供要发送的消息内容')

优化说明

  • 修正机器人判断逻辑,直接通过member.bot布尔值识别机器人,跳过同步打印提示。
  • 将参数名args改为message_content,语义更清晰。
  • 修复拼写错误,优化提示文本的可读性。
  • 替换宽泛的异常捕获为Discord API相关的具体异常,同时保留兜底捕获以便排查未知问题。
  • 使用列表收集成功/失败的成员,最后统一发送结果通知,避免频道消息刷屏。
  • 用f-string格式化消息内容,让代码更简洁易读。

内容的提问来源于stack exchange,提问作者Md Sakib Rayhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:10:23