"""CLI 入口:用法说明与 argv 分发。""" import sys from service.account_service import ( cmd_add, cmd_delete_by_id, cmd_delete_by_platform, cmd_delete_by_platform_phone, cmd_get, cmd_list, cmd_list_json, cmd_pick_logged_in, cmd_pick_web, cmd_set_login_status, ) from service.browser_service import cmd_login, cmd_open from util.constants import _apply_cli_local_dev_env from util.logging_config import get_skill_logger from util.platforms import _platform_list_cn_for_help, resolve_platform_key from util.runtime_paths import _maybe_print_paths_debug_cli def _cli_print_full_usage() -> None: """总览(未带子命令或需要完整说明时)。""" print("用法概览(将 main.py 换为你的路径):") print(" python main.py add <平台中文名> <手机号>") print(" python main.py list [平台|all|全部]") print(" python main.py pick-logged-in <平台> # 跨技能用:仅已登录账号,一行 JSON 或 ERROR") print(" python main.py pick-web <平台> # 跨技能用:优先已登录,否则最新一条账号") print(" python main.py list-json <平台|all> [--limit N] # 跨技能用:一行 JSON 数组,元素同 get") print(" python main.py get ") print(" python main.py set-login-status <0|1> # 跨技能回写登录态") print(" python main.py open ") print(" python main.py login ") print(" python main.py delete id ") print(" python main.py delete platform <平台>") print(" python main.py delete platform <平台> <手机号>") print(" python main.py <平台> # 等价于只列该平台") print(" python main.py <平台> list # 同上") print() print("支持的平台(可用下列中文称呼,亦支持英文键如 sohu):") print(" " + _platform_list_cn_for_help()) def _cli_fail_add() -> None: print("ERROR:CLI_ADD_MISSING_ARGS") print() print("【add 添加账号】参数不足。") print(" 必填:平台名称(中文即可,如 搜狐号、知乎、微信公众号)") print(" 必填:中国大陆 11 位手机号(1 开头,第二位 3~9),同平台下不可重复") print() print("示例:") print(" python main.py add 搜狐号 13800138000") print(" python main.py add 知乎 13900001111") print() print("支持的平台:" + _platform_list_cn_for_help()) def _cli_fail_need_account_id(subcmd: str) -> None: print(f"ERROR:CLI_{subcmd.upper()}_MISSING_ID") print() print(f"【{subcmd}】缺少必填参数:账号 id(数据库自增整数,可先 list 查看)。") print("示例:") print(f" python main.py {subcmd} 1") def _cli_fail_delete() -> None: print("ERROR:CLI_DELETE_MISSING_ARGS") print() print("【delete 删除账号】参数不足。支持三种方式:") print(" 按 id:python main.py delete id ") print(" 按平台(删该平台下全部):python main.py delete platform <平台中文名或英文键>") print(" 按平台+手机号:python main.py delete platform <平台> <手机号>") print() print("示例:") print(" python main.py delete id 3") print(" python main.py delete platform 搜狐号") print(" python main.py delete platform 头条号 18925203701") print() print("说明:会同时删除数据库记录与 profile 用户数据目录(若存在)。") def main() -> None: if len(sys.argv) < 2: _cli_print_full_usage() sys.exit(1) _apply_cli_local_dev_env() get_skill_logger().info("cli_start argv=%s", sys.argv) cmd = sys.argv[1] _maybe_print_paths_debug_cli() plat_from_first = resolve_platform_key(cmd) if len(sys.argv) >= 3 and sys.argv[2] == "list" and plat_from_first: cmd_list(plat_from_first) elif plat_from_first and len(sys.argv) == 2: cmd_list(plat_from_first) elif cmd == "add": if len(sys.argv) < 4: _cli_fail_add() sys.exit(1) cmd_add(sys.argv[2], sys.argv[3]) elif cmd == "list": cmd_list(sys.argv[2] if len(sys.argv) >= 3 else "all") elif cmd == "get": if len(sys.argv) < 3: _cli_fail_need_account_id("get") sys.exit(1) cmd_get(sys.argv[2]) elif cmd == "set-login-status": if len(sys.argv) < 4: print("ERROR:CLI_SET_LOGIN_STATUS_MISSING_ARGS") print("用法:python main.py set-login-status <0|1>") print("说明:供 llm-manager 等脚本回写登录态;成功时 stdout 首行以 OK: 开头。") sys.exit(1) cmd_set_login_status(sys.argv[2], sys.argv[3]) elif cmd == "list-json": if len(sys.argv) < 3: print("ERROR:CLI_LIST_JSON_MISSING_PLATFORM") print("用法:python main.py list-json <平台|all|全部> [--limit N]") print("说明:跨技能编排;成功时 stdout 仅一行 JSON 数组(元素与 get 一致)。") sys.exit(1) av = sys.argv[2:] platform_arg = av[0] lim = 200 if "--limit" in av: i = av.index("--limit") if i + 1 < len(av): try: lim = int(av[i + 1]) except ValueError: pass cmd_list_json(platform_arg, limit=lim) elif cmd == "pick-logged-in": if len(sys.argv) < 3: print("ERROR:CLI_PICK_LOGGED_IN_MISSING_ARGS") print("用法:python main.py pick-logged-in <平台中文名或英文键>") print("说明:供 llm-manager 等技能查询该平台已登录账号;成功时 stdout 仅一行 JSON。") sys.exit(1) cmd_pick_logged_in(sys.argv[2]) elif cmd == "pick-web": if len(sys.argv) < 3: print("ERROR:CLI_PICK_WEB_MISSING_ARGS") print("用法:python main.py pick-web <平台中文名或英文键>") print("说明:供 llm-manager 等;优先已登录账号,否则返回该平台最新一条账号(未登录也可用于打开浏览器登录)。") sys.exit(1) cmd_pick_web(sys.argv[2]) elif cmd == "open": if len(sys.argv) < 3: _cli_fail_need_account_id("open") sys.exit(1) cmd_open(sys.argv[2]) elif cmd == "login": if len(sys.argv) < 3: _cli_fail_need_account_id("login") sys.exit(1) cmd_login(sys.argv[2]) elif cmd == "delete": if len(sys.argv) < 4: _cli_fail_delete() sys.exit(1) mode = (sys.argv[2] or "").strip().lower() if mode == "id": cmd_delete_by_id(sys.argv[3]) elif mode == "platform": if len(sys.argv) >= 5: cmd_delete_by_platform_phone(sys.argv[3], sys.argv[4]) else: cmd_delete_by_platform(sys.argv[3]) else: print(f"ERROR:CLI_DELETE_BAD_MODE 不支持的删除方式「{sys.argv[2]}」,请使用 id 或 platform。") _cli_fail_delete() sys.exit(1) else: print(f"ERROR:CLI_UNKNOWN_OR_BAD_ARGS 子命令「{cmd}」无法识别,或参数组合不合法。") print() _cli_print_full_usage() print() print("说明:list 的筛选可为 all/全部,或上面列出的任一平台中文名。") sys.exit(1) if __name__ == "__main__": main()