请求:为Discord机器人添加特定服务器专属Autorole功能
正确的Discord机器人自动角色(指定服务器生效)实现代码
我来帮你搞定这个自动角色功能,你之前的代码主要有几个问题:比如在on_member_join事件里误用了ctx、服务器判断逻辑混乱,还有角色获取的方式不对。下面是修正后的完整代码,我会顺便把关键注意点说明白:
import discord from discord.ext import commands # 必须配置意图,否则无法触发成员加入事件 intents = discord.Intents.default() intents.members = True # 开启成员意图,这一步很重要! client = commands.Bot(command_prefix="你的机器人前缀", intents=intents) # 在这里设置你要生效的服务器ID和自动添加的角色ID TARGET_GUILD_ID = 753667215710224574 TARGET_ROLE_ID = 770262439937048577 @client.event async def on_member_join(member: discord.Member): # 判断用户加入的是不是指定服务器 if member.guild.id == TARGET_GUILD_ID: # 从当前服务器里获取目标角色(角色是属于服务器的,这样获取更准确) target_role = member.guild.get_role(TARGET_ROLE_ID) if target_role: try: # 给成员添加角色 await member.add_roles(target_role) print(f"成功给 {member.display_name} 添加了 {target_role.name} 角色") except discord.Forbidden: print("警告:机器人没有添加角色的权限,请检查机器人的权限设置!") except discord.HTTPException: print("添加角色时出现HTTP错误,请稍后重试!") else: print(f"错误:服务器 {member.guild.name} 中找不到ID为 {TARGET_ROLE_ID} 的角色") # 如果不是指定服务器,就啥也不做 # 替换成你的机器人令牌 client.run("你的机器人Token")
几个关键注意事项:
- 开启成员意图:现在Discord要求必须在开发者门户的机器人页面开启「服务器成员意图」,同时代码里也要设置
intents.members = True,不然on_member_join事件根本不会触发。 - 不要用ctx:
on_member_join事件的参数只有member,通过member.guild就能拿到用户加入的服务器,不需要ctx。 - 角色获取方式:用
member.guild.get_role()代替client.get_role(),因为同一个ID的角色在不同服务器可能不存在,这样能确保拿到的是当前服务器的角色。 - 异常处理:加了异常判断可以避免机器人因为权限不足或者其他意外情况崩溃,方便你排查问题。
内容的提问来源于stack exchange,提问作者Xx DragonLeon xX
相关产品推荐
相关产品推荐

