Discord.py报错ClientUser无guild_permissions属性如何解决
报错原因
- 参数命名错误:
on_message事件的默认传入参数是Message对象,你代码中错误将其命名为ctx,和命令上下文对象混淆 - 未过滤机器人自身消息:当消息发送者为机器人本身(
ClientUser类型)时,该类没有guild_permissions属性,触发属性不存在报错 - 未过滤私信场景:用户给机器人发的私信消息同样不存在
guild_permissions属性,也会触发同类报错
修复方案
修改on_message监听函数的代码,先做前置过滤逻辑,完整修复后的代码如下:
from discord.ext import commands from var.canais import inviteChannel class Invite(commands.Cog): def __init__(self, client): self.client = client @commands.command( name='invite', pass_context=True ) async def invite(self, ctx): invitelink = await ctx.channel.create_invite( max_uses=1, unique=True ) if inviteChannel: await ctx.message.delete() await ctx.author.send(f'Invite link: {invitelink}') @commands.Cog.listener() async def on_message(self, message): # 前置过滤:机器人自己发的消息直接跳过 if message.author == self.client.user: return # 前置过滤:非服务器内的私信消息直接跳过 if not message.guild: return if inviteChannel: if message.author.guild_permissions.administrator: return else: if not message.content.startswith('!invite'): await message.delete() def setup(client): client.add_cog(Invite(client))
额外说明
修改后代码的逻辑和你原需求完全一致:仅在inviteChannel配置生效时,普通用户在该频道只能发送!invite指令,其他消息都会被删除,管理员不受限制。同时避免了机器人自身消息、私信消息触发的属性报错。
内容的提问来源于stack exchange,提问作者balas
相关产品推荐
相关产品推荐

