无法获取带线程的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
相关产品推荐
相关产品推荐

