90 lines
3.3 KiB
Python
90 lines
3.3 KiB
Python
import re
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
import xml.etree.ElementTree as ET
|
|
|
|
ADB = ["adb"]
|
|
|
|
|
|
def adb(*args):
|
|
subprocess.run(ADB + list(args), check=False)
|
|
|
|
|
|
def main():
|
|
adb("shell", "am", "force-stop", "my.com.tngdigital.ewallet")
|
|
time.sleep(2)
|
|
adb("shell", "am", "start", "-n", "my.com.tngdigital.ewallet/.ui.SplashActivity")
|
|
time.sleep(16)
|
|
adb("shell", "uiautomator", "dump", "/sdcard/ui_cc.xml")
|
|
xml = subprocess.check_output(
|
|
ADB + ["shell", "cat", "/sdcard/ui_cc.xml"], text=True, errors="ignore")
|
|
root = ET.fromstring(xml)
|
|
target = None
|
|
register_btn = None
|
|
for node in root.iter("node"):
|
|
rid = node.get("resource-id") or ""
|
|
text = node.get("text") or ""
|
|
if "tv_left" in rid or (text.strip().startswith("+") and len(text.strip()) < 8):
|
|
target = node
|
|
if "注册" in text and node.get("clickable") == "true":
|
|
register_btn = node
|
|
if target is None and register_btn is not None:
|
|
bounds = register_btn.get("bounds", "")
|
|
m = re.match(r"\[(\d+),(\d+)\]\[(\d+),(\d+)\]", bounds)
|
|
if m:
|
|
x1, y1, x2, y2 = map(int, m.groups())
|
|
x, y = (x1 + x2) // 2, (y1 + y2) // 2
|
|
print(f"tap register at {x},{y}")
|
|
adb("shell", "input", "tap", str(x), str(y))
|
|
time.sleep(4)
|
|
adb("shell", "uiautomator", "dump", "/sdcard/ui_cc.xml")
|
|
xml = subprocess.check_output(
|
|
ADB + ["shell", "cat", "/sdcard/ui_cc.xml"], text=True, errors="ignore")
|
|
root = ET.fromstring(xml)
|
|
for node in root.iter("node"):
|
|
rid = node.get("resource-id") or ""
|
|
text = node.get("text") or ""
|
|
if "tv_left" in rid or (text.strip().startswith("+") and len(text.strip()) < 8):
|
|
target = node
|
|
break
|
|
if target is None:
|
|
for node in root.iter("node"):
|
|
text = node.get("text") or ""
|
|
if "注册" in text or "Register" in text.lower():
|
|
print("login screen text:", text[:40])
|
|
print("ERROR: country code control not found")
|
|
return 1
|
|
bounds = target.get("bounds", "")
|
|
m = re.match(r"\[(\d+),(\d+)\]\[(\d+),(\d+)\]", bounds)
|
|
if not m:
|
|
print("bad bounds", bounds)
|
|
return 1
|
|
x1, y1, x2, y2 = map(int, m.groups())
|
|
x, y = (x1 + x2) // 2, (y1 + y2) // 2
|
|
print(f"tap country {target.get('text','')} at {x},{y}")
|
|
adb("shell", "input", "tap", str(x), str(y))
|
|
time.sleep(3)
|
|
adb("shell", "uiautomator", "dump", "/sdcard/ui_cc2.xml")
|
|
xml2 = subprocess.check_output(
|
|
ADB + ["shell", "cat", "/sdcard/ui_cc2.xml"], text=True, errors="ignore")
|
|
root2 = ET.fromstring(xml2)
|
|
countries = []
|
|
for node in root2.iter("node"):
|
|
text = (node.get("text") or "").strip()
|
|
if "+61" in text or "+86" in text or "Australia" in text or "Malaysia" in text:
|
|
countries.append(text)
|
|
pid = subprocess.check_output(
|
|
ADB + ["shell", "pidof", "my.com.tngdigital.ewallet"], text=True).strip()
|
|
print("pid:", pid or "DEAD")
|
|
print("countries visible:", countries[:8])
|
|
if countries:
|
|
print("OK region picker visible")
|
|
return 0
|
|
print("FAIL region picker empty/black")
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|