QtScrcpy多设备协同控制架构:从单屏镜像到大规模设备集群管理的技术演进
QtScrcpy多设备协同控制架构从单屏镜像到大规模设备集群管理的技术演进【免费下载链接】QtScrcpyAndroid real-time display control software项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpyQtScrcpy作为一款基于Qt框架的Android设备屏幕镜像与控制工具从最初的单设备投屏发展到如今支持大规模设备集群管理的专业级解决方案。本文深入剖析其从单点控制到多点协同的技术演进路径重点解析多设备管理架构、事件分发机制、资源优化策略等核心技术实现为移动设备自动化测试、手游多开、批量操作等场景提供专业的技术参考。技术挑战与设计哲学核心问题定义传统Android投屏工具主要面向单设备调试场景当面对大规模设备集群管理时面临三大技术挑战1资源竞争与性能瓶颈2事件同步与状态一致性3设备异构性与兼容性问题。QtScrcpy通过创新的架构设计解决了这些挑战实现了从单一工具到平台级解决方案的转变。现有方案局限性早期解决方案如scrcpy主要针对单设备场景缺乏设备间协同机制而商业化的多设备管理工具则存在封闭生态、扩展性差的问题。QtScrcpy在开源框架基础上构建了灵活的多设备管理能力平衡了性能与可扩展性。创新架构设计三层协同控制架构QtScrcpy的多设备管理采用控制层-协调层-执行层三层架构每层具有明确的职责边界// 控制层接口定义 class DeviceCoordinator { public: virtual void registerDevice(const DeviceInfo info) 0; virtual void unregisterDevice(const QString serial) 0; virtual void broadcastEvent(const ControlEvent event) 0; virtual void selectiveDispatch(const QStringList targets, const ControlEvent event) 0; }; // 协调层实现 class EventScheduler : public QObject { Q_OBJECT public: explicit EventScheduler(QObject* parent nullptr); void scheduleEvent(const ControlEvent event, SchedulingPolicy policy Immediate); void setDeviceGroup(const QString groupId, const QStringList devices); signals: void eventDispatched(const QString device, const ControlEvent event); void deviceStateChanged(const QString device, DeviceState state); };模块化设计原理模块职责技术实现设备管理器设备发现、连接管理、状态监控Qt信号槽机制异步I/O事件分发器输入事件路由、同步控制、优先级调度事件队列线程池资源协调器内存分配、解码器复用、带宽管理资源池LRU缓存状态同步器设备状态一致性维护、故障恢复心跳检测状态机配置管理器设备分组、策略配置、参数持久化INI配置文件JSON序列化图QtScrcpy多设备集群管理界面支持大规模设备并发操作与资源监控关键技术实现设备集群事件分发机制多设备协同控制的核心是高效的事件分发系统QtScrcpy采用基于策略的事件路由算法// 事件分发策略实现 class EventDispatcher { private: QMapQString, DeviceHandler* m_deviceHandlers; QMapQString, EventPolicy m_policies; QThreadPool m_workerPool; public: enum DispatchMode { BroadcastAll, // 广播到所有设备 SelectiveGroup, // 选择特定设备组 RoundRobin, // 轮询分发 LoadBalanced // 负载均衡分发 }; void dispatchEvent(const ControlEvent event, DispatchMode mode BroadcastAll, const QStringList targets {}) { switch (mode) { case BroadcastAll: broadcastToAll(event); break; case SelectiveGroup: dispatchToGroup(event, targets); break; case RoundRobin: dispatchRoundRobin(event); break; case LoadBalanced: dispatchLoadBalanced(event); break; } } private: void broadcastToAll(const ControlEvent event) { for (auto handler : m_deviceHandlers) { QMetaObject::invokeMethod(handler, handleEvent, Qt::QueuedConnection, Q_ARG(ControlEvent, event)); } } void dispatchToGroup(const ControlEvent event, const QStringList targets) { for (const auto target : targets) { if (m_deviceHandlers.contains(target)) { m_deviceHandlers[target]-handleEvent(event); } } } };资源池化与复用策略大规模设备连接时的资源管理采用智能池化机制显著降低内存占用和CPU开销// 解码器资源池实现 class DecoderPool { private: struct DecoderSlot { std::unique_ptrVideoDecoder decoder; QString assignedDevice; QDateTime lastUsed; bool isActive; }; QVectorDecoderSlot m_pool; QMutex m_mutex; int m_maxPoolSize; public: explicit DecoderPool(int maxSize 10) : m_maxPoolSize(maxSize) { initializePool(); } VideoDecoder* acquireDecoder(const QString deviceSerial) { QMutexLocker locker(m_mutex); // 1. 查找空闲解码器 for (auto slot : m_pool) { if (!slot.isActive) { slot.isActive true; slot.assignedDevice deviceSerial; slot.lastUsed QDateTime::currentDateTime(); return slot.decoder.get(); } } // 2. 按LRU策略回收 if (m_pool.size() m_maxPoolSize) { auto oldest std::min_element(m_pool.begin(), m_pool.end(), [](const DecoderSlot a, const DecoderSlot b) { return a.lastUsed b.lastUsed; }); oldest-assignedDevice deviceSerial; oldest-lastUsed QDateTime::currentDateTime(); return oldest-decoder.get(); } // 3. 创建新解码器 DecoderSlot newSlot; newSlot.decoder std::make_uniqueVideoDecoder(); newSlot.assignedDevice deviceSerial; newSlot.lastUsed QDateTime::currentDateTime(); newSlot.isActive true; m_pool.append(newSlot); return m_pool.last().decoder.get(); } void releaseDecoder(const QString deviceSerial) { QMutexLocker locker(m_mutex); for (auto slot : m_pool) { if (slot.assignedDevice deviceSerial) { slot.isActive false; slot.assignedDevice.clear(); break; } } } };坐标映射与输入事件处理多设备环境下的输入事件处理需要解决坐标转换和设备差异性问题// 跨设备坐标映射系统 class CoordinateMapper { private: struct DeviceMapping { QSize sourceResolution; QSize targetResolution; QPointF offset; float scaleFactor; Rotation rotation; }; QMapQString, DeviceMapping m_mappings; public: QPoint mapCoordinate(const QString deviceSerial, const QPoint sourcePoint, MappingStrategy strategy Proportional) { if (!m_mappings.contains(deviceSerial)) { return sourcePoint; // 默认不转换 } const auto mapping m_mappings[deviceSerial]; switch (strategy) { case Proportional: return proportionalMap(sourcePoint, mapping); case FixedOffset: return fixedOffsetMap(sourcePoint, mapping); case ScaledProportional: return scaledProportionalMap(sourcePoint, mapping); default: return sourcePoint; } } void calibrateMapping(const QString deviceSerial, const QSize sourceRes, const QSize targetRes) { DeviceMapping mapping; mapping.sourceResolution sourceRes; mapping.targetResolution targetRes; mapping.scaleFactor calculateScaleFactor(sourceRes, targetRes); mapping.offset calculateOptimalOffset(sourceRes, targetRes); m_mappings[deviceSerial] mapping; } private: QPoint proportionalMap(const QPoint point, const DeviceMapping mapping) { float xRatio static_castfloat(point.x()) / mapping.sourceResolution.width(); float yRatio static_castfloat(point.y()) / mapping.sourceResolution.height(); int targetX static_castint(xRatio * mapping.targetResolution.width()); int targetY static_castint(yRatio * mapping.targetResolution.height()); return QPoint(targetX, targetY); } };图QtScrcpy坐标调试界面支持精确的输入事件映射和多设备坐标同步配置与部署指南多设备配置优化QtScrcpy通过分层配置策略支持不同规模的应用场景# config/config.ini - 多设备增强配置 [common] # 基础配置 LanguageAuto WindowTitleQtScrcpy Multi-Device MaxFps60 RenderExpiredFrames0 UseDesktopOpenGL-1 [multi_device] # 多设备特有配置 MaxConcurrentDevices20 DeviceGroupingEnabledtrue EventSyncModeSelective ResourcePoolSize15 AutoReconnectAttempts3 HeartbeatInterval5000 [performance] # 性能调优 DecoderPoolStrategyLRU MemoryCacheSize512 NetworkBufferSize131072 EventQueueDepth1000 ThreadPoolSize8 [monitoring] # 监控配置 EnableResourceMonitortrue LogLevelinfo MetricsCollectionInterval1000 AlertThresholdCPU80 AlertThresholdMemory2048性能调优策略场景推荐配置预期效果技术原理小规模测试(1-5台)MaxConcurrentDevices5, ThreadPoolSize4低延迟快速响应减少线程切换开销中规模部署(5-20台)ResourcePoolSize10, EventQueueDepth500平衡性能与资源智能资源复用大规模集群(20-50台)DecoderPoolStrategyLRU, MemoryCacheSize1024高吞吐量稳定运行动态资源分配超大规模(50台)分布式部署多实例负载均衡线性扩展能力集群化架构部署架构方案# deployment-architecture.yaml deployment: mode: clustered instances: - role: coordinator config: max_devices: 100 resource_pool_size: 20 event_sync: selective - role: worker replicas: 3 config: max_devices_per_instance: 30 load_balancing: round_robin networking: internal_port: 5555 external_port: 8080 websocket_enabled: true monitoring: prometheus_enabled: true grafana_dashboard: true alert_rules: - name: high_cpu_usage threshold: 80% - name: memory_leak threshold: 2GB扩展与集成插件化设备管理QtScrcpy通过插件系统支持第三方设备管理和自动化工具集成// 设备管理插件接口 class DeviceManagementPlugin { public: virtual ~DeviceManagementPlugin() default; // 设备发现与连接 virtual QListDeviceInfo discoverDevices() 0; virtual bool connectDevice(const QString serial) 0; virtual void disconnectDevice(const QString serial) 0; // 设备状态监控 virtual DeviceStatus getDeviceStatus(const QString serial) 0; virtual QVariantMap getDeviceMetrics(const QString serial) 0; // 批量操作 virtual bool executeBatch(const QStringList devices, const QString command, const QVariantMap params) 0; // 事件处理 virtual void registerEventHandler(EventHandler* handler) 0; virtual void unregisterEventHandler(EventHandler* handler) 0; }; // 自动化测试插件示例 class AutomationPlugin : public DeviceManagementPlugin { private: QMapQString, AutomationScript m_scripts; QThreadPool m_executionPool; public: AutomationPlugin() { m_executionPool.setMaxThreadCount(10); } bool executeBatch(const QStringList devices, const QString command, const QVariantMap params) override { if (!m_scripts.contains(command)) { return false; } const auto script m_scripts[command]; QListQFuturevoid futures; for (const auto device : devices) { futures.append(QtConcurrent::run(m_executionPool, []() { executeScriptOnDevice(script, device, params); })); } // 等待所有任务完成 for (auto future : futures) { future.waitForFinished(); } return true; } };RESTful API接口设计提供标准化的Web API支持远程管理和集成# RESTful API接口示例 from flask import Flask, jsonify, request from flask_restful import Api, Resource app Flask(__name__) api Api(app) class DeviceResource(Resource): def get(self, device_idNone): 获取设备列表或单个设备信息 if device_id: device device_manager.get_device(device_id) return jsonify(device.to_dict()) else: devices device_manager.list_devices() return jsonify([d.to_dict() for d in devices]) def post(self): 连接新设备 data request.get_json() device device_manager.connect_device( data[serial], data.get(connection_type, usb) ) return jsonify({status: connected, device: device.to_dict()}) def delete(self, device_id): 断开设备连接 device_manager.disconnect_device(device_id) return jsonify({status: disconnected}) class ControlResource(Resource): def post(self): 发送控制命令到设备 data request.get_json() command data[command] devices data.get(devices, []) if not devices: # 广播到所有设备 result control_manager.broadcast(command, data.get(params)) else: # 选择特定设备 result control_manager.selective_dispatch( devices, command, data.get(params) ) return jsonify(result) # WebSocket实时事件接口 from flask_socketio import SocketIO, emit socketio SocketIO(app) socketio.on(device_event) def handle_device_event(data): 处理设备事件推送 event_type data[type] device_id data[device_id] payload data.get(payload, {}) # 转发事件到所有连接的客户端 emit(device_update, { device_id: device_id, event_type: event_type, payload: payload, timestamp: datetime.utcnow().isoformat() }, broadcastTrue)最佳实践与案例手游多开场景部署手游工作室需要同时运行多个游戏实例进行脚本测试或资源采集# game-farming-config.yaml application: mobile_game_farming devices_per_instance: 20 script_config: main_script: auto_farm.lua interval_ms: 5000 retry_attempts: 3 device_groups: - name: farming_group_1 devices: - emulator-5554 - emulator-5556 - emulator-5558 script_params: map_id: 101 farming_mode: resources - name: farming_group_2 devices: - emulator-5560 - emulator-5562 script_params: map_id: 102 farming_mode: experience monitoring: alert_on_disconnect: true performance_thresholds: cpu_per_device: 30% memory_per_device: 512MB network_bandwidth: 10Mbps自动化测试流水线企业级移动应用测试需要集成到CI/CD流水线中# ci_pipeline_integration.py import pytest from qtscrcpy_client import QtScrcpyClient class TestMobileApp: pytest.fixture(scopeclass) def device_pool(self): 创建设备池用于并行测试 client QtScrcpyClient() devices client.connect_devices(count10) yield devices client.disconnect_all() def test_concurrent_users(self, device_pool): 测试并发用户场景 results [] for device in device_pool: result device.run_test( test_caseconcurrent_login, users100, duration5m ) results.append(result) # 分析测试结果 success_rate sum(1 for r in results if r.passed) / len(results) assert success_rate 0.95, f成功率低于95%: {success_rate*100}% def test_cross_device_compatibility(self, device_pool): 跨设备兼容性测试 test_matrix [ {device: samsung_galaxy, os: android_11}, {device: google_pixel, os: android_12}, {device: xiaomi_mi, os: android_10}, ] for config in test_matrix: matching_devices [ d for d in device_pool if d.match_config(config) ] for device in matching_devices: result device.run_compatibility_test(config) assert result.compatible, f设备{device.serial}不兼容配置{config}故障排查指南问题现象可能原因解决方案技术原理设备连接不稳定网络波动USB连接松动启用自动重连增加心跳检测TCP keep-alive连接状态机事件同步延迟网络延迟设备性能差异调整事件队列深度优化调度算法优先级队列时间戳同步内存占用过高解码器未释放缓存积累启用LRU缓存策略定期清理引用计数智能指针管理CPU使用率飙升视频解码负载过重启用硬件解码降低分辨率GPU加速编解码优化多设备操作不同步时钟漂移网络抖动引入NTP时间同步增加缓冲时钟同步算法缓冲队列未来发展方向技术演进路线智能化设备管理阶段v3.0-v3.5集成AI算法优化设备调度和资源分配云原生架构阶段v3.5-v4.0支持Kubernetes部署和微服务架构边缘计算集成阶段v4.0结合边缘计算节点实现分布式设备管理生态扩展阶段建立插件市场和开发者社区云原生架构演进# kubernetes-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: qtscrcpy-coordinator spec: replicas: 3 selector: matchLabels: app: qtscrcpy-coordinator template: metadata: labels: app: qtscrcpy-coordinator spec: containers: - name: coordinator image: qtscrcpy/coordinator:latest resources: limits: cpu: 2 memory: 4Gi env: - name: MAX_DEVICES value: 100 - name: REDIS_HOST value: redis-service ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: qtscrcpy-service spec: selector: app: qtscrcpy-coordinator ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer社区生态建设开发者工具链完善提供SDK、CLI工具、API文档插件市场建立支持第三方开发者贡献功能扩展标准化接口定义制定统一的设备管理接口标准性能基准测试套件提供标准化的性能测试工具总结与价值QtScrcpy从单一设备投屏工具演进为成熟的多设备管理平台其技术价值体现在三个层面在架构设计上创新的三层协同控制架构解决了大规模设备管理的核心难题在实现技术上资源池化、事件分发、坐标映射等机制提供了高性能的基础设施在应用生态上插件化设计和标准化API为行业应用提供了灵活扩展能力。该平台的技术优势不仅在于其开源特性和跨平台能力更在于其面向大规模应用场景的系统性设计。无论是手游多开工作室的批量操作需求还是企业级移动应用的自动化测试亦或是教育机构的设备管理场景QtScrcpy都提供了可靠的技术解决方案。随着移动设备数量的指数级增长和物联网技术的普及多设备协同管理将成为越来越重要的技术领域。QtScrcpy通过持续的技术创新和社区共建正在为这一领域建立技术标准和最佳实践推动整个行业向更高效、更智能的设备管理方向发展。【免费下载链接】QtScrcpyAndroid real-time display control software项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2024年AI原生应用三大突破:对话交互、垂直模型与多模态

