如何在命令行查火山CodingPlan用量

admin 2026-06-30 07:33:29 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍如何使用火山引擎ArkCLI工具查询CodingPlan用量,包括安装ark-cli、SSO登录、连接AIAgent技能的方法,并提供Python脚本对原始JSON输出进行可视化处理,展示用量百分比、剩余额度及重置时间等信息。作者实测GLM-5.2单轮对话消耗9.6%额度,并分享了多账号轮换使用的经验。 综合评分: 72 文章分类: 安全工具,解决方案,技术标准


cover_image

如何在命令行查火山 Coding Plan 用量

原创

hyang0 hyang0

生有可恋

2026年6月27日 09:00 湖北

在小说阅读器读本章

去阅读

火山提供了 Ark CLI 工具以及对应的 Claude Code Skill ,可以直接在 Claude Code 中查用量。

效果如下:

通过 arkcli 是可以查看所使用的 coding plan 的情况的。

不过使用前需要先通过 ark cli 登录,登录后 sso 状态会保留一段时间(47h)。

ark cli 安装:

npm install -g @volcengine/ark-cli

登录:

# 登录方式 :火山 SSO 浏览器登录 (推荐)arkcli auth login volc-sso

安装 skills :

# 装 skill 到你常用的 AI Agent (Claude Code / Cursor / trae / Gemini CLI 等)arkcli +connect

为了使用方便,我又将这个skill封了一层方便自己用。

封装好的 skill 使用效果如下:

测试了一下,底层使用的命令是:

$ arkcli usage plan

输出不是很直观:

除了使用安装的 skill ,也可以直接写一个 Python 脚本处理命令输出。

处理后的效果:

火山的 GLM-5.2 是不太够用,一轮对话差不多要用掉9.6%,查之前是0%,写了一个下面的脚本就用了周额度的1.3%,如果用的比较多的还真不够用。我两个号轮着在用,这个号用的比较少,可以作为用量参考。以后写代码都是要花钱的,古法编程不花钱。

脚本:

