Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。'

Posted

技术标签:

【中文标题】Discord Bot - “属性错误:\'NoneType\' 对象没有属性\'strip。\'【英文标题】:Discord Bot - "Attribute Error: 'NoneType' object has no attribute 'strip.'Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。' 【发布时间】:2020-10-22 06:02:10 【问题描述】:

我是一名新的编码员,我一直在关注 atutorial 如何创建一个不和谐的机器人,下面的代码实际上是直接从教程中复制的代码,我已经创建了一个 . env 文件来存储我的 AuthToken。每次我运行代码时,都会出现上述代码下方的错误。有小费吗?提前致谢!

代码:

import os 

import discord

from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')

client = discord.Client()

@client.event
async def on_ready():
    print(f'client.user has connected to Discord!')
client.run(TOKEN)

错误:

Traceback (most recent call last):   File "/Users/XXXXXXXXXXXX/scratch/discordbot/app.py", line 16, in <module>
    client.run(TOKEN)   File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 640, in run
    return future.result()   File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 621, in runner
    await self.start(*args, **kwargs)   File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 584, in start
    await self.login(*args, bot=bot)   File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/client.py", line 442, in login
    await self.http.static_login(token.strip(), bot=bot) AttributeError: 'NoneType' object has no attribute 'strip' 

【问题讨论】:

我知道您无法共享令牌,但您确定您在 .env 文件中正确定义了令牌吗? 我很确定我做到了。基本上看起来像 DISCORD_TOKEN = XXXXXXXXXXX... 让您了解我做了什么。我只是感到困惑,因为即使我已经安装了所有更新的模块,访问.env 文件似乎也可能存在问题。我知道的不多,但我想不出还有什么可能出错的地方。 试试不带空格的。在本教程中,DISCORD_TOKEN 与其值之间没有空格。 【参考方案1】:

我遵循相同的教程并遇到了相同的错误。对我来说,问题是我错误地创建了“.env”文件。在教程中它说“在与 bot.py 相同的目录中创建一个名为 .env 的文件:” - 这是我的问题。如果您创建一个新的文本文档,粘贴代码,然后将其保存为名称“.env”,您将实际创建一个名为“.env.txt”的文本文件。

要解决这个问题,请转到保存 python 脚本的目录(对我来说,这是 C:\Thonny\DiscordBots),然后右键单击该文件夹并选择“新建 > 文本文档”。不要更改文件名,只需将其保留为“新建文本文档”即可。打开这个文件(应该在记事本中打开),然后粘贴教程中的代码(另外,记住用你的机器人的实际令牌替换名为 your-bot-token 的占位符变量)。现在,转到“文件>另存为”并在文件名字段中,输入“.env”,就像教程所说的那样; 在您点击保存之前,还请单击 另存为类型 下拉菜单(应该在 文件名 的正下方),而不是将其保留为默认类型(*.txt),将其更改为“所有文件”。

如果您已正确执行此操作,您应该会在文件资源管理器中看到您的“.env”文件,并且“类型”列现在将显示“ENV 文件”而不是“文本文档”。尝试再次运行代码。

这对我有帮助。我的理解是“load_dotenv()”正在寻找 ENV type 的文件,而不仅仅是名为“.env”(任何类型)的 any 文档。只要将此文件与您正在运行的脚本放在同一目录中,它就应该可以工作。

【讨论】:

谢谢。我正在遵循相同的教程,这解决了错误。 10/10【参考方案2】:

这个错误是由于在.env文件中获取TOKEN值失败引起的,可以通过-

from dotenv import load_dotenv
load_dotenv('---.env')

对我有用!!!

【讨论】:

谢谢 :) 虽然原版已经有这两行,但我没有,这有帮助!【参考方案3】:

错误是由于TOKEN 被设置为None,这是os.getenv('DISCORD_TOKEN') 在变量不存在或存在并设置为None 时返回的内容。

确保您的 .env 文件位于同一目录中,例如:

.
├── .env
└── bot.py

token 是环境变量,不是 python 变量。环境变量的分配遵循您使用的 shell 的语法。这意味着= 符号周围没有空格。

注意使用dotenv 将变量导出到shell 时的操作顺序(参见自述文件here):

Python-dotenv 可以使用 POSIX 变量插入变量 展开。

变量的值是定义的第一个值 以下列表:

该变量在环境中的值。 .env 文件中该变量的值。 默认值(如果提供)。 空字符串。

确保 变量被 包围,例如 $HOME 作为裸变量,例如 因为 $HOME 没有展开。

给出的例子是:

CONFIG_PATH=$HOME/.config/foo
DOMAIN=example.org
EMAIL=admin@$DOMAIN
DEBUG=$DEBUG:-false

