前一段时间,我制作了一个不和谐的bot,目的是涉及我和我的朋友所需要的消息嵌入。长话短说,由于主机(树莓派)死亡,该机器人下线了大约一年。今天是快速转发,我们再次需要它,因此我尝试将其启动,但是注意到我的大多数代码不再起作用,因为discord.py的异步分支已更新为v1.0,这带来了重大更改和要求迁移代码以符合新库。通过查看文档,我能够弄清楚所有内容,除了我的机器人的嵌入部分。哪个是最重要的。
这是我将重点关注的代码,后面会有更多内容,但这与本部分无关,因为如果我可以在字符串中成功存储我想要的值,那么其余的应该起作用。
async def on_message(message):
serverid = message.guild.id
channel = message.channel
messagecontent = message.content
if message.embeds:
try:
charaname = message.embeds[0]['author']['name']
charaseries = message.embeds[0]['description']
except AttributeError:
return
我基本上想做的是,如果一条消息有一个嵌入,那么我需要将名称和描述值存储在单独的字符串中,以供以后在代码中使用。但是我试图这样做:
Ignoring exception in on_message
Traceback (most recent call last):
File "C:\discord\client.py", line 270, in _run_event
await coro(*args, **kwargs)
File "C:\path_to_script", line 35, in on_message
charaseries = message.embeds[0]['description']
TypeError: 'Embed' object is not subscriptable
一些研究告诉我,“可下标”是指一个对象可以包含多个其他对象(例如列表)的时间。 here的解释更好。如果它不是可下标的,那么我想新库将具有全新的处理方式,我似乎无法弄清楚。因此,我需要帮助来了解这里到底发生了什么,以便我可以修改代码并使这部分再次工作。
非常感谢您的帮助,谢谢!
答案 0 :(得分:1)
TypeError: 'Embed' object is not subscriptable
,如您所见,Embed是object
,它是not subscriptable
。
可下标对象的示例之一是标准字典。这意味着可以使用["key_name"]
来访问它的属性。
要使其他对象可被下标,它们需要实现__getitem__()
dunder方法。由于出现object not subscriptable
错误,这意味着您的Embed对象未实现此方法。
您曾经能够以这种方式访问它们,但是如果您查看d.py migrating page,则会看到它们指出:
Message.embeds现在是Embed列表,而不是dict对象。
这是Embed对象的列表,如果您查看current Embed documentation,将看到如何访问它的属性-对于您的情况:
charaname = message.embeds[0].author.name
charaseries = message.embeds[0].description
为澄清起见,message.embeds
是一个Embed对象的列表,因此,使用[0],我们从该列表中获得第一个元素,即Embed object。
您可以看到from the documentation,我们可以使用description
属性访问它的描述,不是吗?
如果我们执行.author
,如从documentation所见,我们将访问其作者EmbedProxy object
。现在我们可以从中访问什么?如果您查找前一个documentation link,它将显示See set_author() for possible values you can access.
因此,我们来看看set_author()的文档,因为我们看到它的参数是
name (str)
url (str)
icon_url (str)
因此,按照文档中的上一个语句,我们知道我们可以访问那些3。
所以这都是有效的:
message.embeds[0].author.name
message.embeds[0].author.url
message.embeds[0].author.icon_url
如果未设置任何一个,它将返回Embed.Empty
,如the docs所示
因此,如果未设置它们,您将得到Embed.Empty
,这种嵌入的一个示例是:
embed = discord.Embed(title="Test embed #1", description="Some description")
await ctx.send(embed=embed)
您看到未设置作者,因此如果获取message.embeds[0].author.name
会得到Embed.Empty
,而对于message.embeds[0].description
会得到Some description
,因为它已被设置。
在嵌入中设置作者的一个示例:
embed = discord.Embed(title="Test embed #2", description="Some description").set_author(name=ctx.author.name)
await ctx.send(embed=embed)
(我们使用了set_author())-由于我们是在Embed初始化期间设置的,因此将获得作者姓名的字符串。