使用discord.py开发表单机器人遇AttributeError: 'ClientUser'无'avatar_url'属性
Discord表单机器人AttributeError问题解决
我正在用Python开发一款Discord表单机器人,运行代码时触发如下错误:AttributeError: 'ClientUser' object has no attribute 'avatar_url'
我的代码如下:
@bot.command() async def testform(ctx): form = Form(ctx,'Title') form.add_question('Question 1','first') form.add_question('Question 2','second') form.add_question('Question 3','third') await form.start()
错误详情:
2023-09-09 08:58:09 ERROR discord.ext.commands.bot Ignoring exception in command testform Traceback (most recent call last): File "/usr/local/python/3.10.4/lib/python3.10/site-packages/discord/ext/commands/core.py", line 235, in wrapped ret = await coro(*args, **kwargs) File "/workspaces/moon/dir/.py/homeworkBOT/main.py", line 43, in testform await form.start() File "/usr/local/python/3.10.4/lib/python3.10/site-packages/discord/ext/forms/form.py", line 221, in start embed.set_author(name=f"{self.title}: {n+1}/{len(self._questions)}", icon_url=self._bot.user.avatar_url) AttributeError: 'ClientUser' object has no attribute 'avatar_url' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/local/python/3.10.4/lib/python3.10/site-packages/discord/ext/commands/bot.py", line 1350, in invoke await ctx.command.invoke(ctx) File "/usr/local/python/3.10.4/lib/python3.10/site-packages/discord/ext/commands/core.py", line 1029, in invoke await injected(*ctx.args, **ctx.kwargs) # type: ignore File "/usr/local/python/3.10.4/lib/python3.10/site-packages/discord/ext/commands/core.py", line 244, in wrapped raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'ClientUser' object has no attribute 'avatar_url'
我代码里没用到avatar_url,网上搜了一圈也没找到其他人遇到这个discord.py相关问题,求解决办法。
问题分析
从报错栈能明确看到,错误并非出自你的代码,而是discord.ext.forms库内部的form.py文件第221行——它在尝试调用机器人用户对象的avatar_url属性,但discord.py 2.0及以上版本已经移除了avatar_url属性,替换成了avatar.url(需要先判断avatar是否存在,避免机器人无头像时报错)。这是表单库未适配新版本discord.py导致的兼容性问题。
解决方案
- 修改表单库源码
找到/usr/local/python/3.10.4/lib/python3.10/site-packages/discord/ext/forms/form.py第221行,将:
embed.set_author(name=f"{self.title}: {n+1}/{len(self._questions)}", icon_url=self._bot.user.avatar_url)
替换为:
avatar_url = self._bot.user.avatar.url if self._bot.user.avatar else None embed.set_author(name=f"{self.title}: {n+1}/{len(self._questions)}", icon_url=avatar_url)
- 降级discord.py版本
如果不想修改库源码,可以安装适配表单库的旧版discord.py,比如:
pip install discord.py==1.7.3
- 更换表单实现方式
寻找适配discord.py 2.x版本的表单库,或者自行通过消息交互(如按钮、下拉菜单)实现表单逻辑。
内容的提问来源于stack exchange,提问作者Diego Reim
相关产品推荐
相关产品推荐

