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
相关产品推荐
相关产品推荐

