Discord.py客户端登录失败:传入令牌无效问题求助
我用Discord.py编写了一个基于客户端令牌的简单机器人,但登录时遇到LoginFailure: Improper token has been passed.错误,尝试多种方法仍无法解决,请求技术帮助。
我的代码
import discord from decimal import Decimal import os from dotenv import load_dotenv client = discord.Client(intents=discord.Intents.default()) intents = discord.Intents.default() intents.messages = True load_dotenv() my_var = os.environ['TOKEN'] print(my_var) print(type(m)) @client.event async def on_ready(): print('Bot Have Logged In as {0.user'.format(client)) # (webpackChunkdiscord_app.push([[''],{},e=>{m=[];for(let c in e.c)m.push(e.c[c])}]),m).find(m=>m?.exports?.default?.getToken!==void 0).exports.default.getToken() client.run(os.getenv('TOKEN'))
运行时错误信息
[2023-09-08 02:11:36] [INFO ] discord.client: logging in using static token Traceback (most recent call last): File "C:\Users\MrSufi\PycharmProjects\pythonProject\venv\Lib\site-packages\discord\http.py", line 803, in static_login data = await self.request(Route('GET', '/users/@me')) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\MrSufi\PycharmProjects\pythonProject\venv\Lib\site-packages\discord\http.py", line 745, in request raise HTTPException(response, data) discord.errors.HTTPException: 401 Unauthorized (error code: 0): 401: Unauthorized The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\MrSufi\PycharmProjects\pythonProject\text.py", line 15, in client.run(TOKEN) File "C:\Users\MrSufi\PycharmProjects\pythonProject\venv\Lib\site-packages\discord\client.py", line 860, in run asyncio.run(runner()) File "C:\Users\MrSufi\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "C:\Users\MrSufi\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\MrSufi\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\Users\MrSufi\PycharmProjects\pythonProject\venv\Lib\site-packages\discord\client.py", line 849, in runner await self.start(token, reconnect=reconnect) File "C:\Users\MrSufi\PycharmProjects\pythonProject\venv\Lib\site-packages\discord\client.py", line 777, in start await self.login(token) File "C:\Users\MrSufi\PycharmProjects\pythonProject\venv\Lib\site-packages\discord\client.py", line 612, in login data = await self.http.static_login(token) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\MrSufi\PycharmProjects\pythonProject\venv\Lib\site-packages\discord\http.py", line 807, in static_login raise LoginFailure('Improper token has been passed.') from exc discord.errors.LoginFailure: Improper token has been passed.
解决方法
1. 核心问题:令牌类型不匹配
discord.Client()是为机器人账号设计的,必须使用Discord开发者平台生成的机器人令牌,而非用户客户端令牌:
- 用户客户端令牌是个人账号的认证凭证,Discord官方禁止用它登录机器人,违反服务条款,会导致账号封禁。
- 如果是开发机器人,需前往Discord开发者平台创建应用,添加机器人后复制其专属令牌。
2. 修复代码中的语法错误
- 代码中
print(type(m))的m未定义,直接运行会报错,需删除该行或定义变量。 on_ready中的格式化字符串少了闭合的},原代码'{0.user'.format(client)应改为'{0.user}'.format(client),或用更简洁的f-string:f'Bot已登录为 {client.user}'。
3. 修正Intents配置逻辑
你先初始化了client再定义intents,导致配置的intents未生效,正确顺序是先配置intents再初始化客户端:
intents = discord.Intents.default() intents.messages = True client = discord.Client(intents=intents)
4. 环境变量读取优化
- 用
os.getenv('TOKEN')替代os.environ['TOKEN'],避免变量不存在时直接抛出KeyError。 - 增加令牌读取校验,确保能正确获取到值:
token = os.getenv('TOKEN') if not token: raise ValueError("未从环境变量中读取到TOKEN,请检查.env文件配置")
修复后的完整代码
import discord import os from dotenv import load_dotenv # 先配置Intents intents = discord.Intents.default() intents.messages = True # 初始化客户端并传入配置好的intents client = discord.Client(intents=intents) # 加载环境变量 load_dotenv() token = os.getenv('TOKEN') # 校验令牌是否存在 if not token: raise ValueError("未从环境变量中读取到TOKEN,请检查.env文件") # 打印令牌前10位确认(避免泄露完整令牌) print(f"读取到的令牌:{token[:10]}...") @client.event async def on_ready(): print(f'Bot已登录为 {client.user}') client.run(token)
内容的提问来源于stack exchange,提问作者Usama Khalid
相关产品推荐
相关产品推荐

