StarModAPI 在 StarMade 服务器中的实现:加载器接入、事件注册与性能优化
简介StarMod 是一份面向 Java 服务端开发者的开源项目源码基于 StarModAPI 为沙盒太空模拟游戏《StarMade》提供可扩展、可定制的服务器实现适合希望深入理解游戏服务器架构、网络通信与插件机制的中高级开发者研读。压缩包共 66 个文件约 58KB以 55 个 Java 源文件为主体辅以 Gradle 构建脚本、配置文件、许可证与说明文档整体结构紧凑便于快速定位核心模块。项目覆盖服务器端框架、API 接口设计、多线程并发、Socket 与 NIO 网络编程、数据库集成、序列化反序列化、权限管理、日志记录以及 CI/CD 与版本控制等关键知识点读者可从中学习如何组织一个完整的游戏服务端工程。目前已有 6195 人学习下载可作为 Java 网络编程与游戏服务器开发的实战参考帮助理解客户端连接处理、状态同步与插件扩展的实现思路。1. StarMod 与 StarMade 服务器为什么需要一层 API 实现StarMade 是一款以方块宇宙为背景的沙盒建造游戏玩家在服务器里自由搭建飞船、空间站和行星基地。原版服务端只提供最基础的游戏逻辑想加自定义事件、动态经济、权限分级就得自己写模组。StarMod 就是在这个背景下出现的一套模组加载与事件分发方案而 StarModAPI 则是它对外暴露的编程接口。很多服主拿到 StarModAPI 的文档后卡在同一个地方接口有了但不知道在 StarMade 服务端里怎么把它跑起来、怎么让自定义逻辑真正挂到游戏循环上。这篇笔记就围绕「StarModAPI 的 StarMade 服务器实现」展开把加载器怎么接、事件怎么注册、数据怎么持久化、性能怎么守住这几件事讲透。适合已经能开一个原版 StarMade 服务端、想往里面塞自定义玩法的服主和模组开发者。2. StarMod 加载器怎么挂进 StarMade 服务端从启动参数到类加载2.1 先搞清楚 StarMod 在服务端启动链里的位置StarMade 服务端启动时主类会依次初始化配置、网络监听、世界管理器和模组容器。StarMod 的常见做法是把自己做成一个「启动期注入」的加载器在服务端主类完成配置读取之后、世界管理器创建之前把 StarModAPI 的核心类加载进去并注册一个全局事件总线。这样做的原因是世界管理器一旦创建方块实体和玩家实体就开始产生事件如果加载器挂得太晚早期事件会丢失表现为「玩家进服了但自定义欢迎逻辑没触发」这种玄学问题。我一般会把加载器拆成三个职责类加载隔离、事件总线初始化、模组清单扫描。类加载隔离是为了避免模组之间的依赖冲突比如两个模组都带了不同版本的 JSON 解析库。事件总线初始化要保证线程安全因为 StarMade 服务端的主循环和网络线程是分开的。模组清单扫描则决定哪些模组会被启用通常读一个mods目录下的描述文件。2.2 用启动脚本把 StarMod 加载器接进服务端下面是一个最小化的启动脚本示例假设服务端主 jar 和 StarMod 加载器 jar 都在同一目录。关键点是用-javaagent或者把加载器放进 classpath 的靠前位置具体取决于你的加载器实现方式。这里用 classpath 前置的方式兼容性更好。#!/bin/bash # StarMade 服务端启动脚本接入 StarMod 加载器 # 注意-cp 中 starmod-loader.jar 必须排在 starmade-server.jar 之前 # 这样类加载器会优先从加载器 jar 中查找 StarModAPI 相关类 SERVER_HOME/opt/starmade-server JAVA_BIN/usr/bin/java # 堆内存按实际玩家数调整20 人服建议 4G 起步 HEAP_OPTS-Xms2G -Xmx4G -XX:UseG1GC cd $SERVER_HOME || exit 1 $JAVA_BIN $HEAP_OPTS \ -cp starmod-loader.jar:starmade-server.jar:lib/* \ -Dstarmod.mods.dir$SERVER_HOME/mods \ -Dstarmod.log.levelINFO \ org.schema.game.server.ServerMain \ -port 4242 \ -world world_alpha这段脚本里-cp的顺序是核心加载器 jar 在前才能保证 StarModAPI 的类先被找到。-Dstarmod.mods.dir指定模组扫描目录-Dstarmod.log.level控制加载器自身日志级别排查问题时可以调到 DEBUG。org.schema.game.server.ServerMain是服务端入口类不同版本可能略有差异以你手头服务端 jar 里的实际主类为准。启动后如果看到加载器打印「mods directory scanned, N mods found」说明挂载成功。2.3 模组描述文件与加载顺序控制StarMod 加载器扫描到模组后需要知道每个模组的元信息和依赖关系。常见做法是每个模组目录下放一个mod.json字段包括模组 ID、版本、入口类、依赖列表。加载器按依赖拓扑排序后依次初始化避免「A 模组依赖 B 模组但 B 还没加载」的翻车现场。{ id: example.economy, name: Example Economy Mod, version: 1.0.0, mainClass: com.example.economy.EconomyMod, apiVersion: 1.0, dependencies: [example.core], loadAfter: [example.core], enabled: true }id是模组唯一标识加载器和事件总线都用它来区分来源。mainClass是模组入口必须实现 StarModAPI 里的ModInitializer接口。dependencies和loadAfter共同决定加载顺序前者是硬依赖缺失就报错跳过后者是软顺序只影响先后不影响成败。apiVersion用来做兼容性检查加载器发现模组声明的 API 版本高于当前加载器支持的版本时会拒绝加载并打印明确原因这比运行到一半抛NoSuchMethodError要好排查得多。3. 事件注册与游戏循环对接让自定义逻辑真正跑起来3.1 StarModAPI 的事件模型长什么样StarModAPI 的事件模型通常是「事件类型 监听器 优先级」三件套。事件类型对应游戏里的具体动作比如玩家登录、方块放置、实体死亡、服务器 tick。监听器是开发者写的回调方法优先级决定同一事件下多个监听器的执行顺序。常见做法是数值越小越先执行这样核心模组可以抢占早期处理权比如权限模组需要在欢迎模组之前判断玩家是否被封禁。事件总线本身要处理两个问题一是线程安全因为游戏主循环和网络线程都会发事件二是异常隔离某个监听器抛异常不能把整个事件分发链打断。我一般会在总线里对每个监听器调用做 try-catch把异常记到模组自己的日志里然后继续执行下一个监听器。这样即使某个模组写崩了也不会导致服务器直接卡死。3.2 注册一个玩家登录事件监听器下面是一个完整的监听器注册示例用 Java 写假设 StarModAPI 提供了EventBus和PlayerLoginEvent两个类。代码里演示了优先级设置和事件取消。package com.example.economy; import starmod.api.EventBus; import starmod.api.EventPriority; import starmod.api.event.PlayerLoginEvent; import starmod.api.event.EventListener; public class EconomyMod implements ModInitializer { Override public void onInitialize() { // 注册玩家登录监听器优先级 NORMAL不抢占其他模组 EventBus.register(PlayerLoginEvent.class, EventPriority.NORMAL, new EventListenerPlayerLoginEvent() { Override public void onEvent(PlayerLoginEvent event) { String playerName event.getPlayerName(); // 从持久化存储读取玩家余额首次登录初始化为 100 int balance EconomyStore.getBalance(playerName, 100); event.getPlayer().sendMessage(你的当前余额: balance); // 如果余额为负可以取消登录或做其他处理 if (balance 0) { event.setCancelled(true); event.setCancelReason(余额异常请联系管理员); } } }); } }EventBus.register的第一个参数是事件类型第二个是优先级第三个是监听器实例。EventPriority.NORMAL表示普通优先级权限类模组可以用HIGHEST或MONITOR。event.getPlayerName()拿到登录玩家名EconomyStore.getBalance是自定义的持久化读取方法第二个参数是默认值。event.setCancelled(true)会阻止后续监听器和默认登录逻辑适合做封禁或异常拦截。注意取消事件要谨慎一旦取消玩家就进不了服排查时先看日志里有没有「login cancelled by mod」这类记录。3.3 把监听器挂到服务器 tick 循环上除了玩家动作事件很多逻辑需要按固定频率执行比如每秒扣一次领地维护费、每 30 秒保存一次经济数据。StarModAPI 一般会提供Scheduler接口支持延迟执行和周期执行。下面是一个周期任务的注册示例。// 在 onInitialize 中注册周期任务 Scheduler.scheduleSyncRepeatingTask(this, new Runnable() { Override public void run() { // 每 20 tick 执行一次StarMade 默认 20 tick 约等于 1 秒 // 遍历在线玩家扣除领地维护费 for (Player player : Server.getOnlinePlayers()) { int fee TerritoryManager.calculateFee(player); if (fee 0) { EconomyStore.deduct(player.getName(), fee); } } } }, 0L, 20L); // 初始延迟 0 tick周期 20 tickscheduleSyncRepeatingTask的第一个参数是模组实例用来在模组卸载时自动取消任务。第二个参数是初始延迟0 表示服务器启动后立即开始。第三个参数是周期20 tick 对应约 1 秒具体以服务端 tick 率为准。这里用同步任务是因为要访问玩家对象和持久化存储异步任务里访问这些容易出并发问题。如果任务执行时间超过 tick 间隔服务器会开始卡顿所以周期任务里不要做重 IO批量保存可以拆成多个 tick 分批做。4. 数据持久化与配置管理别让玩家数据变成黑匣子4.1 选文件存储还是嵌入式数据库StarMod 模组的数据持久化常见有三条路纯 JSON 文件、SQLite 嵌入式库、外部数据库。纯 JSON 适合配置和小规模玩家数据优点是零依赖、可读性好缺点是并发写容易损坏玩家多了以后每次全量读写很慢。SQLite 适合中等规模单文件、支持事务、并发读没问题写需要加锁。外部数据库适合多服共享数据但引入网络依赖运维复杂度上升。我一般会按数据量分配置和模组元数据用 JSON玩家余额、领地记录用 SQLite跨服排行榜才考虑外部数据库。下面是一个 SQLite 初始化示例用 JDBC 直接操作不引入额外 ORM。// 初始化 SQLite 连接数据库文件放在模组数据目录下 String dbPath ModDataDir.getPath(economy.db); Connection conn DriverManager.getConnection(jdbc:sqlite: dbPath); // 建表如果不存在则创建 try (Statement stmt conn.createStatement()) { stmt.execute(CREATE TABLE IF NOT EXISTS balances ( player_name TEXT PRIMARY KEY, balance INTEGER NOT NULL DEFAULT 0, updated_at INTEGER NOT NULL)); }ModDataDir.getPath是 StarModAPI 提供的路径工具保证每个模组的数据隔离在自己的目录里。jdbc:sqlite:前缀是 SQLite JDBC 驱动的标准写法。建表语句里player_name做主键balance用整数存最小货币单位避免浮点误差。updated_at存时间戳方便做数据审计和过期清理。注意 SQLite 的写操作要串行化多个线程同时写会报database is locked常见做法是用一个单线程 executor 来执行所有写操作。4.2 配置文件的读取与热重载模组配置一般放在config目录下格式用 JSON 或 YAML。读取时机是模组初始化时热重载则通过命令触发。下面是一个配置读取示例带默认值合并。// 读取模组配置缺失字段用默认值填充 JsonObject defaultConfig new JsonObject(); defaultConfig.addProperty(currencyName, 星币); defaultConfig.addProperty(initialBalance, 100); defaultConfig.addProperty(territoryFeePerMinute, 5); JsonObject userConfig ConfigLoader.load(economy.json, defaultConfig); String currencyName userConfig.get(currencyName).getAsString(); int initialBalance userConfig.get(initialBalance).getAsInt();ConfigLoader.load的第二个参数是默认配置加载器会把用户配置合并到默认配置上用户没写的字段用默认值。这样模组升级新增配置项时老配置文件不会因为缺字段而报错。热重载的实现通常是监听一个命令收到后重新执行load并替换内存中的配置对象。注意热重载时正在执行的任务可能读到半新半旧的配置常见做法是用一个 volatile 引用指向配置对象替换时整体替换而不是逐字段修改。4.3 数据保存的时机与回滚策略数据保存最怕的是「保存到一半服务器崩了」导致文件损坏或数据不一致。SQLite 有事务可以解决这个问题JSON 文件则需要写临时文件再原子重命名。下面是一个原子写 JSON 的示例。// 原子写 JSON先写临时文件再重命名覆盖目标文件 Path target ModDataDir.getPath(economy.json); Path temp target.resolveSibling(target.getFileName() .tmp); try (BufferedWriter writer Files.newBufferedWriter(temp, StandardCharsets.UTF_8)) { writer.write(jsonObject.toString()); writer.flush(); } // 原子重命名大多数文件系统上这是原子操作 Files.move(temp, target, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);Files.move带ATOMIC_MOVE选项时在支持的文件系统上是原子操作要么旧文件还在要么新文件完整替换不会出现半个文件。如果文件系统不支持原子移动会抛AtomicMoveNotSupportedException这时要降级为普通替换并加文件锁。保存时机我一般选三个玩家下线时保存该玩家数据、周期任务每 5 分钟全量保存一次、服务器关闭钩子里做最后一次保存。关闭钩子要注册到Runtime.getRuntime().addShutdownHook但注意钩子里不能做太耗时的操作否则服务器会被强制杀掉。5. 避坑与排查StarMod 服务端实现里最容易翻车的几件事5.1 模组加载了但事件不触发现象是启动日志显示模组已加载但玩家登录时自定义消息没发出来。原因通常是事件注册发生在世界管理器创建之后早期事件已经错过了。解决方法是把事件注册提前到onInitialize里并且确认onInitialize是在加载器扫描阶段被调用的而不是等到第一个玩家进服才调用。排查时可以在事件监听器里加一行日志看看到底有没有进回调。5.2 服务器 tick 越来越慢TPS 持续下降现象是开服几小时后玩家感觉卡顿服务端日志里 TPS 从 20 掉到个位数。原因多半是周期任务里做了重 IO 或者遍历了全量实体。解决方法是把重 IO 拆成异步任务实体遍历加范围限制比如只处理在线玩家附近的实体。另外检查有没有监听器在PlayerMoveEvent这种高频事件里做数据库查询这种写法必卡。可以用/starmod profile这类命令看各模组的事件处理耗时定位到具体模组再优化。5.3 SQLite 报 database is locked现象是日志里频繁出现SQLITE_BUSY或database is locked数据写入失败。原因是多个线程同时写同一个 SQLite 文件SQLite 默认的锁机制不支持并发写。解决方法是用单线程 executor 串行化所有写操作或者开启 WAL 模式提高并发读性能。WAL 模式通过PRAGMA journal_modeWAL开启开启后读不阻塞写写不阻塞读但写与写之间仍然串行。5.4 模组之间类冲突导致 NoSuchMethodError现象是某个模组单独跑没问题和其他模组一起跑就抛NoSuchMethodError或ClassNotFoundException。原因是两个模组打包了同一个库的不同版本类加载器加载了先找到的那个版本。解决方法是给每个模组用独立的类加载器做隔离或者在模组描述文件里声明共享库依赖由加载器统一提供。实操上我一般会要求模组作者不要打包 StarModAPI 本身的类这些由加载器提供。5.5 服务器关闭时数据丢失现象是重启服务器后玩家余额回到上次保存前的状态。原因是关闭钩子里没有做最终保存或者保存操作被异常中断。解决方法是注册关闭钩子并在里面调用一次全量保存同时给保存操作加超时避免钩子卡住导致进程被强杀。另外周期保存的间隔不要太长5 分钟是比较稳妥的值即使关闭钩子失效最多丢 5 分钟数据。6. 进阶用事件优先级和异步任务把性能守住事件优先级不只是执行顺序它还能用来做性能分层。比如权限检查用HIGHEST优先级尽早取消无权限玩家的操作避免后续模组做无用功。数据统计用MONITOR优先级只读不写放在最后执行不影响主逻辑。我一般会把所有监听器按优先级画一张表确保高频事件移动、方块交互上的监听器数量控制在 3 个以内超过就考虑合并或异步化。异步任务的使用要克制。StarModAPI 通常提供scheduleAsyncTask适合做数据库批量写入、HTTP 请求、文件压缩这类不访问游戏对象的操作。但异步任务里不能直接调用Player.sendMessage或修改方块这些必须在主线程做。常见做法是异步任务算好结果再通过scheduleSyncTask回到主线程应用结果。下面是一个异步保存的示例。// 异步保存玩家数据避免阻塞主线程 Scheduler.scheduleAsyncTask(this, new Runnable() { Override public void run() { // 在异步线程里做数据库写入 ListPlayerData snapshot EconomyStore.snapshotAll(); for (PlayerData data : snapshot) { EconomyStore.saveToDb(data); } // 回到主线程发通知 Scheduler.scheduleSyncTask(EconomyMod.this, new Runnable() { Override public void run() { Server.broadcastMessage(经济数据已保存); } }); } });snapshotAll在主线程调用拿到数据快照后传给异步线程避免异步线程直接读游戏对象。异步线程里只做数据库写入不碰任何游戏状态。写完后用scheduleSyncTask回到主线程发广播。这个模式我用了很久唯一要注意的是快照数据量不能太大否则主线程做快照本身就会卡。如果玩家上千可以分页快照每 tick 处理一批。验证性能改进是否有效不能只看感觉。我一般会在改动前后各跑一次压力测试用模拟客户端登录 20 个账号持续移动和交互 10 分钟记录 TPS 曲线和事件处理耗时。TPS 稳定在 19 以上、单事件处理耗时低于 5ms 才算过关。如果 TPS 波动大先看 GC 日志再看是不是某个模组的监听器拖了后腿。这套流程跑下来基本能守住服务器性能底线。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

自研可逆字符串长度压缩算法:设计思路与工程实现

自研可逆字符串长度压缩算法:设计思路与工程实现

做这个项目的起因其实挺有意思。有一次我在处理一批数据库导出的文本字段,中间层要求把每条记录的长度压到某个阈值以下,但又不能让数据丢失,因为下游还要做精确校验。当时我翻遍了现成的压缩库,要么是有损的哈希方案,…

2026/10/14 11:00:07 阅读更多 →
K-means聚类算法核心原理与工程实践详解

K-means聚类算法核心原理与工程实践详解

最近在处理一份用户行为数据的时候,我计划做分群分析。第一次直接调现成的K-means实现,K值随手填了个5,数据也没有做标准化,跑出来的结果怎么看怎么别扭——有两个簇几乎完全重叠,还有一个簇里塞进了明显不属于同一类的…

2026/10/14 11:00:07 阅读更多 →
Java基本数据类型详解与实战避坑指南

Java基本数据类型详解与实战避坑指南

1. Java基本数据类型深度解析 作为一名有十年Java开发经验的工程师,我经常遇到新手对基本数据类型理解不透彻的问题。今天我就来系统梳理Java的8种基本数据类型,分享一些实际开发中的使用技巧和避坑经验。 1.1 内存分配与数据类型的关系 当我们在Java中…

