如何用discord.py读取Embed并存储玩家统计数据?遇类型不可迭代错误
嘿,我看到你遇到的问题了——直接在Discord Embed对象上用in操作符找关键词会报错,这是因为embeds[0]是一个discord.Embed实例,不是可迭代的字符串或者字典,所以Python不知道怎么检查里面有没有**AT**。
咱们来一步步解决这个问题:
问题根源
你原来的代码里,if '**AT**' in embeds[0]这一行直接把Embed对象当成了可迭代的序列,但discord.Embed本身不支持这种操作,所以才会抛出“类型不可迭代”的错误。
正确的解决思路
你已经用到了embed.to_dict(),这是个非常好的方向!这个方法会把Embed转换成嵌套字典结构,包含所有内容(标题、描述、字段、脚注等)。另外,Discord.py的Embed对象也提供了直接访问属性的方法,比如description、fields,我们可以通过这些途径定位到统计数据。
修正后的代码示例
方法1:直接访问Embed的属性(更直观)
@bot.command(name='dungeon') async def dungeon(ctx): # 这里可以补充你的 dungeon 命令逻辑 pass @bot.event async def on_message(message): # 必须先处理命令,否则 on_message 会拦截命令触发 await bot.process_commands(message) embeds = message.embeds for embed in embeds: # 检查Embed描述文本中是否包含**AT** if embed.description and '**AT**' in embed.description: print('找到AT在描述里了!') # 假设描述格式是类似 "**AT**: 150",可以提取数值 at_value = embed.description.split('**AT**: ')[1].strip() print(f"提取到AT数值:{at_value}") # 遍历所有Embed字段,查找目标关键词 for field in embed.fields: if '**AT**' in field.name or '**AT**' in field.value: print(f'找到AT字段:{field.name} -> {field.value}') # 提取字段中的数值(示例格式) if '**AT**' in field.value: at_value = field.value.split('**AT**: ')[1].strip() # 这里可以把at_value存储为变量,用于后续逻辑 print(f"提取到AT数值:{at_value}")
方法2:用to_dict()遍历字典内容(更全面)
如果你想搜索整个Embed的所有内容,可以借助to_dict()生成的字典:
@bot.event async def on_message(message): await bot.process_commands(message) embeds = message.embeds for embed in embeds: embed_dict = embed.to_dict() # 检查描述字段 if 'description' in embed_dict and '**AT**' in embed_dict['description']: print('找到AT!') # 检查所有字段 if 'fields' in embed_dict: for field in embed_dict['fields']: if '**AT**' in field['name'] or '**AT**' in field['value']: print(f'找到AT字段:{field}') # 数值提取逻辑同上
额外提示
如果这个玩家资料Embed有特定的标题(比如“玩家属性面板”),建议先加一层判断,避免误处理其他无关Embed:
if embed.title == "玩家属性面板": # 再执行上面的查找逻辑
内容的提问来源于stack exchange,提问作者hithisishigh
相关产品推荐
相关产品推荐

