通用API设计:从短链接解析到多平台内容提取的工程实践
做内容运营或日常开发时你可能遇到过这样的场景用户或同事丢过来一个分享链接有时是小程序里的“小红书图文链接”有时是抖音的“v.douyin.com/xxx”短链偶尔还有蒲公英应用分发页面的链接。每个平台都有自己的域名、短链规则、ID编码方式如果每次都写一套单独的解析逻辑过两个月连自己都忘了当初是怎么处理的了。我花了一些时间把蒲公英、小红书、抖音这三类链接的解析和信息提取做成了统一的API入口今天把设计思路和落地方案完整分享出来希望能帮到同样在折腾多平台数据接入的朋友。这并不复杂关键是要搞清楚三个平台链接背后的真实结构以及如何在合规前提下提取出可复用的结构化数据。下面我按从“为什么需要”到“怎么实现”再到“有哪些坑”的顺序来拆解。1. 为什么需要一套通用API三个平台分散接入的痛点1.1 各平台链接格式差异巨大不同平台的分享链接从域名到参数完完全全是两套逻辑。蒲公英的链接常出现在App分发场景可能是www.pgyer.com/app/xxx或www.pgyer.com/xxx小红书用的是xhslink.cn/o/xxxx这样的短链抖音则统一是v.douyin.com/xxxx/这种短链。除了短链长链接的URL结构也各不相同小红书的作品链接还带有itemId、userId等参数抖音的分享文本里经常混着一堆emoj和特殊符号。如果每个平台单独写代码总共可能也就百八十行但实际维护起来会变成一团乱麻。今天这个平台改一下短链跳转规则明天那个平台加个签名参数每改一次就要动一遍调用方。通用API的价值就在于把变化隔离在适配器层外部调用方永远只面对一套接口。1.2 重复造轮子的代价现实中我见过很多项目里散落着parse_douyin.py、parse_xiaohongshu.py、parse_pgyer.py这类的脚本每个脚本的输入参数、返回字段、错误码都不一样。新的需求一来要么复制粘贴改一遍要么在业务代码里写一堆 if-else 来判断平台类型。一旦同一段逻辑被复制到多个地方后续任何微小的修改都会变成“找鬼”游戏。更好的做法是定义统一的入参url和统一的出参结构然后通过适配器把不同平台的差异封装起来。这样做的好处非常直接调用方不需要关心链接来自某个平台只需要拿到解析后的platform、content_id、title、cover、media_url等字段。即使以后要接入第四个平台也只需要新增一个适配器调用方代码零改动。1.3 通用API的价值主张通用API不只解决了“解析链接”这一个问题它本身就是一个中间层。基于这个中间层你可以继续做内容存档、素材整理、自动化备份、甚至数据看板。我把它想象成一把万能钥匙——但前提是这把钥匙只开公共区域的门而不是去撬别人的保险柜。合规边界在第6节细说先记住这个前提。2. 蒲公英、小红书、抖音三平台的开放能力与边界2.1 蒲公英的API生态蒲公英pgyer.com最初是蒲公英开发者服务平台主要做iOS/Android应用的内测分发。它提供了正式的开放API开发者可以通过API管理应用、查询下载信息。蒲公英的链接格式比较规整无论短链还是长链接最终都可以拿到对应的app_id。通过公开的API接口如https://www.pgyer.com/apiv2/app/view传入app_id和api_key就能返回应用名称、版本号、下载地址、图标等信息。需要注意蒲公英的API是需要注册开发者账号并获取 API Key 的这是完全合法的开放能力。我们做的通用API里蒲公英适配器就是封装这一个流程。2.2 小红书的分享链接与内容获取方式小红书目前没有面向普通开发者的内容读接口官方开放的主要是电商、品牌相关的服务。但用户日常分享的小红书笔记链接是公开的任何人都能打开查看。所以合规的做法是解析xhslink.cn短链通过HTTP重定向拿到真实链接通常包含/discovery/item/xxxx这样的路径从路径或查询参数里提取itemId基于itemId使用小红书Web端的公开页面数据接口这类接口在浏览器里就能抓到返回的是JSON格式的笔记信息。这样做只能获取到发布者主动公开的内容比如笔记标题、封面图、点赞数等而且数据量不大适合个人兴趣或小范围自动化。要注意小红书对高频访问有限制频繁解析容易触发风控所以通用API里必须做缓存和限速。2.3 抖音的开放平台与分享解析规则抖音的情况和小红书有些类似。抖音开放平台提供了一些官方能力比如移动应用接入、SDK分享但直接获取用户主页、视频列表这些需要经过复杂的审核流程。不过抖音的分享链接解析有一个方便之处短链v.douyin.com重定向后会进入一个包含视频ID的详情页URL里可能有modal_idxxx或/video/xxx。拿到视频ID后抖音有一个公开的预览接口官方声称是给搜索引擎用的Robots允许访问的页面数据会返回视频标题、作者名、视频URL等信息。这个接口同样有反爬限制所以通用API要控制频率最好配合代理池——但这里要克制个人开发者别搞大规模抓取容易被封IP。2.4 我们仍然能做什么合规前提归纳一下通用API能做的合法操作包括解析用户主动提交的单个分享链接提取该链接自身包含的公开信息调用平台官方的开放API如蒲公英访问平台面向公网用户可见的详情页数据不使用绕过防抓取的技术如IP池、验证码破解、浏览器模拟不批量采集不存储用户cookie。只要守住这些边界通用API就是一个干净可靠的工具。3. 通用API的核心架构设计3.1 统一请求入口URL解析归一化既然叫通用API对外只暴露一个POST /api/parse接口请求体只有{url: ...}。内部第一步要做的是“URL归一化”把原始的分享文本可能夹杂着表情、称呼、符号里的URL部分提取出来然后还原短链。这一层看起来简单但最容易出错的地方是用户可能只粘贴了“复制打开抖音看看... https://v.douyin.com/xxx/”这么一串文字而不是纯URL。所以通用API的入口应该支持两种输入直接传URL或者传包含URL的文本。在代码里我会先做正则匹配找出以http://或https://开头的部分再做短链解析。3.2 适配器模式每个平台一个插件通用API不能把所有平台的处理逻辑堆在一起必须使用适配器模式。抽象出一个PlatformAdapter接口定义三个方法class PlatformAdapter: def match(self, url: str) - bool: ... def parse(self, url: str) - dict: ... def info(self) - dict: ...每个平台一个具体实现类比如PgyerAdapter、XiaohongshuAdapter、DouyinAdapter。入口拿到归一化后的URL后按顺序调用各个适配器的match()方法第一个匹配成功的就交给它处理。这样做的好处是以后新增一个平台比如B站、微博非常简单写一个新适配器然后在配置里注册一下通用API的入口代码完全不用动。3.3 统一响应结构所有适配器返回的数据必须遵循同一个结构我习惯用以下格式{ code: 0, data: { platform: xiaohongshu, content_id: 65f0a1c8000000002703abcd, title: 夏日穿搭日记, author: 小A, cover: https://sns-img-bd.xhscdn.com/xxx, media_type: video, media_url: https://xxx, detail: {} } }字段尽可能通用但允许额外字段放进detail里。统一响应结构的好处是业务侧的数据适配成本几乎为零而且在调试时只要返回结构一致就能用同一套日志模板来追踪问题。3.4 缓存与限流设计分享链接的解析结果一般不会频繁变化比如一个抖音视频的基本信息发布后基本不变。所以必须做缓存避免每次请求都去打平台接口。我用了简单的Redis缓存键用URL的哈希值过期时间设为一小时。同时也加了针对每个平台的调用频率限制比如抖音每分钟最多30次小红书20次。这不是为了防别人而是为了不让自己的IP被平台风控。4. 关键实现细节从分享链接到结构化数据4.1 短链接还原与重定向追踪分享链接大多是短链比如小红书的https://xhslink.cn/o/xx抖音的https://v.douyin.com/xx/。短链的本质是302重定向所以用代码追踪重定向链路是第一步。我推荐用requests的allow_redirectsTrue获取最终URL。但要注意有些平台的重定向链不止一次甚至会在重定向过程中附加新的参数。为了拿到干净的目标URL最好手动循环追踪同时设置最大重定向次数比如5次。import requests def resolve_redirect(url): session requests.Session() resp session.get(url, allow_redirectsFalse, timeout10) if resp.status_code in (301, 302, 303, 307, 308): location resp.headers.get(Location) if location: return resolve_redirect(location) return url注意抖音的短链在返回302时Location可能依赖于WIFI环境不同设备状态看到的最终URL会略有差异。没关系只要能从最终URL里提取到视频ID即可。4.2 提取平台标识与内容ID拿到最终URL后需要写平台相关的提取规则。以小红书为例最终URL里可能会看到/discovery/item/64c5f1e2000000001a0d99b2?appuidxxxapptimexxxappversionxxx只需要用正则匹配/item/([0-9a-zA-Z])就能拿到content_item_id。抖音的最终URL里如果看到/video/73545123456789或者带了modal_id73545123456789同样用正则/(\d)或查询参数modal_id提取。蒲公英更简单通常URL路径里只含app_xxx或数字ID甚至可以直接从短链的路径中提取。比如https://www.pgyer.com/Ux9t里Ux9t就是应用的短名称。要注意ID可能是字母数字混合也可能是纯数字正则时不要限定太死。4.3 调用公开接口获取信息提取出内容ID后需要调用平台的公开数据接口。这里每个平台差异较大我分享我实际用的方法。蒲公英调用官方APIhttps://www.pgyer.com/apiv2/app/view。需要传入_api_key和appKey就是上一步提取的短ID。官方API有请求签名要求需要按文档生成签名。返回的JSON里包含appName、appVersion、buildShortcutUrl下载短链、appIcon等关键字段。小红书我使用的是Web端页面里预先嵌入的JSON数据。在浏览器的开发者工具中可以看到请求详情页时有一个接口https://www.xiaohongshu.com/explore/{item_id}返回HTML其中包含window.__INITIAL_STATE__或类似的JSON数据。用Python解析HTML提取这部分再转成JSON即可。注意这个方式依赖网页结构一旦小红书改版就可能失效所以适配器要有自动检测失败的能力。抖音抖音也有类似的公开HTML页面https://www.douyin.com/video/{video_id}里面同样嵌入了SSR数据。或者我可以直接请求https://www.iesdouyin.com/share/video/{video_id}这个老接口它返回的JSON里有item_list包含标题、封面、无水印视频播放地址通常就是play_addr下面的src。这里有个要点抖音的play_addr播放URL经常会失效因为视频流URL过期时间很短。所以不要让通用API直接透传这个临时URL而是给用户一个临时的代理链接或者要求用户短时间内使用。更好的做法是只返回视频ID让调用方需要时再去拉取最新播放地址。4.4 异常处理与降级平台接口随时可能变化所以适配器必须做好异常处理。我在每个适配器里都定义了可识别的异常类型比如ShortLinkResolveError、ContentIdNotFound、APIResponseError。入口层捕获这些异常后统一转换为外部接口错误码。同时要做降级策略如果小红书适配器解析失败不要影响其他平台。也就是说即便某个平台接口有问题通用API依然能正常处理其他平台的请求只是返回失败的结果。我把这个逻辑放在路由层每个适配器独立运行互不污染。5. 实测案例跑通三个平台的解析请求5.1 蒲公英应用详情解析我用一个测试应用链接https://www.pgyer.com/Ux9t试了一遍。通过通用API返回结果的关键字段如下{ platform: pgyer, content_id: Ux9t, title: 测试应用, author: , cover: http://app-apk.pgyer.com/xxx/icon.jpg, media_type: app, media_url: https://www.pgyer.com/download?app_idabcdef, detail: { appVersion: 1.0.0, buildShortcutUrl: https://www.pgyer.com/Ux9t, appFileSize: 23334455 } }整个过程不到200毫秒主要耗时在蒲公英API请求。需要注意的是蒲公英API的签名必须用官方SDK里的算法不能用随机参数。5.2 小红书图文/视频解析我拿到了一个小红书分享文本里面是“【小红书】里有精彩内容快去瞧瞧 https://xhslink.cn/o/2locmt1h37o”去掉文字后提取URL然后追踪重定向最终得到完整链接。接着用正则提取了item_id最后请求了Web详情页并解析SSR数据。解析结果{ platform: xiaohongshu, content_id: 64c5f1e2000000001a0d99b2, title: 我的旅行日记海边日落, author: 小王, cover: https://sns-img-bd.xhscdn.com/123.jpg, media_type: image_slider, media_url: null, detail: { likes: 523, type: note } }小红书的media_url不像抖音那样有现成的视频地址如果笔记里有很多张图片我会把这些图片的地址以列表形式放在detail的images字段里。5.3 抖音视频信息解析用一个抖音分享短链https://v.douyin.com/9i8mxf61uxa/跑通流程。解析短链后代码提取出modal_id为73545123456789。接着请求https://www.iesdouyin.com/share/video/73545123456789返回的JSON里item_list[0]中的desc是描述video.play_addr.url_list[0]是播放地址。统一接口返回{ platform: douyin, content_id: 73545123456789, title: 南墙作品tpkernel内核下载教程来啦, author: 南墙, cover: https://p3-sign.douyinpic.com/xxx.jpeg, media_type: video, media_url: https://play.xxx.com/.../playwm/?video_id..., detail: { duration: 125, ratio: 720p } }这里有个坑play_addr返回的URL带不带playwm区别很大。带playwm的是带水印的地址不带则可能是无水印。我测试时发现直接从share/video接口里拿到的往往带水印但可以通过替换URL中的playwm为play来尝试获取无水印地址。这属于平台规则模糊地带所以我默认返回带水印版本如果确实需要无水印调用方要自行评估合规性。5.4 统一接口输出对比把三个平台的结果放在一起看统一结构的好处就很明显了。业务方只要写一次消费逻辑就能同时处理App、图文、视频三种内容类型。更重要的是解析超时策略一致都会在10秒内返回失败时返回相同的错误码。我把关键的调用时长和成功率做了个粗略统计平台平均耗时成功率备注蒲公英200ms99%官方API稳定小红书800ms85%依赖页面结构偶尔改版导致失败抖音600ms90%短链解析偶尔需要重试6. 合规红线与技术边界6.1 明确可做什么不可做什么通用API本质上是把用户自己提交的公开链接转换成结构化数据。这属于信息获取工具本身不违法。但边界在于不允许把通用API用于批量抓取某个用户主页的全部内容不允许绕过平台登录权限获取仅粉丝可见的内容不允许把解析出来的视频/图片再加工成付费资源库对外售卖不允许利用平台风控漏洞高频调用接口。我在代码里特意加了两道防线第一每个IP的调用次数做限制比如每分钟20次第二所有解析结果只保留缓存不持久化到数据库。这样可以避免自己的工具被别人滥用。6.2 如何规避法律风险即使做了限制有些行为仍需注意。例如抖音的分享页数据接口尊重Robots协议个人学习用途没有大问题但绝不能商用。如果要做成公开SaaS服务提供给别人使用就需要去抖音开放平台申请正式权限。对于小红书Web网页上的INITIAL_STATE数据实际上属于前端渲染产物不算API盗用但同样不能高频访问。合理的使用场景是内容收藏备份、运营人员统计自己的笔记数据。6.3 给开发者的建议如果你也想自建一个类似的通用API我的建议是优先接入有正规开放平台的平台比如蒲公英技术风险最小对于无公开API的平台尽量通过官方网页分享链接的重定向解析而不要去逆向移动端API移动端API加密复杂且容易踩缝纫机不管做什么都要给服务加上鉴权请求头带token避免被外部扫描到后滥用为每个适配器设计一个独立开关某个平台出问题时可以直接熔断不影响整体服务。我自己在开发过程中踩过不少坑印象最深的是抖音短链解析有时拿到重定向之后的URL里不是/video/而是/share/或者带了不必要的参数导致提取ID失败。后来我写了一个多模式匹配先查modal_id再查/video/(\d)最后还尝试用item_ids参数。这些经验说白了就是多做几层备选方案。通用API看起来是个小项目但它让我处理多平台数据时省下了大量时间。如果你也有类似需求建议从最常用的那个平台开始跑通一个适配器再慢慢扩展。这比一上来就想做“全网解析”要靠谱得多。

相关新闻

16GB显存本地部署27B大模型:llama.cpp+GGUF+KV缓存量化实现256K上下文

16GB显存本地部署27B大模型:llama.cpp+GGUF+KV缓存量化实现256K上下文

1. 为什么要在 16GB 显存上死磕 256K 上下文先把结论摆在前面:16GB 显存跑 27B 级别的模型,还要吃下 256K 上下文,这件事在纯 GPU 方案里基本是死路,但在 llama.cpp GGUF KV 缓存量化这套组合拳下,是可以落地的。我自…

2026/10/7 11:58:41 阅读更多 →
激光雷达与相机外参标定实战:基于livox_camera_calib的完整流程与避坑指南

激光雷达与相机外参标定实战:基于livox_camera_calib的完整流程与避坑指南

先用一句话给这篇文章定个性:它不是官方README的复读,而是我从第一次标定翻车到最终稳定成功之后,沉淀下来的一套完整操作流和排查思路。我最早在某台巡检机器人上做激光雷达和相机融合。当时觉得自己挺懂,直接拿结构设计图纸上的…

2026/10/7 11:57:40 阅读更多 →
JSP+MySQL农产品商城源码实战:从环境搭建到下单事务的完整拆解

JSP+MySQL农产品商城源码实战:从环境搭建到下单事务的完整拆解

