def _esc(text) -> str: return (str(text).replace("&", "&").replace("<", "<") .replace(">", ">").replace('"', """)) def _kb(value: int) -> str: if value < 1024: return f"{value} B" if value < 1024 * 1024: return f"{value / 1024:.1f} KB" return f"{value / 1024 / 1024:.1f} MB" def _uptime(seconds: int) -> str: days, rest = divmod(int(seconds), 86400) hours, rest = divmod(rest, 3600) minutes = rest // 60 if days: return f"{days} 天 {hours} 小时" if hours: return f"{hours} 小时 {minutes} 分" return f"{minutes} 分" # ====================================================================== # 启动 # ====================================================================== class Server(ThreadingHTTPServer): daemon_threads = True allow_reuse_address = True request_queue_size = 64 def main() -> int: DATA_DIR.mkdir(parents=True, exist_ok=True) try: server = Server((BIND, PORT), Handler) except OSError as exc: print(f"监听 {BIND}:{PORT} 失败:{exc}") return 1 log(f"中转服务器 v{VERSION} 启动,监听 {BIND}:{PORT}") log(f"长轮询 {POLL_SECONDS:.0f} 秒 · 队列上限 " f"{MAX_QUEUE_BYTES // 1024} KB · 数据目录 {DATA_DIR}") key = admin_key() log(f"管理页:http://<本机>:{PORT}/?key={key}") log(f"(钥匙也在 {DATA_DIR / 'admin_key.txt'})") try: server.serve_forever() except KeyboardInterrupt: log("收到中断,退出") finally: server.server_close() return 0 if __name__ == "__main__": sys.exit(main())