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

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%的场景:

  1. 检查项目根目录下的.env文件:
    • 确认文件名正确,Windows默认隐藏已知后缀名,很容易出现实际存成.env.txt的情况,导致load_dotenv()读不到配置
    • 文件内DISCORD_TOKEN的取值不要加引号、不要带多余前后空格,必须和Discord开发者后台Bot页面生成的最新Token完全一致

    只要你在开发者后台点击过「Reset Token」,旧Token会立刻失效,必须替换成新生成的字符串;如果你的Bot Token被提交到公开代码仓库,Discord会自动检测并作废Token,会发通知到你的绑定邮箱

  2. 验证Token读取结果:在TOKEN = os.getenv("DISCORD_TOKEN")下新增一行print(repr(TOKEN)),运行后如果打印结果是None,说明环境变量没有被正确加载,检查.env路径和load_dotenv()的传参即可
  3. 确认复制的是Bot专属Token,不是应用的Client Secret、普通用户账号Token,三者不通用

代码问题修复

你贴的代码存在三个显性问题,就算Token正确也会运行异常:

  1. on_message函数缺少@client.event装饰器,不会被注册为事件监听函数
  2. 新版本discord.py(v1.5+)需要手动声明Intents权限,否则拉取不到服务器成员列表、消息内容
  3. 缺少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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:09:25