AttributeError: 'ClientUser' object has no attribute 'guild_permissions' on Discord.py

AttributeError: 'ClientUser' object has no attribute 'guild_permissions' on Discord.py

我正在尝试创建一个“!invite”命令来生成对服务器的邀请 link 并将其发送到用户的直接消息。 该命令有效,但我在控制台上收到以下错误:

Ignoring exception in on_message
Traceback (most recent call last):
  File "C:\Users[=10=]1\Envs\Pix\lib\site-packages\discord\client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "C:\Users[=10=]1\PycharmProjects\Testing bot\cogs\invite.py", line 27, in on_message
    if ctx.author.guild_permissions.administrator:
AttributeError: 'ClientUser' object has no attribute 'guild_permissions'

尽管如此,我得到了link:My DM screenshot.

我该如何解决这个错误?

代码:

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, ctx):

        if inviteChannel:
            if ctx.author.guild_permissions.administrator:
                return
            else:
                if not ctx.content.startswith('!invite'):
                    await ctx.delete()


def setup(client):
    client.add_cog(Invite(client))

如错误所述: 行

 if ctx.author.guild_permissions.administrator:

抛出 AttributeError 错误,因为 'ctx.author'(ClientUser 类型)没有 guild_permissions 属性。

错误消息还意味着错误被忽略,因此代码不会停止。

我找到了 可能会帮助您解决此问题的答案

祝你好运!

发生此错误是因为当机器人发送消息时也会调用 on_message 事件,在您的情况下,机器人正在 dm 中发送消息,因此它应该是用户对象(成员对象只是公会),而用户对象没有权限,因为它们不在服务器内。它是一个 ClientUser 对象,而不是 User,它是一个特殊的 class 类似 User 的机器人独有的对象。与 User 相比,这是一个单独的 class,因为它有一些只有机器人才能使用的特殊方法,例如编辑机器人名称等 要解决此问题,请忽略消息是否从机器人发送,因此代码为

@commands.Cog.listener()
async def on_message(self, ctx):
    if message.author.bot:
        return
    if inviteChannel:
        if ctx.author.guild_permissions.administrator:
            return
        if not ctx.content.startswith('!invite'):
            await ctx.delete()

这里我添加了if message.author.bot: return,这样如果作者是机器人它就会停止函数的执行。而且我还删除了不必要的 else 语句