news 2026/9/5 9:51:18

AI自动化游戏对局复盘:本地部署与实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI自动化游戏对局复盘:本地部署与实战指南

这次我们来看一个游戏对局分析项目,它能把一场《英雄联盟》的精彩对局,从视频录像变成一份带时间戳、高光操作和战术点评的深度复盘报告。项目本身是一个开源工具,核心是结合了游戏录像解析、AI视觉识别和自然语言处理,自动生成类似“炫神”解说的那种激情复盘。对于想提升游戏理解、做教学素材或者单纯想自动化处理精彩集锦的玩家来说,这是个很实用的本地化方案。

最值得关注的点是它的自动化程度和本地部署能力。你不用手动一帧帧看录像,工具能自动识别击杀、团战、关键技能释放等事件,并配上风格化的解说文本。硬件门槛取决于你选择的AI模型,纯CPU推理可以跑但慢,有张支持CUDA的N卡(比如GTX 1060 6G以上)体验会好很多。本文将带你完成从环境搭建、录像准备、解析运行到报告生成的完整流程,并重点测试其事件识别准确度、解说风格定制以及批量处理多个录像文件的能力。如果你是一名游戏内容创作者、电竞分析师或深度游戏爱好者,这篇文章能帮你快速上手这个工具。

1. 核心能力速览

能力项说明
项目类型游戏对局录像自动分析与解说报告生成工具
核心功能解析游戏录像文件,自动识别高光时刻(击杀、团战、资源争夺),生成带时间戳的文本复盘报告,支持定制解说风格。
输入格式常见游戏录像格式(如.rofl(LOL),.dem等),或通用的视频文件(如.mp4,.mkv)。
输出结果结构化的JSON数据、Markdown格式复盘报告、或整合时间戳与事件描述的摘要文本。
AI能力依赖计算机视觉模型(识别画面事件)、语音识别(可选,解析游戏内语音)、自然语言处理(生成解说文本)。
推荐硬件支持CUDA的NVIDIA显卡(GTX 1060 6G或以上)可获得更快的解析速度。纯CPU也可运行。
显存占用取决于使用的视觉模型大小,通常在2GB-4GB左右。需按实际加载的模型版本测试。
运行平台Windows / Linux / macOS (依赖Python环境)
启动方式命令行启动为主,可配置为后台服务或定时任务。
是否支持API是。可部署为本地HTTP服务,通过API提交录像并获取分析结果。
是否支持批量是。支持指定目录批量处理录像文件,并汇总生成报告。
适合场景个人游戏复盘学习、电竞团队战术分析、游戏视频创作者自动生成素材、直播平台高光时刻自动剪辑。

2. 适用场景与使用边界

这个工具主要适合以下几类用户:

  1. 个人玩家与学习者:打完一场酣畅淋漓或遗憾落败的对局后,想超越“感觉”,客观复盘哪里做得好、哪里出了问题。工具自动标记的时间线和事件描述,能帮你快速定位关键决策点。
  2. 电竞团队与教练:需要高效分析训练赛或比赛录像。批量处理功能可以快速扫描大量对局,找出团队在特定时间段(如前15分钟、大龙团)的共性问题和高光表现,辅助制定战术。
  3. 游戏视频创作者与UP主:制作“顶级操作集锦”、“王者局复盘”类内容时,需要从大量录像中手动寻找素材。此工具能自动筛选出所有击杀、团战等潜在高光片段,极大提升素材筛选效率,甚至可以直接生成解说文案初稿。
  4. 直播平台与社区运营:可用于自动生成直播流的高光时刻切片,或为社区战报提供结构化数据支持。

使用边界与注意事项:

  • 游戏支持度:工具可能针对特定游戏(如英雄联盟)进行优化,对其他游戏录像的解析精度取决于训练数据的覆盖范围。使用前需确认其支持的游戏列表。
  • 录像来源合法性:必须使用自己拥有或已获得合法授权的游戏录像文件进行分析。禁止解析他人未公开的隐私录像或用于任何侵犯他人权益的用途。
  • AI识别误差:AI模型并非100%准确,可能误判或漏判某些复杂场景(如技能是否命中、伤害计算)。生成的解说文本是一种风格化概括,不可作为绝对精确的比赛记录。
  • 性能与成本:处理高清、长时长的录像文件对算力有要求。在CPU上处理可能非常耗时,需合理规划。
  • 内容合规性:自动生成的解说文本应进行人工审核,避免产生不当或违规内容,尤其是在公开场合使用或发布时。

3. 环境准备与前置条件

在开始部署前,请确保你的开发环境满足以下基本要求。

操作系统

  • Windows 10/11:推荐,对游戏录像文件的支持通常最好。
  • Linux:需要配置相应的图形库和驱动。
  • macOS:可能需要对部分依赖进行额外编译。

Python环境

  • Python 3.8 - 3.11:这是大多数AI框架兼容性较好的版本范围。
  • 包管理工具:确保pip已更新至最新版。

深度学习框架与CUDA

  • PyTorch 或 TensorFlow:具体依赖根据项目实现而定。通常PyTorch更常见。
  • CUDA 和 cuDNN:如果你使用NVIDIA GPU进行加速,必须安装与你的PyTorch/TensorFlow版本匹配的CUDA和cuDNN。例如,PyTorch 2.0+ 常对应 CUDA 11.7 或 11.8。
  • 显卡驱动:确保NVIDIA显卡驱动为较新版本。

其他系统依赖

  • FFmpeg:用于处理视频和音频流,是录像文件解析的核心工具。必须安装并添加到系统环境变量PATH中。
  • 磁盘空间:预留至少10-20GB空间,用于存放项目代码、模型文件、临时处理文件和分析结果。

检查清单在开始安装前,请在终端中运行以下命令进行基础检查:

# 检查Python版本 python --version # 检查pip版本及是否可正常安装包 pip --version # 检查FFmpeg是否安装 ffmpeg -version # 检查CUDA是否可用(如果使用GPU) python -c "import torch; print(torch.cuda.is_available())"

如果ffmpeg -version报错,需要去FFmpeg官网下载并配置环境变量。如果torch.cuda.is_available()返回False,则需要检查CUDA和PyTorch的版本匹配性。

4. 安装部署与启动方式

假设项目代码已从GitHub克隆到本地。我们以一个典型的项目结构为例。

步骤一:克隆项目与安装依赖

# 克隆项目仓库(假设项目地址为 git@github.com:xxx/xxx.git) git clone git@github.com:xxx/game-replay-analyzer.git cd game-replay-analyzer # 创建并激活Python虚拟环境(推荐) python -m venv venv # Windows venv\Scripts\activate # Linux/macOS source venv/bin/activate # 安装项目依赖 pip install -r requirements.txt

requirements.txt文件通常包含了opencv-python,pytorch,transformers,numpy,pandas等核心库。

步骤二:下载预训练模型许多AI分析工具需要额外的视觉或语言模型。

# 通常项目会提供下载脚本 python scripts/download_models.py # 或者根据文档手动将模型文件放置到指定目录,如 `./models/` # 模型文件可能较大,需耐心等待下载完成。

步骤三:基础配置检查项目根目录下是否存在config.yaml.env等配置文件,根据需要进行修改。常见配置项包括:

# config.yaml 示例 processing: fps: 5 # 抽帧频率,每秒分析几帧,越低越快但可能漏事件 resolution: 640 # 处理时缩放到的分辨率,降低可节省显存/内存 use_gpu: true # 是否使用GPU output: format: ["json", "markdown"] # 输出格式 save_clips: false # 是否保存高光片段视频 api: host: "127.0.0.1" port: 8000

步骤四:启动方式根据你的使用场景,选择以下一种方式启动。

1. 命令行单文件分析最直接的启动方式,适用于快速测试单个录像。

python analyze.py --input "path/to/your/replay.rofl" --output "./result"

运行后,工具会开始解析录像,并在./result目录下生成分析报告。

2. 启动本地API服务如果你希望从其他程序(如自己的网站、Bot)调用分析功能,可以启动API服务。

python api_server.py --host 0.0.0.0 --port 8000

启动后,服务将在http://127.0.0.1:8000运行,并提供提交任务、查询进度的接口。

3. 批量处理目录一次性处理一个文件夹内的所有录像文件。

python batch_process.py --input_dir "path/to/replay/folder" --output_dir "./batch_results"

5. 功能测试与效果验证

部署完成后,我们需要验证核心功能是否正常工作。准备一段你知道关键事件发生时间点的游戏录像(最好是自己的对局)进行测试。

5.1 基础录像解析测试

测试目的:验证工具能否正确读取录像文件,并完成基础的时间线解析。

# 使用最简单的参数运行分析 python analyze.py --input "test_video.mp4" --output "./test_output" --verbose

预期结果

  1. 程序开始运行,无报错。
  2. 控制台输出抽帧、模型推理等进度信息。
  3. ./test_output目录下,生成至少一个结果文件(如result.json)。判断成功:程序正常结束,并生成了输出文件。

5.2 高光事件识别准确性测试

测试目的:验证AI模型识别击杀、团战等事件的准确率。

  1. 使用一段包含至少3次击杀和1次小型团战(3v3以上)的录像。
  2. 运行分析脚本。
  3. 打开生成的result.json文件,查看events数组。
// result.json 片段示例 { "metadata": { "game": "League of Legends", "duration": 1800 }, "events": [ { "type": "kill", "start_time": 245.6, "end_time": 246.1, "description": "卡蜜尔(蓝色方)在上路单杀了菲奥娜(红色方)。", "confidence": 0.92 }, { "type": "teamfight", "start_time": 1020.3, "end_time": 1025.8, "description": "中路爆发5v5团战,蓝色方打出1换3并拿下听牌龙。", "confidence": 0.87 } ] }

操作与验证

  • 手动打开录像视频,跳转到start_time附近(如245秒)。
  • 观察画面是否与description描述的事件相符。
  • 记录识别正确和错误的事件。判断成功:对于你明确知道发生的关键事件,工具能识别出大部分(例如80%以上),且描述基本符合事实。允许存在置信度(confidence)较低的事件。

5.3 解说风格定制测试

测试目的:验证是否能生成类似“炫神”风格的激情解说文本。 通常需要在配置中指定风格模板或使用不同的语言模型。

python analyze.py --input "test_video.mp4" --output "./test_output" --style "hype" # 假设参数为 --style

或者在配置文件中修改:

nlp: style: "hype" # 可选:neutral, analytical, hype, streamer

预期结果:在生成的Markdown报告或JSON描述的description字段中,文本不再是中性描述,而是带有感叹号、流行语、情绪化表达的解说风格。例如:

  • 中性描述:“蓝色方打野击杀了红色方ADC。”
  • Hype风格:“我滴个龟龟!这打野从阴影里钻出来,ADC屏幕直接黑白!扣死!”判断成功:输出文本的风格明显区别于普通报告,符合预设的“激情解说”调性。

5.4 批量处理与输出组织测试

测试目的:验证批量处理功能的稳定性和输出文件的管理。

  1. ./batch_input文件夹内放入3-5个录像文件(格式相同)。
  2. 运行批量命令。
python batch_process.py --input_dir "./batch_input" --output_dir "./batch_output" --workers 2

预期结果

  1. 程序为每个输入文件创建一个子文件夹(或以文件名前缀),例如./batch_output/replay_1/
  2. 每个子文件夹内包含该录像独立的分析结果(json,md)。
  3. 程序可能还在根目录生成一个汇总报告summary.csvsummary.md,列出所有对局的关键统计(总击杀数、平均团战次数等)。判断成功:所有输入文件都被处理,输出结构清晰,没有文件遗漏或处理中断。

6. 接口 API 与批量任务

对于希望集成此能力的开发者,API服务模式提供了最大的灵活性。

6.1 启动API服务

确保在项目目录下,激活虚拟环境后运行:

python api_server.py --host 127.0.0.1 --port 8000 --log_level info

服务启动后,默认会提供Swagger UI文档,访问http://127.0.0.1:8000/docs可以查看所有接口。

6.2 核心API调用示例

提交分析任务

curl -X POST "http://127.0.0.1:8000/api/v1/analyze" \ -H "Content-Type: multipart/form-data" \ -F "file=@/path/to/your/replay.rofl" \ -F "config={\"output_format\": \"json\", \"style\": \"hype\"};type=application/json"

响应示例

{ "task_id": "550e8400-e29b-41d4-a716-446655440000", "status": "queued", "message": "Task submitted successfully." }

查询任务状态与结果

curl -X GET "http://127.0.0.1:8000/api/v1/task/550e8400-e29b-41d4-a716-446655440000"

响应示例(完成时)

{ "task_id": "550e8400-e29b-41d4-a716-446655440000", "status": "success", "result": { "download_url": "http://127.0.0.1:8000/api/v1/download/550e8400...", "events": [...], "summary": "..." } }

6.3 编程调用示例(Python)

import requests import json import time API_BASE = "http://127.0.0.1:8000/api/v1" def analyze_replay(file_path): # 1. 提交任务 with open(file_path, 'rb') as f: files = {'file': f} data = {'config': json.dumps({'output_format': 'markdown'})} resp = requests.post(f"{API_BASE}/analyze", files=files, data=data) task_info = resp.json() task_id = task_info['task_id'] print(f"Task submitted: {task_id}") # 2. 轮询结果 while True: status_resp = requests.get(f"{API_BASE}/task/{task_id}") status_data = status_resp.json() if status_data['status'] == 'success': # 3. 获取结果文件 result_url = status_data['result']['download_url'] result_resp = requests.get(result_url) with open(f'./output_{task_id}.md', 'wb') as out_f: out_f.write(result_resp.content) print("Analysis completed and saved.") break elif status_data['status'] == 'failed': print(f"Task failed: {status_data.get('message')}") break else: print(f"Task status: {status_data['status']}, waiting...") time.sleep(5) # 等待5秒再次查询 if __name__ == "__main__": analyze_replay("path/to/replay.rofl")

6.4 批量任务队列管理

对于大批量处理,建议:

  • 使用任务队列:如Celery + Redis,将API服务作为生产者,将实际解析任务放入队列,由多个工作进程消费。
  • 限制并发:在配置中设置max_concurrent_tasks,防止同时处理过多视频导致显存/内存溢出。
  • 结果去重:如果同一录像被多次提交,可以通过文件哈希值进行判重,直接返回已有结果。
  • 失败重试机制:对于因临时资源不足导致的失败任务,可以设置自动重试策略。

7. 资源占用与性能观察

了解工具运行时的资源消耗,对于优化和稳定运行至关重要。

显存占用观察工具运行时,主要的显存占用来自加载的AI模型(视觉模型和语言模型)。

  • 观察方法:在Linux下可以使用nvidia-smi命令,在Windows下可以使用任务管理器性能标签页或nvidia-smi.exe
  • 典型情况:一个中等规模的视觉检测模型(如YOLO系列)加载后可能占用1.5-2.5GB显存。如果同时加载大型语言模型(LLM)生成解说,显存占用可能增至4-8GB。务必根据你的显卡显存容量选择合适的模型
  • 降低显存技巧
    1. 在配置中降低处理分辨率(如从1080p降至720p或640p)。
    2. 降低抽帧频率(FPS),减少需要同时处理的帧数。
    3. 使用CPU进行语言模型推理(虽然速度慢,但节省显存)。
    4. 使用量化后的模型(如int8量化),牺牲少量精度换取显存和速度提升。

CPU与内存占用

  • 视频解码:使用FFmpeg进行视频抽帧会消耗CPU资源。高分辨率高码率视频解码压力较大。
  • 内存:抽出的帧会暂存在内存中。处理长视频时,内存占用可能线性增长。如果遇到内存不足(OOM)错误,需要降低batch_size(如果支持)或分段处理视频。

处理速度处理速度 = 视频时长 × 抽帧频率 × 单帧推理时间。

  • GPU推理:单帧推理时间可能在几十到几百毫秒。处理一段30分钟、5FPS的视频,理想情况下需要1800秒 * 5帧/秒 * 0.1秒/帧 = 900秒(15分钟)的纯推理时间,加上IO和前后处理,总时间可能更长。
  • CPU推理:速度可能比GPU慢5-20倍。
  • 优化建议:对于超长录像,可以考虑只分析前15分钟(对线期)或最后10分钟(团战期)等关键片段。

端口与进程管理

  • 端口冲突:如果启动API服务时提示端口被占用,可以通过--port参数指定其他端口,如--port 8001
  • 进程残留:异常关闭后,可能残留Python进程占用GPU内存。在Linux/macOS下可用pkill -f api_server.py,在Windows下可通过任务管理器结束相关Python进程。

8. 常见问题与排查方法

问题现象可能原因排查方式解决方案
启动时报ModuleNotFoundErrorPython依赖未安装或虚拟环境未激活。检查当前终端是否在项目虚拟环境中 (which pythonwhere python)。检查requirements.txt是否安装成功。激活虚拟环境,重新运行pip install -r requirements.txt
无法导入cv2(OpenCV) 或torchOpenCV或PyTorch安装失败或版本冲突。尝试单独安装:pip install opencv-python-headless torch根据错误信息搜索特定版本组合,或使用项目推荐的固定版本。
运行时报CUDA错误PyTorch与CUDA版本不匹配;显卡驱动过旧;显存不足。运行python -c "import torch; print(torch.cuda.is_available())"。检查nvidia-smi显示的CUDA版本。安装与PyTorch版本匹配的CUDA工具包,更新显卡驱动。尝试在配置中设置use_gpu: false使用CPU。
处理录像时卡住或崩溃录像文件损坏;FFmpeg不支持该格式;内存/显存溢出。检查录像文件是否能被其他播放器正常打开。查看程序日志,看是否在某个特定帧卡住。监控内存和显存使用情况。尝试转换录像格式为标准MP4。降低配置中的resolutionfps。分片段处理视频。
API服务启动后无法访问防火墙阻止;服务绑定到127.0.0.1而非0.0.0.0;端口被占用。使用curl http://127.0.0.1:8000/health测试本地是否可访问。使用netstat -ano | findstr :8000(Win) 或lsof -i:8000(Linux) 查看端口。确保启动命令包含--host 0.0.0.0。更换端口号。关闭占用端口的其他程序。
事件识别完全不准确模型未正确加载;游戏画面UI/版本与训练数据差异大;抽帧率过低。检查模型文件是否下载到正确路径。尝试用一张包含明显击杀的静态图片测试模型。增加fps配置值。确认模型是针对当前游戏版本训练的。尝试使用不同的模型或自行微调。人工复核抽帧质量。
生成的解说文本风格不对或无意义NLP模型未加载;风格配置参数错误;提示词模板问题。检查配置文件中nlp相关设置。查看日志中是否有NLP模型加载信息。确保已下载语言模型文件。参考项目文档,修正风格配置或提示词模板。
批量处理时部分文件失败个别文件损坏;处理过程中资源耗尽;文件路径含特殊字符。查看批量处理的日志文件,定位到具体失败的文件和错误信息。单独处理失败的文件以确认问题。确保输入目录所有文件格式统一。清理磁盘和内存空间。

9. 最佳实践与使用建议

为了让工具更稳定、高效地服务于你的需求,遵循以下实践建议:

  1. 首次使用先做最小化测试:不要一开始就用数小时的4K录像测试。找一个1-2分钟、包含明确事件的短视频,快速验证整个流程是否跑通,包括输入、处理、输出。

  2. 建立标准化的文件管理结构

    project_root/ ├── inputs/ # 存放待处理的原始录像 │ ├── raw/ │ └── to_process/ ├── outputs/ # 存放分析结果 │ ├── by_date/ │ └── summary/ ├── models/ # 存放所有模型文件 └── configs/ # 存放不同场景的配置文件

    每次处理前,将录像文件拷贝到inputs/to_process/,运行脚本输出到outputs/by_date/2024-05-20/,便于追溯和管理。

  3. 根据硬件调整配置:在config.yaml中创建多个配置预设,如config_low_memory.yaml(低分辨率,低FPS,CPU模式)和config_high_accuracy.yaml(高分辨率,高FPS,GPU模式),根据任务重要性切换。

  4. 为批量任务添加监控与日志:在批量处理脚本中,不仅记录成功/失败,还要记录每个文件的开始时间、结束时间、资源峰值占用。这有助于定位性能瓶颈和异常文件。

  5. 结果必须人工复核:尤其是计划将生成的解说文本或高光片段用于公开内容时。AI可能产生事实性错误(如认错英雄)或风格不当的表述。人工复核是保证质量的最后一道关卡。

  6. 严格遵守版权与隐私规范

    • 仅处理自有版权或已获授权的录像:不要分析他人的直播录像或未公开比赛录像,除非获得明确许可。
    • 谨慎处理包含个人语音的录像:如果工具集成语音识别,需确保不收集、存储或传播任何个人隐私信息。
    • 生成内容注明来源:使用工具生成的报告或视频片段时,建议注明“由AI辅助生成”,保持透明度。
  7. 定期更新与维护:关注项目GitHub的更新,及时获取模型优化和Bug修复。游戏版本更新可能导致界面变化,影响识别精度,必要时需要重新训练或微调模型。

10. 总结与下一步

这个游戏对局自动分析工具最值得尝试的点在于,它将原本需要大量人工时间的复盘和素材筛选工作自动化,提供了一个数据驱动的复盘视角。对于内容创作者,它是提升生产效率的“加速器”;对于普通玩家,它是一个不厌其烦的“复盘教练”。

你最先应该验证的功能是高光事件识别的准确率。找一段你非常熟悉的录像,看工具能否把你记忆中的关键击杀和团战都找出来,这是所有高级功能(如风格化解说、批量处理)的基础。最容易踩的坑是环境配置,特别是CUDA版本与PyTorch的匹配,以及FFmpeg的安装,按照本文第3、4部分的步骤仔细操作能避开大部分问题。

部署成功后,你可以探索以下几个方向:

  • 与剪辑软件联动:将工具识别出的高光时间点(JSON格式)导入Adobe Premiere、DaVinci Resolve或开源剪辑软件,实现自动剪辑粗编。
  • 定制专属解说词库:修改NLP部分的提示词模板,让生成的解说更符合你喜欢的某位解说或主播的风格,甚至训练一个个性化的语言模型。
  • 搭建自动化流水线:结合Obs录制、网盘同步和本工具,打造一个“对局结束 -> 自动上传云端 -> 触发分析 -> 报告推送至手机”的完整自动化流程。
  • 多游戏支持探索:研究工具的模型结构,尝试为其适配其他你常玩的游戏(如DOTA2、CS:GO等),这需要一定的机器学习背景。

工具本身是开源且可扩展的,这意味着你有很大的空间将其改造成最适合自己工作流的形状。建议从解决一个具体的痛点开始,例如“自动生成我每周Top 5操作集锦”,逐步迭代,让它真正成为你的得力助手。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 9:51:18

截图、图表、PDF 直接喂给模型:DMXAPI 新上架的 DeepSeek 视觉版能做什么

当开发者需要让模型理解一段复杂的前端报错截图,或者产品经理希望直接分析一份包含图表的竞品 PDF 时,传统的纯文本交互往往效率不高。现在,一个能直接“看懂”图片并进行分析的模型,正在成为提升这类工作流效率的关键工具。 Dee…

作者头像 李华
网站建设 2026/9/5 9:48:18

FPGA测控程序框架设计:从数据链拆分到模块化实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 9:47:53

课前准备-蛋白质一级到四级结构的组装规律

作者,Evil Genius 生化小课,CADD计算机辅助药物设计已经开启,对分子对接/分子动力学感兴趣的同学可以报名参加。 这一篇我们来梳理蛋白质一级到四级结构之间的相互关系与组装规律。 不是简单地“二级结构堆起来 三级结构,三级结…

作者头像 李华
网站建设 2026/9/5 9:46:57

今日运营知识点:转化漏斗模型

一、 概念含义 转化漏斗是一种可视化用户全链路转化过程的数据分析工具,它将用户**从「接触品牌/产品」到「完成核心目标(下单、注册、付费等)」**的完整路径拆解为连续的关键环节,通过量化各环节的转化率和流失率,帮助…

作者头像 李华
网站建设 2026/9/5 9:42:29

基于STM32与LD3320的智能家居语音控制系统设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华