2024年AI原生应用三大突破:对话交互、垂直模型与多模态

1. 2024年AI原生应用的三大突破方向 自然语言处理技术正在经历从"能用"到"好用"的关键转折期。作为从业者,我观察到2024年AI原生应用将呈现三个显著特征:首先是交互方式的革命性变化,语音和文字正在取代传统图形界面&…

2026/10/7 19:52:10 阅读更多 →
职业转型决策框架:从价值评估到离职实操全流程解析

职业转型决策框架:从价值评估到离职实操全流程解析

1. 一个决定背后的全景图:为什么“我离职了”不只是个人选择 “我离职了”这四个字,在社交媒体上几乎每天都能刷到。它可能是一条简短的朋友圈,一篇长文,或者一个短视频的标题。表面上看,这是一个纯粹的个人职业变动事…

2026/9/21 3:24:56 阅读更多 →
腾讯Java基础专项面经:String不可变性、异常体系、IO流、反射与注解的坑

腾讯Java基础专项面经:String不可变性、异常体系、IO流、反射与注解的坑

腾讯5级Android面经聊完(初级→架构师),进入专项系列。Java基础是每个级别都考的底层功夫。"String为什么不可变"这种题,背答案说"为了安全"就完了,真理解的会从内存模型、线程安全、hashCode缓存讲到字符串池。同一问题深度差五倍。今天8道题覆盖四大…

