- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来制作机器人。我听取了 this thread 的建议,但是我仍然需要帮助。
这是 The TeamSpeak API我正在使用的。
在编辑之前,这是我脚本中实际发生的事情的摘要(1 个连接):
我怎样才能让它不断开连接?如何让脚本保持“等待”状态,以便在命令执行后继续读取?
我正在使用 Python 3.4.1。
我尝试学习线程,但要么我很笨,要么它不像我想象的那样工作。还有另一个“错误”,一旦等待事件,如果我没有用命令触发任何东西,它会在 60 秒后断开连接。
#Librerias
import ts3
import threading
import datetime
from random import choice, sample
# Data needed #
USER = "thisisafakename"
PASS = "something"
HOST = "111.111.111.111"
PORT = 10011
SID = 1
class BotPrincipal:
def __init__(self, manejador=False):
self.ts3conn = ts3.query.TS3Connection(HOST, PORT)
self.ts3conn.login(client_login_name=USER, client_login_password=PASS)
self.ts3conn.use(sid=SID)
channelToJoin = Bot.GettingChannelID("TestingBot")
try: #Login with a client that is ok
self.ts3conn.clientupdate(client_nickname="The Reader Bot")
self.MyData = self.GettingMyData()
self.MoveUserToChannel(ChannelToJoin, Bot.MyData["client_id"])
self.suscribirEvento("textchannel", ChannelToJoin)
self.ts3conn.on_event = self.manejadorDeEventos
self.ts3conn.recv_in_thread()
except ts3.query.TS3QueryError: #Name already exists, 2nd client connect with this info
self.ts3conn.clientupdate(client_nickname="The Writer Bot")
self.MyData = self.GettingMyData()
self.MoveUserToChannel(ChannelToJoin, Bot.MyData["client_id"])
def __del__(self):
self.ts3conn.close()
def GettingMyData(self):
respuesta = self.ts3conn.whoami()
return respuesta.parsed[0]
def GettingChannelID(self, nombre):
respuesta = self.ts3conn.channelfind(pattern=ts3.escape.TS3Escape.unescape(nombre))
return respuesta.parsed[0]["cid"]
def MoveUserToChannel(self, idCanal, idUsuario, passCanal=None):
self.ts3conn.clientmove(cid=idCanal, clid=idUsuario, cpw=passCanal)
def suscribirEvento(self, tipoEvento, idCanal):
self.ts3conn.servernotifyregister(event=tipoEvento, id_=idCanal)
def SendTextToChannel(self, idCanal, mensajito="Error"):
self.ts3conn.sendtextmessage(targetmode=2, target=idCanal, msg=mensajito) #This works
print("test") #PROBLEM HERE This doesn't work. Why? the line above did work
def manejadorDeEventos(sender, event):
message = event.parsed[0]['msg']
if "test" in message: #This works
Bot.SendTextToChannel(ChannelToJoin, "This is a test") #This works
if __name__ == "__main__":
Bot = BotPrincipal()
threadprincipal = threading.Thread(target=Bot.__init__)
threadprincipal.start()
在使用 2 个机器人之前,我测试了在 SendTextToChannel 连接时启动它,它运行良好,允许我在将文本发送到 channel 后做任何我想做的事情。导致整个 python 代码停止的错误只有在由 manejadorDeEventos 触发时才会发生
编辑 1 - 线程试验。
我用线程搞砸了很多时间,得到了 2 个客户端同时连接的结果。不知何故,我认为其中一个正在阅读事件,另一个正在回答。该脚本不再自行关闭,这是一个胜利,但拥有克隆连接看起来不太好。
编辑 2 - 更新代码和问题的实际状态。
我设法使双连接或多或少“正常”工作,但如果房间内 60 秒没有任何反应,它就会断开连接。尝试使用 Threading.timer 但我无法使其工作。已为其更新了整个问题代码。
我想要一个答案,它可以帮助我从 channel 中读取和回答它,而不需要为它连接第二个机器人(就像它实际上正在做的......)如果答案我会加分还帮助我理解了一种每 50 秒向服务器查询一次的简单方法,这样它就不会断开连接。
最佳答案
从看the source , recv_in_thread
不会创建一个循环接收消息直到退出时间的线程,它会创建一个接收单个消息然后退出的线程:
def recv_in_thread(self):
"""
Calls :meth:`recv` in a thread. This is useful,
if you used ``servernotifyregister`` and you expect to receive events.
"""
thread = threading.Thread(target=self.recv, args=(True,))
thread.start()
return None
这意味着你必须重复调用recv_in_thread
,而不是只调用一次。
通过阅读文档,我不确定在哪里这样做,但大概是在接收到的事件触发的任何回调结束时;我认为这是您的 manejadorDeEventos
方法? (或者它可能与 servernotifyregister
方法有关?我不确定 servernotifyregister
是做什么用的,on_event
是做什么用的……)
manejadorDeEventos
提出了两个方面:
manejadorDeEventos
错误。每个方法都必须将 self
作为其第一个参数。当您传递绑定(bind)方法时,例如 self.manejadorDeEventos
,绑定(bind)的 self
对象将作为第一个参数传递,在调用者传递的任何参数之前。 (对于 classmethod
和 staticmethod
有异常(exception),但这些不适用于此处。)此外,在该方法中,您几乎肯定会访问 self
,不是一个全局变量 Bot
,恰好与 self
是同一个对象。manejadorDeEventos
实际上是 recv_in_thread
的回调,那么这里就会出现竞争条件:如果第一条消息在主线程完成 之前到达on_event
分配,recv_on_thread
将无法调用您的事件处理程序。 (这正是那种经常出现一百万次的错误,当您在部署或发布代码几个月后发现它时,调试起来会非常痛苦。)因此,将这两行颠倒过来。最后一件事:简要浏览一下这个库的代码有点令人担忧。它看起来不像是真正知道自己在做什么的人写的。我上面复制的方法只有3行代码,但它包括一个无用的return None
和一个永远无法join
的泄漏的Thread
,更不用说让您在收到每个事件后调用此方法(并产生一个新线程)的整个设计很奇怪,而且更是如此,因为它没有真正解释。如果这是您必须使用的服务的标准客户端库,那么您真的没有太多选择,但如果不是,我会考虑寻找其他库。
关于Python 3 (Bot) 脚本停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490533/
因此,我想创建一个 bot/incoming webhook 来读取群组中的所有消息并将其复制到电子表格中。我在这里要问的是,机器人或传入的 webhook 可以读取整个群组消息吗?在 google
我正在使用 Microsoft Bot Framework 开发一个机器人,在该机器人中,机器人将通过向用户发送一些图像来响应。我用 slack 和 skype 配置了它。 在 slack 中图像正在
我试图让我的机器人与用户开始对话,但我不知道应该从代码中的哪个位置发送消息。启动 convo 的文档在这里,但不是很有帮助:http://docs.botframework.com/connector
我正在创建 Telegram Bot 。我需要跟踪添加用户和添加用户的时间。我如何使用 Telegram API 来做到这一点? 最佳答案 在使用 Telegram API 的群组中,您可以调用 ne
我已经创建了几个 Telegram 机器人。它们适用于我的帐户,也适用于我测试过的其他几个帐户。 但我收到一些用户的报告,称机器人从不响应。 是否有一些用户设置会阻止帐户从机器人获取消息?或者任何其他
如果在一段时间内没有用户输入,我有一个关于取消提示或对话框的问题。 我需要一种方法来以某种方式在提示中超时。 Example: Bot prompts the user: "How old are y
我有一个用例,当我的机器人需要在一天中的特定时间向用户发送消息时。假设每天早上 6 点。 我正在使用预定的 azure Webjob 发送这些消息。消息将在 Slack 和 Skype 客户端中传递。
我是 Microsoft bot 的新手。我的公司有自己的通信应用程序,我想将我的机器人与通信应用程序连接起来,我的客户可以在我公司的通信应用程序上使用我的机器人。我读到它需要使用 Direct Li
我在 sdk V4 Bot 中实现了一个中间件来拦截 bot 和用户之间的每条消息并记录该自定义 mongo Db。我正在尝试为使用 SDK v4 构建的 Bot 实现类似的概念。看起来我可以使用以下
我对编程和学习还很陌生。我认为制作一个不和谐的机器人是一种很好的学习方式,我很享受,只是有点卡住了。所以我的机器人是私有(private)的,我们的不和谐服务器中有一个正在运行的笑话,每当用户发送“k
如何让机器人假装它正在输入消息? 当机器人假装输入时,聊天中会出现以下文本: 我使用 python aiogram框架,但对 native Telegram API 的建议也会有所帮助。 最佳答案 我
我有一个像这样的 Telegram Bot : 通过 webhook 获取更新 语言:C#(我也欢迎其他语言的回答) 我们有以下用户场景: 向机器人发送/MyPhoto a_parameter命令 向
我加入了一个 Telegram Bot ,但我不知道它的所有者。是否可以找到 Telegram Bot 的所有者? 最佳答案 根据 Telegram MTProto protocol 不可能看到 Te
我已经创建了一个电报机器人并按照文档中的描述设置了一个 webhook。出于测试目的,我已经设置了它,因此一旦您向机器人发送一条消息,它就会用相同的消息回复。 现在我遇到的问题是来自电报的更新非常缓慢
是否可以将位置从 Telegram 发送到 Bot,这是在 Bot Framework 中制作的? 我将我的位置从我的 Telegram 帐户发送到我的 Bot,但服务器没有收到它们(我没有收到回复)
我在 Telegram 上创建了一个组并创建了一个机器人并添加进来。 我正在尝试向我创建的组发送消息,错误如下所示 {"ok":false,"error_code":403,"description"
使用 Microsoft Bot Framework V3 我开始使用登录卡。 我从示例代码页做了一个简单的剪切并粘贴到我的代码中,假设它有效(编译): https://docs.botframewo
当用户刚刚打开聊天时,机器人如何向用户发送消息。 例子: 用户已经添加了 Telegram bot到他的联系人列表并开始对话 稍后,用户打开与该机器人的聊天窗口 机器人“看到”该用户已打开聊天窗口,但
将 XCode 更新到版本 11.4 (11E146) 后,我不再在机器人设置中看到存储库分支。但是我在 Source Controll Navigator 中看到了这些存储库分支。有谁知道我该如何解
我想将机器人的位置发送给用户,我在谷歌上搜索了很多,但我发现只有这种情况“将用户的位置发送给机器人”我想要相反的情况,意思是:“发送机器人的位置给用户”。这是我的想法:机器人的所有者是一个司机,他想与
我是一名优秀的程序员,十分优秀!