LibCurl在Linux C/C++下的网络请求实战:从API到踩坑
做Linux下的C/C网络开发绕不开LibCurl这个库。它是目前应用最广、协议支持最全的开源网络传输库HTTP、HTTPS、FTP、SMTP这些协议都能用同一套API搞定。我最早接触LibCurl是因为一个内部工具需要向远端服务上报状态当时第一反应是用socket自己拼HTTP报文结果被各种边界情况折磨得够呛后来换用LibCurl几十行代码完事从此再也不想回去手搓协议了。这篇文章就以LibCurl在Linux C/C工程里的实际应用为主线讲清楚它怎么解决网络请求的常见痛点给出可直接复用的代码模板再分享一些我在生产环境里踩过的坑。1. 为什么不用裸Socket而要选LibCurl1.1 从一次真实的HTTP请求说起想当初我负责的那台设备需要向云端注册中心上报心跳数据格式是JSON走HTTP协议。听起来很简单对吧就是POST一个请求体拿一个响应。但真用socket裸写起来发现暗坑远比想象的多。第一步是DNS解析。设备端的域名是动态解析我得自己调getaddrinfo拿到IP再挨个尝试connect。第二步是TCP三次握手细节socket默认是阻塞的万一对端不可达connect可能要卡几十秒必须自己设非阻塞、轮询getsockopt判断连接状态。第三步才是拼请求报文方法行、Header字段、Content-Length、空行、消息体每一项都得手写数字转字符串、字符串拼接一不小心就多一个空格少一个回车。响应回来以后还得自己解析状态行、响应头、消息体边界Content-Length和chunked两种编码得分别处理。再往后还有重定向、HTTP代理、超时中断、连接复用……任何一个环节没有兜住线上就会偶发“请求失败”“卡住不动”。那次虽然最终也把功能做完了光socket封装就写了将近800行但review代码的时候我自己都看不下去。后来同事提了一句你为什么不用libcurl这才算是打开了新世界。1.2 LibCurl究竟解决了什么LibCurl不是简单的“网络库”它是一整套传输语义的抽象。你不需要关心TCP怎么握手、TLS怎么协商、HTTP报文格式怎么写只需要告诉它“我要用什么的协议、访问哪个地址、把响应数据放哪”剩下的事情由库内部完成。具体来说它至少解决了这么几类问题协议栈统一同一个API接口可以访问HTTP、HTTPS、FTP、SMTP、RTSP等几十种协议切换协议只需要改URL scheme。连接管理内部实现了连接池和Keep-Alive重复请求同一主机时复用已有连接省去反复三次握手的时间。超时控制connect超时、总超时、低网速超时都可以分开设置不再需要自己写非阻塞connect那套轮询。重定向与代理默认可自动跟随301/302支持HTTP代理、SOCKS代理跨网请求省心很多。TLS处理内置OpenSSL、GnuTLS等后端的接入HTTPS证书校验、双向认证都直接在选项里配。更关键的是LibCurl的API设计非常稳定从C代码到C封装都能无缝使用而且它在所有主流Linux发行版上都有现成包编译部署成本极低。2. 核心API拆解从初始化到请求完成的完整链路2.1 三个关键句柄CURL、CURLoption、CURLcodeLibCurl的使用方式可以用一条主线概括初始化句柄、设置选项、执行请求、清理句柄。整条链路里你会反复见到三个类型CURL、CURLoption、CURLcode。CURL是指向会话句柄的指针所有操作都围绕它进行。它相当于一个“请求上下文”保存了URL、超时、回调函数等全部配置。CURLoption是个巨大的枚举定义了上百个可配置项从URL到代理、从超时到证书、从回调到Header每一项都是一个选项编号。CURLcode是所有函数的返回码等于0CURLE_OK表示成功非0值对应具体的错误类型。基本流程是这样CURL *curl curl_easy_init(); if (!curl) { /* 初始化失败 */ } curl_easy_setopt(curl, CURLOPT_URL, http://example.com/api); CURLcode res curl_easy_perform(curl); if (res ! CURLE_OK) { fprintf(stderr, request failed: %s\n, curl_easy_strerror(res)); } curl_easy_cleanup(curl);这8行就是一次完整请求的骨架。注意curl_easy_setopt本身不返回请求结果它只是把配置写进句柄真正的网络交互发生在curl_easy_perform里它是阻塞执行的直到响应完成或出错才返回。还有一个容易被误解的细节curl_easy_init本身不负责全局初始化。官方文档里明确要求在多线程程序里应该先调用一次curl_global_init(CURL_GLOBAL_DEFAULT)并且最好在主线程调用之后再创建各个线程的easy句柄。早期版本里很多泄漏和崩溃其实都跟跳过这一步有关虽然现在版本里easy_init内部会做兼容处理但正规写法仍然是显式调一次全局初始化。2.2 高频使用的选项与回调函数先列一份我平时用得最多的选项清单选项作用常用取值示例CURLOPT_URL设置访问地址https://api.example.com/userCURLOPT_WRITEFUNCTION响应体写回调函数指针CURLOPT_WRITEDATA传给回调的用户数据结构体指针CURLOPT_TIMEOUT整个请求超时秒数10LCURLOPT_CONNECTTIMEOUT连接建立超时3LCURLOPT_FOLLOWLOCATION自动跟随重定向1LCURLOPT_HTTPHEADER自定义HTTP头struct curl_slist*CURLOPT_POSTFIELDSPOST请求体keyvalueCURLOPT_NOSIGNAL不触发信号1LCURLOPT_SSL_VERIFYPEER是否校验TLS证书0L或1LCURLOPT_USERAGENT设置User-Agenthttp-client/1.0这里重点说回调函数。CURLOPT_WRITEFUNCTION是数据出口签名固定为size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata);ptr指向收到的数据size乘以nmemb是本次数据总字节数。函数必须返回实际消费的字节数如果返回值与传入值不匹配libcurl会认为写失败并报CURLE_WRITE_ERROR。最稳妥的写法是把数据追加到动态缓冲区里userdata指向你的缓冲区结构体返回size*nmemb。还有两个容易踩的选项需要提醒。一个是CURLOPT_TIMEOUT如果设为0表示不限制生产环境一定要设否则服务端不回包时请求会无限等下去。另一个是CURLOPT_SSL_VERIFYPEER生产环境别轻易设成0关闭证书校验等于把HTTPS降级成明文HTTP安全审计过不了。2.3 从GET到POST一屏搞定常用请求范式除了GET日常用的最多就是POST。LibCurl里POST有两种常见姿势一种是CURLOPT_POSTFIELDS直接传字符串适合表单和JSON另一种是配合CURLOPT_READFUNCTION做流式上传适合大文件或流数据。最简单的POST模板是这个curl_easy_setopt(curl, CURLOPT_URL, http://example.com/submit); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, namealiceage28); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(namealiceage28));记得CURLOPT_POSTFIELDSIZE一定要设。因为POSTFIELDS指向的是字符串首地址libcurl不知道字符串长度一旦里面包含\0字节发送的数据就会被截断。设了大小以后Byte层面精确传输不会再出这种诡异问题。如果要发JSON只需要把POSTFIELDS指向JSON字符串Header里加Content-Type: application/json即可。我在实际开发中把GET、POST、PUT、DELETE都封装成同一个接口参数只有method和body内部用strcmp分流一个函数走天下连接复用和错误处理全在一个地方维护代码量反而比裸socket方案小得多。3. 实操过程基于LibCurl实现一个带超时控制的请求模块3.1 环境准备与编译配置先用命令确认系统里有没有装libcurl开发包curl-config --version curl-config --cflags --libs如果提示找不到命令在Debian/Ubuntu系系统上用apt安装sudo apt install libcurl4-openssl-dev在CentOS/RHEL系系统上则是sudo yum install libcurl-devel装好之后编译时最省事的办法是用curl-config动态拼接头文件和库路径gcc -Wall -O2 -o demo demo.c $(curl-config --cflags --libs)也可以使用pkg-configgcc -Wall -O2 -o demo demo.c $(pkg-config --cflags --libs libcurl)两种方式效果一样。用curl-config的好处是它会自动带上OpenSSL等依赖库少遇到链接问题。如果你习惯在VS Code里写Linux C/C项目我建议在c_cpp_properties.json里把头文件路径加上curl-config --cflags输出的目录同时在tasks.json的args里加上$(curl-config --cflags --libs)对应的实际参数。别小看这一步VS Code默认编译配置不带curl头文件路径时代码里一堆红色波浪线虽然不影响编译但很影响开发体验。我实测下来用curl-config生成参数最稳比手动硬编码/usr/include/x86_64-linux-gnu这类路径要可靠得多换机器也不会出问题。3.2 完整代码实现与逐段讲解下面给一个完整的GET请求模块带超时、带自定义Header、响应体存进内存。这个模板我直接搬到了好几个项目里改动量很小。#include stdio.h #include stdlib.h #include string.h #include curl/curl.h typedef struct { char *data; size_t len; } Buffer; static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata) { size_t bytes size * nmemb; Buffer *buf (Buffer *)userdata; char *tmp realloc(buf-data, buf-len bytes 1); if (!tmp) return 0; buf-data tmp; memcpy(buf-data buf-len, ptr, bytes); buf-len bytes; buf-data[buf-len] \0; return bytes; } int http_get(const char *url, char **out_body) { CURL *curl curl_easy_init(); if (!curl) return -1; Buffer buf {0}; struct curl_slist *headers NULL; headers curl_slist_append(headers, Accept: application/json); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb); curl_easy_setopt(curl, CURLOPT_WRITEDATA, buf); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); CURLcode res curl_easy_perform(curl); long http_code 0; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, http_code); if (res ! CURLE_OK) { fprintf(stderr, perform error: %s\n, curl_easy_strerror(res)); } else if (http_code 400) { fprintf(stderr, http error: %ld\n, http_code); } *out_body buf.data ? buf.data : strdup(); curl_slist_free_all(headers); curl_easy_cleanup(curl); if (res ! CURLE_OK || http_code 400) return -1; return 0; } int main(void) { char *body NULL; if (http_get(https://httpbin.org/get, body) 0) { printf(%s\n, body); } free(body); return 0; }逐段说几个关键点。Buffer结构体是响应体收集器write_cb每次收到数据块就realloc扩容并在末尾补\0这样响应体可以当普通字符串用。注意realloc失败时返回0libcurl会立刻中止请求并报错这个兜底必须有。curl_easy_getinfo配合CURLINFO_RESPONSE_CODE可以在请求结束后读出HTTP状态码这是判断业务成功与否的第一道关口。网络层成功不等于HTTP层成功4xx/5xx必须单独处理。函数返回值设计上-1表示请求失败0表示成功响应体通过out_body指针带出。调用方负责free这个责任边界一开始就要讲清楚否则很容易在团队协作里产生内存泄漏。还有个小细节CURLOPT_FOLLOWLOCATION设了以后libcurl最多默认跟随5次重定向。如果服务端配置有问题形成重定向环它会返回CURLE_TOO_MANY_REDIRECTS这个错误码在排查“请求成功但结果不对”的疑难杂症时很有用。3.3 多线程与连接复用LibCurl提供了easy、multi、share三种接口对应不同的使用场景。easy接口最简单一次调用完成一次同步请求但它是线程不友好的两个线程不能共享同一个CURL句柄必须各自curl_easy_init。在多线程程序里还有一个必须开的选项CURLOPT_NOSIGNAL。为什么因为libcurl默认在DNS解析超时等场景下会发SIGALRM信号如果你的进程没有处理这个信号默认动作是终止进程。我遇到过“程序莫名退出日志里什么都没有”的离奇case最后gdb定位就是忘了设NOSIGNAL。开着这个选项libcurl会改用超时机制而不是信号机制代价是极个别场景下超时精度会降低但相比进程被搞死完全可以接受。另外连接复用这件事也值得讲透。如果你在循环里每次都重新curl_easy_init那么即使请求的是同一台服务器每次也会重新做TCP握手握手开销虽然不大但在高QPS场景下累计起来就很可观。正确做法是循环外初始化一个easy句柄循环内只更新CURLOPT_URL再perform。服务器开启Keep-Alive的前提下后续请求能直接复用已有连接P99延迟能有肉眼可见的下降。4. 踩坑记录与问题排查速查表4.1 实战中高频出现的五个问题先上一张速查表这几个问题我几乎每带一个人就会遇到一次现象可能原因排查方法解决办法回调返回0请求报CURLE_WRITE_ERROR写回调里realloc失败或主动返回0检查回调里有无内存分配失败扩容失败时调用free并返回0或在初始化时预分配大块内存多线程偶发进程退出未设置CURLOPT_NOSIGNALgdb看信号确认是不是SIGALRM加NOSIGNAL选项HTTPS请求报证书错误系统CA证书路径未配置curl -v看错误详情指定CURLOPT_CAINFO或安装ca-certificates包请求一直卡住不返回CURLOPT_TIMEOUT未设置strace看是否阻塞在poll设置总超时和连接超时二次请求明显变慢每次都新建句柄未复用连接观察抓包有无大量TCP握手用multi接口或对同一主机复用easy句柄第一个问题值得多说两句。回调函数返回0被libcurl定义为“写中止”它会立刻中断传输并给上层一个CURLE_WRITE_ERROR。所以在写回调里如果你临时决定不接收数据可以返回0但要想清楚是不是真的想终止请求。我见过有人把“本次不处理”直接当成0返回结果整个请求失败其实更好的做法是把数据先存下来哪怕临时用不上也应该消费掉只是不再向上层转发。第二个问题是信号问题。前面提过的CURLOPT_NOSIGNAL只要你的程序是多线程的基本属于必选项。单线程程序可以不开但也别省这行代码因为后续代码一旦被改成多线程很容易遗漏这个开关。4.2 调试利器CURLOPT_VERBOSE与curl_easy_strerror排查libcurl问题最直接的手段是打开详细输出curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);开了之后请求的每一跳都会打到stderr正在解析的域名、选择的IP、TLS握手状态、发送的请求头、接收的响应头、传输统计数据。这份输出信息量极大基本能定位90%以上的问题。如果还需要更细的观测我会在开发环境用tcpdump抓包配合确认sudo tcpdump -i eth0 host example.com -w /tmp/curl.pcap然后在Wireshark里看TCP和TLS层的交互细节。用LibCurl不等于就可以对协议层毫无感知很多时候问题出在网络栈而不是应用层比如MTU导致TCP分段异常、TLS版本协商失败这类抓包结果比任何日志都直观。关于错误码curl_easy_strerror能把CURLcode枚举转成可读字符串这比打印裸数字好排查得多。还有一个稍显冷门但实用的函数curl_easy_getinfo它能在请求结束后拉取响应码、总耗时、DNS耗时、连接耗时等各项指标。把这些指标打进日志线上问题定位效率能提升一大截double dns_time 0, connect_time 0, total_time 0; curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, dns_time); curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, connect_time); curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, total_time);不同阶段耗时分开统计能一眼看出瓶颈在DNS、TCP连接还是数据传输上。我处理过一个“偶尔超时”的case打开分阶段计时后才发现是DNS解析偶尔抖动和HTTP服务本身一点关系没有修复方向立刻从后端转到了DNS缓存策略上。4.3 性能优化multi接口异步请求如果你的程序需要一口气请求几十个URL用easy接口逐个同步执行显然太慢。这时就该上multi接口。multi接口的核心是事件驱动把多个easy句柄放进一个multi句柄libcurl用IO多路复用机制统一管理socket事件你只需要定期调用curl_multi_perform驱动状态机再处理完成事件。骨架大概是这个结构CURLM *multi curl_multi_init(); // 为每个请求创建 easy 句柄curl_multi_add_handle(multi, easy) int still_running 0; do { curl_multi_perform(multi, still_running); // 用 curl_multi_wait 或 poll 等待可读可写事件 // 处理 curl_multi_info_read 返回的完成消息 } while (still_running 0); // 逐个 curl_multi_remove_handle / curl_easy_cleanup用multi接口最大的收益是并发性能几十个请求可以在几秒内全部完成而不是串行地逐个等待。但它的复杂度也高一个台阶句柄生命周期管理、事件循环、错误隔离都要自己设计。我的建议是请求数少于10个、且服务端延迟不高时直接用easy接口加上线程池就足够了请求量大或者服务端延迟不稳定时才值得引入multi。顺带聊一下DNS解析。libcurl在编译时如果启用了c-ares可以将DNS解析从阻塞式getaddrinfo换成真正的异步解析在并发请求量大、域名解析慢的场景下很有帮助。用curl -V可以查看当前版本是否包含c-ares特性。如果没有可以用共享DNS缓存的方式先顶一顶或者直接用multi接口的架构规避阻塞点。我在实际项目里最深的体会是LibCurl不是那种“用起来高大上”的库它是那种“用了之后再也回不去”的库。早期从socket手写协议里爬出来时我对它的印象只是“方便”后来在压测、多线程、重构中逐渐理解了它背后的连接管理、超时模型和事件驱动设计才意识到它真正的价值在于把大量传输层的脏活累活包揽了让上层业务逻辑变得干净可控。如果你正打算在Linux C/C工程里接网络请求建议先别急着造socket轮子花半小时把LibCurl的基本API跑通后面省下的时间远超这半小时。另外用到生产环境前一定把超时、重试、日志这几件事提前规划好网络请求的稳定性从来不是靠库而是靠调用方的工程习惯。

相关新闻

PPOCRLabel多语种OCR自动标注全流程实操指南

PPOCRLabel多语种OCR自动标注全流程实操指南

接到一批多语种单据的标注任务时,我一开始还天真地以为工作量差不多就是“多敲几行外文”的事。真上手才发现,画框、敲字、断句、看方向,每一种语言的书写习惯都在给标注流程加码。中文英文还好,到了泰文、阿拉伯文、藏文&#xf…

2026/10/11 20:45:31 阅读更多 →
高斯泼溅三维重建实战:从原理到落地的完整指南

高斯泼溅三维重建实战:从原理到落地的完整指南

1. 从“像照片”到“像现实”:高斯泼溅到底在解决什么问题第一次看到高斯泼溅的渲染结果时,大多数人的反应是“这不就是一张照片吗”。但真正上手做过三维重建的人会告诉你,这句话恰恰点出了它的核心矛盾——像照片,远远不够。照片…

2026/10/11 20:45:31 阅读更多 →
内存中的整数与浮点数:补码与IEEE 754原理及实践陷阱

内存中的整数与浮点数:补码与IEEE 754原理及实践陷阱

1. 为什么说“内存怎么存”决定了你的代码怎么写我记忆特别深的一次排查,是统计脚本里总金额差了 0.03 元。断点打了一遍,数值看起来都对;加了日志,中间结果也都是“正常小数”。最后我把中间变量按字节打出来看十六进制&#xff…

2026/10/11 20:44:30 阅读更多 →

最新新闻

YOLOv7火焰烟雾检测实战:从数据集标注到部署避坑全攻略

YOLOv7火焰烟雾检测实战:从数据集标注到部署避坑全攻略

简介:基于YOLOv7的火焰与烟雾检测方案,面向计算机视觉开发者、消防预警领域研究者、安全监控项目人员以及正在入门目标检测的学员,适合作为模型训练、推理验证和二次开发的参考基础。资源包含训练好的模型权重,下载后可直接加载推…

2026/10/11 22:24:10 阅读更多 →
Python akshare A股数据实战:从拉取清洗到本地存储的稳定链路

Python akshare A股数据实战:从拉取清洗到本地存储的稳定链路

简介:这是一份面向金融数据分析初学者与量化爱好者的Python股票数据处理源码包,基于akshare库实现股票数据的自动化抓取、清洗与分析,适合想用编程替代手工整理行情数据、搭建个人分析流程的开发者参考。压缩包共442个文件、约12.22MB&#x…

2026/10/11 22:24:09 阅读更多 →
连续相位调制CPM原理与MATLAB仿真实现

连续相位调制CPM原理与MATLAB仿真实现

简介:这份资源面向通信工程、电子信息类专业学生及数字通信初学者,聚焦连续相位调制(CPM)在MATLAB环境下的原理验证与仿真实现,帮助读者理解调制指数、符号速率与信息速率之间的关系,并掌握MSK、GMSK等典型…

2026/10/11 22:24:09 阅读更多 →
小龙虾OpenClaw一键部署U盘:把配置改到TaoToken的完整实操

小龙虾OpenClaw一键部署U盘:把配置改到TaoToken的完整实操

/* 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 22:24:09 阅读更多 →
Pytorch实现DualGAN非配对图像去雾:原理与实战

Pytorch实现DualGAN非配对图像去雾:原理与实战

简介:基于Pytorch实现的对偶生成对抗网络图像去雾项目,包含完整Python源码、预训练模型与文档说明,面向计算机相关专业毕业设计、课程设计及需要项目实战的初学者。资源包共25个文件,涵盖10个py源码文件用于网络定义、训练、预测与…

2026/10/11 22:24:09 阅读更多 →
ROS2 Action通信机制详解:从接口定义到完整实战

ROS2 Action通信机制详解:从接口定义到完整实战

第一次看到ROS2里还有action这种通讯方式时,我一瞬间是有点懵的:topic我会用,service我也明白,action到底是什么鬼?直到我在导航小车上真跑了一次任务才发现,动作方式通讯解决的是"带反馈、可取消、有…

2026/10/11 22:23:08 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →