Discord.py Rewrite版本on_member_join自动分配角色功能TypeError报错求助
问题排查与修复:Discord.py on_member_join 触发 TypeError
报错原因分析
这个报错其实很好定位——你给on_member_join事件函数多写了一个ctx参数!
在discord.py的事件机制里,on_member_join是专门监听新成员加入的事件,它只会自动传入member这一个参数。它和你平时写的命令函数(比如带@client.command()装饰器的函数)不一样,那些函数需要ctx来获取上下文,但这个事件完全不需要。
你现在的函数定义是async def on_member_join(ctx, member):,当discord.py触发这个事件时,只会把新加入的成员对象传给函数,也就是第一个参数位置是member,但你定义的函数却把这个值赋给了ctx,导致member参数没有接收到值,直接触发了missing 1 required positional argument的错误。
修复方案
两步就能搞定:
- 删掉函数定义里的
ctx参数,改成async def on_member_join(member): - 替换代码里用到
ctx.message.created_at的地方——因为现在没有ctx了,推荐用member.joined_at(成员实际加入服务器的时间),或者导入datetime模块用datetime.datetime.utcnow()
修复后的完整代码如下:
import datetime # 若使用utcnow()则需要导入,用member.joined_at的话可以不用 @client.event async def on_member_join(member): if member.guild.name == "lusk_245789": # Server Name role = discord.utils.get(member.guild.roles, name="Member") await member.add_roles(role) embed = discord.Embed( title=f"Member Joined", description=f"{member.mention}, Welcome to {member.guild.name}. We hope that your time with us is a happy one!", color=0x9b26b9, timestamp=member.joined_at # 用成员加入时间更贴合场景 ) embed.add_field(name="Please check out the Rules Channel!", value="<#822090510495514644>", inline=False) embed.add_field(name="Latest announcements are made here!", value="<#781017647922937856>", inline=False) embed.set_footer(text="Task Completed!") # 发送欢迎消息到指定频道 await client.get_channel(873238209897844799).send(embed=embed) else: return
额外注意事项
- 确保你的机器人账号拥有管理角色的权限,不然执行
add_roles时会报错 - 确认服务器里确实存在名为
Member的角色,并且机器人的角色在服务器角色列表里的位置要高于这个角色(不然机器人没有权限给成员添加该角色) - 如果你的discord.py版本比较旧,建议升级到稳定版,避免一些版本兼容问题
内容的提问来源于stack exchange,提问作者lusk_245789
相关产品推荐
相关产品推荐