2026/10/14 11:00:07 阅读更多 →

最新新闻

听觉-触觉跨模态注意力机制:实现仿生机器人遮挡场景的多模态感知融合

听觉-触觉跨模态注意力机制:实现仿生机器人遮挡场景的多模态感知融合

简介:仿生机器人听觉-触觉跨模态感知融合的527页专题技术文档,聚焦遮挡场景下的鲁棒性设计,面向机器人感知、深度学习和多模态融合方向的研究者与工程师。资源为单个PDF文件,压缩包大小10.75MB,支持目录跳转与书签大纲…

2026/10/14 12:06:10 阅读更多 →
游戏网关GM管理工具:多端网页访问与安全指令执行架构

游戏网关GM管理工具:多端网页访问与安全指令执行架构

简介:这是一款专为问道游戏服务端运维人员与GM(游戏管理员)设计的跨平台网页远程管理工具包,解决传统网关管理依赖本地客户端、多系统适配难、移动端无法操作等痛点,适用于Linux/Windows/macOS等环境下的服务端日常监控…

2026/10/14 12:06:10 阅读更多 →
智能体安全边界:从输出过滤到内核层约束的工程实践

智能体安全边界:从输出过滤到内核层约束的工程实践

1. 从 18000 条帖子说起:智能体安全边界到底在防什么先把背景交代清楚。所谓“18000 条帖子”,指的是一个智能体在真实社区环境里连续运行、累计产出并交互了约一万八千条内容之后,暴露出来的那批问题。这个量级很关键——几百条帖子的时候&a…

2026/10/14 12:06:10 阅读更多 →
工业AI视觉检测:边缘计算与模型选型实战解析

工业AI视觉检测:边缘计算与模型选型实战解析

直播结束后第二天我还在翻后台记录,结果评论区被顶到最上面的不是“下一步怎么做”,而是一条看起来很基础的问题:“像工业AI检测、服装检测这类AI,到底用的是云联网还是单机的AI?用的什么大模型才够?”说实…

2026/10/14 12:06:10 阅读更多 →
hyperframes:面向网页视频交付的 CLI 工具链

hyperframes:面向网页视频交付的 CLI 工具链

1. 项目概述&#xff1a;什么是 hyperframes&#xff1f;它不是“超帧”&#xff0c;而是一套面向现代网页视频工作流的 CLI 工具链 你搜“hyperframes”时&#xff0c;首页弹出一堆混杂词&#xff1a;HTML、MP4、Node.js、CLI、m3u8转MP4、codex cli、zcode cli、<!doctyp…

2026/10/14 12:06:10 阅读更多 →
深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

1. 从“选哪个框架”这个老问题说起如果你在深度学习这个圈子里待过一段时间&#xff0c;大概率会被问到或者问过别人一个问题&#xff1a;“我到底该学哪个框架&#xff1f;”这个问题几乎和“该学Python还是R”一样&#xff0c;属于入门阶段的经典纠结。但有意思的是&#xf…

2026/10/14 12:05:09 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/14 7:53:34 阅读更多 →