鸿蒙环境ACME协议级适配:HTTPS证书自动签发与续签实战
去年那次证书翻车我至今想起来还很肉疼。自建服务跑在一台边缘设备上证书是三个月前手动签的结果用户某天突然反馈“连接不受信任”我登上去一看证书已经过期两天服务在夜里悄悄挂掉了。从那以后我给自己定了个规矩凡涉及自建HTTPS服务证书签发和续签一律走自动化绝对不靠人脑记时间。最近在鸿蒙设备上做服务通信适配我干脆把Dart生态里的shelf_letsencrypt拉过来做了一次深度介入和协议级适配。目标很明确自动接管全量域名的SSL证书签发与续签让端到端通信链路具备防流量劫持能力。这篇文章就把整个过程的思路和实操细节拆开讲从ACME协议介入点到鸿蒙网络栈适配从续签调度到劫持演练给打算在鸿蒙设备上部署自建服务、或者正在做跨平台安全链路适配的开发者一份可直接参考的路线图。1. 为什么说“协议级适配”不是在鸿蒙上重新编译那么简单如果你以为“Flutter能跑在鸿蒙上那Dart生态的库肯定也能直接搬过去”那大概率会在通信相关的库上栽跟头。这个结论来自我参与某模拟项目X的经历当时服务端跑在某鸿蒙开发板上网络部分用Dart标准的dart:io普通HTTP请求一切正常。等把shelf_letsencrypt装上去问题立刻暴露——库初始化时要在80端口上绑定一个应答ACME挑战的服务bind直接报错。翻日志发现是沙箱网络策略不允许普通应用直接监听低端口。这类问题不能靠简单换个端口解决。ACME的HTTP-01挑战要求证书颁发机构能通过http://域名/.well-known/acme-challenge/xxx访问到token文件而这个路径默认依赖80端口。你换成高位端口除非做出口端口映射否则挑战永远无法完成。所以这根本不是“库有没有Bug”的问题而是端口策略、协议流程、网络链路三个层面的共同适配任务。再往深处看鸿蒙沙箱对证书信任的处理也和普通Linux不一样普通Linux改一下ca-certificates就能全局信任鸿蒙应用沙箱有自己的证书管理策略要么把证书导入信任库要么在应用网络配置里显式声明信任范围。这些差异叠加起来逼着我重新思考适配的边界。层次Linux/类Unix默认行为鸿蒙沙箱环境适配动作端口绑定允许绑定指定端口通常需root或较宽松机制应用级沙箱限制端口默认无法监听80/443这类弱权限端口绑定高位端口 网关做端口映射证书存储文件系统任意目录如/etc/ssl沙箱专属目录或系统信任库自定义存储介质PEM路径切换到沙箱目录挑战响应随便起个HTTP服务在80端口挂载路径HTTP服务需在鸿蒙网络能力框架内运行让ACME挑战流量经网关转发到业务端口我对“协议级适配”的定义是不是你改一行业务代码去适应库而是要把库依赖的协议生命周期搬到目标平台并让它在该平台上稳定闭环。落到鸿蒙上就要把ACME流程里“绑定端口、响应请求、读写证书、信任链加载”这几件事全部重新落地。1.1 别再被“库级移植”的表象迷惑有人可能会说shelf_letsencrypt只是依赖shelf的HTTP服务能力而shelf可以跑在任意HttpServer上这算什么问题问题在于shelf_letsencrypt为了完成ACME挑战默认会在你指定的端口上直接监听外部请求。这个行为在Linux服务器上是常规操作但在鸿蒙沙箱里等于踩了权限红线。我在某鸿蒙开发板上实测普通应用连绑定8000端口都需要额外能力声明更别说80端口。所以适配的首要动作不是改Dart代码逻辑而是先确认这个环境允许你监听哪个端口、允许你写到哪个目录、允许你加载哪种证书格式。搞清楚这三个“允许”适配的路子就算定了一半。2. shelf_letsencrypt 的 ACME 核心流程与两个关键接入点在动手改代码之前必须把shelf_letsencrypt背后的ACME流程吃透这一步省不得。它的核心工作流程可以归纳为四件大事注册账户、创建订单、完成挑战、签发与续签证书。注册账户发生在首次启动时库会生成一个账户密钥通过ACME协议向Lets Encrypt提交你的邮箱等信息创建订单时库把需要保护的所有域名放进一个订单里请求证书颁发机构为每个域名生成授权挑战完成挑战是ACME协议里最关键的动作服务器必须证明自己确实控制着这些域名签发与续签则是拿到证书文件后在有效期窗口内反复执行的动作。这四步里shelf_letsencrypt已经把细节封装好了但它暴露了两个接口是适配时必须介入的。2.1 接入点一HTTP-01挑战的响应路径ACME验证你的域名控制权最常见的方式是HTTP-01Lets Encrypt随机生成一个token然后通过http://你的域名/.well-known/acme-challenge/这个token回访。如果你的服务器在那个路径上返回了约定的内容就说明这个域名确实归你管。// 示意shelf_letsencrypt 默认会挂载挑战路径 final challengeHandler shelf_letsencrypt.challengeHandler; // 等价于在 .well-known/acme-challenge/ 路由上返回 token 内容在鸿蒙上适配这个接入点问题就是第一节说的端口困局。我的做法是让库绑定到一个可用高位端口同时把外部80端口的流量用网关转发到那个高位端口上。这样ACME验证服务器从公网访问域名时请求走到80网关转给鸿蒙设备内网IP的18080端口挑战服务器在那里接收并应答。这里还要小心一个隐蔽问题如果你自己的业务路由也挂在同一个shelf实例上必须确保任何业务路由都不要吞掉/.well-known/acme-challenge/前缀。否则ACME回访请求会被业务路由拦截返回404挑战永不成功。2.2 接入点二证书存储与续签状态的持久化shelf_letsencrypt拿到证书后要落盘里面包括账户密钥、私钥文件、证书文件和证书链文件。它默认写入你配置的storageDirectory目录但鸿蒙沙箱里不存在绝对的、可写的/路径只能通过系统API拿到应用专属目录。我在适配时做了两件事动态获取沙箱路径并在启动时把路径拼接好后传给库同时把“上次续签时间、剩余天数、证书指纹”作为一份独立JSON状态文件同步保存。这份状态文件非常重要它让整个自动化系统有了“记忆”——重启后不用重新签发证书只需要比对当前文件系统中的证书有效期和状态记录就知道该不该触发续签。2.3 为什么这套设计能撑起“自适应”这个词标题里提到的“自适应型”堡垒我的理解是系统不要依赖固定的端口、固定的绝对路径、固定的人工干预。适配层应该能自动探测当前鸿蒙设备可用的网络能力、自动拼接沙箱存储路径、自动判断证书是否临近过期。这样同一个代码包放到不同型号的开发板、不同鸿蒙版本上都能自己调整行为并跑起来。3. 鸿蒙网络协议栈的适配改造从 Socket 到证书信任链这一章是实际操作中的重头戏我把改造过程分成四步每一步都有明确的验证目标。第一步绑定可监听端口。我不能让库直接监听80或443因为鸿蒙沙箱大概率拒绝。适配层的做法是先探测端口可用性优先从高位数端口段里选一个固定端口例如18080和18443然后在出口网关配置端口转发规则把对公网IP的80和443请求转给内网鸿蒙设备的18080和18443。整个过程不涉及修改业务协议只是把“入站流量进出口”换了个方式。第二步让ACME挑战流量与业务流量分离。在shelf_letsencrypt的handler外侧加一层路由判断凡是请求路径以/.well-known/acme-challenge/开头的直接交给挑战处理器其余请求再进业务路由。这样即使业务代码里写了通配符路由也不会误伤挑战路径。第三步完成证书落地。证书文件以PEM格式保存到鸿蒙沙箱目录比如{sandbox}/certificates/。我建议分三个文件保存cert.pem叶证书、chain.pem中间CA链、privkey.pem私钥。真正配置到HTTPS服务时必须把cert和chain拼成一个文件传给服务器加载。// 伪代码示意适配层中指定沙箱存储目录 final storageDir await getHarmonySandboxPath(certificates); final serverHandler ShelfLetsEncrypt( email: adminexample.com, domains: [api.sim-project.internal], storageDirectory: storageDir, isProduction: true, ).handler(_businessHandler); await serve(serverHandler, InternetAddress.anyIPv4, 18080);第四步信任链检查。这是鸿蒙端最显眼的坑。如果你把shelf_letsencrypt签出来的叶证书单独拿去用客户端会报“证书无效”因为你没把中间CA带上。Lets Encrypt签发的证书链通常包含一个中间CA正确做法是叶证书和中间CA一起传输。我在鸿蒙设备上自建的测试环境里就是漏了这一步排查了半小时才发现是证书链不完整。3.1 鸿蒙网络能力声明与权限配置千万别忘了在鸿蒙工程的配置文件里声明网络权限。我在初期适配时漏了局域网访问权限导致设备只能访问公网内网网关转发过来的ACME挑战请求全部被拦截。常见的声明包括Internet访问权限、局域网通信权限、以及监听网络状态的能力。具体字段名会根据鸿蒙版本和工程模板不同而变化适配时建议先确认目标设备的最小系统版本。3.2 证书文件的原子替换与热加载续签完成后证书文件会被新版本覆盖。如果业务服务器正在运行直接把证书文件换掉可能导致加载到半新半旧的内容。比较好的做法是把新证书先写到临时文件再重命名或者监听文件变更事件后触发TLS配置的重新加载。在shelf_letsencrypt配合自建代理的场景里配置好文件变更回调后这个过程可以做到无需重启服务。4. 全量域名自动接管与续签调度从一份清单说起“全量域名”这四个字听上去像要管无穷无尽的证书实际上没那么夸张关键在于怎么设计域名清单。Lets Encrypt允许在一张证书里写入多个域名也就是SAN扩展。如果你的域名之间共享同一个根域比如主域和一堆子域完全可以塞进一张证书里统一签发和续签。这是我认为效率最高的自动接管方式。4.1 域名清单的结构与调优我在配置文件里维护一份YAML清单结构化地描述应该签发哪些域名certificates: - name: api-gateway email: adminsim-project.internal domains: - sim-project.internal - api.sim-project.internal - admin.sim-project.internal storage: certificates/api-gateway这里sim-project.internal是虚构的测试域名实际使用时替换为你的真实域名即可。把域名集中到一张SAN证书里意味着续签时只需要处理一个订单、一次ACME挑战流程、一次文件替换自动化逻辑可以大幅简化。但也要注意Lets Encrypt对SAN数量和执行频率有限制一张证书最多100个SAN每个域名每月限制50个证书签发。对于常见的中小型服务完全够用如果真的需要保护多个完全不同的根域那就按根域拆成多个证书清单分别管理。4.2 续签窗口的选择90天有效期背后的数学题Lets Encrypt签发的证书有效期只有90天这是为了降低被盗用后长期有效的风险。既然有效期这么短续签自动化就必须成熟可靠。我的经验是把续签阈值设置为剩余35天左右而不是等到最后一周。为什么是35天因为要覆盖几种最坏情况DNS记录修改后的传播延迟可能长达数小时ACME挑战在繁忙网络下可能超时失败设备可能因为过热、断电等原因离线几天。35天触发的窗口让系统有充足的失败重试时间。实际调度策略我采用“服务启动立即检查 每24小时自动巡检”的节奏。服务启动时做一次强制检查能处理“设备重启后证书即将过期”的局面每24小时的巡检负责处理正常生命周期里的续签任务。为了避免错误重试把证书颁发机构接口打爆续签失败要用指数退避第一次失败等1小时第二次等2小时第三次等4小时最多累计十次超过后只在状态文件里记录失败原因。4.3 状态文件驱动的无人值守机制为什么状态文件这么重要因为ACME是带状态的协议如果设备中途断电、重启PSK和订单状态会丢失可能导致重复签发或挑战失败。我用一份ssl-state.json记录每个证书的域名列表、证书签发时间、剩余天数、上次续签时间、续签失败次数。{ api.sim-project.internal: { issuedAt: 2025-01-01T00:00:00Z, expiresAt: 2025-04-01T00:00:00Z, daysRemaining: 35, lastRenewalAttempt: 2025-02-25T00:00:00Z, lastFailureReason: null, renewalFailureCount: 0 } }启动流程变成读取状态文件 → 逐项检查证书实际文件是否存在 → 如果证书文件不存在或剩余天数小于阈值 → 触发续签。这套机制的好处是“无人值守”不再是一个空洞的词设备重启后系统知道自己该干什么网络异常时它会等待下一轮重试而不是放弃。5. 端到端防劫持证书自动续签不是安全终点也许有人会以为“证书自动续签都做完了防劫持肯定也没问题了”。这是整个项目里最要命的误解。证书自动续签解决的只是“证书不过期”这一个维度但流量劫持的手段远远不止“证书过期”这一种。举个典型的中间人场景攻击者通过某种方式控制了你的DNS解析把你的域名指向他自己的服务器然后他也申请一张你这个域名的合法证书Lets Encrypt签发证书不验证主体身份只验证域名控制权。当用户访问你的域名时实际上连到了攻击者的服务器证书链上显示的是合法证书用户不会收到任何告警。如果整个安全体系只有“证书自动续签”这一层这个劫持攻击会顺利通过悄无声息。所以我在完成自动续签之后又给链路补了三个机制。5.1 HSTS把“可选HTTPS”变成“强制HTTPS”HSTS是最简单也最容易被忽略的一层防护。服务端在响应头里返回Strict-Transport-Security字段告诉客户端“该域名在约定时间内只能使用HTTPS访问使用HTTP访问直接报错或自动升级”。这就杜绝了攻击者把HTTPS请求降级成HTTP的常见手法。// 给业务响应统一加 HSTS 响应头 const hstsHeader Strict-Transport-Security: max-age31536000; includeSubDomains;首次开启时建议先用较小的max-age比如一天确认所有客户端都正常后再延长到一年。因为HSTS一旦设置客户端会“记住”这个策略万一后续有问题短时间内不好立即回退。5.2 证书固定或指纹监控给客户端一把认准的钥匙如果客户端是你自己开发的App或固件直接做证书固定最稳妥客户端内置服务器的证书公钥指纹或证书指纹每次建立TLS连接时比对。即使攻击者拿到了合法证书只要指纹不同客户端就直接拒绝。如果客户端数量不可控没办法做固定那就做指纹监控定期用自己的服务器重新获取证书算出证书指纹和本地状态文件里的指纹比对。指纹发生变化且不在预期的续签窗口内立刻告警。这一步能有效发现“证书被悄悄替换”的异常。5.3 主动做一次劫持演练让“自以为安全”暴露真相测试环境里我把模拟项目X的域名DNS手动指向一台持有自签名证书的测试服务器然后尝试连接。结果符合预期仅配置了自动续签时因为攻击方可以配出合法证书TLS校验完全通过连接成功——劫持“成功”了再加上证书固定后客户端因为指纹不匹配而拒绝连接劫持演练这才符合预期。这个演练告诉我安全体系必须做纵深防御每一层解决一类风险。6. 实测与排雷从签发到续签再到劫持演练的完整链路实践是检验适配成果的唯一标准。我在鸿蒙设备上完整跑通了“首次签发 → 到期续签 → 劫持演练 → 异常恢复”四组场景这里把过程中的关键命令和排雷经验整理出来。6.1 首次签发与证书校验启动服务后先看日志里ACME流程是否走完然后再用命令验证证书文件本身是否正确。最直接的工具是opensslopenssl s_client -connect api.sim-project.internal:443 \ -servername api.sim-project.internal \ | openssl x509 -noout -text重点检查几项证书的Subject和Subject Alternative Name是否覆盖了清单里的所有域名Issuer是不是Lets Encrypt的中间CA而不是它的根CA直接签发Validity是否合理正常应该是90天窗口。如果浏览器或客户端仍然提示“不信任”大概率是证书链没有完整下发。把叶证书和中间CA拼成一个文件重新配置后问题就能解决。6.2 模拟续签的实操思路Lets Encrypt不允许申请人自定义证书有效期所以没法直接把证书改成“还有1天过期”来验证续签。我的替代方案是直接删除本地证书文件让shelf_letsencrypt在下一轮巡检时发现证书缺失触发重新签发流程。这一步能验证“证书缺失导致重新申请”的路径。但要真正验证“证书过期导致续签”的路径还需要改状态文件里的到期时间把expiresAt改成昨天daysRemaining改成负数再触发巡检。调度器会认为证书已过期并重新走签发流程。等证书签发完成后再核对状态文件里的daysRemaining是否回到接近90天就能确认续签流程闭环。6.3 常见异常排查表现象常见原因处理动作ACLET挑战返回404端口映射没配到位或业务路由吞掉了/.well-known/acme-challenge/前缀检查网关转发规则确认挑战路径优先匹配证书链不完整导致客户端报错只配置了叶证书没带中间CA将cert.pem与chain.pem拼接后重新配置续签一直失败沙箱目录不可写或存储介质被清空确认storageDirectory有写权限状态文件路径稳定客户端报“不信任”设备时间不同步或证书未导入系统信任库设备重新同步时间检查信任库配置劫持演练“意外成功”安全策略只有自动续签缺少指纹校验或固定加证书指纹监控或启用客户端证书固定6.4 无人值守不等于放养整套自动化链路跑通之后最明显的收获是不再需要半夜爬起来看证书是不是到期了。但自动化取代的是“手动操作”不是“风险意识”。建议在链路之外保留一个独立的告警通道证书剩余天数少于15天、续签连续失败超过三次、证书指纹发生变化这三类事件必须能主动推给你。真等用户反馈“连接不安全”的时候损失已经造成了。这次鸿蒙适配做完我对“协议级适配”的理解比之前深了一个层次。真正的适配不只是让库在鸿蒙上通过编译而是让整个证书生命周期管理在这套沙箱环境里闭环运转端口从80变成高位端口存储从固定路径变成动态沙箱目录安全边界从单点证书变成多层防线。如果只是把库跑起来那只是一次库级移植把协议相关的权限、存储、信任链、调度全部重新设计并跑通才算真正落地。

