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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:03:12