Discord.py 重写 get_member() 函数,为除 bot 之外的所有用户返回 None

Posted

技术标签:

【中文标题】Discord.py 重写 get_member() 函数,为除 bot 之外的所有用户返回 None【英文标题】:Discord.py rewrite get_member() function returning None for all users except bot 【发布时间】:2021-01-21 01:43:51 【问题描述】:

几个月前我做了一个愚蠢的不和谐机器人来每分钟更改我朋友的名字,但我今天更新了它,现在 get_member 函数没有返回。

@client.event
async def on_ready():
    print('bot is ready!')
    status = discord.Activity(name="Sam be a loser", type=discord.ActivityType.watching)
    await client.change_presence(activity=status)

    name_change.start()

@tasks.loop(minutes=1)
async def name_change():
    server = client.get_guild(id=584112137132048387)
    user = server.get_member(376388277302984714)

    global english_words
    global wordNumber
    wordNumber = wordNumber + 1
    #changes nickname to current word
    await user.edit(nick=f"english_words[wordNumber] lookin' ass")
    print(f'Word number wordNumber: english_words[wordNumber]')
    #updates number in file
    file = open("currentWord.txt", "w")
    file.write(str(wordNumber))
    file.close

我对服务器中的每个用户都尝试了相同的功能,但它没有返回所有用户,除非我将机器人的 id 放入其中。我不知道为什么会发生这种情况,因为我什至没有编辑这部分代码。

【问题讨论】:

【参考方案1】:

这很可能是由于最近的 discord.py 1.5 更新。声明 Bot 时需要配置 Intent。

什么是意图? 1.5 版引入了意图。这是机器人编写方式的根本变化。意图基本上允许机器人订阅特定的事件桶。对应于每个意图的事件记录在 Intents 文档的单个属性中。这是一个例子:

import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.members = True  # Subscribe to the privileged members intent.
bot = commands.Bot(command_prefix='!', intents=intents)

您还必须为公会相关事件启用特权意图:Here

您可以阅读有关意图的更多信息:Here

【讨论】:

【参考方案2】:

您可以不使用 Intent、Privileged 或其他方式,不使用 get_member() 而是使用

guild.fetch_member()

【讨论】:

以上是关于Discord.py 重写 get_member() 函数,为除 bot 之外的所有用户返回 None的主要内容,如果未能解决你的问题,请参考以下文章

禁止命令 discord.py 的问题(重写分支)

Discord Bot 响应短语(Discord.py 重写)

Discord.py 重写多服务器数据

Discord.py(重写)静音命令总是返回相同的响应

使用 Heroku 时如何从 Discord.py 异步更改为重写?

根据 UTC 时间制作 discord.py(重写版本)计时器