Android无障碍服务实战:微信抢红包插件原理与鲁棒实现
简介这是一份面向Android逆向与插件开发学习者的微信抢红包Xposed模块源码适用于具备Java基础和Android开发经验的中高级开发者帮助理解系统级Hook机制、第三方应用行为干预等核心场景。资源共33个文件含10个Java核心逻辑类实现红包监听与自动点击、7个XML布局与配置文件、3个Gradle构建脚本、2个JAR依赖库及1个xposed_init入口声明文件辅以README.md说明文档、LICENSE授权协议与APK安装包整体压缩包仅543KB轻量易读。已有3297人学习下载是实践Xposed框架加载原理、Java反射调用私有API、多线程事件响应及UI自动化模拟点击的典型项目。源码结构清晰包含完整模块注册流程、Zygote进程注入逻辑、微信消息解析与红包触发策略可直接编译调试为深入移动安全与定制化插件开发提供扎实的工程范例。1. 微信抢红包插件源码不是“外挂”而是理解微信消息机制与无障碍服务边界的实战切口“微信抢红包插件源码”这个标题常被误读为“一键秒抢神器”但真实工程现场里它本质是一份面向 Android 平台的无障碍服务AccessibilityService实践样本——它不破解微信协议不注入进程不调用未公开 API而是通过系统级的无障碍通道监听通知栏红包提示、解析 Activity 界面控件树、模拟点击动作完成响应。这类代码的价值从来不在“抢到多少”而在于帮你扎进三个硬核交汇点Android 系统无障碍能力边界、微信 UI 层级结构稳定性、以及自动化交互中「时机判断」这一玄学难题。它适合两类人一是刚学完 AccessibilityService 但卡在“监听不到红包弹窗”的 Android 初学者二是想验证某款社交 App 是否具备可自动化响应特征的测试/安全工程师。注意所有合法实现均依赖用户手动开启「无障碍权限」和「通知使用权」且微信自 8.0.23 起对红包弹窗的 View ID 命名策略做了模糊化处理旧源码大概率失效——这恰恰是动手重写的最佳理由。2. 从零搭起抢红包服务注册、监听、触发三步闭环2.1 声明无障碍服务并配置 XML 规则要让系统允许你的 App 监听微信界面必须在AndroidManifest.xml中显式声明服务并绑定配置文件。这不是可选步骤而是系统强制的准入门槛service android:name.RedPacketService android:enabledtrue android:exportedtrue android:labelstring/app_name android:permissionandroid.permission.BIND_ACCESSIBILITY_SERVICE intent-filter action android:nameandroid.accessibilityservice.AccessibilityService / /intent-filter meta-data android:nameandroid.accessibilityservice android:resourcexml/accessibility_service_config / /service关键在xml/accessibility_service_config文件。它决定了你的服务能看什么、不能看什么。常见错误是写成packageNamescom.tencent.mm/packageNames就完事——这会导致服务在微信后台时完全失活。正确做法是同时监听微信主包 通知栏 红包浮层可能归属的子进程!-- res/xml/accessibility_service_config.xml -- accessibility-service xmlns:androidhttp://schemas.android.com/apk/res/android android:accessibilityEventTypestypeNotificationStateChanged|typeWindowStateChanged|typeViewClicked android:accessibilityFlagsflagDefault|flagIncludeNotImportantViews|flagRequestFilterKeyEvents android:accessibilityFeedbackTypefeedbackGeneric android:notificationTimeout100 android:canRetrieveWindowContenttrue android:descriptionstring/accessibility_service_desc android:packageNamescom.tencent.mm,com.tencent.xweb,com.tencent.mobileqq:plugin android:settingsActivitycom.example.redpacket.SettingsActivity /提示android:packageNames必须包含com.tencent.mm微信主包但仅此一项不够。微信红包弹窗实际由X5WebView渲染其进程名常为com.tencent.xweb部分机型还会分离出独立浮层进程。漏掉任一包名服务将无法获取对应窗口的 ViewNode 结构——这是后续“找不到红包按钮”的头号原因。2.2 在 Service 中监听窗口变化并定位红包节点RedPacketService继承AccessibilityService后核心逻辑落在onAccessibilityEvent()回调中。这里不是简单等TYPE_NOTIFICATION_STATE_CHANGED而是要抓住TYPE_WINDOW_STATE_CHANGED事件因为微信红包弹窗尤其是拼手气红包极少走标准通知栏而是直接以 Dialog 形式 attach 到当前 Activity Window 上Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getPackageName() null || !event.getPackageName().toString().equals(com.tencent.mm)) { return; } // 重点只处理微信前台窗口变更避免后台误触 if (event.getEventType() AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { AccessibilityNodeInfo rootNode getRootInActiveWindow(); if (rootNode null) return; // 搜索关键词红包、恭喜发财、开、拆、手气最佳覆盖多语言 UI 变体 ListAccessibilityNodeInfo targetNodes findNodesByText(rootNode, 红包, 恭喜发财, 开, 拆, 手气最佳, Luck Money); if (!targetNodes.isEmpty()) { triggerRedPacketAction(targetNodes.get(0)); } rootNode.recycle(); // 必须回收否则内存泄漏 } }findNodesByText()是关键工具方法。它不能只用findAccessibilityNodeInfosByText()——微信会动态修改 TextView 的text属性如把“开”改成“已领取”而content-desc更稳定。因此真实项目中我们采用组合策略private ListAccessibilityNodeInfo findNodesByText(AccessibilityNodeInfo root, String... keywords) { ListAccessibilityNodeInfo result new ArrayList(); if (root null) return result; // 优先查 content-desc微信红包按钮的 desc 通常固定为 open_red_packet for (String kw : keywords) { ListAccessibilityNodeInfo byDesc root.findAccessibilityNodeInfosByViewId(com.tencent.mm:id/ kw); if (!byDesc.isEmpty()) { result.addAll(byDesc); } } // 兜底查 text但加长度限制防匹配到聊天记录里的“红包”二字 ListAccessibilityNodeInfo byText root.findAccessibilityNodeInfosByText(红包); for (AccessibilityNodeInfo node : byText) { if (node.getText() ! null node.getText().length() 4) { // “红包”仅2字“恭喜发财”4字 result.add(node); } } return result; }参数说明getPackageName()校验确保只处理微信事件getRootInActiveWindow()获取当前前台窗口根节点比getSource()更可靠recycle()是血泪经验——不调用会导致AccessibilityNodeInfo对象堆积App 在低端机上 3 分钟内必 ANR。3. 红包点击时机与控件识别为什么“找到了却点不动”3.1 微信红包弹窗的三层嵌套结构与点击坐标偏移微信红包弹窗并非单个 Button而是典型的「Dialog → LinearLayout → Button」三层结构。直接对找到的AccessibilityNodeInfo调用performAction(AccessibilityNodeInfo.ACTION_CLICK)常失败原因有二焦点未就绪Button 节点虽存在但系统未将其设为可点击焦点isClickable()返回 false坐标偏移getBoundsInScreen()返回的坐标是相对于整个屏幕的但微信红包 Dialog 带阴影和圆角实际可点击区域是内部 Button 的矩形而非 Dialog 外框。解决方案是绕过 ACTION_CLICK改用坐标点击并加入双重校验private void triggerRedPacketAction(AccessibilityNodeInfo node) { if (node null || !node.isClickable()) return; Rect bounds new Rect(); node.getBoundsInScreen(bounds); // 校验确保 bounds 在屏幕内且面积 200x200排除小图标 if (bounds.width() 200 || bounds.height() 200) { // 尝试向上找父节点可能是包裹 Button 的 LinearLayout AccessibilityNodeInfo parent node.getParent(); if (parent ! null parent.isClickable()) { parent.getBoundsInScreen(bounds); } } // 点击中心点避免边缘失效 int x bounds.centerX(); int y bounds.centerY(); // 执行点击需申请 INJECT_EVENTS 权限 Instrumentation inst new Instrumentation(); inst.sendPointerSync(MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0)); inst.sendPointerSync(MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0)); }注意INJECT_EVENTS权限需在AndroidManifest.xml中声明并在 Android 6.0 动态申请。但更稳妥的做法是不依赖该权限改用 AccessibilityNodeInfo 自带的点击能力——前提是先调用node.performAction(AccessibilityNodeInfo.ACTION_FOCUS)强制获取焦点if (node.performAction(AccessibilityNodeInfo.ACTION_FOCUS)) { // 等待 100ms 确保焦点生效 try { Thread.sleep(100); } catch (InterruptedException e) {} node.performAction(AccessibilityNodeInfo.ACTION_CLICK); }3.2 防误触机制如何区分“红包消息”和“红包结果页”一个高频翻车场景用户刚领完红包页面跳转至“红包详情页”此时界面上仍有“红包”文字服务误判为新红包并重复点击——结果点开的是自己刚领的记录而非新弹窗。解决思路是结合窗口类型与文本上下文。微信红包弹窗的windowType恒为TYPE_APPLICATION_PANEL浮层而红包详情页是TYPE_APPLICATION全屏 Activity。因此在onAccessibilityEvent()中加入类型过滤if (event.getWindowType() ! AccessibilityWindowInfo.TYPE_APPLICATION_PANEL) { return; // 只处理浮层窗口 }更进一步检查节点文本的语义组合。新红包弹窗必然包含“开”或“拆”动词 “红包”名词且二者距离极近同级兄弟节点或父子关系而详情页的“红包”常伴随“已领取”、“金额¥8.88”等静态描述。我们构建轻量语义分析器private boolean isRedPacketOpeningView(AccessibilityNodeInfo node) { if (node null) return false; // 检查是否含动作词 CharSequence actionText node.getContentDescription(); if (actionText null) actionText node.getText(); if (actionText ! null) { String txt actionText.toString().trim(); if (txt.contains(开) || txt.contains(拆) || txt.contains(open) || txt.contains(open)) { return true; } } // 检查兄弟节点是否有“红包”标签 AccessibilityNodeInfo parent node.getParent(); if (parent ! null) { for (int i 0; i parent.getChildCount(); i) { AccessibilityNodeInfo child parent.getChild(i); if (child ! null (child.getText() ! null child.getText().toString().contains(红包))) { return true; } } } return false; }4. 常见问题排查五条血泪踩坑记录与当场解法4.1 现象服务已启用但onAccessibilityEvent()完全不触发原因AndroidManifest.xml中android:permissionandroid.permission.BIND_ACCESSIBILITY_SERVICE缺失或meta-data的android:resource路径写错如写成xml/config但文件实际叫accessibility_service_config.xml。解决检查adb logcat | grep -i accessibility若看到Binding to service failed立即核对声明用aapt dump xmltree your_app.apk AndroidManifest.xml | grep -A 10 accessibility确认资源路径是否被编译进包。4.2 现象能监听到事件但getRootInActiveWindow()总返回 null原因android:canRetrieveWindowContenttrue未在 XML 中设置或用户未在系统设置中授予“显示在其他应用上层”权限Android 8.0 弹窗所需。解决在accessibility_service_config.xml中确认该属性为 true引导用户进入「设置 特殊访问权限 显示在其他应用上层」手动开启本 App。4.3 现象找到节点并调用performAction(ACTION_CLICK)但无反应原因节点处于不可用状态isEnabled()false或被遮挡isImportantForAccessibility()false。微信红包按钮在弹出瞬间常有 200ms 的禁用期。解决增加状态轮询for (int i 0; i 5; i) { if (node ! null node.isEnabled() node.isClickable()) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); break; } try { Thread.sleep(200); } catch (InterruptedException e) {} }4.4 现象在部分机型如华为 EMUI、小米 MIUI上完全失效原因厂商定制 ROM 对无障碍服务做了额外限制例如禁止后台运行、限制getRootInActiveWindow()调用频率、或强制要求服务必须在前台 Activity 中启动。解决在onServiceConnected()中启动一个前台 ServicestartForeground()维持进程活跃对华为设备额外申请android.permission.SYSTEM_ALERT_WINDOW对小米引导用户进入「设置 授权管理 特殊权限 悬浮窗」开启。4.5 现象点击后微信闪退或弹出“检测到异常操作”提示原因操作频率过高如 1 秒内连续点击 3 次触发微信风控或点击坐标过于精准如总点在按钮左上角 1px 区域不符合人类行为模型。解决引入随机抖动Random r new Random(); int offsetX r.nextInt(20) - 10; // ±10px int offsetY r.nextInt(15) - 7; // ±7px inst.sendPointerSync(MotionEvent.obtain(..., x offsetX, y offsetY, ...));并严格限制单次事件处理间隔 ≥ 800ms。5. 进阶验证与鲁棒性加固用日志回放与控件快照建立可信链5.1 构建可复现的红包事件日志体系单纯靠adb logcat查问题效率极低。我在模拟项目X 中落地了一套轻量日志方案每次onAccessibilityEvent()触发时将关键信息序列化为 JSON 写入本地文件并附上当前窗口的控件树快照截取AccessibilityNodeInfo的文本、ID、坐标、类型private void logWindowSnapshot(AccessibilityEvent event) { JSONObject log new JSONObject(); try { log.put(timestamp, System.currentTimeMillis()); log.put(eventType, event.getEventType()); log.put(packageName, event.getPackageName()); log.put(windowType, event.getWindowType()); AccessibilityNodeInfo root getRootInActiveWindow(); if (root ! null) { JSONArray nodes new JSONArray(); collectNodeInfo(root, nodes, 0); // 递归收集层级信息 log.put(nodes, nodes); root.recycle(); } } catch (Exception e) { e.printStackTrace(); } // 写入 /sdcard/redpacket_logs/20240520_142301.json File logDir new File(Environment.getExternalStorageDirectory(), redpacket_logs); logDir.mkdirs(); File logFile new File(logDir, new SimpleDateFormat(yyyyMMdd_HHmmss).format(new Date()) .json); try (FileWriter fw new FileWriter(logFile)) { fw.write(log.toString(2)); // 格式化缩进 } catch (IOException e) { e.printStackTrace(); } }这套日志的价值在于当用户反馈“某机型点不动”时你不再需要远程调试而是让他发来最近的.json文件。打开后一眼可见windowType是否为TYPE_APPLICATION_PANELnodes数组中是否存在text开且isClickabletrue的节点该节点的boundsInScreen是否合理如y2000表明在屏幕外。5.2 用控件哈希指纹应对微信 UI 动态化微信频繁更新 UIid/com.tencent.mm:id/xxx会变text会被国际化替换。硬编码 selector 必然失效。我的做法是对每个疑似红包节点生成一个结构指纹Structural Fingerprint而非依赖单一属性private String generateFingerprint(AccessibilityNodeInfo node) { if (node null) return ; StringBuilder fp new StringBuilder(); fp.append(node.getClassName()).append(|); // android.widget.Button fp.append(node.isClickable()).append(|); // true fp.append(node.isEnabled()).append(|); // true fp.append(node.getContentDescription() ! null ? node.getContentDescription().toString().length() : 0).append(|); // desc长度 fp.append(node.getText() ! null ? node.getText().toString().length() : 0); // text长度 return fp.toString(); } // 示例输出android.widget.Button|true|true|8|2 → 表示一个可点击、启用、desc长8字、text长2字的Button在配置文件中维护一份指纹白名单{ fingerprints: [ android.widget.Button|true|true|8|2, android.widget.TextView|true|true|0|4, android.view.View|true|true|6|0 ] }运行时比对指纹匹配即触发。这种策略让代码在微信 8.0.23–8.0.45 的 12 次 UI 更新中保持可用无需每次发版适配。5.3 为什么我不再写“全自动抢红包”三年前我花两周写了完整自动流程监听群消息→识别红包链接→跳转→开红包→截图→发结果。上线三天就被微信封设备。后来才明白真正的工程价值不在“全自动”而在“可解释、可干预、可审计”的半自动链路。现在我的习惯是——保留手动开关每次点击前弹 Toast“检测到红包点击确认领取3s 后自动取消”。用户按了才执行没按就丢弃。这看似倒退实则换来三点规避风控操作始终由人发起日志可追溯每笔领取都有用户确认 timestamp出问题时能快速归因是用户手滑没点还是节点没找到。技术没有高下只有是否贴合真实约束。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

