#!/usr/bin/env python3 """ Sentry UX Audit Script ====================== 使用 Sentry Session Replay + Error Data 自動審計 UI/UX 問題 執行方式: cd apps/api python scripts/audit_ux_sentry.py 輸出: - 有錯誤的 Session Replay - 憤怒點擊 (Rage Clicks) 統計 - 死亡點擊 (Dead Clicks) 統計 - UI 相關錯誤列表 版本: v1.0 建立: 2026-03-29 (台北時區) 建立者: Claude Code (Phase 19 UX 監控) """ import asyncio import json import sys from pathlib import Path # 添加專案路徑 sys.path.insert(0, str(Path(__file__).parent.parent)) from src.services.sentry_service import SentryService async def main(): """執行 UX 審計""" print("=" * 60) print("AWOOOI UX Audit via Sentry Session Replay") print("=" * 60) print() service = SentryService() # 檢查連線 projects = await service.list_projects() if not projects: print("❌ 無法連線 Sentry API,請檢查:") print(" - SENTRY_SELF_HOSTED_URL") print(" - SENTRY_AUTH_TOKEN") print(" - SENTRY_ORG") return print(f"✅ Sentry 連線成功,找到 {len(projects)} 個專案") print() # 取得 UX 審計摘要 print("📊 執行 UX 審計...") print("-" * 60) summary = await service.get_ux_audit_summary() # 輸出摘要 print() print("🔍 UX 問題摘要:") print(f" 有錯誤的 Replay 數: {summary['replays_with_errors']}") print(f" 憤怒點擊 (Rage Clicks): {summary['rage_clicks']}") print(f" 死亡點擊 (Dead Clicks): {summary['dead_clicks']}") print(f" UI 錯誤數: {summary['ui_errors']}") print() # 輸出詳情 if summary["details"]: print("📝 問題詳情:") print("-" * 60) for i, detail in enumerate(summary["details"][:15], 1): # 最多 15 筆 detail_type = detail.get("type", "unknown") if detail_type == "replay_with_errors": print(f"{i}. 🎥 Replay 有 {detail.get('error_count', 0)} 個錯誤") print(f" URL: {detail.get('url', 'N/A')}") urls = detail.get("urls", []) if urls: print(f" 訪問頁面: {', '.join(urls[:2])}") print() elif detail_type == "ui_error": print(f"{i}. 🐛 UI Error: {detail.get('title', 'N/A')[:60]}...") print(f" 發生次數: {detail.get('count', 0)}") print(f" URL: {detail.get('url', 'N/A')}") print() else: print("✨ 太棒了!目前沒有檢測到明顯的 UX 問題") print() # 總結與建議 print("=" * 60) total_issues = ( summary["replays_with_errors"] + summary["ui_errors"] ) if total_issues > 10: print("🔴 UX 健康度: 差 - 需要立即處理") print(" 建議: 優先修復 UI Error,然後檢視 Rage Click Replay") elif total_issues > 3: print("🟡 UX 健康度: 普通 - 有改善空間") print(" 建議: 逐一檢視問題 Replay 找出根因") else: print("🟢 UX 健康度: 良好") print(" 建議: 持續監控,設置 Alert 自動通知") print() print("💡 查看完整 Session Replay:") print(f" {service.base_url}/organizations/{service.org}/replays/") print() # 輸出 JSON (供 CI 使用) json_output = Path(__file__).parent / "ux_audit_result.json" with open(json_output, "w") as f: json.dump(summary, f, indent=2, ensure_ascii=False) print(f"📄 JSON 結果已保存: {json_output}") if __name__ == "__main__": asyncio.run(main())