class Auto: def __init__(self, name="Test"): self.name = name self.http = Http() self.db = Database() self.db.execute( ''' create table if not exists auto( url text, about text, time text, v1 text, v2 text, v3 text, v4 text, v5 text ) ''' ) return # 日志输出 def out(self, obj): print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.__module__ + self.name + "." + str(obj)) # tools.out(obj) return # 实时控制帮助 def help(self): self.out(dir(self)) return # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2) def doMethod(self, listArgs): size = len(listArgs) res = None if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) if(callable(method)): if(size == 2): res = method(listArgs[1]) elif(size == 3): res = method(listArgs[1], listArgs[2]) elif(size == 4): res = method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: res = method() else: self.out(method) return res # 手动命令监控 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd.split(" "))): self.doCmd(cmd) time.sleep(1) except Exception as e: self.out(repr(e)) return # 测试用 def test(self): self.login() # 输入监控线程 ThreadRun( "InputHello." + str(self.name), self.inputHello ).start() tool.wait() return # 非函数调用 属性变量查看 其他的指令控制 def doCmd(self, cmd): self.out("其他指令." + str(cmd)) return # 认证登录 def login(self): self.out("访问主页 获取 token session") # http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1548294412328 # "http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1545268253550" #http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1552005766720 ttt = str(tool.getNowTime()) kkk = 'a5f9ff6d068a46e68d363426ca69bd07' url = "http://content.icbc.com.cn/site1/" + kkk + "/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=" + ttt #BIGipServerwifi_ContextPlat_80_Pool 2097346570.20480.0000 N/A N/A N/A 59 #cmp_glb_param 98f7808c851a9f53da5f0c3f1639b678 N/A N/A N/A 46 #layerNettimeType true N/A N/A N/A 23 #layerPosterType true N/A N/A N/A 22 #layerSafeType true N/A N/A N/A 20 #Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 #Accept-Encoding: gzip, deflate #Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7 #Connection: keep-alive header = { "Cookie" : "BIGipServerwifi_ContextPlat_80_Pool=2097346570.20480.0000; layerSafeType=true; layerPosterType=true; layerNettimeType=true; cmp_glb_param=98f7808c851a9f53da5f0c3f1639b678" } self.http.addHeader(header) self.http.show() responce = self.http.doGet(url) re = responce.read() soup =BeautifulSoup.BeautifulSoup(re) nameList = soup.findAll('button',{'id':{'login_btn'}}) if(len(nameList) > 0): self.out(nameList) self.out("抓取成功: ") self.http.show(responce) self.out("模拟登录") # http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true url = "http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true" #{"msg":"GlbInfo检查不通过","retCode":1,"success":false,"data":{"needJump":"http%3A%2F%2Fwww.baidu.com%2F"}} json=self.http.doJson(url) self.out((json)) self.out(json["msg"]) self.out(json["data"]["needJump"]) else: self.out("error! 没能抓取到token") return False
class Auto: def __init__(self, name="Test"): self.name = name self.http = Http() self.db = Database() self.db.execute( ''' create table if not exists auto( url text, about text, time text, v1 text, v2 text, v3 text, v4 text, v5 text ) ''' ) return # 日志输出 def out(self, obj): print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.__module__ + self.name + "." + str(obj)) # tools.out(obj) return # 实时控制帮助 def help(self): self.out(dir(self)) return # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2) def doMethod(self, listArgs): size = len(listArgs) res = None if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) if(callable(method)): if(size == 2): res = method(listArgs[1]) elif(size == 3): res = method(listArgs[1], listArgs[2]) elif(size == 4): res = method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: res = method() else: self.out(method) return res # 手动命令监控 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd.split(" "))): self.doCmd(cmd) time.sleep(1) except Exception as e: self.out(repr(e)) return # 测试用 def test(self): self.login() # 输入监控线程 ThreadRun( "InputHello." + str(self.name), self.inputHello ).start() tool.wait() return # 非函数调用 属性变量查看 其他的指令控制 def doCmd(self, cmd): self.out("其他指令." + str(cmd)) return # 认证登录 def login(self): self.out("访问主页 获取 token session") # "http://content.icbc.com.cn/site1/a5f9ff6d068a46e68d363426ca69bd07/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=1545268253550" ttt = '1545268253550' #str(tool.getNowTime()) kkk = 'a5f9ff6d068a46e68d363426ca69bd07' url = "http://content.icbc.com.cn/site1/" + kkk + "/login_unfirst.html?pageOrder=login_unfirst.html;index.html&_mp_cmp_ttime=" + ttt responce = self.http.doGet(url) re = responce.read() soup =BeautifulSoup.BeautifulSoup(re) nameList = soup.findAll('button',{'id':{'login_btn'}}) if(len(nameList) > 0): self.out(nameList) self.out("抓取成功: ") self.out("cookie\t " + tool.toString(self.http.getCookie())) self.out("模拟登录") # http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true url = "http://content.icbc.com.cn/cmp/AuthSkipController.do?method=authSkip&ajaxRequest=true" json=self.http.doJson(url) self.out((json)) else: self.out("error! 没能抓取到token") return False
class AutoCochat: def __init__(self, name="Test", id="18408249138", pwd="1234qwer"): reload(sys) sys.setdefaultencoding('utf8') #针对socket发送中文异常 self.detaTime = 3600 * 1000 #推送延时 60min self.detaTimeMin = 1200 * 1000 #推送延时 20min self.id = id self.pwd = pwd self.name = name self.robot = Robot() self.http = Http() self.db = Database('sqlite_' + self.id + '.db') self.socket = Socket() self.onConnect = False self.ifOk = False # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点 self.db.execute( ''' create table if not exists cochat( id text, sendTime text, sendTimeT text, deta text, preTime text, preTimeT text, type text, msg text, flag text ) ''' ) self.sendList = [] #发送队列 (time, deta, type, data) return # 日志输出 def out(self, obj): print(time.strftime("%Y%m%d %H:%M:%S", time.localtime()) + "." + self.name + "." + str(obj)) return # 实时控制帮助 def help(self): self.out(dir(self)) return # doMethod([methodName arg1 arg2]) -> methodName(arg1,arg2) def doMethod(self, listArgs): size = len(listArgs) res = None if(size > 0): if(hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) if(callable(method)): if(size == 2): res = method(listArgs[1]) elif(size == 3): res = method(listArgs[1], listArgs[2]) elif(size == 4): res = method(listArgs[1], listArgs[2], listArgs[3]) elif(size == 5): res = method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: res = method() else: self.out(method) return res # 手动命令监控 def inputHello(self): self.out("开启输入监控!") self.help() while(True): try: cmd=raw_input("") if(cmd != ""): if(not self.doMethod(cmd.split(" "))): # self.out("exm???") # self.out(cmd) pass time.sleep(1) except Exception as e: self.out(traceback.format_exc()) return def send(self, ttt, data, deta=-1): if(deta == -1): deta = tools.getRandom(self.detaTime, self.detaTimeMin) sendTime = tool.getNowTime() preTime = sendTime + deta sendTimeT = tool.parseTime(sendTime/1000, "%D %H:%M:%S") preTimeT = tool.parseTime(preTime/1000, "%D %H:%M:%S") # self.sendList1.append((sendTime, deta, preTime, type, data)) # sendTime添加时间, type消息类型, msg发送消息体, deta间隔发送时间, preTime预期发送时间节点 self.db.execute("insert into cochat values(?,?,?,?,?,?,?,?,?)", str(self.id), str(sendTime),str(sendTimeT), str(deta), str(preTime),str(preTimeT), str(ttt), str(data),'0') return # 定时任务 def timeSend(self): self.out("开启定时任务 发送队列!") self.nowNight = 0 while(True): time.sleep(5) #每分钟扫描 只对非凌晨时间处理 延时一小时发送 timeNow = tool.getNowTime() hour = tool.parseTime(timeNow/1000, "%H:%M") if(hour >= "23:30" or hour <= "07:20" or self.ifOk == False): if(self.nowNight != 1): self.out("不是白天 或者 没有登录 now:" + str(hour) ) self.nowNight = 1 continue self.nowNight = 0 try: # self.sendList1.append((sendTime, deta, preTime, type, data)) self.sendList = self.db.executeQuery("select * from cochat where preTime<=? and flag=0 and id=?", timeNow, str(self.id) ) i = len(self.sendList) - 1 while(i >= 0): obj = self.sendList[i] sendTime = int(obj.get("sendTime", 0)) deta = int(obj.get("deta", 0)) preTime = int(obj.get("preTime", 0)) type = str(obj.get("type", "")) data = ast.literal_eval((str(obj.get("msg", "")))) info = "" hour = tool.parseTime(preTime/1000, "%D %H:%M:%S") info = str(timeNow) + "->" + str(preTime) + " 推送时刻:" + str(hour) if(timeNow >= preTime): info += " 触发" self.sendTrue(type, data) # self.sendList.pop(i) else: info += " " self.out(tool.parseTime(timeNow/1000, "%D %H:%M:%S") + "." + str(type) + "." + str(data) + "." + info) i = i - 1 self.db.execute("update cochat set flag='1' where preTime<=? and flag=0 and id=? ", timeNow, str(self.id)) except Exception as e: self.out(traceback.format_exc()) return # 定时任务 def timeHello(self): self.out("开启定时任务!") self.help() while(True): time.sleep(3600 * 3) try: self.out("定时重新连接") self.login() except Exception as e: self.out(repr(e)) return # 测试用 def test(self): self.login() ThreadRun( "TimeHello." + str(self.name), self.timeHello ).start() # ThreadRun( "TimeCtrl." + str(self.name), self.inputHello ).start() ThreadRun( "TimeSend." + str(self.name), self.timeSend ).start() self.socket.waitRead(self.onException) #异常回调 tool.wait() return # 监控执行 def doCmd(self, cmd): self.send({"data":cmd}) return def login(self): i = 0 while(self.ifOk == False or i <= 0): try: self.whileLogin() i = i + 1 except Exception as e: self.out(traceback.format_exc()) self.out("登录异常,5s后重试 try:" + str(i)) time.sleep(5) return # 认证登录 def whileLogin(self): self.ifOk = False if(self.onConnect): self.out("已经在尝试登录") return self.socket.close() self.onConnect = True self.out("尝试登录:") # {CONF_V ARS: "*", ORG_VARS: true, logintype: "mobile", id: "18408249138", password: "******"} # Request URL:http://picc.cochat.cn/SY_ORG_LOGIN.login.do?DESKTOP_OS=Win10&USER_LAST_BROWSER=Win32&USER_LAST_CLIENT=2.5.1&USER_LAST_OS=DESKTOP&USER_LAST_PCNAME=%7B%7D # request Cookie:JSESSIONID=abcb0skaQYCGs6lvy9orw obj = self.http.doJson("http://picc.cochat.cn/SY_ORG_LOGIN.login.do?DESKTOP_OS=Win10&USER_LAST_BROWSER=Win32&USER_LAST_CLIENT=2.5.1&USER_LAST_OS=DESKTOP&USER_LAST_PCNAME=%7B%7D",{ "CONF_VARS":"*", "ORG_VARS":"true", "logintype":"mobile", "id":self.id, "password":self.pwd }) if(obj.get("error","") != ""): self.onConnect = False return self.loginUser = obj token = obj.get("USER_TOKEN", "") self.out("登录结果 token:" + token) urlWithPort = obj.get("CONF_VARS", {}).get("@C_SY_COMM_SOCKET_SERV_V1.0@", "http://cochat.cn:9091") uus = urlWithPort.split(':') port = int(uus[2]) url = uus[1][2:999] #cochat.cn 不需要ws http 只需要ip 域名 self.socketServerUrl = urlWithPort self.socketUrl = url self.socketPort = port self.showUser() self.config = { "transports":['websocket', 'polling'], # websocket优先 "timeout":5 * 1000, # 超时时间 "forceNew": True, "reconnection" : False }; self.out("socket开始") self.socket.connect(url,port) # , params=self.config) self.out("socket连接完成,开始初始化事件") socketMsgTypes = ("connect", "disconnect","error","connect_error","connect_timeout","connecting","reconnecting","message", "event") # socketMsgTypes = ("connect", "disconnect","message", "event") for item in socketMsgTypes: if(hasattr(self, item)): method = getattr(self, item) if(callable(method)): self.socket.on(item, method) else: self.out("变量而非方法" + item + "回调?") else: self.out("属性" + item + "不存在,是否写错了名字?") # self.socket.on("message", self.message) self.out("socket初始化事件完成,开始发送认证") self.data = { "userName":obj.get("USER_CODE", ""), "displayName": tool.encode(obj.get("ORG_VARS", {}).get("@USER_NAME@", "") ), #"ccc",# "odept":obj.get("ORG_VARS", {}).get("@ODEPT_CODE@", ""), "token":obj.get("USER_TOKEN", ""), "uuid":"" + str(uuid.uuid1()), "version":obj.get("USER_CODE", "") + "_LAST_MSG" } self.out(self.data) self.socket.emit('loginv17', self.data, self.onSocketLogin) self.out("已发送认证信息") self.ifOk = True self.onConnect = False return def connect(self, *args): print("connect") print(args) # self.login() return def disconnect(self, *args): print("disconnect") print(args) self.login() return def error(self, *args): print("error") print(args) self.login() return def connect_error(self, *args): print("connect_error") print(args) return def connect_timeout(self, *args): print("connect_timeout") print(args) return def connecting(self, *args): print("connecting") print(args) return def reconnect(self, *args): print("reconnect") print(args) return def reconnecting(self, *args): print("reconnecting") print(args) return def onException(self, *args): tool.line() self.out("onexception") print(args) def turnArray(self, args): if(len(args) == 1): args = args[0] reg = re.match(r'^\d+', args) #25[xxxx] -> [xxxxx] if(reg is not None): start = reg.group() args = args[len(start):999999] # reg = re.match(r'^\["\w+",', args) #["message", {"to":{"id":" -> {"to":xxxx # if(reg is not None): # start = reg.group() # args = args[len(start):999999] # mtype = start[2:-2] res = tool.toJson(args) else: res = list(args) if(len(res) <= 1): res = ( 'null', res[0]) elif(callable(res[1])): res = ( 'fun', res[0]) return res def message(self, *args): # 普通消息 try: # print("收到message ") # print(args) # tool.line() # print("转换") args = self.turnArray(args) # print(args[0]) # print(args[1]) if(len(args) <= 1): return data = args[1] #{} mtype = args[0] #message null fun if(mtype == 'message'): data = tool.toJson(data) fro = data.get("from", {}) to = data.get("to", {}) contact = data.get("contact", {}) msg = data.get("body") fullId = contact.get("fullId") sessionName = contact.get("nickName", "") uid = self.data.get("uuid") tTag = data.get("timeMillis", tool.getNowTime()) tool.line() self.out("Msg:" + fro.get("nickName","from") + ">>" + msg + ">>" + to.get("nickName","to") + " time:" + data.get("time")) # self.out(msg); # 自发消息不需要处理 if(fro.get("nickName","from").find(self.loginUser.get("ORG_VARS", {}).get("@USER_NAME@", "")) >= 0): return ttt = self.detaTime reg = re.match(r'^\d+$', str(msg)) if(reg is not None): ttt = int(msg) * 1000 self.send("updateConversationStatus", { 'contactFullId': fullId, 'clientId': uid, 'timeTag': tTag }, ttt) self.send("updateMsgStatus", { "messages":data.get("id","") }, ttt) # 自发言 且 只有自己auto回复 if(self.id != "18408249138"): return # 过滤 ff = sessionName.find("陈鹏辉") hh = fro.get("nickName","from").find("许欢") zz = fro.get("nickName","from").find("赵振国") cdf = fro.get("nickName","from").find("迪") d1 = sessionName.find("迪") d2 = sessionName.find("祝") d3 = sessionName.find("纯") if(ff < 0 or d1 >= 0 or d2 >= 0 or d3 >= 0): self.out("未命中自己title 命中特殊 不回复") return point = 76 if(hh >= 0 or zz >= 0): point = 33 self.sendTrue("updateMsgStatus", { "messages":data.get("id","") }) if(tool.getRandom(0,100) < point): self.out("概率不自动回复" + str(point)) return # data["body"] = str(data["body"]) + "." # self.send("message", data) obj = {} # if(contact.get("type") == "GROUP"): # unicode(self.robot.do(msg, fro.get("nickName"))) msg = self.robot.do(msg, fro.get("nickName")) msg = msg.get("text", ''); if(msg == ''): return obj["body"] = msg #"666" + str(tool.getNowTime()) obj["bodyType"] = "text" obj["clientId"] = str(uuid.uuid1()) obj["retry"] = 1 obj["from"] = {} obj["from"]["fullId"] = "u__" + self.data.get("userName") obj["from"]["id"] = self.data.get("userName") obj["from"]["nickName"] = "fromnickname" obj["to"] = {} if(contact.get("type") == "GROUP"): obj["to"]["fullId"] = contact.get("fullId") else: obj["to"]["fullId"] = fro.get("fullId") obj["to"]["nickName"] = "tonickname" obj["from"]["nickName"] = self.loginUser["ORG_VARS"]["@USER_NAME@"] # "from-nickName" obj["to"]["nickName"] = "to-nickName" self.sendTrue("message", obj) elif(str(mtype) == 'fun'): pass elif(str(mtype) == 'event'): pass else: self.out("其他:" + str(mtype)) print(data) # print(args) # tool.line() except Exception as e: self.out(traceback.format_exc()) return def event(self, *args): # 事件消息 群创建? print("event") print(args) return def onSocketLogin(self, *data): self.out("socket登录回调:") print(data) return def sendTrue(self, type, data): self.socket.send(type, data) return def showUser(self): tool.line() obj = self.loginUser user = obj.get("ORG_VARS", {}) self.out(user.get("@USER_NAME@", "")) self.out(user.get("@USER_POST@", "")) self.out(user.get("@LOGIN_NAME@", "")) self.out("USER_CODE:" + obj.get("USER_CODE", "")) self.out("USER_TOKEN:" + user.get("UESR_TOKEN", "")) self.out("socketServerUrl:" + self.socketServerUrl) self.out("to url:" + self.socketUrl) self.out("to port:" + str(self.socketPort)) tool.line() return
class AutoBaidu: def __init__(self, name="0000000"): self.http = Http() self.name = name # https://console.bce.baidu.com/ai/?_=1533038198056&fromai=1#/ai/speech/app/detail~appId=464300 self.appId = "11615410" self.appKey = "zzTM1VXx7Edmj4QXqCcnhZfF" self.appSecret = "jekAAbrElm87rpMM7jVBFFuKrm8ZWbwy" self.loginRes = {} self.access_token = "" def out(self, obj): print(self.__module__ + "." + self.name + "." + str(obj)) def login(self): tool.line() self.out("百度接口token获取") res = False obj = self.http.doJson( "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + self.appKey + "&client_secret=" + self.appSecret) token = obj.get("access_token", "") # scope中含有audio_tts_post 表示有语音合成能力, # 没有该audio_tts_post 的token调用接口会返回502错误。 # 在结果中可以看见 token = 1.a6b7dbd428f731035f771b8d********.86400 # .1292922000-2346678-124328,在2592000秒(30天)后过期。 if (token != ""): self.access_token = token self.loginRes = obj res = True else: self.out("接口认证失败") self.out(str(obj)) res = False return res def help(self): self.out(dir(self)) # [methodName arg1 arg2] def doMethod(self, listArgs): size = len(listArgs) res = False if (size > 0): if (hasattr(self, listArgs[0])): method = getattr(self, listArgs[0]) #获取的是个对象 if (callable(method)): if (size == 2): method(listArgs[1]) elif (size == 3): method(listArgs[1], listArgs[2]) elif (size == 4): method(listArgs[1], listArgs[2], listArgs[3]) elif (size == 5): method(listArgs[1], listArgs[2], listArgs[3], listArgs[4]) else: method() res = True else: self.out(method) return res def getAudio(self, text=""): flag = False res = "" if (text == ""): return flag, res url = "http://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=" + self.name + "&tok=" + self.access_token + "&tex=" + self.http.encode( text) + "&vol=13&per=0&spd=5&pit=5&aue=3" responce = self.http.do(url) # tex 必填 合成的文本,使用UTF-8编码。小于2048个中文字或者英文数字。(文本在百度服务器内转换为GBK后,长度必须小于4096字节) # tok 必填 开放平台获取到的开发者access_token(见上面的“鉴权认证机制”段落) # cuid 必填 用户唯一标识,用来计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内 # ctp 必填 客户端类型选择,web端填写固定值1 # lan 必填 固定值zh。语言选择,目前只有中英文混合模式,填写固定值zh # spd 选填 语速,取值0-15,默认为5中语速 # pit 选填 音调,取值0-15,默认为5中语调 # vol 选填 音量,取值0-15,默认为5中音量 # per 选填 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声 # aue 选填 3为mp3格式(默认); 4为pcm-16k;5为pcm-8k;6为wav(内容同pcm-16k); 注意aue=4或者6是语音识别要求的格式,但是音频内容不是语音识别要求的自然人发音,所以识别效果会受影响。 if (type(responce) == str): res = "转换接口访问失败" + str(text) else: header = responce.headers # Content-Type: audio/mp3; # Content-Type: application/json ct = header.get("Content-Type", "") if (ct == "application/json"): obj = tool.toJson(responce.read()) # {"err_no":500,"err_msg":"notsupport.","sn":"abcdefgh","idx":1} code = obj.get("err_no", "") if (str(code)[0:1] == "5"): if (code == 500): info = "不支持输入" elif (code == 501): info = "输入参数不正确" elif (code == 502): info = "token验证失败" elif (code == 503): info = "合成后端错误" else: info = "其他错误" + str(code) info = info + " " + obj.get("err_msg", "") else: info = str(obj) flag = False res = info else: flag = True res = url self.out("转换文本[" + text + "] -> " + res) return flag, res # 手动控制 def inputHello(self): self.out("开启输入监控!") self.help() while (True): try: cmd = raw_input("") if (cmd != ""): if (not self.doMethod(cmd.split(" "))): self.out("手动发送:" + cmd) self.getAudio(cmd) time.sleep(1) except Exception as e: self.out(repr(e)) return def test(self): self.login() ThreadRun("InputHello." + str(self.name), self.inputHello).start() flag, res = self.getAudio("百度你好") print(flag) print(res) tool.wait() return