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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:45:03