#!/usr/bin/env python3 import os import subprocess import sys import time from datetime import datetime ADDRESS = os.getenv("ADB_ADDRESS", "127.0.0.1:5555") REDROID = os.getenv("REDROID_CONTAINER", "redroid") TASKS = ["startup", "recruit", "infrast", "fight", "mall", "award"] DIRECT = {k: v for k, v in os.environ.items() if k.lower() not in ("http_proxy", "https_proxy", "all_proxy")} def command(args, proxy=False): print(f"[{datetime.now():%H:%M:%S}] {' '.join(args)}", flush=True) return subprocess.run(args, env=os.environ if proxy else DIRECT).returncode def retry(args): for attempt in range(3): if command(args) == 0: return True print(f"命令失败,第 {attempt + 1}/3 次", flush=True) time.sleep(1) return False def maa(*args): return ["maa", *args, "--batch", "-a", ADDRESS] def wait_android(): print("等待 Android 启动……", flush=True) deadline = time.monotonic() + 180 while time.monotonic() < deadline: try: subprocess.run(["adb", "connect", ADDRESS], env=DIRECT, capture_output=True, timeout=10) result = subprocess.run(["adb", "-s", ADDRESS, "shell", "getprop", "sys.boot_completed"], env=DIRECT, capture_output=True, text=True, timeout=10) if result.returncode == 0 and result.stdout.strip() == "1": return True except subprocess.TimeoutExpired: pass time.sleep(2) print("Android 启动超时", flush=True) return False def task(name): for _ in range(3): if retry(maa("run", name)): return True print(f"任务 {name} 失败,重新打开游戏后重试", flush=True) retry(maa("closedown")) retry(maa("run", "startup")) return False def main(): # 更新走代理;失败时仍尝试使用已有版本,与原脚本一致。 command(["maa", "update"], proxy=True) command(["maa", "self", "update"], proxy=True) if command(["docker", "restart", REDROID]): return 1 failed = False ready = False try: ready = wait_android() if not ready: return 1 retry(["adb", "-s", ADDRESS, "shell", "am", "start", "--windowingMode", "4", "com.hypergryph.arknights/com.u8.sdk.U8UnityContext"]) for name in TASKS: if not task(name): failed = True finally: if ready and not retry(maa("closedown")): failed = True if command(["docker", "stop", REDROID]): failed = True return int(failed) if __name__ == "__main__": sys.exit(main())