186 lines
7.4 KiB
Python
186 lines
7.4 KiB
Python
"""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 <id>")
|
||
print(" python main.py set-login-status <id> <0|1> # 跨技能回写登录态")
|
||
print(" python main.py open <id>")
|
||
print(" python main.py login <id>")
|
||
print(" python main.py delete id <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 <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 <account_id> <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()
|