Discord.py 广播命令如何跳过锁定频道并发送至首个权限开放的文本频道
问题诊断
- 核心错误1:遍历所有服务器时误用了触发命令的服务器身份组
ctx.guild.default_role,应该针对当前遍历到的guild对象的机器人成员身份校验权限 - 核心错误2:权限校验逻辑错误,
None | True的写法不符合Python语法,且不需要校验普通用户权限,只需确认机器人自身拥有对应频道的发消息、查看频道权限即可 - 核心错误3:没有做异常捕获,遇到机器人无权限访问的频道/服务器会直接抛出异常中断执行
- 逻辑错误:原代码没有在成功发送后跳出频道循环,可能导致单服务器多频道重复发送
解决方案
你只需要遍历每个服务器的文字频道,校验机器人自身在频道内的send_messages和view_channel权限,找到第一个符合要求的频道发送后立刻跳出当前服务器的频道循环即可。
正确实现代码
@commands.command() @commands.is_owner() async def broadcast(self, ctx, *, msg): # 遍历机器人加入的所有服务器 for guild in self.client.guilds: # 标记当前服务器是否已经完成发送 sent = False # 遍历服务器内的所有文字频道 for channel in guild.text_channels: try: # 校验机器人自身在当前频道的权限 bot_perms = channel.permissions_for(guild.me) # 需要同时拥有查看频道和发送消息的权限 if bot_perms.view_channel and bot_perms.send_messages: await channel.send(msg) sent = True # 发送成功后跳出频道循环,只发第一个符合要求的频道 break except Exception: # 遇到无权限访问的频道直接跳过 continue # 可选:打印发送失败的服务器名称方便排查,不需要可以删除 if not sent: print(f"无法向服务器 {guild.name} (ID:{guild.id}) 发送广播")
内容的提问来源于stack exchange,提问作者Jeebo
相关产品推荐
相关产品推荐

