discord.py报RuntimeError: Event loop is closed及登录失败问题排查
Discord.py 机器人启动报错排查方案
报错优先级说明
两个报错存在因果关系,不需要同时处理:
discord.errors.LoginFailure: Improper token has been passed是程序启动失败的根因,直接导致进程退出RuntimeError: Event loop is closed是Windows平台Python 3.8+版本asyncio默认事件循环的已知兼容问题,属于程序异常退出后触发的连带报错,本身不影响机器人运行逻辑
401 Token无效问题排查步骤
按顺序排查即可覆盖99%的场景:
- 检查项目根目录下的
.env文件:- 确认文件名正确,Windows默认隐藏已知后缀名,很容易出现实际存成
.env.txt的情况,导致load_dotenv()读不到配置 - 文件内
DISCORD_TOKEN的取值不要加引号、不要带多余前后空格,必须和Discord开发者后台Bot页面生成的最新Token完全一致
只要你在开发者后台点击过「Reset Token」,旧Token会立刻失效,必须替换成新生成的字符串;如果你的Bot Token被提交到公开代码仓库,Discord会自动检测并作废Token,会发通知到你的绑定邮箱
- 确认文件名正确,Windows默认隐藏已知后缀名,很容易出现实际存成
- 验证Token读取结果:在
TOKEN = os.getenv("DISCORD_TOKEN")下新增一行print(repr(TOKEN)),运行后如果打印结果是None,说明环境变量没有被正确加载,检查.env路径和load_dotenv()的传参即可 - 确认复制的是Bot专属Token,不是应用的Client Secret、普通用户账号Token,三者不通用
代码问题修复
你贴的代码存在三个显性问题,就算Token正确也会运行异常:
on_message函数缺少@client.event装饰器,不会被注册为事件监听函数- 新版本discord.py(v1.5+)需要手动声明Intents权限,否则拉取不到服务器成员列表、消息内容
- 缺少Windows平台事件循环兼容配置,就算正常退出也可能抛事件循环关闭的错误
修复后的完整可运行代码:
import os import sys import asyncio import discord from dotenv import load_dotenv # 修复Windows下事件循环关闭报错 if sys.version_info >= (3, 8) and sys.platform.startswith('win'): asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) load_dotenv() TOKEN = os.getenv("DISCORD_TOKEN") GUILD = os.getenv("DISCORD_GUILD") # 配置需要的Intents权限,对应开发者后台Bot页面的开关要同步打开 intents = discord.Intents.default() intents.members = True intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): guild = discord.utils.get(client.guilds, name=GUILD) print( f'{client.user} is connected to the following guild:\n' f'{guild.name}(id: {guild.id})\n' ) members = '\n - '.join([member.name for member in guild.members]) print(f'Guild Members:\n - {members}') @client.event async def on_message(message): # 过滤机器人自身发送的消息,避免死循环 if message.author == client.user: return print(message.content) if __name__ == "__main__": client.run(TOKEN)
额外注意
配置Intents后,需要同步到Discord开发者后台,在Bot页面的「Privileged Gateway Intents」板块,把你用到的Server Members Intent、Message Content Intent开关打开,保存后重启机器人即可。
内容的提问来源于stack exchange,提问作者ColorfulYoshi
相关产品推荐
相关产品推荐