相关新闻

机器人开源数据集体检:五维健康度评估框架

机器人开源数据集体检:五维健康度评估框架

1. 项目概述:一次意外触发的开源数据集健康诊断实践“给机器人开源数据集做‘体检’”——这听起来不像常规操作,倒像实验室里某个凌晨三点的灵光乍现。但恰恰是这次看似边缘的尝试,撬动了整个机器人数据供应链的认知盲区。我最初只是想验证一…

2026/10/17 13:02:13 阅读更多 →
AI智能体耗电量估算:从芯片到业务的四层功耗归因法

AI智能体耗电量估算:从芯片到业务的四层功耗归因法

1. 这不是“算电费”,而是AI智能体落地前必须掐住的命脉 你有没有遇到过这样的场景:团队花三个月打磨出一个能自动处理客户投诉、实时调取知识库、还能生成合规回复的AI智能体,部署到生产环境后,运维同事突然发来一条消息&#x…

2026/10/17 13:02:13 阅读更多 →
数据可视化实战指南:从图形选型到仪表板布局的五大核心技巧

数据可视化实战指南:从图形选型到仪表板布局的五大核心技巧

先说个我自己的经历。前两年我接手一个内部运营数据展示需求,业务方上来就点名要"炫酷大屏",要动态地图、要飞线、要3D柱状图。我花了一周把效果堆出来,结果业务方盯着看了三十秒,问了一句"所以哪个环节掉单最严重…

