如果用户关闭了隐私设置“允许来自服务器成员的直接消息”并且不和谐机器人调用
await user.dm_channel.send("Hello there")
Run Code Online (Sandbox Code Playgroud)
你会得到这个错误:
discord.errors.Forbidden: 403 Forbidden (error code: 50007): Cannot send messages to this user
Run Code Online (Sandbox Code Playgroud)
我想检查是否可以在不发送消息的情况下向用户发送消息。尝试发送消息并捕获此错误对我来说不起作用,因为我不希望在允许机器人发送消息的情况下发送消息。
我已经尝试过这个:
print(user.dm_channel.permissions_for(bot).send_messages)
Run Code Online (Sandbox Code Playgroud)
但它总是返回 True,即使该消息是不允许的。
我也尝试过这个:
channel = await user.create_dm()
if channel is None:
...
Run Code Online (Sandbox Code Playgroud)
但不幸的是,似乎“有权向用户发送消息”和“有权创建DM频道”被认为是不同的。
编辑
由于似乎有点混乱,为了澄清确切的用法,请看这个例子。有一台服务器和 3 个有问题的用户:我、我的机器人和史蒂夫。Steve 已勾选“允许来自服务器成员的直接消息”。
该机器人有一个名为 的命令!newgame,它接受用户列表并在他们之间启动游戏,其中涉及对游戏中的一些成员进行私聊。由于史蒂夫的隐私设置,他无法玩游戏(因为机器人需要向他发送消息)。如果我做
!newgame @DJMcMayhem @Steve
Run Code Online (Sandbox Code Playgroud)
我想提供这样的回应:
await user.dm_channel.send("Hello there")
Run Code Online (Sandbox Code Playgroud)
但据我目前所知,确定史蒂夫是否可以玩游戏的唯一方法是首先尝试向每个用户发送消息,我想避免这种情况。
我一年前制作并部署到 Heroku 的不和谐机器人一直工作到现在。然而,在更改了一些 cogs 并将 python 更新到版本 3.9.10 后,我在 Heroku 日志中收到以下警告:
app[worker.1]: /app/m_bot.py:120: RuntimeWarning: coroutine 'BotBase.load_extension' was never awaited
app[worker.1]: client.load_extension(f"cogs.{filename[:-3]}")
app[worker.1]: RuntimeWarning: Enable tracemalloc to get the object allocation traceback
app[worker.1]: Bot is ready.
app[api]: Build succeeded>
Run Code Online (Sandbox Code Playgroud)
120行块是:
app[worker.1]: /app/m_bot.py:120: RuntimeWarning: coroutine 'BotBase.load_extension' was never awaited
app[worker.1]: client.load_extension(f"cogs.{filename[:-3]}")
app[worker.1]: RuntimeWarning: Enable tracemalloc to get the object allocation traceback
app[worker.1]: Bot is ready.
app[api]: Build succeeded>
Run Code Online (Sandbox Code Playgroud)
机器人上线但不响应任何命令。除了上面列出的内容之外,我没有进行任何其他更改。
当我在我的电脑上运行我的机器人时它可以工作,所以我怀疑这可能是版本问题。
我该如何解决这个问题?
我的代码(见下文)运行良好,但随后弹出此错误并且不会消失:
"http.py", line 293, in static_login
data = await self.request(Route('GET', '/users/@me')
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/http.py", line 209, in request
raise HTTPException(r, data)
discord.errors.HTTPException: 429 Too Many Requests (error code: 0): "
Run Code Online (Sandbox Code Playgroud)
我搜索了该错误,发现人们是通过在多台服务器上运行强大的程序,或者人们在一台服务器上运行相同的代码大量次来获得该错误的。但是,我只在一台服务器上运行它,并且代码非常简单。
这是供参考的代码(它在 repl.it 中运行)(os.getenv 用于隐藏机器人的令牌):
import discord
import os
client = discord.Client()
@client.event
async def on_ready():
print ('We have logged in as {0.user}'.format(client))
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
client.run(os.getenv('TOKEN'))
Run Code Online (Sandbox Code Playgroud) 当我使用以下代码启动 Discord.py 机器人时:
\n\n> from discord.ext import commands\n> \n> bot = commands.Bot(command_prefix = ",", description = "Bot de eagle57")\n> \n> bot.run("Mytoken")\nRun Code Online (Sandbox Code Playgroud)\n我收到此错误:
\nC:\\Users\\El\xc3\xa8ve\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\aiohttp\\connector.py:964: RuntimeWarning: coroutine 'TCPConnector._resolve_host' was never awaited\n hosts = await asyncio.shield(self._resolve_host(\nRuntimeWarning: Enable tracemalloc to get the object allocation traceback\nTraceback (most recent call last):\n File "d:\\Python\\Bot_discord\\main.py", line 5, in <module>\n bot.run("Mytoken")\n File "C:\\Users\\El\xc3\xa8ve\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\discord\\client.py", line 723, in run\n return future.result()\n File "C:\\Users\\El\xc3\xa8ve\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\discord\\client.py", line 702, in runner\n await self.start(*args, **kwargs)\n File "C:\\Users\\El\xc3\xa8ve\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\discord\\client.py", line 665, in start\n await self.login(*args, …Run Code Online (Sandbox Code Playgroud)