大智慧新一代C语言接口:架构解析与行情接入实战
简介这份资源提供大智慧新一代股票软件外部扩展函数的C语言接口模板面向具备一定C/C基础、希望为行情软件编写自定义公式或功能扩展的开发者。模板以WIN32动态链接库形式实现可直接作为二次开发的起点解决从零搭建扩展工程时接口定义与工程配置繁琐的问题。压缩包共6个文件约6KB包含2个cpp源文件、2个h头文件以及dsw、dsp工程文件分别对应核心扩展函数实现、接口声明、预编译头与VC工程配置结构精简便于快速理解动态库的编译与导出方式。目前已有1860人学习下载说明该接口模板在股票软件扩展开发场景中具有一定参考价值。读者可据此掌握大智慧外部函数的注册与调用流程并在此基础上扩展自有公式逻辑减少重复搭建工程的时间成本。1. 大智慧新一代的C语言接口为什么老接口跑不动了新接口能救你如果你手里有一套跑了七八年的行情接入程序最近突然发现连接成功率往下掉、行情推送延迟忽高忽低、某些品种的盘口数据干脆收不到那你大概率已经撞上了老接口的天花板。大智慧新一代的C语言接口本质上是把行情接入从“能用就行”推到“可观测、可恢复、可扩展”这一层。它解决的不是“能不能连上”的问题而是“连上之后数据对不对、断了之后能不能自己爬起来、多品种并发时会不会互相拖死”这三个要命的问题。适合谁适合那些用C/C写行情中转、做量化回测数据源、或者给内部系统做行情网关的开发者。如果你只是用Python调个库看看盘这篇文章对你意义不大但如果你要自己管连接、自己处理回调、自己扛断线重连那接下来的内容值得你花二十分钟。2. 新一代接口的架构拆解从连接模型到回调分发2.1 为什么老接口的“单连接单线程”模型会崩老一代行情接口的典型做法是一个TCP连接一个接收线程收到数据后直接在接收线程里做解析和业务回调。这种模型在品种少、行情频率低的时候没问题但一旦你订阅了几百个品种或者遇到开盘集合竞价那种瞬时爆发接收线程就会被业务逻辑堵死。堵死的后果不是丢一两条数据而是TCP接收缓冲区被填满内核开始丢包然后连接被服务端判定为“不活跃”直接踢掉。更麻烦的是这种模型下你很难判断到底是网络断了还是业务处理太慢导致的心跳超时。新一代接口在架构上做了两件事第一把网络接收和业务分发拆成两个独立阶段中间用一个无锁环形队列做缓冲第二把连接状态和订阅状态分开管理连接断了不代表订阅关系丢失重连后可以自动恢复订阅。这两件事听起来简单但实现细节里全是坑。2.2 连接、订阅、回调三层分离的具体做法先看连接层。新一代接口通常提供一个CreateSession之类的函数返回一个会话句柄。这个句柄不直接对应TCP连接而是一个逻辑会话。你可以在会话上设置服务器地址列表、超时参数、重连策略。真正的TCP连接由接口内部管理对外只暴露状态变化回调。// 创建会话传入配置结构体 SessionConfig config; memset(config, 0, sizeof(config)); config.server_count 2; strcpy(config.servers[0].ip, 10.0.0.1); config.servers[0].port 9001; strcpy(config.servers[1].ip, 10.0.0.2); config.servers[1].port 9001; config.reconnect_interval_ms 3000; // 重连间隔 config.max_reconnect_attempts 0; // 0表示无限重连 config.heartbeat_interval_ms 15000; // 心跳间隔 SessionHandle session CreateSession(config); if (session NULL) { // 创建失败通常是配置参数不合法 return -1; }这段代码里最容易被忽略的是max_reconnect_attempts。很多人设成3或者5觉得重连几次连不上就算了。但行情服务端在开盘前会有一次集中重启如果你设了有限次数刚好在那段时间重连失败后面就彻底不连了。我一般设成0配合一个指数退避策略让接口自己控制重连节奏。订阅层是独立于连接的。你调用Subscribe的时候接口会把订阅请求缓存起来。如果当前没有连接请求会挂起连接建立后自动发送。连接断开重连后接口会自动重新发送所有活跃订阅。这个机制的关键在于订阅ID的管理——每个订阅请求返回一个唯一的订阅ID取消订阅时用这个ID而不是用品种代码。因为同一个品种可能被不同模块重复订阅用品种代码取消会误伤。// 订阅行情返回订阅ID int sub_id Subscribe(session, 600000, SUB_TYPE_QUOTE | SUB_TYPE_ORDER); if (sub_id 0) { // 订阅失败检查品种代码格式或会话状态 } // 取消订阅时用订阅ID不用品种代码 Unsubscribe(session, sub_id);回调分发层是新一代接口最值得说的部分。老接口通常只给你一个回调函数所有数据都往里面塞。新一代接口一般支持注册多个回调按数据类型分开行情快照回调、逐笔成交回调、委托队列回调、连接状态回调、错误回调。这样做的好处是你可以把不同处理逻辑放到不同线程池里互不阻塞。// 注册各类回调 SetQuoteCallback(session, OnQuote, NULL); SetOrderCallback(session, OnOrder, NULL); SetStatusCallback(session, OnStatusChange, NULL); SetErrorCallback(session, OnError, NULL); // 行情回调示例 void OnQuote(SessionHandle session, const QuoteData *quote, void *user_data) { // 注意这个回调在接口内部线程执行不要做耗时操作 // 正确做法是拷贝数据到队列由业务线程消费 QuoteData *copy malloc(sizeof(QuoteData)); memcpy(copy, quote, sizeof(QuoteData)); RingQueue_Push(g_quote_queue, copy); }这里有个血泪经验回调函数里千万不要直接写数据库或者做复杂计算。接口内部线程被堵住整个会话的数据流都会受影响。我见过一个案例有人在行情回调里直接写SQLite开盘三分钟后连接必断查了一周才发现是回调阻塞导致心跳包发不出去。2.3 参数配置里最容易被忽略的三个值第一个是心跳间隔。很多人设30秒甚至60秒觉得省流量。但行情服务端通常有服务端侧的超时判定一般是心跳间隔的2到3倍。你设60秒服务端可能90秒就踢你。我一般设15到20秒兼顾流量和稳定性。第二个是接收缓冲区大小。接口内部会设置SO_RCVBUF但有些实现允许你通过配置覆盖。默认值在Linux上通常是128KB对于高频行情来说偏小。如果你订阅了全市场品种建议设到1MB以上。但注意不要超过系统net.core.rmem_max限制否则设置无效。第三个是回调线程数。新一代接口通常允许你配置回调分发线程的数量。设太少高频数据来不及处理设太多线程切换开销大。经验值是CPU核心数的1到2倍。如果是8核机器设8到16个比较合适。3. 从零跑通一个行情接收程序编译、连接、收数3.1 环境准备与库文件依赖假设你拿到的是Linux版本的接口库通常包含这几个文件头文件dxquote.h、静态库libdxquote.a或者动态库libdxquote.so、以及一个示例配置文件。编译时需要注意链接顺序静态库要放在源文件后面。# 编译命令示例 gcc -o quote_demo quote_demo.c -L./lib -ldxquote -lpthread -lrt -lm # 如果使用动态库运行时需要指定库路径 export LD_LIBRARY_PATH./lib:$LD_LIBRARY_PATH ./quote_demo-lrt是必须的因为接口内部用了POSIX共享内存和定时器。-lpthread不用多说。如果链接时报undefined reference to clock_gettime就是缺-lrt。3.2 最小可运行代码初始化、登录、订阅、收数下面是一个完整的骨架代码去掉了业务处理只保留最核心的流程。#include stdio.h #include string.h #include stdlib.h #include dxquote.h static volatile int g_running 1; // 连接状态回调 void OnStatus(SessionHandle session, int status, void *user_data) { switch (status) { case STATUS_CONNECTED: printf([状态] 已连接\n); break; case STATUS_DISCONNECTED: printf([状态] 已断开\n); break; case STATUS_LOGIN_SUCCESS: printf([状态] 登录成功\n); // 登录成功后再订阅 Subscribe(session, 600000, SUB_TYPE_QUOTE); Subscribe(session, 000001, SUB_TYPE_QUOTE); break; case STATUS_LOGIN_FAILED: printf([状态] 登录失败\n); break; default: break; } } // 行情回调 void OnQuote(SessionHandle session, const QuoteData *quote, void *user_data) { printf([行情] %s 最新价:%.2f 成交量:%d\n, quote-code, quote-last_price, quote-volume); } // 错误回调 void OnError(SessionHandle session, int error_code, const char *msg, void *user_data) { printf([错误] code%d msg%s\n, error_code, msg); } int main(int argc, char *argv[]) { // 1. 创建会话 SessionConfig config; memset(config, 0, sizeof(config)); config.server_count 1; strcpy(config.servers[0].ip, 127.0.0.1); config.servers[0].port 9001; config.reconnect_interval_ms 3000; config.max_reconnect_attempts 0; config.heartbeat_interval_ms 15000; config.recv_buffer_size 1024 * 1024; // 1MB SessionHandle session CreateSession(config); if (session NULL) { fprintf(stderr, 创建会话失败\n); return 1; } // 2. 注册回调 SetStatusCallback(session, OnStatus, NULL); SetQuoteCallback(session, OnQuote, NULL); SetErrorCallback(session, OnError, NULL); // 3. 启动会话内部开始连接、登录、重连 if (StartSession(session) ! 0) { fprintf(stderr, 启动会话失败\n); DestroySession(session); return 1; } // 4. 主线程等待实际业务在回调线程处理 while (g_running) { sleep(1); } // 5. 清理 StopSession(session); DestroySession(session); return 0; }这段代码的逻辑说明CreateSession只创建逻辑会话不发起网络连接。StartSession才真正开始连接和登录流程。登录成功后状态回调里触发订阅。行情数据通过OnQuote回调出来。整个过程中如果连接断开接口会自动重连重连成功后自动重新登录和恢复订阅你的业务代码不需要处理这些。参数说明recv_buffer_size设成1MB前提是系统允许。可以用sysctl net.core.rmem_max查看上限。如果设了没效果检查这个值。heartbeat_interval_ms设15秒是经验值大部分服务端超时判定在30到45秒之间。3.3 编译时常见的链接错误与解决最常见的错误是undefined reference to pthread_create加-lpthread即可。其次是undefined reference to shm_open加-lrt。如果用的是C编译器记得在头文件包含处加extern C。#ifdef __cplusplus extern C { #endif #include dxquote.h #ifdef __cplusplus } #endif还有一个坑有些接口库区分Debug和Release版本Debug版本带断言和日志性能差很多。生产环境一定要用Release版本。怎么区分看库文件名通常带_d后缀的是Debug版。4. 避坑与排查回调阻塞、重连丢订阅、时间戳错乱4.1 回调里做耗时操作导致连接被踢现象程序运行几分钟后连接断开重连后过几分钟又断循环往复。日志里能看到心跳发送失败或者服务端主动断开。原因行情回调在接口内部线程执行你在回调里做了文件写入、数据库操作、或者调用了会阻塞的第三方库。内部线程被堵住心跳定时器得不到执行服务端判定超时。解决回调里只做数据拷贝把数据推到无锁队列由独立业务线程消费。队列满了就丢弃最老的数据并记录丢包计数。不要试图在回调里做任何可能阻塞的事情。4.2 重连后订阅丢失或重复现象断线重连后部分品种收不到行情或者同一个品种收到重复数据。原因订阅管理没做好。有些接口在重连后不会自动恢复订阅需要你手动重新订阅。如果你在状态回调里无脑重新订阅又可能导致重复订阅。解决用订阅ID管理。每次订阅返回一个ID维护一个活跃订阅ID集合。重连成功后遍历集合重新订阅。取消订阅时从集合移除。不要用品种代码做去重因为同一品种可能被不同策略订阅多次。4.3 行情时间戳与本地时间对不上现象收到的行情数据里带的时间戳和本地time(NULL)差了几秒甚至几十秒。原因行情服务端的时间戳通常是交易所时间本地机器如果没有做时间同步偏差会累积。另外有些接口返回的时间戳精度是秒有些是毫秒单位搞错也会导致看起来差很多。解决部署NTP服务确保本地时间与标准时间偏差在毫秒级。解析时间戳时先确认单位毫秒时间戳除以1000才是秒。如果接口提供的是交易所时间不要直接和本地时间做减法算延迟因为交易所时间和本地时间之间还有网络传输时间。4.4 高频行情下内存持续增长现象程序运行一段时间后内存占用越来越高最终OOM。原因回调里malloc了数据但忘记free或者队列只进不出。还有一种情况是接口内部缓存了所有历史行情需要你定期调用某个清理函数。解决用Valgrind或者AddressSanitizer跑一遍检查内存泄漏。队列消费速度要跟上生产速度如果跟不上要么加消费者线程要么在队列满时主动丢弃。检查接口文档里有没有FlushCache之类的函数定期调用。4.5 多线程调用接口函数导致崩溃现象程序随机崩溃堆栈显示在接口内部函数。原因接口的会话句柄不是线程安全的。你在一个线程里调用Subscribe在另一个线程里调用Unsubscribe可能同时操作内部链表导致崩溃。解决所有对同一个会话的接口调用加一把互斥锁。或者更简单的做法所有接口调用都放在同一个线程里通过消息队列把请求传过去。回调是接口内部线程调用的但回调里不要调用接口函数否则可能死锁。5. 进阶技巧用状态机管理会话生命周期与压测验证5.1 把会话状态画成状态机代码就不会乱很多人写行情接入状态管理是一团乱麻连接中、已连接、登录中、已登录、订阅中、断线重连中……这些状态散落在各个回调里用一堆布尔标志位表示最后自己都搞不清当前到底在哪个状态。我的做法是显式定义一个状态机把所有状态和迁移条件写清楚。typedef enum { STATE_IDLE, // 初始状态 STATE_CONNECTING, // 连接中 STATE_CONNECTED, // 已连接未登录 STATE_LOGGING_IN, // 登录中 STATE_LOGGED_IN, // 已登录 STATE_SUBSCRIBING, // 订阅中 STATE_READY, // 就绪正常收数 STATE_RECONNECTING, // 断线重连中 STATE_STOPPED // 已停止 } SessionState; // 状态迁移表当前状态 事件 - 新状态 动作 typedef struct { SessionState cur_state; int event; SessionState next_state; void (*action)(SessionHandle session); } StateTransition; StateTransition g_transitions[] { {STATE_IDLE, EVT_START, STATE_CONNECTING, NULL}, {STATE_CONNECTING, EVT_CONNECTED, STATE_CONNECTED, NULL}, {STATE_CONNECTED, EVT_LOGIN_REQ, STATE_LOGGING_IN, DoLogin}, {STATE_LOGGING_IN, EVT_LOGIN_OK, STATE_LOGGED_IN, DoSubscribe}, {STATE_LOGGED_IN, EVT_SUB_OK, STATE_READY, NULL}, {STATE_READY, EVT_DISCONNECT, STATE_RECONNECTING, NULL}, {STATE_RECONNECTING, EVT_CONNECTED, STATE_CONNECTED, NULL}, // ... 其他迁移 };这样做的好处是任何时刻你都能打印出当前状态排查问题时一目了然。而且状态迁移是集中管理的不会出现“在未登录状态下调用订阅”这种低级错误。5.2 用模拟服务端做断线重连压测接口的断线重连逻辑不压测是不知道靠不靠谱的。我一般会写一个模拟服务端故意在特定条件下断开连接观察客户端行为。# 模拟服务端接受连接后随机在5到15秒后断开 import socket import threading import time import random def handle_client(conn, addr): print(f客户端 {addr} 已连接) # 随机等待一段时间后断开 wait random.randint(5, 15) time.sleep(wait) print(f主动断开 {addr}已等待 {wait} 秒) conn.close() server socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((0.0.0.0, 9001)) server.listen(5) print(模拟服务端启动端口9001) while True: conn, addr server.accept() t threading.Thread(targethandle_client, args(conn, addr)) t.start()跑这个模拟服务端然后启动你的行情客户端观察断线后多久开始重连重连间隔是否符合配置重连成功后订阅是否恢复连续断开20次有没有出现重连失败后不再尝试的情况这些观察结果比看文档靠谱得多。5.3 用时间戳差值监控端到端延迟行情接入的延迟不能只看接口返回的时间戳。你需要计算从服务端发出到本地收到的完整链路延迟。做法是在模拟服务端发送数据时打一个本地时间戳客户端收到后计算差值。// 客户端计算延迟 void OnQuote(SessionHandle session, const QuoteData *quote, void *user_data) { struct timespec now; clock_gettime(CLOCK_MONOTONIC, now); long long recv_ns now.tv_sec * 1000000000LL now.tv_nsec; long long send_ns quote-send_timestamp_ns; // 服务端发送时的时间戳 long long latency_us (recv_ns - send_ns) / 1000; // 记录延迟分布 if (latency_us 100000) { // 超过100ms告警 printf([延迟告警] %s 延迟 %lld us\n, quote-code, latency_us); } }注意CLOCK_MONOTONIC和CLOCK_REALTIME不要混用。如果服务端时间戳用的是CLOCK_REALTIME客户端也要用CLOCK_REALTIME否则算出来的差值没有意义。另外这个延迟包含了网络传输时间如果服务端和客户端不在同一台机器还要考虑网络抖动。我自己的习惯是每次接入一个新的行情接口先跑三天模拟环境记录断线次数、重连成功率、延迟分布、内存增长曲线。这四个指标都稳定了才敢上生产。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于PSO的两区域负荷频率控制PID参数整定与Simulink仿真

