繁体   English   中英

Discord.py 无法向会员发送dm

[英]Discord.py cannot send dm to member

错误代码是:

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 object,但是由于某种原因它返回一个 ClientUser object,您无法向其发送消息。 我想发个私信给 message.author

整个function代码:

    @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)

问题是特权网关意图。 如果你不知道 Discord 最近带来了 Gateway Intents。 跟踪服务器成员的机器人需要这些意图。 当您发送“会员”DM 时,您需要会员意图。 如果没有意图,“get_member”function 只会返回机器人用户。
要获得意图,请前往开发人员门户和机器人部分(您有机器人的令牌)。 向下滚动直到你看到; 特权网关意图。 打开 Presence 和 Member 的意图并保存。 完成后,Go 到您的代码。 (确保您使用的是 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")

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM