如何保持python 3脚本(Bot)运行

时间:2014-10-17 18:58:14

标签: python api bots

(非英语原文,对不起可能是英语不好。我也是编程的新手。)
您好,我正在尝试使用QueryServer连接到TeamSpeak服务器来制作僵尸程序。经过几天的挣扎......它的工作原理只有一个问题,而我却坚持使用它。

如果您需要检查,这是我正在使用的TeamSpeak API:http://py-ts3.readthedocs.org/en/latest/api/query.html

这是我脚本中实际发生的事情的摘要:

  1. 它连接。
  2. 检查频道ID(以及它自己的客户端ID)
  3. 加入频道
  4. 脚本结束,因此断开连接。
  5. 我的问题是:如何才能让它无法断开连接?如何使脚本保持在等待"状态,所以如果有人打字,它可以读取" hi bot"在频道?阅读文本和回答所需的所有代码似乎都很容易编程,但是我遇到了一个问题,我无法保持机器人运行"因为它在结束运行脚本后立即关闭文件。

    更多信息:
    我正在使用 Python 3.4.1 我尝试过学习线程http://www.tutorialspoint.com/python/python_multithreading.htm,但要么是愚蠢的,要么就像我想的那样工作。 在API中有一个名为on_event的函数,我希望它一直在运行。机器人代码应该只运行一次,然后等待"等待"直到事件发生。我该怎么做?毫无头绪。

    代码:

    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)
    

1 个答案:

答案 0 :(得分:3)

从API的快速一瞥看起来,您需要明确告诉ts3conn对象等待事件。似乎有几种方法可以做到,但ts3conn.recv(True)似乎最明显:

  

如果recv_forever为真,则阻止所有未获取的响应,或者永久保存。

据推测,当每个命令进入时,它将调用你的on_event处理程序,然后当你从那里返回时它会回到永远等待下一个命令。

我不知道你是否需要线程,但是recv_in_thread的文档听起来像你一样:

  

在一个帖子中调用recv()。如果您使用servernotifyregister并且希望接收事件,这很有用。

你可能想要获得servernotify事件和命令,我想这个库的编写方式你需要线程吗?如果是,请拨打ts3conn.recv_in_thread()而不是ts3conn.recv(True)。 (如果查看the source,那么所有操作都是启动后台线程并在该线程上调用self.recv(True)。)