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

discord.py报错:'async_generator'对象不可下标访问,求无discord.ext解决方案

问题分析与修复方案

核心问题

  1. 异步操作未正确处理:channel.history()是异步方法,返回的是异步生成器,不能直接用[0]索引,必须通过await转换成列表才能操作。
  2. 逻辑顺序错误:获取消息的代码放在了命令判断之前,不管用户发没触发.content命令都会执行,既浪费资源又会提前抛出错误。
  3. 未排除机器人自身消息:如果不判断消息发送者是否是机器人自己,机器人发消息后会再次触发on_message,导致无限循环。

修复后的代码

TOKEN = 'MY_BOTS_TOKEN'
import discord

intents = discord.Intents.all()
client = discord.Client(intents=intents)

@client.event 
async def on_message(message):
    # 跳过机器人自己发的消息,避免循环触发
    if message.author == client.user:
        return
    
    if message.content.startswith('.content'):
        # 仅在触发命令时才执行获取消息逻辑
        mychannel = client.get_channel(MYCHANNELID)
        # 异步获取消息并转为列表
        messages = await mychannel.history(limit=1).flatten()
        if messages:  # 确保目标频道有消息
            content = messages[0].content
            await message.channel.send(content)
        else:
            await message.channel.send("目标频道里没有消息")

client.run(TOKEN)

关键修复点说明

  • 异步处理修正:用await mychannel.history(limit=1).flatten()把异步生成器转为普通列表,才能安全用索引取第一条消息。
  • 逻辑位置调整:把获取频道消息的代码移到命令判断内部,只有用户触发.content时才执行,减少无效操作。
  • 添加自我消息过滤:通过if message.author == client.user: return避免机器人响应自己的消息,防止循环。
  • 空消息防护:增加if messages:检查,避免目标频道为空时出现索引越界错误。

内容的提问来源于stack exchange,提问作者Dauern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:05:29