Discord Bot调用message.channel.send需管理员权限?权限配置排查
Discord Bot发送消息报403权限错误(错误码50013)排查方案
问题背景
使用Python开发Discord Bot时,调用await message.channel.send()或message.reply()均返回403 Forbidden (error code: 50013): Missing Permissions错误,仅当Bot角色设置为管理员时可正常发送消息。已配置除管理员外的所有服务器角色权限,疑惑是否必须管理员权限,或遗漏了某项配置(原以为仅需「发送消息」权限)。
示例代码:
@bot.event async def on_message(message): if message.author == bot.user: # 忽略Bot自身发送的消息 return if message.content.startswith('$hello'): await message.channel.send('Hello to you too!') if message.content.startswith('$inspire'): await message.channel.send(get_quote()) # 检查是否为用户首次发帖并设置角色 result=await set_to_prospect_roles_on_first(message) if result is not None: print ("Sending, "+result) try: await message.channel.send(result) except Exception as e: print ("Failed to send response, " + str(e))
排查要点(无需管理员权限,必是权限配置遗漏)
1. 检查频道级权限覆盖
服务器角色权限不等于频道权限,很多时候频道单独设置会覆盖全局:
- 打开目标频道的「编辑频道」→「权限」
- 找到Bot的角色,确认以下权限为允许状态,且未被「拒绝」:
- 查看频道
- 发送消息
- (若消息含嵌入内容)发送嵌入链接
2. 确认角色层级优先级
Discord权限按角色层级生效:
- 若Bot角色层级低于服务器内其他角色,或频道内存在更高层级角色设置了拒绝权限,会覆盖Bot的允许权限
- 调整Bot角色位置至所有相关角色之上(服务器设置→角色→拖动排序)
3. 检查特殊内容所需权限
如果消息包含以下内容,需额外开启对应权限:
- 嵌入消息/链接:需「发送嵌入链接」权限
- 自定义表情:需「使用外部表情」权限(若表情来自其他服务器)
- @所有人/角色:需「提及所有人」权限
4. 启用必要的网关意图
在Discord开发者门户的Bot设置中,开启以下特权网关意图:
- Server Members Intent(成员意图)
- Message Content Intent(消息内容意图)
注:使用on_message读取消息内容必须开启此项,否则可能导致权限校验异常
5. 排查代码返回内容
确认get_quote()或result返回的内容是否包含需要特殊权限的元素,比如嵌入对象、大文件、受限表情等,这类内容会触发额外权限校验。
内容的提问来源于stack exchange,提问作者Quadgnim
相关产品推荐
相关产品推荐

