import json import os import signal import sys import time from datetime import datetime, timezone from wcferry import Wcf PORT = int(os.environ.get("WCF_COMMAND_PORT", "10086")) STATE_ROOT = os.environ.get("WCF_STATE_ROOT", r"C:\UniDesk\personal-wechat\wcf-state") DEBUG = os.environ.get("WCF_DEBUG", "false").lower() == "true" STOP = False def now_iso(): return datetime.now(timezone.utc).isoformat() def log(event, **fields): os.makedirs(STATE_ROOT, exist_ok=True) payload = {"ts": now_iso(), "event": event, **fields} line = json.dumps(payload, ensure_ascii=False, sort_keys=True) print(line, flush=True) with open(os.path.join(STATE_ROOT, "wcf-host.log"), "a", encoding="utf-8") as fp: fp.write(line + "\n") def handle_signal(_signum, _frame): global STOP STOP = True signal.signal(signal.SIGTERM, handle_signal) signal.signal(signal.SIGINT, handle_signal) def main(): log("wcf-host-start", port=PORT, debug=DEBUG) wcf = Wcf(port=PORT, debug=DEBUG, block=False) while not STOP: try: logged_in = bool(wcf.is_login()) qrcode = "" if not logged_in: try: qrcode = wcf.get_qrcode() except Exception: qrcode = "" state = { "ts": now_iso(), "isLogin": logged_in, "qrcodePresent": bool(qrcode), "commandPort": PORT, "messagePort": PORT + 1, } if qrcode: state["qrcode"] = qrcode with open(os.path.join(STATE_ROOT, "status.json"), "w", encoding="utf-8") as fp: json.dump(state, fp, ensure_ascii=False, indent=2, sort_keys=True) log("wcf-host-status", isLogin=logged_in, qrcodePresent=bool(qrcode)) time.sleep(5) except Exception as exc: log("wcf-host-error", error=f"{type(exc).__name__}: {exc}"[:1000]) time.sleep(3) try: wcf.cleanup() except Exception: pass log("wcf-host-stop") if __name__ == "__main__": main()