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

Discord.py调用channel.history()返回内存地址而非消息内容问题

问题根因

discord.py中channel.history()是异步迭代方法,不会直接返回单条消息实例,你未加await直接赋值得到的是异步生成器对象,不是实际的消息数据,因此访问.content属性会报错,打印对象时显示的就是内存地址样式的生成器标识。
另外代码存在两个易踩的逻辑问题:

  • 即使加了await,history()返回的是消息集合,哪怕limit=1也需要从中取出对应元素,才是你要的第一条消息
  • 注意区分「拉取消息的源频道」和「发送转发消息的目标频道」,不要混淆变量
修复代码

适配discord.py 1.x版本的写法:

# 转发消息的目标频道
target_channel = bot.get_channel(123456789)
# 异步拉取频道最早的1条消息,展平为列表
msg_list = await ctx.channel.history(limit=1, oldest_first=True).flatten()
first_msg = msg_list[0]

em = discord.Embed(
    title='Ticket Closed',
    description=f"Ticket `{ctx.channel.name}` has been closed.\nReason: {args}\n\nOriginal Ticket: {first_msg.content}",
    color=0x2ecc71
)
await target_channel.send(embed=em)

如果你用的是discord.py 2.0+版本,flatten()已被移除,替换拉取消息的逻辑即可:

# 2.0+版本拉取消息写法
msg_list = [message async for message in ctx.channel.history(limit=1, oldest_first=True)]
first_msg = msg_list[0]
额外说明

如果频道存在权限问题、或者频道内没有消息,直接取msg_list[0]会触发索引报错,生产环境建议加长度判断做异常兜底。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:45:32