discord.py rewrite 如何通过用户名获取服务器成员对象
Discord机器人获取成员对象失败解决方案
1. 开启必要的网关意图(Intents)
discord.py v2.0+ 版本默认关闭成员、消息内容相关的敏感权限,需要手动开启才能正常获取成员信息、读取消息内容:
代码侧配置:
import discord from discord.ext import commands # 声明意图 intents = discord.Intents.default() intents.members = True # 开启成员列表访问权限 intents.message_content = True # 开启消息内容读取权限 # 初始化客户端时传入意图 client = commands.Bot(command_prefix='自定义前缀', intents=intents)
开发者后台配置:
进入Discord开发者平台的对应应用页,找到「Bot」选项卡,将「Privileged Gateway Intents」下的Server Members Intent、Message Content Intent两个开关全部开启。
2. 修复成员匹配逻辑
message.guild.get_member_named()方法仅支持精确匹配「完整用户名#标签」或者「服务器完整昵称」,如果只拿到用户名的纯文本(不带#后缀)、或者匹配规则需要支持模糊匹配,可以替换为自定义遍历逻辑:
# 替换原有 member = message.guild.get_member_named(b) 代码 target_name = b member = None # 遍历服务器所有成员优先匹配服务器昵称,其次匹配用户名 for m in message.guild.members: # 精确匹配 if (m.nick and m.nick == target_name) or m.name == target_name: member = m break # 如果需要模糊匹配,把上面的判断替换为下面的 # if target_name in (m.nick if m.nick else m.name): # member = m # break
3. 修复代码语法问题
你提供的代码中if messages in message.content:的messages变量未定义,需要先声明这个触发关键词,否则整个逻辑块不会执行,自然无法获取到成员对象。
4. 增加空值兜底逻辑
匹配不到成员时直接调用member.mention会抛出异常,需要增加空值判断:
holder_display = target_name if not member else member.mention # 构造embed时替换为holder_display即可 embed = makeembed("Dank Island™️'s heist history",f"__**Amount**__ : {a}\n__**Holder**__ : {holder_display}\n__**Robbers**__ : {msg[0]}\n __**Status**__ : [Success]({link})")
内容的提问来源于stack exchange,提问作者Gaming with Akashdeep
相关产品推荐
相关产品推荐