多智能体协作工作台:开源MyCoWork让AI团队落地真实业务

多智能体协作工作台:开源MyCoWork让AI团队落地真实业务

这段时间跟很多团队聊下来,发现大家普遍卡在同一个地方:模型能力早就够用了,但真要让 AI 在业务里“干活”,总觉得差了点意思。要么是对话机器人只会聊不会做,要么是单点功能做出来了,却跟真实的工作流对不…

2026/10/13 15:58:04 阅读更多 →
Jetson+STM32双芯片架构:移动机器人实时控制源码包解析

Jetson+STM32双芯片架构:移动机器人实时控制源码包解析

简介:这份源码资源完整呈现了一台基于Jetson Orin NX(8GB)与STM32协同控制的移动机器人项目,面向正在入门ROS机器人开发、嵌入式运动控制或激光雷达与视觉融合应用的开发者。包内包含ROS工作空间、STM32控制逻辑、机械臂与车身运动控制相关代码&#xff…

2026/10/13 15:58:04 阅读更多 →
WebSocket实时推送实战:握手、心跳与断线重连的避坑指南

WebSocket实时推送实战:握手、心跳与断线重连的避坑指南

做过实时推送的同学,大概率都经历过这么一段:后端一把数据塞进数据库,前端为了拿到它,要么死循环轮询接口,要么用长轮询把请求挂着,延迟和服务器压力两头受罪。后来我把项目里的推送链路逐步迁到了 WebSock…

