使用Hikari&Lightbulb获取Discord用户头像URL时出现属性对象错误
解决Hikari+Lightbulb机器人slap命令头像URL获取失败问题
问题场景
使用Hikari和Lightbulb开发Discord机器人时,执行slap命令尝试获取指定用户头像URL,得到的结果是<property object at 0x000001F7E7FE6F70>,导致requests请求抛出MissingSchema错误,最终触发lightbulb.errors.CommandInvocationError。
原代码如下:
import lightbulb from PIL import Image from io import BytesIO import requests plugin = lightbulb.Plugin('Images', 'Create Images') @plugin.command @lightbulb.option('user', 'who to create image of',required = True) @lightbulb.command('slap', 'Slap someone') @lightbulb.implements(lightbulb.PrefixCommand) async def wanted(ctx: lightbulb.context, user = hikari.User): slap = Image.open('images\\slap.png') userAvatarUrl = user.display_avatar_url response = requests.get(userAvatarUrl) pfp = Image.open(BytesIO(response.content)) pfp = pfp.resize(100,100) slap.paste(pfp,(120,120)) slap.save('Profile.jpg') await ctx.respond(file = hikari.File('Profile.jpg')) def load(bot): bot.add_plugin(plugin)
错误原因
- 属性调用错误:
user.display_avatar_url是Hikari的属性对象(而非直接的字符串URL),直接赋值会得到属性对象的内存引用,而非实际URL字符串。 - 参数类型错误:
pfp.resize(100,100)中,resize方法要求传入元组类型的尺寸参数,而非两个单独的整数。 - 类型标注错误:函数参数
user = hikari.User是默认值赋值,不是类型提示,应该改为user: hikari.User。 - 同步请求阻塞:requests是同步HTTP库,在异步机器人中使用会阻塞事件循环,建议改用Hikari的异步HTTP客户端。
修复方案
- 将
user.display_avatar_url改为str(user.display_avatar_url)(将URL对象转为字符串),或者直接取user.display_avatar_url.url属性。 - 修正resize参数为
pfp.resize((100, 100))。 - 修正函数参数的类型标注为
user: hikari.User。 - 替换requests为Hikari的异步
fetch_image方法,避免阻塞事件循环。
完整修正代码
import lightbulb import hikari from PIL import Image from io import BytesIO plugin = lightbulb.Plugin('Images', 'Create Images') @plugin.command @lightbulb.option('user', 'who to create image of', required=True, type=hikari.User) @lightbulb.command('slap', 'Slap someone') @lightbulb.implements(lightbulb.PrefixCommand) async def wanted(ctx: lightbulb.Context, user: hikari.User): # 打开基础图片 slap = Image.open('images\\slap.png') # 获取用户头像的二进制数据(使用Hikari异步客户端) avatar_data = await ctx.bot.rest.fetch_image(user.display_avatar_url) pfp = Image.open(BytesIO(avatar_data)) # 修正resize参数为元组 pfp = pfp.resize((100, 100)) # 粘贴头像到基础图片 slap.paste(pfp, (120, 120)) # 保存到内存流,避免写入本地文件 with BytesIO() as buffer: slap.save(buffer, format='JPEG') buffer.seek(0) await ctx.respond(file=hikari.File(buffer, 'slap_result.jpg')) def load(bot): bot.add_plugin(plugin)
关键报错信息(翻译后)
requests.exceptions.MissingSchema: 无效URL '<property object at 0x000001F7E7FE6F70>':缺少协议头。你是不是想写 http://<property object at 0x000001F7E7FE6F70>? 上述异常直接导致以下错误: lightbulb.errors.CommandInvocationError: 执行命令'slap'时发生错误
内容的提问来源于stack exchange,提问作者Pain.
相关产品推荐
相关产品推荐

