Discord.py 欢迎机器人 on_member_join 事件未被调用

Discord.py welcome bot on_member_join event not getting callded

我最近对使用 discord 机器人很感兴趣,据我所知,这段代码应该可以工作,但事实并非如此…… 我只是在玩 API 因为它很有趣所以我对此很陌生。我只是希望机器人在有人加入时欢迎他们。

import discord

client = discord.Client()

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))
    channel = client.guilds[0].get_channel(CHANNEL ID)
    await channel.send("Bot online")

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

@client.event
async def on_member_join(member):
    print(f'{member.name} has joined the server')
    channel = client.guilds[0].get_channel(CHANNEL ID)
    print(channel)
    await channel.send(f'{member.name} has joined the server')

@client.event
async def on_member_remove(member):
    print(f'{member.name} has left the server')
    channel = client.guilds[0].get_channel(CHANNEL ID)
    print(channel)
    await channel.send(f'{member.name} has left the server')

client.run('TOKEN HERE')

您忘记了装饰器的括号。

@client.event

应该是

@client.event()

编辑:显然不是。当 OP 回复更多信息时将更新此答案。

对于 discord.py >= 1.5

1.5 添加了对 Gateway Intents 的支持,默认情况下,您的机器人无法像以前的版本那样访问公会成员。如果您的机器人在少于 100 台服务器中,那么您可以在不验证的情况下启用这些意图。您应该会在 Discord 开发者门户的 Bot 页面底部看到这些设置。如果你同时启用两者,那么你需要改变你的客户端(或commands.Bot)实例化:

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

当我对此进行测试时,事件正在触发,但我敢打赌你的问题在于:

channel = client.guilds[0].get_channel(CHANNEL ID)

仅使用 client.get_channel 来确保您确实抓住了预期的频道会更加可靠,discord 上的所有频道 ID 都是唯一的,因此您不需要使用公会对象。 CHANNEL ID 也不是有效变量,但我猜你刚刚编辑了它。

而不是 member.name 使用 member,如果它不起作用,请将其添加到您有变量的地方 intents = discord.Intents(messages = True, guilds = True, reactions = True, members = True,存在 = 真) 客户 = commands.Bot(command_prefix = '*', intents = intents)