"""本地账号管理服务 — tripocli serve. tripocli serve # 打开 http://127.0.0.1:8765/ tripocli serve --port 9000 --open # 指定端口并自动打开浏览器 页面里可以粘贴/更新 cookie、查看会话有效期与积分额度、切换当前账号、删除账号。 默认只监听 127.0.0.1:能访问到它的人就能以该账号身份调用接口。 """ import subprocess import sys import webbrowser from ..server import serve NAME = "serve" HELP = "启动本地账号管理服务(网页里粘贴/更新 cookie、看有效期与积分)" LOOPBACK = {"127.0.0.1", "localhost", "::1"} def add_arguments(parser): parser.add_argument("--host", default="127.0.0.1", help="监听地址(默认 127.0.0.1)") parser.add_argument("--port", type=int, default=8765, help="监听端口(默认 8765,0 表示自动分配)") parser.add_argument("--open", action="store_true", help="启动后自动打开浏览器") parser.add_argument("--quiet", action="store_true", help="不打印请求日志") def run(ctx): args = ctx.args httpd, url = serve(host=args.host, port=args.port) if args.quiet: httpd.RequestHandlerClass.log_message = lambda *a, **k: None ctx.out.line(f"🖥 账号管理服务已启动: {url}") ctx.out.line(f" 账号文件: {ctx.accounts.path}") if args.host not in LOOPBACK: ctx.out.line(f" ⚠️ 正在监听 {args.host},局域网内任何人都能访问并操作该账号,请谨慎使用") ctx.out.line(" 按 Ctrl+C 停止") if args.open: try: webbrowser.open(url) except Exception: try: subprocess.Popen(["open", url]) except Exception: ctx.out.line(" (无法自动打开浏览器,请手动访问上面的地址)") try: httpd.serve_forever() except KeyboardInterrupt: ctx.out.line("\n已停止") finally: httpd.server_close() return {"url": url}