2026/10/17 13:02:13 阅读更多 →

最新新闻

AI绘图工具快速制作小说封面:51mazi实操指南

AI绘图工具快速制作小说封面:51mazi实操指南

做小说封面这件事,过去一直是很多作者心里的老大难。花钱找设计师吧,一版改三五次,报价从几十到几百不等;自己动手用PS吧,光是图层、字体、滤镜就能劝退一大半人。我认识的不少作者,最后都是直接套网站模板…

2026/10/17 14:03:56 阅读更多 →
从Copilot到Agent:AI编程工具选型的关键路径与避坑指南

从Copilot到Agent:AI编程工具选型的关键路径与避坑指南

简介:《2025年全球AI Coding市场洞察研究报告》由亿欧智库出品,面向具备编程基础的研发人员、企业开发团队及关注AI编程的非技术人员。报告系统梳理了AI编程工具从代码补全向自主型AI Agent跃迁的演变路径,涵盖主流工具测评、中美市场差异、产…

2026/10/17 14:03:56 阅读更多 →
智能网联汽车仿真测试白皮书:从在环测试到场景库的落地指南

智能网联汽车仿真测试白皮书:从在环测试到场景库的落地指南

简介:《中国智能网联汽车自动驾驶仿真测试白皮书(2023版)》聚焦智能网联汽车仿真测试,系统梳理了行业从传统实车测试转向人-车-路-云强耦合系统验证的背景,直面恶劣气象、复杂电磁环境等测试挑战,适合汽车研…

2026/10/17 14:03:56 阅读更多 →
MyBatis拦截器实战:打印SQL执行方法、SQL与耗时排查慢查询

MyBatis拦截器实战:打印SQL执行方法、SQL与耗时排查慢查询

做后端这几年,我几乎每次排查接口慢、数据查不对的问题,第一反应都是先看 MyBatis 到底执行了什么 SQL。但早期我的项目里一没配日志、二没加拦截器,控制台干干净净,翻到数据库端去查慢查询日志又费劲,一条条对上接口里…

2026/10/17 14:03:56 阅读更多 →
AI Agent治理实战:从权限分级到审计追踪,守住自主性安全边界

AI Agent治理实战:从权限分级到审计追踪,守住自主性安全边界

OpenFang 是我们内部维护的一个多步骤 AI Agent,今年年初我把它的自主性调到了比较激进的一档。结果第三周就出了事:它按照预设目标自己拆解了六个子任务,调用了文件服务、数据库查询和消息推送,一气呵成地跑完了整个流程——但把…

2026/10/17 14:03:56 阅读更多 →
Windows Server 2012任务计划程序报错0x800710E0排查与解决

Windows Server 2012任务计划程序报错0x800710E0排查与解决

早上到办公室,看到运维告警邮件,一台 Windows Server 2012 上有两个计划任务没跑,后台面板上显示“上次运行结果”是 0x800710E0,错误信息写着“操作员或系统管理员拒绝了请求(0x800710E0)”。这个报错在 2…

2026/10/17 14:02:56 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/17 1:44:59 阅读更多 →
影刀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 阅读更多 →