gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:22:04 26 4
gpt4 key购买 nike

(不是母语,很抱歉可能英语不好。我也是编程新手)。
您好,我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来制作机器人。经过几天的努力...它起作用了,只有 1 个问题,我被那个问题困住了。

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

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

  1. 它连接。
  2. 它检查 channel ID(以及它自己的客户端 ID)
  3. 加入 channel
  4. 脚本结束,因此断开连接。

我的问题是:如何让它不断开连接?如果有人在 channel 中输入“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)

最佳答案

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

Blocks untill all unfetched responses have been received or forever, if recv_forever is true.

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

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

Calls recv() in a thread. This is useful, if you used servernotifyregister and you expect to receive events.

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

关于python - 如何保持 python 3 脚本(Bot)运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com