使用Discord Py获取跨服务器用户私信及消息获取异常排查
解决Discord机器人无法获取频道对象导致的'NoneType'报错
核心问题分析
报错'NoneType' object has no attribute 'fetch_message'的直接原因是channel变量为None——也就是bot.get_channel(int(channelId))没有找到对应的频道对象,后续调用fetch_message自然会失败。
可能的原因及解决方案
- 频道不在机器人缓存中
get_channel依赖本地缓存查找频道,如果频道未被缓存(比如机器人刚启动、频道新建,或长期未访问),就会返回None。改用fetch_channel直接从Discord API拉取频道信息:
channel = await bot.fetch_channel(int(channelId))
机器人缺少频道权限
确认机器人在目标服务器中拥有查看频道和读取消息历史权限,私有频道还要保证机器人被加入频道权限列表。目标是用户DM会话
DM频道不属于服务器缓存,get_channel无法获取。先通过用户对象拿到DM频道:
user = await bot.fetch_user(userId) dm_channel = await user.create_dm() # 若会话已存在,也可直接用user.dm_channel message = await dm_channel.fetch_message(messageId)
部分版本也支持直接全局获取消息:
message = await bot.fetch_message(messageId)
- 频道ID有误
再次核对ID:确保是纯数字、无多余字符,可开启Discord开发者模式后右键频道复制ID验证。
修改后的示例代码
针对DM会话场景
async def updatePost(userId, channelId, messageId): print("Проверка") user = await bot.fetch_user(userId) dm_channel = await user.create_dm() print(dm_channel.id) print(messageId) message = await dm_channel.fetch_message(messageId)
针对服务器频道场景
async def updatePost(userId, channelId, messageId): print("Проверка") user = await bot.fetch_user(userId) print(channelId) channel = await bot.fetch_channel(int(channelId)) print(channel) print(messageId) message = await channel.fetch_message(messageId)
内容的提问来源于stack exchange,提问作者Kaito Hitsugaya
相关产品推荐
相关产品推荐