因此,您可能需要在继续之前清除相关的 shell 变量,因为dotenv 会尝试使用已定义的变量,该变量可能在您的初始设置中设置为空字符串(例如unset DISCORD_TOKEN,或者使用 source ~/.bashrc 或类似的东西重新启动你的 shell)。

出于调试目的,我建议使用print(os.getenv('DISCORD_TOKEN')) 来查看该变量的确切设置。您也可以尝试在环境设置期间查看load_dotenv(verbose=True) 的输出。

【讨论】:

你对这个名字完全正确 - 修正了这个问题。我确实对.env 文件进行了调整,使其没有空格,但它仍然出现了同样的错误。我尝试了几种不同的写法,都没有成功 把它变成一个字符串怎么样? (即DISCORD_TOKEN="my-token-here" 刚才试过了,不幸的是同样的结果(谢谢你的建议顺便说一句,我真的很感谢你的帮助!) 你能看到load_dotenv(verbose=True)的输出是什么吗? 刚刚试了一下,结果一样——并没有改变错误类型的输出【参考方案4】:

在您的 .env 文件中,它是像“BOT_TOKEN=WHAT_EVER_TOKEN”还是其他什么? 如果是这样,那就错了 正确的方式是“BOT_TOKEN=WHAT_EVER_TOKEN”,只是没有“”

【讨论】:

我知道这个问题,因为我以前遇到过这个问题,而且完全一样......如果这不起作用,那么它可能与IDE或其他东西有关。 不应该有任何东西,只有令牌本身和“变量”。【参考方案5】:

浏览了几个论坛,然后发现了这个 - 救命稻草,谢谢!

现在排序为;

load_dotenv('Token.env')
TOKEN = os.getenv('DISCORD_TOKEN')

Token.env;

DISCORD_TOKEN=这里是令牌

【讨论】:

【参考方案6】:

我遇到了同样的问题,load_dotenv() 找不到与我的 .py 文件位于同一文件夹中的 .env 文件,这导致了错误 Attribute Error:'NoneType' object has no attribute '剥离'

我尝试了一系列不同的修复,从 load_dotenv(find_dotenv())os.envrion['TOKEN'] 而不是 os.getenv("TOKEN") 以及其他人在这个堆栈溢出线程中给我们的所有其他修复。您可能已经尝试过那些没有像我一样运气的方法。

为了解决这个问题,我使用了:

load_dotenv(dotenv_path = os.path.abspath(os.getcwd()) + "\DiscordBot\discordbot.env")

这指定了 load_dotenv() 将加载的确切文件(我认为)。记下os.path.abspath(os.getcwd())。这将返回您的项目文件所在的当前工作目录 (getcwd())。在我的例子中,它会返回这个字符串:F:\dev\Python\YaykobDiscordBot.

我的实际 .py 文件位于更深的另一个文件夹中:"F:\dev\Python\YaykobDiscordBot\DiscordBot\YaykobBot.py",并且在它旁边的同一个文件中是 "F:\dev\Python\YaykobDiscordBot\DiscordBot\discordbot.env" 这是我存储令牌的地方。

你可能注意到了,你只需要给load_dotenv() .env 文件所在位置的文件路径。就我而言,我可以写: load_dotenv(dotenv_path = "F:\dev\Python\YaykobDiscordBot\DiscordBot\discordbot.env") 它会完美运行。我使用os.path.abspath,因为只要我想从 Github 克隆我的存储库,它就可以工作。

【讨论】:

【参考方案7】:

您必须从 .env 文件中删除空格。所以如果你的文件看起来像这样

DISCORD_TOKEN = 1234ABC

它不会接受它。它需要看起来像这样

DISCORD_TOKEN=1234ABC

【讨论】:

【参考方案8】:

我遇到了同样的问题,我知道如何解决它。所以基本上出于某种原因 vscode 不会接受 os.getenv(TOKEN)。所以我所做的就是将令牌直接放入 client.run("Your TOKEN here") 函数中。

【讨论】:

虽然这是一种解决方案,但强烈建议避免在生产代码中直接使用令牌、密码或其他敏感数据。【参考方案9】:

看来读取的令牌是'NoneType' object。

因此,如果您使用client.run(str(TOKEN)) 而不是client.run(TOKEN),该方法应该能够正确处理令牌并且您的机器人应该可以工作。

【讨论】:

以上是关于Discord Bot - “属性错误:'NoneType' 对象没有属性'strip。'的主要内容,如果未能解决你的问题,请参考以下文章

Discord Bot 回复自己,无法识别 message.author.bot

如何使用 discord.js 从 discord bot 向特定用户发送消息

Discord - BOT 发送私信

@bot.event 在一个 cog discord.py

discord.py bot 不会响应命令

discord.py 'Bot' 对象没有属性 'send_message'