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

Discord.py技术问题:用户获指定角色时机器人未发送嵌入消息

问题排查与修复方案

1. 变量名冲突导致逻辑错误

你代码里生成roles_before和roles_after时,循环变量用了role,这会覆盖外层定义的目标角色变量,直接导致后续角色判断逻辑失效:

roles_before = set(role.id for role in before.roles)  # 此处的role是循环中的遍历角色,并非你定义的目标角色

修复方式:将循环变量改为其他名称,比如r:

roles_before = set(r.id for r in before.roles)
roles_after = set(r.id for r in after.roles)

或者用更直观的方式判断角色变化:

if role in after.roles and role not in before.roles:

2. 未开启服务器成员意图(Server Members Intent)

Discord.py v2.x及以上版本,必须在开发者门户开启服务器成员意图,否则on_member_update事件根本不会被触发:

  • 登录Discord开发者门户,进入你的应用
  • 切换到「Bot」标签页,找到「Privileged Gateway Intents」,开启「Server Members Intent」
  • 代码中同时启用意图:
intents = discord.Intents.default()
intents.members = True

client = discord.Client(intents=intents)

3. Embed颜色参数格式错误

discord.Embed的color参数不支持RGB元组,需要传入整数或discord.Color对象:
修复方式:使用discord.Color.from_rgb()转换:

embed = discord.Embed(description=f"{after.mention} 现在获得了这个角色,太棒了!", color=discord.Color.from_rgb(28, 60, 128))

或者直接传入十六进制整数:

embed = discord.Embed(description=f"{after.mention} 现在获得了这个角色,太棒了!", color=0x1C3C80)

4. 机器人权限不足

确保机器人拥有以下权限:

  • 查看指定频道的权限
  • 在指定频道发送消息的权限
  • 发送嵌入消息的权限(Embed Links)

修复后的完整代码示例

import discord

intents = discord.Intents.default()
intents.members = True

client = discord.Client(intents=intents)

@client.event
async def on_member_update(before, after):
    role_id = 123456789012345678  # 替换为你的目标角色ID
    channel_id = 987654321098765432  # 替换为指定频道ID

    role = before.guild.get_role(role_id)
    channel = before.guild.get_channel(channel_id)

    if role and channel:
        if role in after.roles and role not in before.roles:
            embed = discord.Embed(description=f"{after.mention} 现在获得了这个角色,太棒了!", color=discord.Color.from_rgb(28, 60, 128))
            await channel.send(embed=embed)

client.run("你的机器人令牌")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:27:18