Discord.py 动态获取开发者头像URL与用户名设置Embed页脚的方法
Discord.py 动态获取开发者账号信息实现方法
内置属性基础说明
- 不需要硬编码开发者的用户名和头像URL,
commands.Bot实例自带开发者相关的信息获取能力,拿到的对象和指令触发用户ctx.author属于同一类discord.User实例,所有属性(用户名、头像地址、账号判别码)都会随你账号修改自动同步,不存在硬编码不同步的问题 - 可直接调用的内置逻辑说明:
bot.owner:直接返回缓存好的开发者discord.User对象,和ctx.author的用法完全一致,可以直接提取头像地址、用户名等信息- 这个属性是懒加载模式,不会在机器人启动瞬间就完成数据拉取:必须等机器人和Discord网关完成连接、加载完应用信息之后才能正常读取,绝对不能把获取逻辑写在全局同步代码块的位置
- 最稳妥的配置方式是在初始化Bot的时候直接传入你的账号ID:
bot = commands.Bot(command_prefix="!", owner_id=你的Discord账号ID),后续不管你是改用户名还是换头像,这个属性返回的信息都会实时匹配Discord端的最新数据 - 如果配置了多个开发者账号,可以通过
bot.owner_ids获取所有绑定的开发者ID列表,读取用户信息的逻辑和单所有者场景完全一致
代码实现示例
按照现有代码的逻辑调整,核心是把获取开发者信息的逻辑放到指令运行的协程内部,不要放在全局初始化区域:
# 在你的信息查询指令的协程方法内部执行 async def info_command(ctx): # 优先读取缓存的开发者信息,避免懒加载未命中的问题 owner = ctx.bot.owner or await ctx.bot.application_info().owner em = discord.Embed() em.set_footer( icon_url=owner.avatar.url, text=str(owner) # 直接将User对象转字符串会自动输出 用户名#判别码 的完整格式,和预期的展示效果完全匹配 ) await ctx.send(embed=em)
- 实现细节注意点:
- Discord.py 2.x版本之后,旧版的
avatar_url属性已经替换为avatar.url,继续使用旧属性会触发弃用警告 - 不需要每次调用指令都发网络请求拉取开发者信息:只要在
on_ready事件里提前执行一次await bot.application_info(),拿到的开发者对象会存在bot的内存缓存里,后续随时调用都不会重复消耗请求额度
- Discord.py 2.x版本之后,旧版的
常见报错排查
如果获取开发者信息返回None,基本是两类原因:
- 把获取开发者信息的代码写在了机器人初始化的同步位置,这时候还没完成网关连接,对应缓存为空
- 初始化Bot的时候没有传入
owner_id,也没有在on_ready阶段提前拉取应用信息做缓存
内容的提问来源于stack exchange,提问作者Paul Weinmann
相关产品推荐
相关产品推荐

