如何区分机器人与真实用户并仅向真实用户发送消息?
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
相关产品推荐
相关产品推荐