简介:本资源为基于Java的农产品网上销售系统设计与实现文档,面向计算机相关专业学生、课程设计或毕业设计开发者,以及希望了解电商系统开发流程的初学者。文档围绕农产品线上销售场景,从需求分析、系统设计到功能实现进行了完整阐…

2026/10/7 11:57:40 阅读更多 →

最新新闻

Winform 窗体控件缩放自适应:辅助类实现原理与避坑指南

Winform 窗体控件缩放自适应:辅助类实现原理与避坑指南

简介:适用于Winform开发的窗体与控件布局缩放自适应辅助类,面向使用C#进行桌面应用开发、需要处理不同分辨率下界面适配问题的开发者。该辅助类支持对Winform自带多数控件及自定义控件进行缩放,可动态添加控件并保留自适应特性,同…

2026/10/7 12:33:33 阅读更多 →
SpringBoot+Vue疾病防控系统开发实战:从数据库设计到部署全流程

SpringBoot+Vue疾病防控系统开发实战:从数据库设计到部署全流程

很多同学在拿到“基于SpringBootVue的疾病防控综合系统”这类题目时,第一反应是到处搜源码、下模板,结果要么代码老旧跑不起来,要么结构混乱根本没法写进自己的文档。我在实际开发这个系统的过程中,把需求分析、数据建模、接口设计…

