discord.py中如何查找可发送启动消息的默认频道?
现有代码问题说明
- 你当前使用的
@bot_has_permissions装饰器是discord.py框架专为命令回调设计的校验装饰器,对普通自定义函数不会生效,因此你现有的逻辑并没有实际做频道权限校验,只会返回遍历到的第一个文本频道 - 直接将频道类型转成字符串比对的方式兼容性差,建议直接用框架提供的枚举值判断
修正后实现代码
import discord from discord import ChannelType # 机器人就绪事件 @client.event async def on_ready(): # 就绪提示 print("Bot is ready.") # 获取符合要求的默认频道 default_channel = check_valid_channel() if default_channel: print(f"找到可用频道: {default_channel.name}") else: print("未找到符合要求的可发送消息的文本频道") # 查找第一个符合要求的文本频道 def check_valid_channel(): for guild in client.guilds: # 获取机器人在当前服务器的身份实例 bot_member = guild.me for channel in guild.channels: # 先判断是否为文本频道 if channel.type == ChannelType.text: # 获取机器人在当前频道的完整权限(自动计算角色权限、频道覆写规则) channel_perms = channel.permissions_for(bot_member) # 校验是否有发送消息权限 if channel_perms.send_messages: return channel # 遍历所有服务器都未找到符合要求的频道时返回空 return None
逻辑说明
- 遍历顺序为机器人加入的服务器顺序、服务器内频道的原生排序,返回第一个符合要求的频道,符合你的需求
- 权限校验逻辑会自动计算角色继承、频道单独权限覆写的结果,判断结果准确
- 无符合条件的频道时会返回None,你可以根据自己的需求补充对应异常处理逻辑
内容的提问来源于stack exchange,提问作者Tomer Klevansky
相关产品推荐
相关产品推荐

