【问题标题】:Check if Discord bot is online检查 Discord 机器人是否在线
【发布时间】:2021-06-26 00:16:51
【问题描述】:

我正在尝试让我的机器人的一个实例一次只能连接到 Discord,而另一个实例只有在另一个未连接时才连接。我怎么能做到这一点?我正在使用Discord.py。另外,如果可能的话,我希望它可以跨多台机器工作。

【问题讨论】:

  • 好问题
  • 不是真的相关@sahasrara62,它甚至不是同一种编程语言......
  • 您的意思是,在更一般的python 意义上,一次只允许运行一个python 脚本实例?还是您有 2 个完全独立的机器人,它们不应该彼此同时运行?我相信我的答案在这两种情况下都会大同小异,但值得一试。

标签: python discord discord.py


【解决方案1】:

如果你问我认为你在问什么,也就是说,机器人应该只被允许在任何时候在机器上运行它自己的一个版本,那么这应该适用于你只想要同时运行一个脚本。

我们可以做到这一点的一种方法是让脚本创建一个“锁定”文件,如果该文件已经存在则退出。只要记住在我们完成后删除它,即使机器人崩溃了。 (这里可能有更好的方法来处理错误,您的机器人代码本身应该尽力处理机器人可能生成的错误。在大多数情况下,即使出现错误,discord.py 也会继续运行。这只会得到严重的机器人崩溃问题,并确保您可以看到发生了什么,同时仍然优雅地关闭并确保删除锁定文件。)

import discord
from discord.ext import commands
import os  # for file interactions
import traceback
# etc.

bot = commands.Bot(description="Hard Lander's lovely bot", command_prefix="!")
@bot.event
async def on_ready():
    print("I'm ready to go!")
    print(f"Invite link: https://discordapp.com/oauth2/authorize?client_id={bot.user.id}&scope=bot&permissions=8")

def main():
    bot.run("TOKEN")

if __name__ == '__main__':
    running_file = "running.txt"
    if os.path.isfile(running_file):  # check if the "lock" file exists
        print("Bot already running!")
        exit()  # close this instance having taken no action. 
    else:
        with open(running_file, 'w') as f:
            f.write("running")
    try:  # catch anything that crashes the bot
        main()
    except:  # print out the error properly 
        print(traceback.format_exc())
    finally:  # delete the lock file regardless of it it crashed or closed naturally. 
        os.unlink(running_File)
        

【讨论】:

  • 谢谢!如果我能以某种方式在多台机器上使用它会很好(也许托管一个文件?),但这会很好:)!
  • 也许您可以在其中一台/一台机器上设置一些微小的 api 或其他东西,然后执行类似的工作来记住一台机器是否正在运行。但这取决于它们之间的连接是否稳定;)取决于您愿意去的hacky级别哈哈。祝你好运:P
【解决方案2】:

在第一个机器人中的bot.run() 之后运行第二个机器人的简单方法。 为什么?因为除非机器人停止,否则它会阻止任何其他代码。

所以我建议这样做:

bot.run("Your first bot token here")

import secondbot # you may use another method to run the bot script

另一种方法是为第二个机器人制作第三个脚本,该脚本将定期运行以检查第一个机器人状态(在本例中为离线状态),如果第一个机器人状态为离线,它将转在第二个机器人上。对于您的情况,我不推荐此方法,因为您可能希望将您的第一个机器人状态更改为离线,这将使第三个脚本认为机器人离线。

编辑:写完这个答案后,我发现了一个名为“is_closed”的 Bot 方法,无论机器人是否连接到 websocket,它都会返回 bool,链接是 here

【讨论】:

  • 我尝试使用 is_closed(),但由于某种原因它似乎不起作用?我需要先运行机器人还是什么?
  • @ComboDev is_closed() 是一个方法,所以你需要调用它,我的建议是定期调用它来检查机器人是否连接到 webscoket。
猜你喜欢
  • 2019-04-24
  • 2020-12-02
  • 2021-01-24
  • 2021-11-08
  • 2018-06-03
  • 2020-07-13
  • 2018-09-14
  • 2021-10-06
  • 2021-04-01
相关资源
最近更新 更多