2026/10/7 12:33:33 阅读更多 →
MiniMax M Plan 额度迁移与 Claude Code、Cursor 免密接入实战

MiniMax M Plan 额度迁移与 Claude Code、Cursor 免密接入实战

1. 从 Token Plan 到 M Plan:这次额度体系到底改了什么如果你最近一直在用 MiniMax 的 API 做开发,大概率已经注意到一个明显的变化:过去那套按 Token 单独计费、按模态分别扣额度的逻辑,正在被一套更统一的东西取代。这就是 M Pl…

2026/10/7 12:33:33 阅读更多 →
MATLAB调试全指南:从报错定位到性能优化

MATLAB调试全指南:从报错定位到性能优化

你盯着屏幕上的红色报错,程序跑了二十分钟断在这一行,旁边同事还等着你出结果。这种时刻,MATLAB调试的水平就决定了你是卡在错误信息前不知所措,还是花三分钟定位问题、五分钟修完收工。这篇内容我把这些年跟MATLAB错误打交道攒下…

2026/10/7 12:33:33 阅读更多 →
刀开关矩阵结构设计详解:从多路切换到可靠隔离

刀开关矩阵结构设计详解:从多路切换到可靠隔离

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

2026/10/7 12:33:33 阅读更多 →
量子中心超级计算参考架构:量子-经典融合的算力基建蓝图

量子中心超级计算参考架构:量子-经典融合的算力基建蓝图

1. 从科研玩具到工程基建:参考架构到底在解决什么问题量子计算喊了这么多年,大家最直观的感受可能是:新闻很热闹,实验室很兴奋,但真正能用起来的东西少。这里面的核心矛盾,早就不是量子比特数量够不够&…

2026/10/7 12:32:33 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

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

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

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

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

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

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 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/6 8:21:32 阅读更多 →
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/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练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/6 1:18:13 阅读更多 →