discord.py接收Discord私信时无法获取embed消息内容问题求助
问题根源
你遇到的问题主要由两方面原因导致:
- 最核心的原因是Discord网关意图(Intents)未正确配置:discord.py v1.5及以上版本要求开发者显式声明需要接收的网关数据范围,读取消息内容、Embed属于
message_content特权意图的管辖范畴,没有开启的话即使消息携带Embed也会读取为空。 - 次要问题是参数命名不规范:
on_message事件默认接收的参数是消息对象,常规命名为message,你命名为ctx容易和命令上下文对象混淆,不过这个问题不会直接导致功能失效。 - 你观察到的
print(ctx)输出为空是正常现象:如果消息仅包含Embed、没有纯文本内容,直接打印消息对象默认会输出空字符串,不属于bug。
修复方案
1. 代码层面添加意图声明
初始化客户端时显式声明需要的意图,示例代码如下:
import discord from discord.ext import commands # 初始化意图配置 intents = discord.Intents.default() intents.message_content = True # 必须开启,才能读取消息内容、Embed等数据 intents.dm_messages = True # 额外开启私信消息的接收权限,适配你的私信读取需求 # 初始化客户端时传入意图配置 client = commands.Bot(command_prefix='自定义前缀', intents=intents)
2. 修正事件代码的潜在问题
调整事件代码的参数命名,增加私信通道判断逻辑,避免服务端消息干扰:
@client.event async def on_message(message): # 用标准的消息对象命名,避免和命令上下文混淆 # 仅处理私信通道的消息,不需要可以删除这两行 if not isinstance(message.channel, discord.DMChannel): return if message.author.id in bots_id: print(message.author.id, message.author.display_name) print(message.content) if len(message.embeds) > 0: print(message.embeds[0].to_dict()) await send_embed(message.embeds[0].to_dict()) # 如果同时使用了命令框架,保留此行保证命令能正常触发 await client.process_commands(message)
3. 开启开发者后台的特权意图
需要在Discord开发者后台手动开启特权意图开关:
- 进入你的Bot应用的管理页面,切换到「Bot」标签
- 下滑找到「Privileged Gateway Intents」区域
- 打开
Message Content Intent的开关,保存设置即可
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

