extract_signkey.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. """Extract signkey from 996box env.json and add/update it in .env.
  2. Run this once per machine to bootstrap credentials. The signkey is
  3. written to .env (gitignored) and never displayed in chat output.
  4. """
  5. import base64
  6. import json
  7. import os
  8. import re
  9. from pathlib import Path
  10. ENV_JSON_PATH = Path(r"D:\ProgramFiles\996box\GameBoxDownload\1\env.json")
  11. ENV_FILE = Path(".env")
  12. SENSITIVE_LINE_RE = re.compile(r"^CQ2_SIGNKEY=.*$", re.MULTILINE)
  13. def extract_signkey(path: Path) -> str | None:
  14. if not path.exists():
  15. return None
  16. raw = path.read_bytes()
  17. text = raw.decode("utf-8", errors="replace")
  18. for marker in ("MeyJ", "eyJ", "{"):
  19. idx = text.find(marker)
  20. if idx < 0:
  21. continue
  22. b64 = text[idx:].rstrip()
  23. try:
  24. padded = b64 + "=" * (-len(b64) % 4)
  25. decoded = base64.urlsafe_b64decode(padded)
  26. obj = json.loads(decoded.decode("utf-8", errors="replace"))
  27. if isinstance(obj, dict) and "signkey" in obj:
  28. sk = obj["signkey"]
  29. if isinstance(sk, str) and sk:
  30. return sk
  31. except Exception:
  32. continue
  33. return None
  34. def update_env_file(path: Path, signkey: str) -> None:
  35. if not path.exists():
  36. # create minimal .env
  37. path.write_text(
  38. f"CQ2_ACCOUNT=\n"
  39. f"CQ2_PASSWORD=\n"
  40. f"CQ2_SIGNKEY={signkey}\n"
  41. f"CQ2_GATE_HOST=jycq-206923.dhsf.xqhuyu.com\n"
  42. f"CQ2_GATE_PORT=8001\n",
  43. encoding="utf-8",
  44. )
  45. return
  46. text = path.read_text(encoding="utf-8")
  47. if SENSITIVE_LINE_RE.search(text):
  48. text = SENSITIVE_LINE_RE.sub(f"CQ2_SIGNKEY={signkey}", text)
  49. else:
  50. text = text.rstrip("\n") + f"\n\n# Extracted from env.json (per-account signkey)\nCQ2_SIGNKEY={signkey}\n"
  51. path.write_text(text, encoding="utf-8")
  52. def main() -> int:
  53. signkey = extract_signkey(ENV_JSON_PATH)
  54. if signkey is None:
  55. print(f"error: could not extract signkey from {ENV_JSON_PATH}", flush=True)
  56. return 1
  57. print(f"extracted signkey (len={len(signkey)}) from {ENV_JSON_PATH}", flush=True)
  58. update_env_file(ENV_FILE, signkey)
  59. print(f"updated {ENV_FILE.resolve()}", flush=True)
  60. print(f"signkey not displayed (written to .env only)", flush=True)
  61. return 0
  62. if __name__ == "__main__":
  63. import sys
  64. sys.exit(main())