我的不和谐机器人给我 AttributeError("'NoneType' object has no attribute 'roles'")

My discord bot gives me AttributeError("'NoneType' object has no attribute 'roles'")

我有一个用 python 编写的 discord 机器人。该机器人应该根据表情符号反应赋予角色和移除角色。但是今天当我尝试获取角色 AttributeError("'NoneType' object has no attribute 'roles'") 时出现此错误,当我尝试删除角色时出现此错误 AttributeError("'NoneType'对象没有属性 'remove_roles'").

主文件:

from discord import utils
 
import config
 
class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))
 
    async def on_raw_reaction_add(self, payload):
        channel = self.get_channel(payload.channel_id) # получаем объект канала
        message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
        member = utils.get(message.guild.members, id=payload.user_id) # получаем объект пользователя который поставил реакцию
            
        try:
            emoji = str(payload.emoji) # эмоджик который выбрал юзер
            role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # объект выбранной роли (если есть)
            
            if payload.message_id != 669082231955783707:
                print('[Error] Wrong message id {0.display_name}'.format(member))
                return

            if (len([i for i in member.roles if i.id in config.ROLES.values()]) < config.MAX_ROLES_PER_USER):
                await member.add_roles(role)
                print('[SUCCESS] User {0.display_name} has been granted with role {1.name}'.format(member, role))
            else:
                await message.remove_reaction(payload.emoji, member)
                print('[ERROR] Too many roles for user {0.display_name}'.format(member))
        
        except KeyError as e:
            print('[ERROR] KeyError, no role found for ' + emoji)
        except Exception as e:
            print(repr(e))
 
    async def on_raw_reaction_remove(self, payload):
        channel = self.get_channel(payload.channel_id) # получаем объект канала
        message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
        member = utils.get(message.guild.members, id=payload.user_id) # получаем объект пользователя который поставил реакцию
       
        try:
            emoji = str(payload.emoji) # эмоджик который выбрал юзер
            role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # объект выбранной роли (если есть)
 
            await member.remove_roles(role)
            print('[SUCCESS] Role {1.name} has been remove for user {0.display_name}'.format(member, role))
 
        except KeyError as e:
            print('[ERROR] KeyError, no role found for ' + emoji)
        except Exception as e:
            print(repr(e))
 
# RUN
client = MyClient()
client.run(config.TOKEN) ```

我建议使用 await Guild.fetch_member(id) or Guild.get_member(id) 来接收您的成员对象。从那里您应该可以根据需要添加和删除角色。

您遇到了 utils.get 未返回成员对象的问题。 您可能还想尝试在 discord 开发人员门户中启用 Server Members Intent 并在初始化您的客户端对象时添加意图。