123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- # coding: utf-8
- #
- """
- import uiautomator2 as u2
- import uiautomator2.ext.ocr as ocr
- u2.plugin_add("ocr", ocr.OCR)
- d = u2.connect()
- d.ext_ocr("对战模式").click()
- """
- import requests
- import time
- API = ""
- class OCRObjectNotFound(Exception):
- pass
- class 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())
|