检查 Discord 机器人是不是在线

Posted

技术标签:

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

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

【问题讨论】:

好问题 这可能对detect-if-a-bot-account-goes-offline-online有帮助 不是真的相关@sahasrara62,它甚至不是同一种编程语言...... 您的意思是,在更一般的python 意义上,一次只允许运行一个python 脚本实例?还是您有 2 个完全独立的机器人,它们不应该彼此同时运行?我相信我的答案在这两种情况下都会大同小异,但值得一试。 【参考方案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。

以上是关于检查 Discord 机器人是不是在线的主要内容,如果未能解决你的问题,请参考以下文章

(discord.js) 检查机器人是不是有权限不起作用

Discord JDA getOnlineStatus() 未检查服务器上的在线成员

如何让我的 Python Discord 机器人检查消息是不是由机器人本身发送?

我的 discord.py 机器人有啥方法可以检查用户是不是具有使用命令的特定权限?

如何检查我的机器人是不是可以在 discord.js v12 中添加角色?

Discord.js 如何检查用户是不是不接受私信