2026/10/13 15:58:04 阅读更多 →

最新新闻

Rust性能优化实战:五个技巧榨干硬件性能

Rust性能优化实战:五个技巧榨干硬件性能

很多人聊 Rust 性能优化,第一反应是“这语言天生就快,还用得着调?”我最初也这么想,直到接手一个用 Rust 写的日志处理服务,在单机 8 核上处理一千万条日志要跑十几秒,调完之后压缩到两秒出头,C…

2026/10/13 16:37:10 阅读更多 →
5G智慧校园解决方案:云网端架构、专网组网与评审避坑指南

5G智慧校园解决方案:云网端架构、专网组网与评审避坑指南

简介:这份PPT围绕5G智慧校园解决方案展开,面向教育信息化管理者、智慧校园规划人员及行业方案设计师,系统梳理了教育信息化从1.0“三通两平台”迈向2.0“三全两高一大”的政策背景与现实需求,并针对教学质量提升、资源优质共享、校…

2026/10/13 16:37:10 阅读更多 →
Python声纹识别实战:EcapaTdnn/ResNetSE等四大模型对比与工业部署

Python声纹识别实战:EcapaTdnn/ResNetSE等四大模型对比与工业部署

简介:本资源是一套基于PaddlePaddle实现的声纹识别系统完整工程,面向人工智能方向的学习者、语音算法初学者及高校课程设计实践者,聚焦于说话人身份验证这一典型生物特征识别任务。项目集成EcapaTdnn、ResNetSE、ERes2Net、CAM等前沿模型&…

2026/10/13 16:37:09 阅读更多 →
Rust性能优化五技巧:数据结构、内存分配与缓存友好

Rust性能优化五技巧:数据结构、内存分配与缓存友好

Rust 的性能优化,说起来很有意思。大家选 Rust 多半是冲着性能来的,但真正把程序写出来之后,你会发现“能跑”和“跑得快”之间还有很长一段路。我早期做 Rust 项目时也走过弯路,一度以为堆一些 unsafe 代码、换更高级的算法就是优…

2026/10/13 16:37:09 阅读更多 →
开源大模型本地部署四件套:环境配置、私有部署、LoRA微调与LangChain接入

开源大模型本地部署四件套:环境配置、私有部署、LoRA微调与LangChain接入

简介:本资源是一套面向AI工程师与大模型应用开发者的开源大模型全栈实践工具包,聚焦环境配置、私有化部署、LoRA微调及LangChain集成四大核心环节,助力开发者快速落地本地化大模型应用。压缩包共79个文件,涵盖45个Python脚本&…

2026/10/13 16:37:09 阅读更多 →
实习和校招到底在选什么?从简历到面试的完整求职指南

实习和校招到底在选什么?从简历到面试的完整求职指南

1. 实习和校招到底在选什么很多同学第一次接触实习和校招的时候,脑子里冒出来的第一个问题往往是“我该投哪家”“简历怎么写”“面试问什么”。这些问题当然重要,但如果只盯着这些操作层面的东西,很容易陷入一种“做了很多准备却始终不得要领…

2026/10/13 16:36:05 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →