# chatai 评审报告

## 修复前问题清单 (9项)

| # | 严重度 | 问题 | 文件 |
|---|--------|------|------|
| 1 | **致命** | 模块导入即执行`force_kill_chrome()`，杀死系统所有Chrome进程 | __init__.py:59 |
| 2 | **高** | 裸`except:`吞掉所有异常(3处) | __init__.py:55,84,182 |
| 3 | **高** | markdown输出直接注入HTML模板，存在XSS风险 | screenshot.py:9 |
| 4 | **高** | `create_task`未保存引用，task可能被GC回收 | __init__.py:170 |
| 5 | **高** | `os._exit(0)`绕过所有清理逻辑 | __init__.py:70 |
| 6 | **中** | 用`threading.Lock`保护async对象(应用`asyncio.Lock`) | __init__.py:34 |
| 7 | **中** | 图片路径硬编码`output.png`，并发请求互相覆盖 | __init__.py:163 |
| 8 | **中** | 每次API调用创建新OpenAI client | __init__.py:121 |
| 9 | **低** | 未使用导入: `types`/`T_State`/`signal`/`atexit`/`threading`/`subprocess`(部分) | __init__.py |

## 修复内容

### __init__.py (重写)
- 移除模块级`force_kill_chrome()`，改为`@driver.on_startup`延迟执行
- 移除`signal`/`atexit`/`threading`/`os._exit`，使用NoneBot生命周期管理
- `threading.Lock` → `asyncio.Lock`
- 裸`except:` → `except Exception` + 日志
- `create_task` → `_recall_tasks`集合 + `add_done_callback`
- OpenAI client → 单例`_get_ai_client()`
- 图片路径 → `f"data/chatai/output_{event.message_id}.png"`，发送后清理
- `except FinishedException: pass` → `raise`（不可吞）

### screenshot.py (重构)
- `html.escape()`防XSS后用`markdown.markdown()`转换
- 变量名`html` → `html_content`避免冲突
- `page`提前初始化为`None`，`locals()`检查 → 直接变量检查
- 资源清理加`try/except`防止二次异常
- `from pyppeteer import launch`延迟导入到需要时

### config.py (不变)
- 无问题，保持原样

### chrome_manager.py (不变)
- 独立脚本，无安全问题
