如何保持Python3脚本(Bot)运行

如何保持Python3脚本(Bot)运行,python,api,bots,Python,Api,Bots,(不是母语英语,很抱歉可能是蹩脚的英语。我也是编程新手)。 您好,我正在尝试使用QueryServer连接到TeamSpeak服务器以创建一个机器人。经过几天的挣扎。。。它是有效的,只有一个问题,而我只能解决这个问题 如果您需要检查,这是我正在使用的TeamSpeak API: 这是我的脚本中实际发生的事情的总结: 它连接 它检查通道ID(以及它自己的客户端ID) 它与英吉利海峡相连 脚本结束后将断开连接 我的问题是:如何使它不断开连接?如何使脚本保持“等待”状态,以便在有人在频道中键入“hi

(不是母语英语,很抱歉可能是蹩脚的英语。我也是编程新手)。
您好,我正在尝试使用QueryServer连接到TeamSpeak服务器以创建一个机器人。经过几天的挣扎。。。它是有效的,只有一个问题,而我只能解决这个问题

如果您需要检查,这是我正在使用的TeamSpeak API:

这是我的脚本中实际发生的事情的总结:

  • 它连接
  • 它检查通道ID(以及它自己的客户端ID)
  • 它与英吉利海峡相连
  • 脚本结束后将断开连接
  • 我的问题是:如何使它不断开连接?如何使脚本保持“等待”状态,以便在有人在频道中键入“hi bot”时可以读取?阅读文本和回答文本所需的所有代码似乎都很容易编程,但是我面临一个问题,即我无法保持bot“运行”,因为一旦运行完脚本,它就会关闭文件

    更多信息:
    我正在使用Python 3.4.1
    我试着学习线程,但要么我很笨,要么我认为它不能正常工作。
    在API中,有一个名为
    on_event
    的函数,我希望它一直运行。bot代码应该只运行一次,然后一直“等待”直到事件发生。我该怎么做?没有线索

    代码:

    import ts3
    import telnetlib
    import time
    
    class BotPrincipal:
        def Conectar(ts3conn):
            MiID = [i["client_id"] for i in ts3conn.whoami()]
            ChannelToJoin = "[Pruebas] Bots"
            ts3conn.on_event = BotPrincipal.EventHappened()
            try: 
                BuscandoIDCanal = ts3conn.channelfind(pattern=ChannelToJoin) 
                IDCanal = [i["cid"] for i in BuscandoIDCanal]
                if not IDCanal: 
                    print("No channel found with that name")
                    return None
                else:
                    MiID = str(MiID).replace("'", "")
                    MiID = str(MiID).replace("]", "")
                    MiID = str(MiID).replace("[", "")
                    IDCanal = str(IDCanal).replace("'", "")
                    IDCanal = str(IDCanal).replace("]", "")
                    IDCanal = str(IDCanal).replace("[", "")                
                    print("ID de canal " + ChannelToJoin + ": " + IDCanal)
                    print("ID de cliente " + Nickname + ": " + MiID)
                try:
                    print("Moving you into: " + ChannelToJoin)
                    ts3conn.clientmove(cid=IDCanal, clid=MiID) #entra al canal
                    try:
                        print("Asking for notifications from: " + ChannelToJoin)
                        ts3conn.servernotifyregister(event="channel", id_=IDCanal)
                        ts3conn.servernotifyregister(event="textchannel", id_=IDCanal)
                    except ts3.query.TS3QueryError:
                        print("You have no permission to use the telnet command: servernotifyregister")
                    print("------- Bot Listo -------")
                except ts3.query.TS3QueryError:
                    print("You have no permission to use the telnet command: clientmove")
            except ts3.query.TS3QueryError:
                print("Error finding ID for " + ChannelToJoin + ". telnet: channelfind")
    
        def EventHappened():
            print("Doesn't work")
    
    # Data needed #
    USER = "thisisafakename"
    PASS = "something"
    HOST = "111.111.111.111"
    PORT = 10011
    SID = 1
    
    if __name__ == "__main__":    
        with ts3.query.TS3Connection(HOST, PORT) as ts3conn:
            ts3conn.login(client_login_name=USER, client_login_password=PASS)
            ts3conn.use(sid=SID)
            print("Connected to "+HOST)
            BotPrincipal.Conectar(ts3conn)
    

    快速浏览一下API,您似乎需要显式地告诉
    ts3conn
    对象等待事件。似乎有几种方法可以做到这一点,但最明显的是:

    如果
    recv\u forever
    为真,则阻塞直到收到所有未蚀刻的响应或永久

    假设每个命令进入时,它将调用您的
    on_事件处理程序,然后当您从该事件返回时,它将返回到永远等待下一个命令

    我不知道您是否需要这里的线程,但是的文档使它听起来像您可能:

    在线程中调用
    recv()
    。如果您使用了
    servernotifyregister
    ,并且希望接收事件,那么这很有用


    您可能希望同时获得servernotify事件和命令,我猜这个库的编写方式需要线程吗?如果是这样,只需在线程()中调用
    ts3conn.recv\u,而不是
    ts3conn.recv(True)
    。(如果您查看,所做的只是启动一个后台线程并在该线程上调用
    self.recv(True)

    作为旁注,这不是使用类的方式。您的
    Conectar
    应该使用
    self
    参数,您的主代码应该构造一个
    BotPrincipal
    实例,并在该实例上调用
    Conectar
    方法,等等。这是三个bug的组合,消除了它们,从而实现了这类工作,这可能不是你想要依赖的东西。只是在Abarnet便笺上加上一句,看看或者其他一些。因为我从来没有真正学习过任何编程语言,而且我正在尽我最大的努力使用谷歌,我可以看到我失败的地方。我现在正在检查那个网站,试图解决问题。谢谢你的帮助。让我看看我是否明白这一点。我应该在def eventOccessed()内部调用ts3conn.recv_in_thread():它将创建自己的线程,所以我不需要自己做?@Saelyth:不在
    eventOccessed
    内部,无论是在
    Conectar
    的末尾,还是在
    Conectar
    返回后的主代码中。是的,它会创建自己的线程,所以您不必这样做。除非您试图在处理程序中执行依赖于变异全局变量或其他共享变量的操作,否则您甚至不必担心线程的存在。我有一个与此相关的问题。现在,bot读取线程中的telnet控制台事件(这很完美),但如果我要求bot执行任何其他操作,它会停止读取,并且似乎会关闭线程(我认为)。我使用了类似于“如果你读X,那么就发送信息”。但在那之后,它将不再等待事件发生。从API来看,我似乎无法理解on_事件停止工作的原因。@Saelyth:如果你有一个新问题,你可能应该问一个新答案。特别是因为我对这个API一无所知,一个新的问题可能会吸引一些了解它的人来回答。但是,如果线程正在结束,则可能是您必须在每条消息之后再次调用
    recv\u in\u thread
    ?是否这样做了。我也试着使用我应该使用的类(我想,我真的很感谢你的帮助),链接这里: