深入OWASP ZAP源码:结对编程解析Web安全工具核心架构与插件开发
1. 项目概述从“用”到“懂”的深度安全实践OWASP ZAPZed Attack Proxy作为一款开源的Web应用安全测试工具在渗透测试和漏洞扫描领域几乎是无人不知。但绝大多数使用者包括很多安全工程师都停留在“用”的层面——配置代理、启动扫描、查看报告。我们这次的项目则是一次彻底的“反向工程”与“协作共创”之旅。核心目标不是简单地使用ZAP而是深入其源码腹地理解其设计哲学、核心架构与实现细节并通过“结对编程”这种高强度协作模式将理解转化为实践甚至尝试进行定制化改造。这听起来像是一个纯技术研究项目但它的价值远不止于此。对于安全从业者而言理解一个顶级安全工具的内部运作机制就如同医生理解了手术器械的精密构造不仅能更精准地使用它还能在它“失灵”或“不适用”时知道如何调试、修复乃至创造新的“手术刀”。而结对编程的引入则将个人探索变成了团队的知识共振与质量共建极大地加速了学习曲线并确保了分析成果的可靠性与可复用性。无论是想深入安全工具开发、定制企业级自动化扫描流程还是希望提升代码审计与架构设计能力这个项目都能提供一条扎实的实践路径。2. 核心思路与方案选型为何是“源码分析”加“结对编程”2.1 为何选择OWASP ZAP作为分析对象在众多安全工具中选定ZAP是基于几个关键考量。首先生态成熟度与架构代表性。ZAP历经十多年发展代码量庞大超过百万行Java代码模块化清晰核心、扩展、网络、数据库等涵盖了代理服务器、爬虫、主动/被动扫描器、API、UI等完整组件。分析它相当于解剖一个中型安全软件的完整标本能学到企业级软件在可扩展性、可维护性上的设计经验。其次技术栈的普适性。ZAP主要基于JavaSwing UI其设计模式、插件体系、线程模型、网络通信等是后端和客户端开发的通用知识迁移成本低。最后开源与社区的活跃性。活跃的社区意味着丰富的文档尽管可能不完善、持续的更新和可参考的Issue、PR这为源码分析提供了宝贵的上下文和“活教材”。2.2 “结对编程”模式在本项目中的独特价值单纯阅读源码容易陷入细节迷宫或产生理解偏差。我们引入结对编程并非为了开发新功能而是将其作为一种强制的、实时的、高保真的知识同步与审查机制。具体角色分配上我们采用了“驾驶员-领航员”轮换制。驾驶员负责操作IDE进行代码导航、断点调试、撰写分析笔记领航员则负责宏观把控思考模块关联、设计意图并提出问题或验证假设。每1-2小时轮换一次角色。这种模式带来了几个显著好处第一对抗“想当然”。一个人可能跳过自认为“不重要”的代码但搭档的提问会迫使你重新审视往往能发现关键的设计决策或隐藏的Bug。第二加速知识传递。对于复杂模块如ZAP的主动扫描引擎Scanner一人解析算法一人梳理调用链能快速拼出全貌。第三统一产出标准。共同撰写的分析文档、绘制的架构图、记录的疑难问题其质量和一致性远高于个人产出。我们约定所有核心结论必须经过双方在调试状态下验证通过才能记录。2.3 技术栈与工具链选型工欲善其事必先利其器。我们搭建了一套高效的分析环境IDEIntelliJ IDEA Ultimate版。这是不二之选其对Java项目强大的索引、导航特别是“查找用法”和“继承层次”、重构和调试支持远超其他工具。利用其“Diagram”功能快速生成类图理解模块关系。构建与依赖管理ZAP使用Gradle构建。我们首先确保能在本地完整构建并通过基础测试。这能验证环境正确性并让你理解项目的依赖生态。调试与动态分析光静态看代码不够。我们配置了远程调试将ZAP以调试模式启动然后从IDE连接。这样可以在执行具体操作如发起一次扫描时动态跟踪代码执行流观察对象状态变化这是理解运行时逻辑的关键。文档与绘图工具使用Mermaid在Markdown中或Draw.io来绘制核心的架构图、序列图和状态图。好记性不如烂笔头复杂的调用关系必须可视化。代码分析插件使用SonarLint进行基本的代码质量检查有时它能提示出潜在的代码异味或复杂度过高的方法这些地方往往是核心逻辑或历史债务所在。注意在导入ZAP项目后第一件事不是直接扎进代码而是先花时间跑通Gradle的build任务并尝试启动主类org.zaproxy.zap.ZAP。确保你的JDK版本与项目要求一致查看gradle.properties或build.gradle避免在环境问题上浪费大量时间。3. 核心模块深度解析拆解ZAP的“五脏六腑”ZAP的源码结构清晰我们将其核心分为以下几个层次进行剖析。3.1 网络代理层流量拦截与转发的基石ZAP的核心是一个中间人代理。其代理服务器模块主要在org.zaproxy.zap和org.parosproxy.paros包下是一切功能的起点。关键类是ProxyThread和HttpProxy。工作原理当浏览器将代理设置为ZAP后所有HTTP/HTTPS请求首先到达ZAP的代理监听端口。ProxyThread负责接受Socket连接并为每个连接创建处理线程。对于HTTPS请求ZAP会动态生成CA证书进行SSL中间人解密将明文流量传递给后续处理链。源码追踪要点请求/响应消息模型ZAP定义了HttpMessage类作为所有HTTP流量的统一抽象。里面包含了请求头、请求体、响应头、响应体等。这是贯穿整个工具的数据总线。代理链Proxy Chain请求并非直接转发。ZAP引入了“监听器”ProxyListener机制。这是一个典型的观察者模式。代理核心在收到请求和响应后会遍历所有注册的监听器允许它们对HttpMessage进行读取、修改甚至中断转发。爬虫、扫描器、被动扫描规则都是通过注册为监听器来介入流量的。连接管理重点看HttpSender类。它负责实际向目标服务器发送请求和接收响应。这里涉及到连接池、超时设置、重试逻辑等网络编程的细节。实操心得调试代理层时最容易混淆的是“请求流”和“响应流”的多个副本。ZAP内部为了记录和历史记录可能会复制HttpMessage对象。务必在调试时观察对象的id或内存地址理清数据流向。一个技巧是在关键监听器的onHttpRequestSend和onHttpResponseReceive方法入口打上条件断点只针对特定URL进行中断能极大提升分析效率。3.2 扩展插件体系可扩展性的生命线ZAP的强大功能如主动扫描、爬虫、API、各种插件都是通过扩展Extension机制加载的。这是ZAP架构中最精妙的部分之一位于org.zaproxy.zap.extension包。核心设计Extension抽象类所有扩展的基类。定义了init(),start(),stop(),destroy()等生命周期方法以及getAuthor(),getDescription()等元信息方法。扩展加载器ExtensionLoader在ZAP启动时扫描classpath下所有实现了Extension接口的类并动态加载和初始化它们。它管理着扩展的依赖关系通过DependsOn注解和加载顺序。钩子Hook机制扩展可以通过实现特定的接口如ProxyListener,ScannerHook来将自己“钩入”ZAP的核心流程。这种基于接口的松散耦合是插件体系健壮的关键。以“主动扫描”扩展为例ExtensionActiveScan是主动扫描功能的主扩展。它本身并不执行扫描而是管理扫描会话、策略并提供了一个UI。真正的扫描逻辑在org.zaproxy.zap.extension.ascan包下的扫描规则Plugin和扫描引擎ActiveScanner中。扫描引擎会从策略中加载启用的规则插件并发起攻击。源码分析技巧找一个你熟悉的简单扩展比如ExtensionAlert负责管理警报入手。从它的init方法开始看它注册了哪些监听器提供了哪些API端点修改了哪些UI组件。这比直接啃复杂的扫描扩展要容易得多能快速建立对扩展模型的理解。3.3 主动扫描引擎漏洞检测的核心大脑主动扫描是ZAP的招牌功能其源码也是最复杂的部分之一。核心位于org.zaproxy.zap.extension.ascan。三层架构扫描控制层ActiveScan对应一次扫描任务。它持有扫描策略Policy管理扫描状态开始、暂停、停止并控制扫描队列。扫描引擎层ActiveScanner这是真正的执行者。它从控制层获取任务通常是某个URL和参数然后根据策略加载的插件Plugin列表按顺序执行插件。插件规则层Plugin每个插件对应一种或一类漏洞的检测逻辑。例如SqlInjectionPlugin、XssPlugin。插件是实际发送攻击载荷、分析响应的代码单元。关键流程剖析参数发现扫描开始前ZAP会先对目标URL进行“参数分析”。这通常由Variant类族完成它们能识别URL查询参数、POST表单参数、JSON参数、Cookie等所有可能的输入点。插件执行与调度引擎并非简单遍历所有插件。它有一个强度Strength和阈值Threshold的概念。强度如低、中、高、攻击决定了发送攻击载荷的多少和攻击性阈值如关、低、中、高决定了根据潜在漏洞迹象决定是否报警的严格程度。插件会根据这些设置调整自己的行为。攻击载荷与逻辑以SQL注入插件为例它会构造一系列包含SQL语法片段的测试字符串如 OR 11替换原始参数值并发送请求。然后分析响应寻找数据库错误信息、响应时间差异、内容差异等“迹象Evidence”。判断逻辑往往很复杂涉及正则表达式匹配、字符串差异比对、时间统计等。注意事项主动扫描的代码充满了多线程和状态管理。在调试时务必注意线程上下文。一个扫描任务可能同时有多个插件在针对不同参数进行测试。使用IDE的调试器线程视图并给扫描任务设置一个独特的名称以便跟踪。另外扫描插件的逻辑可能存在误报和漏报阅读其源码能让你理解其检测原理的局限性这在编写自定义扫描规则或评估扫描结果时至关重要。3.4 用户界面与API设计双轨交互模型ZAP提供了桌面GUI基于Swing和完整的REST API两种交互方式。研究这两部分能学到大型工具如何设计前后端分离尽管是桌面应用和自动化接口。Swing GUI架构ZAP的UI采用了Model-View-ControllerMVC的变体。核心模型如SiteMap、HistoryTable维护数据状态各种View面板和ExtensionPopupMenu右键菜单作为观察者监听模型变化。UI代码分散在各个扩展中通过ExtensionHookView来挂载菜单和按钮。分析UI代码的重点不是Swing语法而是理解用户操作如何触发核心功能调用。例如在历史记录面板右键点击“攻击”菜单这个事件是如何传递到ExtensionActiveScan并启动一个新扫描任务的。REST API设计ZAP的APIorg.zaproxy.zap.extension.api设计非常规范是学习如何设计可扩展、版本化API的绝佳案例。API端点定义每个API端点对应一个ApiAction或ApiView类。ApiAction执行操作如/JSON/ascan/action/scan/ApiView获取数据如/JSON/core/view/alerts/。自动生成与注册API类使用注解如ApiAction定义名称、参数、权限。ApiImplementor负责收集这些端点并在扩展启动时自动注册到API前端。前后端分离实践ZAP的桌面UI在调用某些功能时实际上是通过内部HTTP请求调用自己的本地API。这种设计使得为ZAP开发第三方客户端如命令行工具、CI/CD集成变得非常容易。在结对编程分析API部分时我们一个人负责追踪一个具体的API调用比如通过curl发送启动扫描的请求另一个人则在IDE中调试看请求如何被路由、解析、最终调用到哪个扩展的哪个方法。这个过程能清晰地揭示整个请求处理链路。4. 结对编程实践中的挑战与应对策略4.1 典型挑战一代码规模庞大无从下手面对百万行代码最初的迷茫是最大的敌人。我们的策略是目标驱动由表及里。确立一个具体、可验证的小目标例如“搞清楚在ZAP界面点击‘主动扫描’按钮后到第一个HTTP攻击请求发出前代码都经历了什么”。这个目标有明确的起点UI事件和终点网络请求。利用调试器进行动态追踪在可能的入口方法如按钮的actionPerformed设置断点然后执行操作。一步步“Step Into”不要怕深入调用栈。用IDE的“调用栈Call Stack”视图记录下路径。绘制调用序列图在追踪过程中用绘图工具实时绘制简化的序列图标注出关键的类和方法。这能帮你理清脉络避免在复杂的调用中迷失。分工协作一个人负责追踪主流程另一个人负责查阅当前停留的类或方法的文档如果有、查看其字段和方法并快速搜索其在项目中的其他用法提供上下文支持。4.2 典型挑战二设计模式与抽象层过多理解困难ZAP中大量使用了工厂模式、策略模式、观察者模式、模板方法模式等。这提高了代码的灵活性但也增加了阅读难度。应对方法识别模式给代码“贴标签”当看到ProxyListenerFactory、VariantFactory这类名字立刻意识到这是工厂模式。观察者模式通常有addListener、fireXXXEvent等方法。给这些模式贴上认知标签能快速理解这段代码的意图。聚焦接口而非实现在分析一个流程时先找到定义行为的接口如HttpSender理解它的核心方法sendAndReceive。暂时忽略具体的实现类如HttpSenderImpl的细节。先掌握抽象层面的数据流和控制流。结对讨论设计意图当遇到一个特别绕的设计时停下来和搭档讨论“为什么这里要用策略模式如果不用代码会变成什么样” 通过对比和假设往往能更深刻地理解设计者的良苦用心通常是为了解耦、便于测试或支持未来扩展。4.3 典型挑战三遗留代码与历史债务ZAP历史悠久部分代码尤其是org.parosproxy.paros核心包下的风格较旧注释也可能不清晰。应对方法借助版本控制历史使用Git blame功能查看令人困惑的代码段是何时、由谁、在什么提交中引入的。查看那次提交的日志信息有时能获得关键背景。不纠结于每一行对于明显是边缘功能或陈旧的工具类代码如果与当前分析的主线目标无关可以暂时搁置标记一个“待后续深究”的标签即可。保持主线推进的动量更重要。以测试用例为文档ZAP拥有相当数量的单元测试和集成测试。当某个类或方法的行为不明确时去读它的测试用例*Test.java。测试用例是最好的行为说明书它们明确展示了代码在特定输入下预期的输出和行为。5. 从分析到实践定制化扫描插件开发示例理解了原理最好的巩固方式就是实践。我们选择开发一个简单的自定义被动扫描规则作为输出。被动扫描规则在HTTP请求/响应经过代理时进行检查开销小。目标开发一个检测HTTP响应中是否包含敏感内部IP地址如10.x.x.x,192.168.x.x泄露的规则。步骤创建扩展骨架在ZAP源码的zap/src/org/zaproxy/zap/extension/pscanrules/目录下这是官方被动扫描规则存放处创建我们的规则类InternalIpAddressDisclosure继承PluginPassiveScanner。实现核心方法getName(),getDescription(): 返回规则名称和描述。getPluginId(): 返回一个唯一ID。scanHttpResponseReceive(): 这是核心检测方法。我们在这里编写逻辑从参数HttpMessage中获取响应体和响应头使用正则表达式匹配是否存在内网IP模式。getAlert(): 如果发现泄露则创建一个Alert对象设置风险等级Risk.INFO或Risk.LOW、置信度Confidence.LOW、详细描述等。注册规则需要在ExtensionPassiveScan的初始化代码中注册我们的新规则类确保它被加载。更规范的做法是通过ZapAddOn.xml文件在插件包中声明。测试与调试将ZAP以调试模式运行安装我们修改后的扩展。访问一个故意包含内网IP的测试页面观察历史记录中是否生成了我们预期的警报。通过调试器跟踪scanHttpResponseReceive方法的执行。结对分工在这个实践环节一个人负责编写核心检测逻辑和正则表达式另一个人负责研究如何正确创建Alert对象并设置其属性同时查阅其他现有被动扫描规则如InformationDisclosureInURL作为参考模板。最后一起进行集成测试和调试。这个小小的实践串联起了我们对代理监听机制、扩展加载、消息模型和警报系统的所有理解将抽象的源码知识转化为了具象的、可运行的功能。6. 总结与收获超越工具本身的能力提升回顾整个源码分析与结对编程项目其价值远不止于弄懂了ZAP。它更像是一次密集的软件工程与安全技术的综合训练。在技术层面你深入理解了中型Java应用的模块化架构、设计模式的实际应用、线程安全编程、插件化体系设计以及网络代理的核心原理。这些知识具有极强的可迁移性。在方法论层面结对编程迫使你持续地进行技术沟通、精确表达和即时审查极大提升了代码理解、调试和协作的效率。而面对庞大陌生代码库时采用的“目标驱动、动态追踪、绘图辅助、测试佐证”的分析方法将成为你未来学习任何新系统、新框架的利器。在安全专业层面你不再是一个黑盒工具的使用者。你看清了自动化漏洞扫描器的工作原理、优势与固有局限。你知道一个SQL注入检测规则是如何编写的也就能更好地判断其误报和漏报的原因。这让你在渗透测试中能更聪明地使用工具甚至创造工具。最后给想要尝试类似项目的朋友一个建议从一个小而具体的目标开始准备好得力的工具特别是IDE的调试器并找一个靠谱的搭档。过程中一定会遇到晦涩难懂的代码和令人沮丧的障碍但每一次通过调试和讨论突破一个难点所带来的成就感和对系统认知的深化都是无可替代的。这趟深入源码的旅程最终会让你对所研究的技术产生一种“了如指掌”的自信这种自信是任何教程和文档都无法给予的。