2026/10/3 19:08:26 阅读更多 →

最新新闻

具身智能中的无线技术——无线线束1

具身智能中的无线技术——无线线束1

无线线束是具身智能领域的颠覆性技术&#xff0c;通过用无线电波替代机器人内部的信号线&#xff0c;解决线缆易断、重量大、灵活性受限等问题。其核心在于实现低时延&#xff08;<20μs&#xff09;、高可靠性、抗干扰的无线通信&#xff0c;已在灵巧手、触觉皮肤和电池管理…

2026/10/12 3:21:58 阅读更多 →
Kun 轨迹视图对齐 DeepSeek Harness:Schema v2 投影、密集台账与悬浮 Composer 的实现拆解

Kun 轨迹视图对齐 DeepSeek Harness:Schema v2 投影、密集台账与悬浮 Composer 的实现拆解

人工智能AI Agent自主智能体桌面应用MCP Clients 【免费下载链接】Kun Local-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/de/Kun 点击查…

2026/10/12 3:21:58 阅读更多 →
纯Java打造企业级Agent Harness:工具治理与上下文管理的工程实践

纯Java打造企业级Agent Harness:工具治理与上下文管理的工程实践

面对群里几乎一边倒的“Agent 项目不选 Python 等于自找麻烦”的声音&#xff0c;我们组还是在一个面向多家企业客户的系统改造项目里&#xff0c;用纯 Java 搭了一个企业级 Agent Harness 平台&#xff0c;代号 BizBuddy。这篇文章想把立项时算的账、Harness 与 Agent 的边界划…

