【问题标题】:Discord.py run 2 instances of a bot in a scriptDiscord.py 在脚本中运行 2 个机器人实例
【发布时间】:2020-12-23 21:17:42
【问题描述】:

我有一个不和谐的机器人,它需要在一个 while(True) 循环中运行,并且仍然接收命令。我认为我可以使用我的程序执行此操作的唯一方法是运行 2 个单独的机器人实例。就像说:

import discord
import time
import asyncio

client = commands.Bot(command_prefix = '!');       
client2= commands.Bot(command_prefix = '.');
channel = client.get_channel(734106469343249954)

@client.event
async def on_ready():
    time.Sleep(5)
    while(True):
        await channel.send("Sent message")

@client2.command()
async def a(ctx):
    await ctx.send("Send")

然后在底部:

loop = asyncio.get_event_loop()
loop.create_task(client.start('Token'))
loop.create_task(client2.start('Token'))
loop.run_forever()

我试过了,但没有用。我究竟做错了什么?有没有办法从一个脚本运行 2 个机器人,或者同一个机器人两次?

我需要其中一个实例处于 while(True) 循环中。

当我尝试这个时,我开始循环并且能够调用.a 命令直到循环开始,但之后它没有给我任何响应。

如何在一个脚本中运行 2 个机器人实例,并让其中一个保持循环,同时让另一个听命令?

【问题讨论】:

    标签: python discord discord.py python-asyncio discord.py-rewrite


    【解决方案1】:

    首先,您不需要 2 个机器人来执行此操作。其次,您正在做的实际上是 API 滥用。每个通道和全局发送消息都有速率限制,滥用这是他们重置令牌/删除应用程序的原因。所以我不太确定你的问题,但如果我是的话,我也不会帮助你滥用 API。

    【讨论】:

      【解决方案2】:

      您正在使用time.sleep,这将冻结您的机器人并且在此期间不接受任何其他输入。请改用await asyncio.sleep(5)。您可以删除 client2 的东西,并为您的 on_ready 事件和您的命令保留 client。对于您正在尝试做的事情,这可能对您有所帮助:

      import discord
      import asyncio
      
      client = commands.Bot(command_prefix = '!')
      channel = client.get_channel(734106469343249954)
      
      @client.event
      async def on_ready():
          print('Hello')
      
      @client.listen()
      async def background():
          await asyncio.sleep(5)
          while not client.is_closed():
              await channel.send("Sent message")
      
      
      @client.command()
      async def a(ctx):
          await ctx.send("Send")
      
      client.loop.create_task(background())
      client.run('--Token--')
      

      我认为您不需要运行 2 个机器人实例来执行您想要的操作。我希望这会有所帮助:p

      【讨论】:

        【解决方案3】:

        嗯,是的,这是你在向服务器发送垃圾邮件吗? 没有勺子喂你,但问题是你正在使用,而真的,永远不要那样做。做 x = True,而 x: 代替。和 time.Sleep,这是一个阻止命令,可能会使您的机器人与 websocket 断开连接。而不是 time.Sleep 你应该导入 asyncio 并等待 asyncio.sleep(5)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多