基于PSO的两区域负荷频率控制PID参数整定与Simulink仿真

上一次做两区域互联电网的负荷频率控制仿真时,我被PID参数整定卡了整整三个晚上。单区域模型用Z-N法整出来的参数还挺能看,可一旦把联络线加进来,两个区域的频率偏差互相耦合,手动调Kp、Ki、Kd怎么调都差口气——频率偏差总在稳态…

2026/10/13 20:33:28 阅读更多 →
给代码助手配个可视化办公室:状态监控与多会话管理实践

给代码助手配个可视化办公室:状态监控与多会话管理实践

1. 从命令行到可视化办公室:这个项目到底在做什么 第一次跟朋友聊起这个项目的时候,对方一脸困惑地问我:“你给一个代码助手配了个办公室?它还能坐在工位上喝咖啡不成?”我当时就笑了,但仔细想想&#xff0…

2026/10/13 20:33:28 阅读更多 →
PS5全屋串流实战指南:从卧室到异地,官方功能不折腾

PS5全屋串流实战指南:从卧室到异地,官方功能不折腾

标题里这个“Any”,我第一反应是“任何地方都能玩”,但折腾了大半年之后,我理解的“Any”其实是另一层意思:把PS5塞进所有日常场景里,而且要稳定、要顺手、还要不花冤枉钱。说实话,最开始的动机很简单——客…

2026/10/13 20:32:25 阅读更多 →

最新新闻

Sub-Agents、Skills与知识库:大模型应用架构重构实践

Sub-Agents、Skills与知识库:大模型应用架构重构实践

去年做一个复杂业务场景的大模型应用时,我一开始图省事,把所有能力塞进单个 Agent:检索、生成、校验、执行全在一个上下文里跑。结果很快发现这条路走不通——prompt 越来越长,模型在工具调用里频繁迷失,多轮对话后甚至…

2026/10/14 23:51:18 阅读更多 →
智能体角色拆分实践:Sub-Agents、技能包与知识库协同跑通

智能体角色拆分实践:Sub-Agents、技能包与知识库协同跑通

1. 为什么要把智能体拆成角色,而不是做一个万能大脑做AI智能体项目,组里最常听到的一句话就是“能不能让这个Agent自己搞定所有事”。最开始谁都这么想,真做两个星期就会发现,任务越复杂,单个Agent越容易顾此失彼。这个…

2026/10/14 23:51:18 阅读更多 →
归并排序实战指南:从寻找大富翁读懂排序算法的取舍与细节

归并排序实战指南:从寻找大富翁读懂排序算法的取舍与细节

做这套题时我最初的提交记录特别丢人——先写了个裸的sort直接交,数据量不大,过了,但我自己清楚,这种写法对“寻找大富翁”可以说毫无解释力。题目考的是排序,可你要真只会调库,那“归并排序”四个字就永远…