2026/10/12 3:21:58 阅读更多 →
Simple Live:一个入口看虎牙、斗鱼、Bilibili、抖音的开源直播聚合应用

Simple Live:一个入口看虎牙、斗鱼、Bilibili、抖音的开源直播聚合应用

Simple Live&#xff1a;一个入口看虎牙、斗鱼、Bilibili、抖音的开源直播聚合应用 【免费下载链接】dart_simple_live 简简单单的看直播 项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live 你追的主播&#xff0c;上午在 B 站开播、晚上去虎牙&#…

2026/10/12 3:21:58 阅读更多 →
Agent OS Discover Standards 实战指南:把代码库隐性知识沉淀为可检索的工程规范

Agent OS Discover Standards 实战指南:把代码库隐性知识沉淀为可检索的工程规范

AI AgentAgent 工作流开发工具 【免费下载链接】agent-os Agent OS is a system for injecting your codebase standards and writing better specs for spec-driven development. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/agen/agent-os 点击查看 免费下载 Agen…

2026/10/12 3:21:58 阅读更多 →
Apache Beam 依赖管理实践指南:从依赖冲突到升级政策的完整解读

Apache Beam 依赖管理实践指南:从依赖冲突到升级政策的完整解读

批处理流处理大数据 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/beam15/beam 点击查看 免费下载 导读 本文以 Apache Beam 官方《Dependencies Guide…

2026/10/12 3:20:57 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天&#xff0c;画面可以做到绝对的锐利、平滑与无瑕。然而&#xff0c;当一张秋日手账插画或拍立得照片过于“平整无瑕”时&#xff0c;往往会散发出一种冰冷生硬的“数码塑料感&#xff08;Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中&#xff0c;横排&#xff08;Horizontal Layout&#xff09;早已经成为了绝对的主流。然而&#xff0c;当我们翻开泛黄的线装古籍、宋版木刻诗集&#xff0c;或是欣赏一张茶道雅集的手写便签时&#xff0c;那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点&#xff0c;很多人心里都会悄悄亮起一盏警示灯。 在心理学上&#xff0c;这种现象有一个专门的称谓——“周日夜晚焦虑症&#xff08;Sunday Scaries&#xff09;”。明天又是周一&#xff0c;闹钟又要重新在七点响彻卧房&#xff1b;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →