Example #1
0
 def __init__(self, bm):
     self.YES = "yes"
     self.NO = "no"
     self.SPLITMARK = "###"
     self.XPATHARG = "{@@}"
     self.driver = bm.getDriver()
     self.proxyIp = bm.getIp()
     self.proxyPort = bm.getPort()
     self.operate = Operate(self.driver)
     self.currentWindow = self.driver.current_window_handle
     self.defaultWindow = self.driver.current_window_handle
Example #2
0
def plan(fileoutName, virusPlotName, runNumber):

    fileT = fileoutName + str(runNumber) + ".dat"
    fileT2 = virusPlotName + str(runNumber)

    l = []
    for i in range(0, constants.N_vacc):
        x = randint(constants.cs_minX, constants.cs_maxX)
        y = randint(constants.cs_minY, constants.cs_maxY)
        l.append((x, y))

    operator = Operate(CoordinateSystem(), [FSM(24, 1)], Vaccine(l))
    reporter = Report(operator, fileT, fileT2, [0.33, 0.42, 0.5, 0.58, 0.67])

    for i in range(constants.N_turns):
        operator.run()
        reporter.update()
        reporter.reveal_virus(i)

    reporter.output()
Example #3
0
class AutoForm(object):
    def __init__(self, bm):
        self.YES = "yes"
        self.NO = "no"
        self.SPLITMARK = "###"
        self.XPATHARG = "{@@}"
        self.driver = bm.getDriver()
        self.proxyIp = bm.getIp()
        self.proxyPort = bm.getPort()
        self.operate = Operate(self.driver)
        self.currentWindow = self.driver.current_window_handle
        self.defaultWindow = self.driver.current_window_handle

    def getCurrentWindow(self):
        return self.currentWindow

    def getDefaultWindow(self):
        return self.defaultWindow

    def setCurrentWindow(self, cWindow):
        self.currentWindow = cWindow

    def setDefaultWindow(self, dWindow):
        self.defaultWindow = dWindow

    def getDriver(self):
        return self.driver

    '''
    结合operate中操作,生成带窗口状态处理的新操作
    '''

    def doOperate(self, by, xpath, value, op):
        operateDic = {
            "closeotherwindows": self.closeOtherWindows,
            "switchtowindowbyclick": self.switchToWindowByClick,
            "switchtodefaultwindow": self.switchToDefaultWindow,
            "setcurrwinasdefault": self.setCurrWinAsDefault
        }
        try:
            if (operateDic.has_key(op.lower())):
                return operateDic.get(op.lower())(xpath, value, by)
            else:
                # 处理非WebDriver处理的请求方法
                if (op.lower() == "sameaslocalfile"):
                    if (self.proxyIp <> "" and self.proxyIp <> None):
                        t_proxy = self.proxyIp + str(self.proxyPort)
                    else:
                        t_proxy = ""
                    return self.operate.sameAsLocalFile(by,
                                                        xpath,
                                                        value,
                                                        proxy=t_proxy)
                # 处理WebDriver处理的请求方法
                else:
                    return self.operate.operate(by, xpath, value, op.lower())
        except Exception as e:
            return {
                "state": False,
                "info": getErrInfo(xpath, op, value, str(e))
            }

    '''
    设置当前窗口作为默认窗口
    '''

    def setCurrWinAsDefault(self, xpath, value):
        result = {}
        try:
            self.setDefaultWindow(self.driver.current_window_handle)
            self.setCurrentWindow(self.driver.current_window_handle)
            result = {"state": True, "info": ""}
        except Exception as e:
            result = {
                "state": False,
                "info": getErrInfo(xpath, "setCurrWinAsDefault", value, str(e))
            }
        return result

    '''
    关闭当前窗口以外的窗口
    '''

    def closeOtherWindows(self, xpath, value):
        result = {}
        try:
            allWindows = self.driver.window_handles
            for i in range(0, allWindows.__len__()):
                tempWindow = allWindows.__getitem__(i)
                if (self.currentWindow <> tempWindow):
                    self.driver.switch_to.window(tempWindow)
                    self.driver.close()
                self.driver.switch_to.window(self.currentWindow)
                self.setDefaultWindow(self.driver.current_window_handle)
                self.setCurrentWindow(self.driver.current_window_handle)
                result = {"state": True, "info": ""}
        except Exception as e:
            result = {
                "state": False,
                "info": getErrInfo(xpath, "closeOtherWindows", value, str(e))
            }
        return result

    '''
    点击某个元素后,打开新窗口,并指向新窗口
    '''

    def switchToWindowByClick(self, xpath, value, by):
        result = {}
        try:
            oriWindows = self.driver.window_handles
            self.driver.find_element(by, xpath).click()
            self.driver.implicitly_wait(3)
            nowWindows = self.driver.window_handles
            newWindow = None
            for i in range(0, nowWindows.__len__()):
                t = nowWindows.__getitem__(i)
                try:
                    oriWindows.index(t)
                    continue
                except:
                    newWindow = t
                    break
            if (newWindow <> None):
                self.driver.switch_to.window(newWindow)
                self.setCurrentWindow(self.driver.current_window_handle)
                result = {"state": True, "info": ""}
            else:
                result = {
                    "state":
                    False,
                    "info":
                    getErrInfo(xpath, "switchToWindowByClick", value,
                               "can't find new Window by click this element!")
                }
        except Exception as e:
            result = {
                "state": False,
                "info": getErrInfo(xpath, "switchToWindowByClick", value,
                                   str(e))
            }
        return result

    '''
    指向原窗口
    '''

    def switchToDefaultWindow(self, xpath, value):
        result = {}
        try:
            self.driver.switch_to.window(self.getDefaultWindow())
            self.setCurrentWindow(self.driver.current_window_handle)
            result = {"state": True, "info": ""}
        except Exception as e:
            result = {
                "state": False,
                "info": getErrInfo(xpath, "switchToDefaultWindow", value,
                                   str(e))
            }
        return result

    '''
    合并way数组,xpath数组,操作数组,值数组.
    构成字典列表
    '''

    def mergeInputDatas(self, filePath):
        em = ExcelManage(filePath)
        casename_array = em.getDatasByCol('case', 0, 1)
        caseinfro_array = em.getDatasByCol('case', 1, 1)
        way_array = em.getDatasByCol('case', 2, 1)
        xpath_array = em.getDatasByCol('case', 3, 1)
        option_array = em.getDatasByCol('case', 4, 1)
        data_array = em.getDatasByCol('case', 5, 1)
        length = casename_array.__len__()
        inputDatas = []
        for i in range(0, length):
            if (i >= caseinfro_array.__len__()):
                t_caseinfro = ""
            else:
                t_caseinfro = caseinfro_array[i]
            if (i >= way_array.__len__()):
                t_way = ""
            else:
                t_way = way_array[i]

            if (i >= xpath_array.__len__()):
                t_xpath = ""
            else:
                t_xpath = xpath_array[i]

            if (i >= option_array.__len__()):
                t_op = ""
            else:
                t_op = option_array[i]

            if (i >= data_array.__len__()):
                t_value = ""
            else:
                t_value = data_array[i]
            inputDatas.append({
                "casename": casename_array[i],
                "caseinfro": t_caseinfro,
                "way": t_way,
                "xpath": t_xpath,
                "op": t_op,
                "value": t_value
            })
        return inputDatas

    def fixTheForm(self, caseinfro, by, xpath, value, op, logDir=None):
        result = {
            "state": True,
            "info": self.getNowStrftime(),
            "title": ">>>" + caseinfro
        }
        t_result = self.doOperate(by, xpath, value, op)
        if (not t_result.get("state")):
            if ((xpath or "").__len__() > 0
                    and getElement.isElementPresent(self.driver, by, xpath)):
                getElement.scrollToElement(self.driver,
                                           self.driver.find_element(by, xpath))

            result = self.mergeResult(result, t_result)
        if (result.get("state")):
            result.__setitem__("info", result.get("info") + " PASS\n")
        return result

    '''
    获取当前时间的格式化字符串
    '''

    def getNowStrftime(self):
        return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    def getNowStrftime2(self):
        return datetime.datetime.now().strftime("%Y%m%d%H%M%S")

    '''
    合并各个步骤的测试结果(没用)
    '''

    def mergeResult(self, result, t_result):
        result.__setitem__("state",
                           result.get("state") and t_result.get("state"))
        result.__setitem__("info",
                           result.get("info") + "\n" + t_result.get("info"))
        return result

    '''
    获取查找元素的方式
    '''

    def getWays(self, way):
        by = ''
        if way == 'id':
            by = By.ID
        elif way == "name":
            by = By.NAME
        elif way == "xpath":
            by = By.XPATH
        elif way == "css":
            by = By.CSS_SELECTOR
        elif way == "text":
            by = By.LINK_TEXT
        elif way == "classname":
            by = By.CLASS_NAME
        return by

    '''
    运行指定格式sheet页case中的测试用例
    '''

    def runCase(self, filePath, casename, logsDir=None):
        #获取case中可执行的用例数
        resultList = []
        datas = self.mergeInputDatas(filePath)
        for i in range(0, datas.__len__()):
            tmp = datas.__getitem__(i)
            runcase = tmp.get('casename')
            if runcase == casename and runcase != "":
                way = tmp.get("way")
                caseinfro = tmp.get("caseinfro")
                xpath = tmp.get("xpath")
                op = tmp.get("op")
                value = tmp.get('value')
                by = self.getWays(way)
                t_result = self.fixTheForm(caseinfro,
                                           by,
                                           xpath,
                                           value,
                                           op,
                                           logDir=logsDir)
                resultList.append(t_result)
        return resultList

    '''
    获取testcase指定格式excel中的测试集,可运行状态是否
    '''

    @staticmethod
    def getTestSuiteFromStdExcel(filePath):
        em = ExcelManage(filePath)
        caseArray = em.getDatasByCol('testcase', 0, 1)
        stateArray = em.getDatasByCol('testcase', 1, 1)
        caseinfro = em.getDatasByCol('testcase', 2, 1)
        print caseinfro
        print stateArray.__len__()
        runCaseList = []
        for i in range(0, stateArray.__len__()):
            if (stateArray[i] == 'Y'):
                runCaseList.append({
                    "caseinfro": caseinfro[i],
                    "testmethod": caseArray[i]
                })
        return runCaseList

    '''
    退出WebDriver
    '''

    def quitDriver(self):
        self.driver.quit()
Example #4
0
class AutoForm(object):
    def __init__(self, bm):
        self.YES = "yes"
        self.NO = "no"
        self.SPLITMARK = "###"
        self.XPATHARG ="{@@}"
        self.driver = bm.getDriver()
        self.proxyIp= bm.getIp()
        self.proxyPort=bm.getPort()
        #self.driver = webdriver.Chrome()
        self.operate = Operate(self.driver)
        self.currentWindow = self.driver.current_window_handle
        self.defaultWindow = self.driver.current_window_handle


    def getCurrentWindow(self):
        return self.currentWindow

    def getDefaultWindow(self):
        return self.defaultWindow

    def setCurrentWindow(self, cWindow):
        self.currentWindow = cWindow

    def setDefaultWindow(self, dWindow):
        self.defaultWindow = dWindow

    def getDriver(self):
        return self.driver


    '''
    结合operate中操作,生成带窗口状态处理的新操作
    '''
    def doOperate(self, op, xpath, value):
        operateDic = {
            "closeotherwindows": self.closeOtherWindows,
            "switchtowindowbyclick": self.switchToWindowByClick,
            "switchtodefaultwindow": self.switchToDefaultWindow,
            "setcurrwinasdefault": self.setCurrWinAsDefault
        }
        try:
            if (operateDic.has_key(op.lower())):
                return operateDic.get(op.lower())(xpath, value)
            else:
                #处理非WebDriver处理的请求方法
                if(op.lower()=="sameaslocalfile"):
                    if (self.proxyIp <> "" and self.proxyIp <> None):
                        t_proxy=self.proxyIp+str(self.proxyPort)
                    else:
                        t_proxy=""
                    return self.operate.sameAsLocalFile(xpath, value,proxy=t_proxy)
                else:
                    return self.operate.operate(op.lower(), xpath, value)
        except  Exception as e:
            return {"state": False, "info": getErrInfo(xpath,op,value,str(e))}

    '''
    设置当前窗口作为默认窗口
    '''
    def setCurrWinAsDefault(self,xpath,value):
        result = {}
        try:
            self.setDefaultWindow(self.driver.current_window_handle)
            self.setCurrentWindow(self.driver.current_window_handle)
            result = {"state": True, "info": ""}
        except Exception as e:
            result = {"state": False, "info": getErrInfo(xpath,"setCurrWinAsDefault",value,str(e))}
        return result

    '''
    关闭当前窗口以外的窗口
    '''
    def closeOtherWindows(self, xpath, value):
        result = {}
        try:
            allWindows = self.driver.window_handles
            for i in range(0, allWindows.__len__()):
                tempWindow = allWindows.__getitem__(i)
                if (self.currentWindow <> tempWindow):
                    self.driver.switch_to.window(tempWindow)
                    self.driver.close()
                self.driver.switch_to.window(self.currentWindow)
                self.setDefaultWindow(self.driver.current_window_handle)
                self.setCurrentWindow(self.driver.current_window_handle)
                result = {"state": True, "info": ""}
        except Exception as e:
            result = {"state": False, "info": getErrInfo(xpath,"closeOtherWindows",value,str(e))}
        return result


    '''
    点击某个元素后,打开新窗口,并指向新窗口
    '''
    def switchToWindowByClick(self, xpath, value):
        result = {}
        try:
            oriWindows = self.driver.window_handles
            self.driver.find_element_by_xpath(xpath).click()
            self.driver.implicitly_wait(3)
            nowWindows = self.driver.window_handles
            newWindow = None
            for i in range(0, nowWindows.__len__()):
                t = nowWindows.__getitem__(i)
                try:
                    oriWindows.index(t)
                    continue
                except:
                    newWindow = t
                    break
            if (newWindow <> None):
                self.driver.switch_to.window(newWindow)
                self.setCurrentWindow(self.driver.current_window_handle)
                result = {"state": True, "info": ""}
            else:
                result = {"state": False, "info": getErrInfo(xpath,"switchToWindowByClick",value,"can't find new Window by click this element!")}
        except Exception as e:
            result = {"state": False, "info": getErrInfo(xpath,"switchToWindowByClick",value,str(e))}
        return result

    '''
    指向原窗口
    '''
    def switchToDefaultWindow(self, xpath, value):
        result = {}
        try:
            self.driver.switch_to.window(self.getDefaultWindow())
            self.setCurrentWindow(self.driver.current_window_handle)
            result = {"state": True, "info": ""}
        except Exception as e:
            result = {"state": False, "info": getErrInfo(xpath,"switchToDefaultWindow",value,str(e))}
        return result

    '''
    读取指定格式的datas,完成指定操作
    datas格式要求如下:
    datas=[
        {"xpath":"","op":"get","value":""},
        {"xpath":"//input[@id='logonInfo.logUserName']","op":"sendKeys","value":"dongfang"}
    ]
    '''
    def fixTheForm(self, title,datas,logDir=None,filePath=None,defaultParams=None):
        params={}
        if(defaultParams <> None and defaultParams.__len__()>0):
            for (k,v) in defaultParams.items():
                params.__setitem__(k,v)
                
        result = {"state": True, "info": self.getNowStrftime(),"title":">>>"+title}
        for i in range(datas.__len__()):
            tmp = datas.__getitem__(i)
            _op=tmp.get("op").lower()
            _xpath=tmp.get("xpath")
            _value=tmp.get("value")
            if(_op=="skip"):
                continue
            
            #处理保存参数操作,value是个有返回值的js语句
            pattern1=re.compile(r"\{@(\w+)@\}")
            m1=pattern1.match(_op)
            if(m1):
                try:
                    ret=str(self.driver.execute_script(_value))
                    self.driver.implicitly_wait(2)
                    params.__setitem__(m1.group(1),ret)
                    t_result = {"state": True, "info": ""}
                    result = self.mergeResult(result,t_result)
                    continue
                except Exception as e:
                    t_result = {"state": False, "info": getErrInfo(_xpath,"executeJs",_value,str(e))}
                    result = self.mergeResult(result,t_result)
                    continue

            #print params

            #处理带参数的xpath
            if (_xpath.__contains__(self.XPATHARG) and _value.__contains__(self.SPLITMARK)):
                indx = _value.find(self.SPLITMARK)
                xpathParm = _value[:indx]
                _xpath = _xpath.replace(self.XPATHARG,xpathParm)
                _value = _value[indx + self.SPLITMARK.__len__():]

            #处理value中含有参数
            pattern2=re.compile(r".*\{@(\w+)@\}.*")
            c=0
            while pattern2.match(_value) and c<100:  #防止无限循环
                m2=pattern2.match(_value)
                t_key=m2.group(1)
                c=c+1
                if(params.has_key(t_key)):
                    _value=_value.replace("{@"+t_key+"@}",params.get(t_key))
                else:
                    _value==_value.replace("{@"+t_key+"@}","{"+t_key+"}")

            #处理调用公共步骤
            if(_op=="call" and filePath<>None):
                dParams={}
                tValues=_value.split(self.SPLITMARK)
                if(tValues.__len__()>1):
                    for i in range(1,tValues.__len__()):
                        tParamValue=tValues[i].split("=")
                        dParams.__setitem__(tParamValue[0],tParamValue[1])
                t_result=self.runSteps(filePath,tValues[0],None,dParams).__getitem__(0)
                t_result.__setitem__("info",u"第"+str(i+1)+u"步调用公共步骤"+_value+":"+t_result.get("info"))
                result = self.mergeResult(result,t_result)
                continue

            #处理上传\比较下载文件操作的相对链接
            if((_op=="upload" or _op=="sameaslocalfile") and (not _value.__contains__(":"))):
                if(logDir<>None):
                    _value=os.path.join(os.path.dirname(logDir),_value)
                else:
                    print "can't find the logs dir,can't use the relative path"


            #处理正常操作
            t_result = self.doOperate(_op,_xpath,_value)
            if(not t_result.get("state")):
                if((_xpath or "").__len__()>0 and
                       BrowserManage.isElementPresent(self.driver,By.XPATH,_xpath)):
                    BrowserManage.scrollToElement(self.driver,self.driver.find_element_by_xpath(_xpath))
                if(logDir<>None):
                    snapFile=os.path.join(logDir,self.getNowStrftime2()+".png")
                    self.driver.get_screenshot_as_file(snapFile)
                    snapInfo="<img 0src=\"file:\\\\\\"+os.path.abspath(snapFile).strip()+"\" height=\"600\" width=\"800\">"
                else:
                    print "can't find the logs dir,can't use the relative path"
                    snapInfo=""
                t_result.__setitem__("info",u"第"+str(i+1)+u"步:"+t_result.get("info")+u"\n截图:\n"+snapInfo+"\n")
                result = self.mergeResult(result,t_result)
        if(result.get("state")):
            result.__setitem__("info",result.get("info")+" PASS\n")
        return result

    '''
    解析指定格式数据,将其解析成fixTheForm需要的数据
    originDatas的格式(元素名称)如下:
    '''
    def parseDatasFromStdExcel(self,filePath,sheetName):
        em=ExcelManage(filePath)
        dataStepSize=int(em.getDatasByCol(sheetName,1,0,1)[0])
        dataGroupSize=int(em.getDatasByCol(sheetName,2,0,1)[0])
        xpath_array=self.getXpathArrayFromStdExcel(filePath,sheetName,dataStepSize)
        datas=[]
        i=0
        while(i<dataGroupSize):
            piece=None
            runState=self.YES
            title=""
            isRun=em.getDatasByCol(sheetName,3+2*i,0,1)[0]
            if( isRun==u"忽略" or isRun==""):
                runState=self.NO
            title=em.getDatasByCol(sheetName,4+2*i,0,1)[0]
            op_array=em.getDatasByCol(sheetName,3+2*i,2,dataStepSize)
            value_array=em.getDatasByCol(sheetName,4+2*i,2,dataStepSize)
            piece=(runState,title,self.mergeInputDatas(xpath_array,op_array,value_array))
            datas.append(piece)
            i=i+1
        em.closeExcel()
        return datas

    '''
    获取xpathArray
    '''
    def getXpathArrayFromStdExcel(self,filePath,sheetName,dataSize):
        em=ExcelManage(filePath)
        sheetNames=em.getDatasByCol(sheetName,1,2,dataSize)
        elementNames=em.getDatasByCol(sheetName,2,2,dataSize)
        xpath_array=[]
        for i in range(0,dataSize):
            t_sheetName=sheetNames[i].strip()
            t_elementName=elementNames[i].strip()
            if(t_sheetName=="" or t_elementName==""):
                xpath_array.append("")
                continue
            else:
                idx=em.getIndexByCol(t_sheetName,1,t_elementName)
                if(idx>9000):
                    raise ValueError,"The (%d)st row in sheet(%s) of file(%s) has ERROR" % (i,sheetName,filePath)
                xpath_array.append(em.getDatasByCol(t_sheetName,2,idx,1)[0])
                continue
        return xpath_array


    '''
    合并xpath数组,操作数组,值数组.
    构成字典列表
    '''
    def mergeInputDatas(self,xpath_array,op_array,value_array):
        length=xpath_array.__len__()
        inputDatas=[]
        for i in range(0,length):
            t_op=""
            t_value=""
            if(i>=op_array.__len__()):
                t_op=""
            else:
                t_op=op_array[i]
            if(i>=value_array.__len__()):
                t_value=""
            else:
                t_value=value_array[i]
            inputDatas.append({"xpath":xpath_array[i],"op":t_op,"value":t_value})
        return inputDatas

    '''
    获取当前时间的格式化字符串
    '''
    def getNowStrftime(self):
        return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    def getNowStrftime2(self):
        return datetime.datetime.now().strftime("%Y%m%d%H%M%S")

    '''
    合并各个步骤的测试结果
    '''
    def mergeResult(self,result,t_result):
        result.__setitem__("state",result.get("state") and t_result.get("state"))
        result.__setitem__("info",result.get("info")+"\n"+t_result.get("info"))
        return result

    '''
    运行指定格式sheet页中的测试用例
    '''
    def runCase(self,filePath,sheetName,logsDir=None):
        datas=self.parseDatasFromStdExcel(filePath,sheetName)
        resultList=[]
        for i in range(0,datas.__len__()):
            piece=datas.__getitem__(i)
            runState=piece[0]
            if(runState==self.NO):
                continue
            else:
                title=piece[1]
                inputDatas=piece[2]
            t_result=self.fixTheForm(title,inputDatas,logDir=logsDir,filePath=filePath)
            resultList.append(t_result)
        return resultList


    '''
    运行指定格式sheet页中的测试用例
    '''
    def runSteps(self,filePath,sheetName,logsDir=None,dParams=None):
        datas=self.parseDatasFromStdExcel(filePath,sheetName)
        resultList=[]
        for i in range(0,datas.__len__()):
            piece=datas.__getitem__(i)
            runState=piece[0]
            if(runState==self.NO):
                continue
            else:
                title=piece[1]
                inputDatas=piece[2]
            t_result=self.fixTheForm(title,inputDatas,logDir=logsDir,filePath=filePath,defaultParams=dParams)
            resultList.append(t_result)
        return resultList

    '''
    获取指定格式excel中的测试集
    '''
    @staticmethod
    def getTestSuiteFromStdExcel(filePath):
        em=ExcelManage(filePath)
        caseCount=int(em.getDatasByCol(u'配置',3,0,1)[0])
        caseArray=em.getDatasByCol(u"配置",2,2,caseCount)
        stateArray=em.getDatasByCol(u"配置",3,2,caseCount)
        runCaseList=[]
        for i in range(0,caseCount):
            if(stateArray[i]<>u"忽略"):
                runCaseList.append(caseArray[i])
        return runCaseList



    '''
    退出WebDriver
    '''
    def quitDriver(self):
        self.driver.quit()
Example #5
0
 def __init__(self):
     self.operate = Operate()
     self._api = OpenApi()
     self._http = HttpClient.getInstance()
     self._pool = ThreadPool(5)    # 初始化5个线程
     print("Task Class 初始化完毕")
Example #6
0
class Tasks(Codes):

    def __init__(self):
        self.operate = Operate()
        self._api = OpenApi()
        self._http = HttpClient.getInstance()
        self._pool = ThreadPool(5)    # 初始化5个线程
        print("Task Class 初始化完毕")

    def getAllAdmin(self):
        print("所有管理员: %s", variable.Admins)
        return variable.Admins

    def getAllGroup(self):
        print("所有关注群: %s", variable.Groups)
        return variable.Groups

    def addAdmin(self, qq):
        return self.operate.addAdmin(qq)

    def delAdmin(self, qq):
        return self.operate.delAdmin(qq)

    def isAdmin(self, qq):
        return self.operate.isAdmin(qq)

    def addGroup(self, qq):
        return self.operate.addGroup(qq)

    def delGroup(self, qq):
        return self.operate.delGroup(qq)

    def inGroup(self, qq):
        # print("inGroup: %s", qq)
        return self.operate.inGroup(qq)

    def addAsk(self, question, answer):
        return self.operate.addAsk(question, answer)

    def delAsk(self, Id):
        return self.operate.delAsk(Id)

    def getAsk(self, content):
        return self.operate.getAsk(content)

    def end(self):
        self._pool.destroy()

    def uin_to_qq(self, uin):
        if uin in variable.UsersQQ:
            return variable.UsersQQ.get(uin)
        print("获取qq %s %s %s", uin, variable.Vfwebqq, variable.Referer)
        html = self._http.get(variable.Get_friend_uin2.format(uin, self.bytesToStr(variable.Vfwebqq)), referer = variable.Referer)
        print("uin_to_qq: %s", html)
        try:
            result = json.loads(self.bytesToStr(html))
            if result.get("retcode") != 0:
                return ""
            qq = result.get("result").get("account")
            if qq:
                variable.UsersQQ[uin] = str(qq)
                return str(qq)
        except Exception as e:
            print(e)
            return ""

    def sendMsg(self, *args, **kwargs):
        print("回复消息")
        url = kwargs.get("url")
        data = kwargs.get("data")
        # print(data)
        referer = kwargs.get("referer")
        result = self._http.post(url = url, data = data, referer = referer)
        print("回复结果: %s", result)

    def otherMsg(self, content, to, url, uin):
        if content:
            html = self._http.get(url = variable.RobotUrl.format(quote(content), uin))
            html = html.replace("\\n", "").replace("\n", "")
            html = self._api.parse(html)
            html = self._api.getResult()
            if html:
                print("智能回复: ", html)
                data = {'r' : variable.Msg_Data.format(to, uin, html, variable.Clientid, variable.Msgid, variable.Psessionid)}
                print(data)
                self._pool.add_task(callback = self.sendMsg, url = url, data = data, referer = variable.Referer)

    def analyze(self, qq, uin, content, iseq = None):
        print("开始解析消息")
        if iseq:
            print("消息来自群")
            to = "group_uin"
            url = variable.Send_qun_msg2
        else:
            print("消息来自好友")
            to = "to"
            url = variable.Send_buddy_msg2
        # 是管理员
        if self.isAdmin(qq) and content in ("开启机器人", "关闭机器人", "退出"):
            # 解析管理员命令
            _msg = ""
            print("是管理员消息")
            if content == "开启机器人":
                variable.State = True
                print("机器人已开启")
                _msg = "机器人已开启"
            elif content == "关闭机器人":
                variable.State = False
                print("机器人已关闭")
                _msg = "机器人已关闭"
            elif content == "退出":
                variable.State = False
                variable.Exit = True
                print("机器人已退出")
                _msg = "机器人已退出"
            if _msg:
                data = {'r' : variable.Msg_Data.format(to, uin, _msg, variable.Clientid, variable.Msgid, variable.Psessionid)}
                self._pool.add_task(callback = self.sendMsg, url = url, data = data, referer = variable.Referer)
            return
        # 给我发送的私人消息(是否是命令)
        result = variable.Command.findall(content)
        if result and to == "to":
            ver, msg = result[0]
            _msg = ""
            if ver == variable.AddAdmin:
                # 添加管理员
                print("添加管理员")
                if self.addAdmin(msg):
                    _msg = "添加管理员: " + msg + " 成功"
                else:
                    _msg = "添加管理员: " + msg + " 失败"
            elif ver == variable.DelAdmin:
                # 删除管理员
                print("删除管理员")
                if self.delAdmin(msg):
                    _msg = "删除管理员: " + msg + " 成功"
                else:
                    _msg = "删除管理员: " + msg + " 失败"
            elif ver == variable.AddAttention:
                # 添加关注群号
                print("添加关注群")
                if self.addGroup(msg):
                    _msg = "添加关注群: " + msg + " 成功"
                else:
                    _msg = "添加关注群: " + msg + " 失败"
            elif ver == variable.DelAttention:
                # 删除关注群号
                print("删除关注群号")
                if self.delGroup(msg):
                    _msg = "删除关注群: " + msg + " 成功"
                else:
                    _msg = "删除关注群: " + msg + " 失败"
            if _msg:
                data = {'r' : variable.Msg_Data.format(to, uin, _msg, variable.Clientid, variable.Msgid, variable.Psessionid)}
                self._pool.add_task(callback = self.sendMsg, url = url, data = data, referer = variable.Referer)
            return
        if content.startswith("#") and len(content) > 2 and self.inGroup(iseq):
            # 开头以#开头并且长度大于2并且是关注群发送的消息
            i = 0
            content = content[1:].strip()
            for w in content:
                if w in variable.Filter:
                    print("发现过滤词: ", w)
                    i += 1
            if i == 0:
                self._pool.add_task(callback = self.otherMsg, content = content, to = to, url = url, uin = uin)
                return
            else:
                data = {'r' : variable.Msg_Data.format(to, uin, "你想干什么!f**k", variable.Clientid, variable.Msgid, variable.Psessionid)}
                self._pool.add_task(callback = self.sendMsg, url = url, data = data, referer = variable.Referer)
                return
        if to == "to" and len(content) > 2:
            # 私人消息
            self._pool.add_task(callback = self.otherMsg, content = content.strip(), to = to, url = url, uin = uin)
            return

    def delwith(self, fuin, suin, iseq, content):
        '''
        #fuin 消息发送者
        #suin 群消息发送人qq
        #iseq 群号码
        #content 消息内容
        '''
        print("%s %s %s %s", fuin, suin, iseq, content)
        # 如果是群文件消息
        if content.startswith("<?xml"):
            print("发现共享文件")
        # 发送者qq
        if iseq and suin:
            qq = self.uin_to_qq(suin)
        else:
            qq = self.uin_to_qq(fuin)
        print("qq: %s", qq)
        self.analyze(qq, fuin, content, iseq)