2026/10/14 23:51:18 阅读更多 →
ScanNet SensReader:.sens RGB-D 传感器流文件格式与读取工具完全解析

ScanNet SensReader:.sens RGB-D 传感器流文件格式与读取工具完全解析

数据集计算机视觉3D视觉 【免费下载链接】ScanNet 项目地址&#xff1a; https://gitcode.com/gh_mirrors/sc/ScanNet 点击查看 免费下载 在 ScanNet 数据集中&#xff0c;每个扫描序列目录&#xff08;scene%04d_%02d&#xff09;都包含一个 <scanId>.sens 文件&#x…

2026/10/14 23:51:18 阅读更多 →
统一内存撑起万亿参数模型:本地部署大模型的算力与功耗实战指南

统一内存撑起万亿参数模型:本地部署大模型的算力与功耗实战指南

去年年底&#xff0c;我把一台以前只在数据中心见过的计算设备搬进了工位旁边的小机房里。开机那一刻&#xff0c;我盯着监控面板半天没说话——系统里那串 748GB 统一内存余量&#xff0c;比我手头几台常用服务器的内存总和还多。更离谱的是&#xff0c;它不是一台机架式服务器…

2026/10/14 23:51:18 阅读更多 →
守株待兔式投资:构建路径图与触发哨兵的稳健交易体系

守株待兔式投资:构建路径图与触发哨兵的稳健交易体系

有一年年初&#xff0c;我给自己的投资研究体系编了个内部代号&#xff0c;就叫“投资-408”。编号本身没什么特殊含义&#xff0c;纯粹是项目管理习惯&#xff0c;但一整年跑下来&#xff0c;这个代号越来越像一句提醒&#xff1a;真正让账户曲线变得平滑的&#xff0c;往往不…

2026/10/14 23:50:17 阅读更多 →

日新闻

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/14 16:30:29 阅读更多 →
影刀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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →