| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | # coding: utf-8#"""import uiautomator2 as u2import uiautomator2.ext.ocr as ocru2.plugin_add("ocr", ocr.OCR)d = u2.connect()d.ext_ocr("对战模式").click()"""import requestsimport timeAPI = ""class OCRObjectNotFound(Exception):    passclass OCR(object):    def __init__(self, d):        """        Args:            d: uiautomator2 instance        """        self._d = d        if not API:            raise EnvironmentError("set API var before using OCR")    def all(self):        rawdata = self._d.screenshot(format='raw')        r = requests.post(API, files={"file": ("tmp.jpg", rawdata)})        r.raise_for_status()        resp = r.json()        assert resp['success']        result = []        for item in resp['data']:            lx, ly, rx, ry = item['coords']            x, y = (lx + rx) // 2, (ly + ry) // 2            ocr_text = item['text']            result.append((ocr_text, x, y))        result.sort(key=lambda v: (v[2], v[1]))        return result    def __call__(self, text):        return OCRSelector(self, text)class OCRSelector(object):    def __init__(self, server, text=None, textContains=None):        self._server = server        self._d = server._d        self._text = text        self._text_contains = textContains    def all(self):        result = []        for (ocr_text, x, y) in self._server.all():            matched = False            if self._text == ocr_text:  # exactly match                matched = True            elif self._text_contains and self._text_contains in ocr_text:                matched = True            if matched:                result.append((ocr_text, x, y))        return result    def wait(self, timeout=10):        """        Args:            timeout: seconds to wait                Returns:            List of recognition (text, x, y)                    Raises:            OCRObjectNotFound        """        deadline = time.time() + timeout        first = True        while first or time.time() < deadline:            first = False            all = self.all()            if all:                return all        raise OCRObjectNotFound(self._text)    def click(self, timeout=10):        result = self.wait(timeout=timeout)        _, x, y = result[0]        self._d.click(x, y)if __name__ == '__main__':    import uiautomator2.ext.ocr as ocr    import uiautomator2 as u2    d = u2.connect()    print(ocr.OCR(d)("王者峡谷").click())
 |