相关新闻

逾期率_CI上下限

逾期率_CI上下限

逾期率_CI下限 和 逾期率_CI上限 是 逾期率的置信区间,我这里用的是 95% Wilson 置信区间。 简单理解: 逾期率:当前样本里实际观察到的逾期比例逾期率_CI下限:考虑样本量波动后,逾期率可能的偏低估计逾期率_CI上限&…

2026/10/14 22:47:05 阅读更多 →
Windows Python环境配置全攻略:从多版本管理到虚拟环境实战

Windows Python环境配置全攻略:从多版本管理到虚拟环境实战

1. 为什么在Windows上安装Python版本管理是门必修课 如果你刚开始接触编程,或者从其他平台转到Windows做开发,第一个拦路虎往往就是Python环境的搭建。你可能觉得,不就是去官网下载个安装包,一路“下一步”就完事了吗?…

2026/10/2 15:33:42 阅读更多 →
Linux CAN应用编程实战:从Socket CAN到嵌入式通信开发

Linux CAN应用编程实战:从Socket CAN到嵌入式通信开发

1. 从零到一:理解Linux CAN应用编程的基石如果你是一名嵌入式或汽车电子领域的开发者,最近在调试一个车载控制器或者机器人底盘,发现数据手册里反复提到CAN总线,而你的开发环境又跑在Linux上,那么“Linux CAN应用编程”…

2026/10/16 13:40:43 阅读更多 →

最新新闻

数据驱动+SIMD:粒子系统内存布局优化与百倍性能提升实战

数据驱动+SIMD:粒子系统内存布局优化与百倍性能提升实战

一个朋友找我调过一个工业仿真系统里的粒子更新逻辑。从算法上看,它简单到不能再简单——一个for循环,每个粒子做一次牛顿力学更新,整体复杂度就是标准的O(n)。但跑起来就是慢,50万粒子一帧更新要120毫秒,CPU占用还忽高…

2026/10/16 23:39:03 阅读更多 →
MCP协议与CLI工具的本质区别:协议层与交互层的分层设计

MCP协议与CLI工具的本质区别:协议层与交互层的分层设计

1. 这不是技术迭代,是概念混淆——先搞懂“MCP”和“CLI”根本不在同一维度 最近刷到好几条标题带“大厂把 MCP 换成 CLI 了”的短视频和推文,评论区一堆人跟着惊呼“MCP 被淘汰了?”“CLI 真香!”“赶紧学命令行,不然…

2026/10/16 23:39:03 阅读更多 →
APS生产计划排程系统解决方案,在制造企业中有哪些作用?

APS生产计划排程系统解决方案,在制造企业中有哪些作用?

引言随着制造业订单越来越碎片化、交期越来越短、生产约束越来越复杂,依靠 Excel、人工经验或传统 MRP 已经很难快速编制出真正可执行的生产计划。APS(Advanced Planning and Scheduling,高级计划与排程)系统正是在这一背景下出现…

2026/10/16 23:37:01 阅读更多 →
SPI技术系列 03 · SPI 速度与电气约束

SPI技术系列 03 · SPI 速度与电气约束

📚 I2C 技术系列 持续更新中 本系列从推挽电气层一路打到 Linux spi 子系统,把"四根线"背后的电气/协议/控制器/驱动/实战全拧成一根线。 👉 想系统追更,戳这里查看完整专栏: 【SPI 技术系列】 👉 其他技术…

2026/10/16 23:37:01 阅读更多 →
环形调度与取模优化:ZOJ3981 气球机器人最小等待时间全解析

环形调度与取模优化:ZOJ3981 气球机器人最小等待时间全解析

1. 题目到底在说什么:先把这个环形流水线看透第一次看 ZOJ3981 的题面,估计不少人和我一样,第一反应是“这不就是个模拟吗,机器人一路走一路发气球,每次 AC 都记一下等待时间,最后枚举起点取最小”。但真上…

2026/10/16 23:36:01 阅读更多 →
CC-Switch 原来是这么玩的!90% 的人都没用对:把 settings 改到 TaoToken

CC-Switch 原来是这么玩的!90% 的人都没用对:把 settings 改到 TaoToken

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

2026/10/16 23:36:01 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →