account_stats.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/env python3
  2. import sys
  3. import asyncio
  4. from pathlib import Path
  5. from dotenv import load_dotenv
  6. # Load .env file from parent directory
  7. BASE_DIR = Path(__file__).resolve().parent.parent
  8. load_dotenv(BASE_DIR / ".env")
  9. # Add parent directory to path for imports
  10. sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
  11. from db import init_db, close_db, row_to_dict
  12. async def gather_stats():
  13. """连接数据库,查询并打印全面的账户统计信息。"""
  14. db = await init_db()
  15. try:
  16. accounts = await db.fetchall("SELECT * FROM accounts ORDER BY created_at DESC")
  17. except Exception as e:
  18. print(f"查询账户时出错: {e}", file=sys.stderr)
  19. await close_db()
  20. sys.exit(1)
  21. accounts = [row_to_dict(acc) for acc in accounts]
  22. total_accounts = len(accounts)
  23. if total_accounts == 0:
  24. print("数据库中没有找到任何账户。")
  25. await close_db()
  26. return
  27. # --- 汇总统计 ---
  28. enabled_accounts = [acc for acc in accounts if acc.get('enabled')]
  29. disabled_accounts = [acc for acc in accounts if not acc.get('enabled')]
  30. refresh_failed_accounts = [acc for acc in accounts if acc.get('last_refresh_status') == 'failed']
  31. never_used_accounts = [acc for acc in accounts if acc.get('success_count', 0) == 0]
  32. error_accounts = [acc for acc in accounts if acc.get('error_count', 0) > 0]
  33. total_success_count = sum(acc.get('success_count', 0) for acc in accounts)
  34. print("--- 账户统计摘要 ---")
  35. print(f"总账户数: {total_accounts}")
  36. print(f" - 启用中: {len(enabled_accounts)}")
  37. print(f" - 已禁用: {len(disabled_accounts)}")
  38. print("-" * 20)
  39. print(f"Token刷新失败数: {len(refresh_failed_accounts)}")
  40. print(f"从未使用过的账户数: {len(never_used_accounts)}")
  41. print(f"有错误记录的账户数: {len(error_accounts)}")
  42. print(f"所有账户总成功调用次数: {total_success_count}")
  43. print("-" * 20)
  44. # --- 详细列表 ---
  45. print("\n--- 账户详细列表 ---")
  46. header = "| {:<8s} | {:<6s} | {:<15s} | {:<5s} | {:<5s} | {:<12s} | {:<20s} |".format(
  47. "状态", "启用", "标签 (Label)", "成功", "错误", "刷新状态", "最后刷新时间"
  48. )
  49. print(header)
  50. print("-" * len(header))
  51. for acc in accounts:
  52. # 状态 emoji
  53. status_icon = "✅" if acc.get('enabled') else "❌"
  54. if acc.get('last_refresh_status') == 'failed':
  55. status_icon = "⚠️"
  56. # 格式化输出
  57. enabled_str = "是" if acc.get('enabled') else "否"
  58. label = acc.get('label') or "(无)"
  59. # 截断过长的标签
  60. if len(label) > 15:
  61. label = label[:12] + "..."
  62. last_refresh_time = acc.get('last_refresh_time') or "从未"
  63. last_refresh_status = acc.get('last_refresh_status') or "never"
  64. print("| {:<10s} | {:<8s} | {:<15s} | {:<5d} | {:<5d} | {:<12s} | {:<20s} |".format(
  65. status_icon,
  66. enabled_str,
  67. label,
  68. acc.get('success_count', 0),
  69. acc.get('error_count', 0),
  70. last_refresh_status,
  71. last_refresh_time
  72. ))
  73. print("-" * len(header))
  74. await close_db()
  75. def main():
  76. """脚本主入口"""
  77. asyncio.run(gather_stats())
  78. sys.exit(0)
  79. if __name__ == "__main__":
  80. main()