You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

错误原因

  1. 属性调用错误:user.display_avatar_url是Hikari的属性对象(而非直接的字符串URL),直接赋值会得到属性对象的内存引用,而非实际URL字符串。
  2. 参数类型错误:pfp.resize(100,100)中,resize方法要求传入元组类型的尺寸参数,而非两个单独的整数。
  3. 类型标注错误:函数参数user = hikari.User是默认值赋值,不是类型提示,应该改为user: hikari.User。
  4. 同步请求阻塞:requests是同步HTTP库,在异步机器人中使用会阻塞事件循环,建议改用Hikari的异步HTTP客户端。

修复方案

  1. 将user.display_avatar_url改为str(user.display_avatar_url)(将URL对象转为字符串),或者直接取user.display_avatar_url.url属性。
  2. 修正resize参数为pfp.resize((100, 100))。
  3. 修正函数参数的类型标注为user: hikari.User。
  4. 替换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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:24:47