检查 Discord 机器人是否在线

时间:2021-03-30 00:06:40

标签: python discord discord.py

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

2 个答案:

答案 0 :(得分:1)

执行此操作的简单方法是在第一个机器人中的 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

答案 1 :(得分: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)