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")
问题原因
- 机器人无发送消息权限:目标频道或服务器层面未给机器人分配
Send Messages权限。 - 频道权限覆盖:服务器全局权限允许,但目标频道单独禁用了机器人的发送消息权限。
- 同步阻塞函数干扰:
time.sleep(value)是同步调用,会阻塞discord.py的异步事件循环,导致机器人状态异常,间接触发权限相关报错。 - 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
相关产品推荐
相关产品推荐

