Discord 机器人不允许用户通过控制台输入而不会抛出错误 [重复]

Discord bot does not allow for user input via console without throwing error [duplicate]

提问人:Xenan 提问时间:11/16/2023 最后编辑:Blue RobinXenan 更新时间:11/17/2023 访问量:46

问:

我和我的朋友正在做一个项目,如果你运行一个命令,作为一个设置命令,运行代码的用户可以通过从控制台发送消息,通过机器人在 Discord 聊天中交谈。

import discord
from discord.ext import commands

intents = discord.Intents.all()
bot = commands.Bot(command_prefix="!", intents=intents)

@bot.event
async def on ready():
    print("Logged in as {}".format(bot.user))
@bot.command()
async def setup(ctx):
    await ctx.message.delete()
    while True:
        msg = input("Message to send: ")
        ctx.send(msg)

这样做的问题是它会抛出一个错误,

Loop thread traceback (most recent call last):
  File "C:\Users\bobot\OneDrive\Documents\projs\py\penissie.py", line 128, in <module>
    bot.run(token)
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 860, in run
    asyncio.run(runner())
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 640, in run_until_complete
    self.run_forever()
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\windows_events.py", line 321, in run_forever
    super().run_forever()
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 607, in run_forever
    self._run_once()
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1922, in _run_once
    handle._run()
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\asyncio\events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 441, in _run_event
    await coro(*args, **kwargs)
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\bot.py", line 1395, in on_message
    await self.process_commands(message)
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\bot.py", line 1392, in process_commands
    await self.invoke(ctx)  # type: ignore
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\bot.py", line 1350, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\core.py", line 1029, in invoke
    await injected(*ctx.args, **ctx.kwargs)  # type: ignore
  File "C:\Users\bobot\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\ext\commands\core.py", line 235, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:\Users\bobot\OneDrive\Documents\projs\py\cool.py", line 48, in setup
    msg = input("Message to send: ")

我相信这可能意味着当我在输入语句中时,机器人无法运行其循环

有什么办法解决这个问题吗?

Python discord.py

评论


答:

1赞 Blue Robin 11/17/2023 #1

为什么这不起作用?

该函数不是异步的。这意味着它会“暂停”程序的其余部分。由于 Discord 的工作方式,您的机器人必须每隔一段时间发送一次请求,以保持您的机器人在线。因此,由于输入不是异步的,因此它不起作用。input()

我们能做些什么来让它发挥作用?

还有其他库允许您异步从控制台获取输入。例如,在这篇文章中,他们使用库 aioconsole。该库具有实现我们想要的功能。aioconsole.ainput()

举个例子

你在这里使用一个循环。绝对不建议这样做。在异步编程中,这也会停止机器人。在下面的帖子中,他们使用异步运行循环。while Trueasyncio.ensure_future(function())

asyncio 文档中,它说:

Future 对象用于将基于回调的低级代码与高级 async/await 代码桥接起来。

尽管您可以为此函数使用可等待对象,但对于此示例,我们不会使用它。

请注意,以下代码可能有效,也可能无效,因为我目前不在PC上测试它。当我回到家时,我会修复任何错误

import asyncio
import aioconsole

def loop(ctx):
    while True:
        msg = aioconsole.ainput("Message to send: ")
        ctx.send(msg)
        if msg.upper() == "CANCEL":
            break  # break loop if cancel is typed in all caps

    

@bot.command()
async def setup(ctx):
    await ctx.message.delete()
    future = asyncio.ensure_future(loop(ctx))

下面的帖子也很好地解释了这一点。

评论

0赞 Xenan 11/17/2023
谢谢,但是输入是我的主要问题,出于某种原因,而 True 循环对我的机器人没有任何作用。
0赞 Blue Robin 11/17/2023
@Xenan我在帖子中介绍了这一点
0赞 Blue Robin 11/17/2023
@Xenan事实证明,我忘了在示例代码中介绍该部分。我相应地更新了它。