Discord.py 无法将 dm 发送给成员

时间:2021-01-30 10:12:41

标签: python python-3.x discord.py discord.py-rewrite

错误代码为:

member = message.guild.get_member(message.author.id)
await member.send(embed=level_up)

尝试执行第二行时,出现错误:

AttributeError: 'ClientUser' object has no attribute 'create_dm'

我在文档中读到 message.guild.get_member() 应该返回一个 Member 对象,但是由于某种原因它返回一个 ClientUser 对象,您无法向其发送消息。 我想给 message.author 发个私信

整个函数代码:

    @commands.Cog.listener()
    async def on_message(self, message):
        if not isinstance(message.channel, discord.channel.DMChannel) \
                and not message.content.startswith(yaml_data["Bot"]["Prefix"]):

            management = message.guild.get_role(yaml_data["Tickets"]["Management_Role"])
            operations = message.guild.get_role(yaml_data["Tickets"]["Operator_Role"])
            ownership = message.guild.get_role(yaml_data["Tickets"]["Owner_Role"])

            with open(arrays_folder + r"/members.json") as members_file:
                members_data = json.load(members_file)

            if random.random() < yaml_data["Xp"]["Xp_Chance"]:

                level_before = self.get_level(members_data["members"][str(message.author.id)]["Xp"])
                members_data["members"][str(message.author.id)]["Xp"] += 1
                level_after = self.get_level(members_data["members"][str(message.author.id)]["Xp"])

                with open(arrays_folder + r"/members.json", "w+") as f:
                    json.dump(members_data, f, indent=4)

                if level_after > level_before \
                        and not any(role in message.author.roles for role in (ownership, operations, management)):
                    if level_after < yaml_data["Xp"]["Levels"] and message.author.id != self.client.user.id:

                        level_up = discord.Embed(
                            description="You have leveled up!\n\n"
                                        f"You are now **Level {level_after}**!",
                            color=yaml_data["Customisation"]["General_Embed_Colour"])

                        new_role = discord.utils.get(message.guild.roles, name="Level " + str(level_after))

                    else:

                        level_up = discord.Embed(
                            description="You have leveled up!\n\n"
                                        f"You are now **{yaml_data['Xp']['Max_Level_Name']}**!",
                            color=yaml_data["Customisation"]["General_Embed_Colour"])

                        new_role = discord.utils.get(message.guild.roles, name=yaml_data['Xp']['Max_Level_Name'])

                    member = message.guild.get_member(message.author.id)
                    await member.send(embed=level_up)
                    await message.author.send(embed=level_up)
                    old_role = discord.utils.get(message.guild.roles, name="Level " + str(level_before))
                    await member.remove_roles(old_role)
                    await member.add_roles(new_role)

1 个答案:

答案 0 :(得分:1)

问题是 Privileged Gateway Intents. 如果您不知道 Discord 最近带来了网关意图。跟踪服务器成员的机器人需要这些意图。当您发送“会员”DM 时,您需要会员意图。在没有意图的情况下,“get_member”函数仅返回机器人用户。
要获取意图,请前往开发人员门户和机器人部分(您拥有机器人的令牌)。向下滚动直到你看到;特权网关意图。打开 Presence 和 Member 的意图并保存它。完成后,转到您的代码。 (确保您使用的是 Discord.py 1.5+,因为该版本引入了意图。)因此,在您的代码中:

# after importing libraries or modules, where you are declaring client or bot variable;
client = commands.Bot(command_prefix="prefix", intents=discord.Intents.all())

# rest of the code with your command or function [...]

client.run("token")

这个解释可能对你来说还不够,请确保你阅读了关于该主题的官方文档以获得更好的解释和使用意图的步骤。单击 here 以获取文档参考。

注意:如果您的机器人在 75 台以上的服务器中,您将需要从不和谐进行验证以使用意图,而且,对于 75 台以上的服务器,您还必须仅启用您需要的意图,例如你不需要存在意图,你不能使用它,但如果你的机器人少于 75 个服务器,可以不受限制地自由使用意图(目前,一旦机器人达到 75 个服务器,你需要验证)