#!/usr/bin/env python3"""arkcli usage plan 输出封装工具方便查看 coding plan 用量"""import jsonimport subprocessimport sysfrom datetime import datetimedef get_usage_plan():    """调用 arkcli usage plan 获取数据"""    try:        result = subprocess.run(            ["arkcli", "usage", "plan", "--format", "json"],            capture_output=True,            text=True,            check=True        )        return json.loads(result.stdout)    except FileNotFoundError:        print("错误: 未找到 arkcli 命令", file=sys.stderr)        sys.exit(1)    except subprocess.CalledProcessError as e:        print(f"错误: arkcli 命令执行失败", file=sys.stderr)        if e.stderr:            try:                err_json = json.loads(e.stderr)                if err_json.get("error", {}).get("message"):                    print(f"  {err_json['error']['message']}", file=sys.stderr)            except:                print(f"  {e.stderr}", file=sys.stderr)        sys.exit(1)    except json.JSONDecodeError:        print("错误: 无法解析 arkcli 输出", file=sys.stderr)        sys.exit(1)def format_timestamp(ts):    """格式化时间戳 (自动处理秒/毫秒)"""    if ts == -1:        return "无数据"    try:        # 判断是秒还是毫秒        if ts > 9999999999:  # 大于这个值说明是毫秒            dt = datetime.fromtimestamp(ts / 1000)        else:            dt = datetime.fromtimestamp(ts)        return dt.strftime("%Y-%m-%d %H:%M:%S")    except (ValueError, OSError):        return "无效时间"def get_progress_bar(percent, width=30):    """生成进度条"""    filled = int(width * percent / 100)    bar = "█" * filled + "░" * (width - filled)    return bardef get_percent_color(percent):    """根据百分比获取颜色代码"""    if percent >= 80:        return "\033[91m"  # 红色    elif percent >= 50:        return "\033[93m"  # 黄色    else:        return "\033[92m"  # 绿色def print_coding_plan(item):    """打印 Coding Plan 详情"""    product_name = {        "coding-plan": "Coding Plan (个人版)",        "coding-plan-team": "Coding Plan (团队版)"    }.get(item["product"], item["product"])    print(f"\n\033[1;34m{product_name}\033[0m")    print("─" * 60)    if not item.get("subscribed", False):        print("  未订阅")        return    if "updated_at" in item:        print(f"  数据更新: {format_timestamp(item['updated_at'])}")    print()    periods = item.get("periods", [])    if not periods:        print("  暂无用量数据")        return    period_labels = {        "session": "会话周期",        "weekly": "每周额度",        "monthly": "每月额度",        "5h": "5小时额度"    }    for period in periods:        label = period_labels.get(period["label"], period["label"])        percent = float(period.get("percent", 0))        color = get_percent_color(percent)        reset = "\033[0m"        print(f"  \033[1m{label}\033[0m")        print(f"    进度: {color}{get_progress_bar(percent)} {percent:.1f}%{reset}")        if "used" in period and "total" in period:            used = period["used"]            total = period["total"]            remaining = total - used            print(f"    用量: {used:,} / {total:,} (剩余: {remaining:,})")        print(f"    重置: {format_timestamp(period.get('reset_at', -1))}")        print()def print_agent_plan(item):    """打印 Agent Plan 详情"""    product_name = {        "agent-plan": "Agent Plan (个人版)",        "agent-plan-team": "Agent Plan (团队版)"    }.get(item["product"], item["product"])    tier = item.get("tier", "")    if tier:        product_name += f" - {tier}"    print(f"\n\033[1;35m{product_name}\033[0m")    print("─" * 60)    if not item.get("subscribed", False):        print("  未订阅")        return    if "seat_id" in item:        print(f"  席位: {item['seat_id']}")    print()    periods = item.get("periods", [])    if not periods:        print("  暂无用量数据")        return    period_labels = {        "session": "会话周期",        "weekly": "每周额度",        "monthly": "每月额度",        "5h": "5小时额度"    }    for period in periods:        label = period_labels.get(period["label"], period["label"])        percent = float(period.get("percent", 0))        color = get_percent_color(percent)        reset = "\033[0m"        print(f"  \033[1m{label}\033[0m")        print(f"    进度: {color}{get_progress_bar(percent)} {percent:.1f}%{reset}")        if "used" in period and "total" in period:            used = period["used"]            total = period["total"]            remaining = total - used            print(f"    用量: {used:,} / {total:,} AFP (剩余: {remaining:,})")        print(f"    重置: {format_timestamp(period.get('reset_at', -1))}")        print()def print_viewer(viewer):    """打印查看者信息"""    print("\033[1;36m" + "=" * 60 + "\033[0m")    print("\033[1;36mARK 套餐用量查看\033[0m")    print("\033[1;36m" + "=" * 60 + "\033[0m")    print()    print("\033[1m当前身份:\033[0m")    auth_method = viewer.get("auth_method", "unknown")    auth_display = {        "sso": "SSO 登录",        "aksk": "AK/SK 登录",        "apikey": "API Key 登录",        "none": "未登录"    }.get(auth_method, auth_method)    print(f"  认证方式: {auth_display}")    if viewer.get("profile"):        print(f"  当前 Profile: {viewer['profile']}")    if viewer.get("region"):        print(f"  区域: {viewer['region']}")    if viewer.get("user_name"):        print(f"  用户: {viewer['user_name']}")    if viewer.get("account_id"):        print(f"  账号: {viewer['account_id']}")def main():    """主函数"""    data = get_usage_plan()    viewer = data.get("viewer", {})    items = data.get("items", [])    print_viewer(viewer)    if not items:        print("\n  未找到任何套餐数据")        return    # 先打印 coding plan,再打印 agent plan    coding_items = [i for i in items if "coding-plan" in i["product"]]    agent_items = [i for i in items if "agent-plan" in i["product"]]    for item in coding_items:        print_coding_plan(item)    for item in agent_items:        print_agent_plan(item)    print("─" * 60)    print()if __name__ == "__main__":    main()

全文完。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:生有可恋 hyang0 hyang0《如何在命令行查火山 Coding Plan 用量》

评论:0   参与:  0