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

Discord机器人发送消息触发403权限缺失错误求助

解决discord.py 403权限缺失错误

问题重现

运行代码时终端抛出权限错误:

discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions

涉事代码:

@tasks.loop(seconds=20)
async def __random_time_money():
    value = random.randint(4, 15)
    time.sleep(value)
    for guild in bot.guilds:
        ch = guild.get_channel(base.execute("""SELECT main_channel FROM guild_name WHERE guild_id = {}""".format(guild.id)).fetchone()[0])
        print(ch)
        await ch.send("hi")

问题原因

  1. 机器人无发送消息权限:目标频道或服务器层面未给机器人分配Send Messages权限。
  2. 频道权限覆盖:服务器全局权限允许,但目标频道单独禁用了机器人的发送消息权限。
  3. 同步阻塞函数干扰:time.sleep(value)是同步调用,会阻塞discord.py的异步事件循环,导致机器人状态异常,间接触发权限相关报错。
  4. SQL查询隐患:用format拼接SQL语句有注入风险,且未处理查询结果为空的情况,可能引发后续异常。

解决步骤

  • 补全机器人权限:
    • 进入服务器「设置」→「角色」,找到机器人角色,开启Send Messages权限;
    • 进入目标频道「设置」→「权限」,确认机器人角色或@everyone角色的Send Messages权限未被禁用。
  • 替换阻塞函数:将time.sleep(value)替换为异步的await asyncio.sleep(value),需先导入asyncio模块,避免卡住事件循环。
  • 修复SQL查询逻辑:使用参数化查询避免注入,同时处理无结果的情况:
    # 以sqlite3为例的参数化查询
    cursor = base.execute("SELECT main_channel FROM guild_name WHERE guild_id = ?", (guild.id,))
    channel_id = cursor.fetchone()
    if not channel_id:
        continue  # 无对应频道则跳过当前服务器
    ch = guild.get_channel(channel_id[0])
    
  • 前置权限检查:发送消息前先验证频道有效性和权限:
    if ch and ch.permissions_for(bot.user).send_messages:
        await ch.send("hi")
    else:
        print(f"服务器 {guild.name} 中频道 {channel_id[0]} 无法发送消息:权限不足或频道不存在")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:10:32