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

无法获取带线程的Discord消息?原因及修复方案

问题原因与修复方案

原因分析

使用get_partial_messageable(tracked_channel)获取的是无服务器关联的部分消息对象,当目标消息带有线程时,Discord.py在初始化Thread对象时需要从所属服务器(Guild)中查找线程数据,但此时self.guild为None,调用get_thread方法就会触发AttributeError: 'NoneType' object has no attribute 'get_thread'。

修复方案

方案1:通过服务器+频道获取消息(推荐)

直接从服务器开始获取频道和消息,确保对象关联完整的服务器信息:

from logic import ds_token, tracked_channel, guild_id  # 新增你的服务器ID(guild_id)
import discord

# 按需开启必要的意图,message_content可选,若后续需要读取消息内容则开启
intents = discord.Intents.default()
intents.message_content = True

bot = discord.Bot(intents=intents)

tracked_msg = int(input("Enter message ID: "))

@bot.event
async def on_ready():
    # 获取服务器对象
    guild = bot.get_guild(guild_id) or await bot.fetch_guild(guild_id)
    # 获取频道对象
    channel = guild.get_channel(tracked_channel) or await guild.fetch_channel(tracked_channel)
    # 获取目标消息
    msg = await channel.fetch_message(tracked_msg)
    print(msg.reactions)

bot.run(ds_token)

方案2:临时移除线程数据(不推荐)

如果无法获取服务器ID,可临时移除消息数据中的线程字段,绕过Thread对象的初始化逻辑,但会丢失线程关联信息:

from logic import ds_token, tracked_channel
import discord

bot = discord.Bot(intents=discord.Intents.default())

tracked_msg = int(input("Enter message ID: "))

@bot.event
async def on_ready():
    channel = bot.get_partial_messageable(tracked_channel)
    # 直接请求消息原始数据
    raw_data = await channel._state.http.get_message(channel.id, tracked_msg)
    # 移除线程字段,避免初始化错误
    raw_data.pop("thread", None)
    # 手动创建Message对象
    msg = discord.Message(state=channel._state, channel=channel, data=raw_data)
    print(msg.reactions)

bot.run(ds_token)

注意事项

  • 优先使用方案1,它能保留完整的服务器与线程关联,更适合后续投票/调查功能的扩展开发。
  • 确保bot拥有读取消息历史的权限,否则会出现权限不足的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:15:41