bot.get_channel()偶尔在discord.py中返回none



我正在尝试编写一个不和谐的bot. py。以下是我的完整代码的节选。

intents = discord.Intents.default()
intents.message_content = True
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
bot = commands.Bot(intents=intents, command_prefix="!", sort_commands=False)
client = discord.Client(intents=intents)

@bot.event
async def on_ready():
print(f'{bot.user.name} has connected to Discord!')
channel = bot.get_channel(12345678912345678912)
await channel.send("This is a test.")
bot.run(TOKEN)

有时,上面的代码将按预期工作,打印连接消息并将所需的消息发送到目标通道。

然而,情况并非总是如此!我得到一个问题,其中bot.get_channel()命令返回none而不是正确的数据。我假设这意味着无法找到通道,除非通道确实存在。


AttributeError: 'NoneType' object has no attribute 'send'

发送到控制台的错误是;我对discord.py非常非常陌生,所以我将感谢任何帮助,我可以更好地理解这里发生的事情。非常感谢您的帮助。

get_channel方法是一个缓存查找方法,因此它并不总是可靠的,或者bot没有访问通道,并且由于如果没有找到缓存并返回None,它不会引发异常,因此您无法确定原因。如果get_channel没有返回值,你可以使用fetch_channel在CC_6之后发出API请求;如果没有找到通道或没有权限获取,此方法将引发异常。

channel = (bot.get_channel(1234567890) or await bot.fetch_channel(1234567890))
await channel.send("This is a test.")

似乎你有discord.ext.commands.Botdiscord.Client实例,请选择一个并删除另一个。

不建议使用接受的答案。

它不工作的原因是因为缓存还没有在on_ready中填充,但是你不应该发出API请求(fetch_X&on_ready中的send)! 在那里做API调用有很大的机会不和谐只是断开你的机器人。

同时,on_ready被触发多次,因此,即使您只启动了一次,您最终也会不断发送此消息。

几乎没有理由在那里做任何事情。如果你想让某些东西在启动时运行,你可以创建一个Task&

最新更新