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)
我最近对使用 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)