Discord机器人只能看到自己,而不能看到公会中的其他用户

11

最近我一直在关注这个教程,以便开始使用Discord的API。不幸的是,在我遇到要打印公会中所有用户时,我卡住了。

当我尝试打印所有用户的名称时,它只打印机器人的名称,没有其他内容。参考一下,该公会共有六个用户。机器人具有管理员权限

import os
import discord

TOKEN = os.environ.get('TOKEN')
client = discord.Client()

@client.event
async def on_ready():
    for guild in client.guilds:
        print(guild, [member.name for member in guild.members])

client.run(TOKEN)
2个回答

17
  1. 在您的Discord开发者门户机器人选项卡中,将底部的服务器成员意图设置为启用:

    enter image description here

  2. client = discord.Client()这行修改为以下内容:

    intents = discord.Intents.default()
    intents.members = True
    client = discord.Client(intents=intents)
    

    这会让你的机器人请求“members”网关意图。


什么是网关意图? 意图允许您订阅某些事件。例如,如果您设置intents.typing = False,则您的机器人将不会收到打字事件,这可以节省资源。

什么是特权意图? 特权意图(如成员和存在)被认为是敏感信息,并需要Discord对超过100个服务器中的机器人进行验证。对于在少于100个服务器中的机器人,您只需要在上面显示的页面中选择加入。

网关意图入门

意图API参考


10

从discord.py v1.5.0开始,您需要为您的机器人使用Intents,您可以通过点击这里了解更多信息。

换句话说,在您的代码中需要进行以下更改 -

import discord
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
GUILD = os.getenv('DISCORD_GUILD')

intents = discord.Intents.all()
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    for guild in client.guilds:
        if guild.name == GUILD:
            break

    print(
        f'{client.user} is connected to the following guild: \n' 
        f'{guild.name} (id: {guild.id})'
    )

    # just trying to debug here
    for guild in client.guilds:
        for member in guild.members:
            print(member.name, ' ')

    members = '\n - '.join([member.name for member in guild.members])
    print(f'Guild Members:\n - {members}')
    
client.run(TOKEN)

1
谢谢!大部分其他答案没有提到你需要执行client = discord.Client(intents=intents)。感谢! - theX
我在nodejs中遇到了同样的问题。你能否也给出nodejs的解决方案? - Pushprajsinh Chudasama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接