SIP软电话源码实战:从编译到NAT穿透与信令定制
简介本资源是一份基于SIP协议的软电话完整源代码工程面向通信协议开发初学者、VoIP系统学习者及嵌入式/网络应用开发者旨在帮助理解SIP信令交互、媒体协商与实时语音通信的核心实现逻辑。压缩包共302个文件含45个C源文件cpp与88个头文件h构成主体逻辑辅以41个编译中间文件obj、39个界面位图资源bmp及可执行程序exe、动态链接库dll等完整覆盖从SIP消息解析INVITE/ACK/BYE/REGISTER、SDP媒体协商、TCP/UDP双栈传输到图形化拨号界面的全链路实现包体大小为8.34MB。已有836人学习下载读者可直接编译运行、调试SIP注册与呼叫流程深入剖析消息头字段处理、重试机制、代理路由逻辑及音视频流初始化等关键模块是掌握VoIP底层协议栈开发的优质实践样本。1. 为什么一个“基于SIP协议的软电话的源代码”项目比你想象中更难跑通、更值得深挖不是所有标着“SIP软电话”的开源仓库都能在你笔记本上点开就拨通——我见过太多开发者 clone 下来、make 一下、看到终端里跳出Listening on udp://0.0.0.0:5060就以为成功了结果一拨号无响应、404 Not Found、Authentication Required 循环弹窗甚至 SIP 消息压根没发出去。根本原因在于SIP 不是 HTTP它不自带注册中心、不默认配好认证、不自动发现对方地址它是一套通信契约而软电话是执约人——契约写得再漂亮执约人没配对信令路径、没填对头域、没处理好 NAT 穿透照样哑火。这份源代码的价值不在“能编译”而在它如何把 RFC 3261 里那些抽象状态机如 INVITE transaction、dialog lifecycle落地成可调试的 C/C/Python 模块它暴露的是 SIP 栈与操作系统网络栈、音频子系统、UI 事件循环之间的真实咬合面。适合正在做 VoIP 终端集成、想搞懂呼叫建立黑匣子、或需要定制化呼叫控制逻辑比如自动应答语音转文字联动的嵌入式/音视频工程师。别把它当玩具要当探针用。2. 从零跑通一个典型 SIP 软电话源码环境准备、编译链与最小可运行验证SIP 软电话不是单个 .py 文件它通常由 SIP 协议栈、媒体引擎音频编解码RTP、信令 UI 三部分耦合而成。主流开源实现有 PJSIPC、LinphoneC、SIP.jsWeb、以及轻量级 Python 实现如 pjsua2 封装或 sipsimple。我们以PJSIP 官方示例 pjsua命令行软电话为基准——它被广泛用于生产环境测试源码结构清晰且规避了 GUI 依赖带来的跨平台陷阱。2.1 环境依赖与编译工具链确认Linux/macOS 优先PJSIP 是纯 C 实现但依赖 POSIX 线程、音频设备抽象层ALSA/PulseAudio/CoreAudio、以及可选的 OpenSSL用于 TLS。不要跳过依赖检查——很多“编译失败”实际是 pkg-config 找不到 libssl 或 libasound。# Ubuntu/Debian sudo apt update sudo apt install -y \ build-essential \ autoconf automake libtool \ python3-pip \ libasound2-dev libpulse-dev \ libssl-dev \ libx11-dev libxt-dev # 可选X11 支持pjsua GUI 版提示macOS 用户请用 Homebrew 安装libtool autoconf automake openssl3 alsa-lib注意macOS 无 ALSA需用 CoreAudio编译时指定--with-coreaudioWindows 用户强烈建议用 WSL2原生 MSVC 编译 PJSIP 的音频后端极其脆弱。2.2 下载、配置与编译 PJSIP 源码含关键参数说明PJSIP 源码需从官网下载非 GitHub 镜像因其构建系统configure make对路径敏感。截至 2024 年稳定版为pjsip-2.14注意2.13 有已知 TLS 1.3 兼容问题。# 下载并解压务必用官方 tar.gz非 git clone wget https://github.com/pjsip/pjproject/releases/download/2.14/pjproject-2.14.tar.bz2 tar -xjf pjproject-2.14.tar.bz2 cd pjproject-2.14 # 关键配置阶段必须显式启用所需组件 ./configure \ --enable-shared \ # 生成动态库便于后续调试符号加载 --with-ssl/usr/include/openssl \ # 指向 OpenSSL 头文件路径Ubuntu 通常在 /usr/include/openssl --with-opus \ # 启用 Opus 编解码现代 VoIP 事实标准 --with-g7221 \ # 启用 G.722.1高清语音 --disable-video \ # 初次验证禁用视频减少依赖复杂度 CFLAGS-O2 -g # 保留调试符号 -g否则 core dump 无法溯源 # 编译-j4 加速但首次建议 -j1 查看报错位置 make dep make clean make -j4参数逻辑说明--enable-shared是必须项静态链接会导致pjsua二进制体积巨大且无法用gdb附加调试--with-ssl必须显式指定路径PJSIP 的 configure 脚本不会自动探测 OpenSSL 3.x 的新路径如/opt/homebrew/opt/openssl3/include漏掉则 TLS 功能编译失败--disable-video是新手避坑开关视频模块依赖 SDL2/X11/OpenGL极易因显卡驱动或头文件缺失中断编译先确保音频通路稳定再开视频。2.3 构建最小可运行实例pjsua 命令行软电话编译成功后可执行文件位于pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnuLinux或pjsip-apps/bin/pjsua-x86_64-apple-darwinmacOS。不要直接运行先验证基础能力# 步骤1检查是否能启动并列出本地网络接口验证网络栈绑定 ./pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu --list-iface # 步骤2启动空实例不注册、不拨号仅监听验证 SIP 栈初始化 ./pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu --stun-srv stun.linphone.org --log-level5 # 观察输出应看到 SIP TCP socket ready 和 SIP UDP socket ready且无 Failed to bind 错误 # 按 CtrlC 退出关键现象解读若出现Failed to bind to 0.0.0.0:5060: Address already in use说明本机已有其他 SIP 服务如 Asterisk、Zoiper占用了 5060 端口需sudo lsof -i :5060杀掉若卡在Initializing sound device...且无后续日志大概率是 PulseAudio/ALSA 权限问题Ubuntu 22.04 默认禁用用户访问/dev/snd/需将当前用户加入audio组sudo usermod -aG audio $USER然后重启会话。3. 注册、呼叫与媒体协商用真实 SIP 服务器打通第一通电话编译通过只是起点。SIP 软电话的核心价值在于与真实 SIP 服务器如 FreeSWITCH、Asterisk、或云厂商提供的 SIP Trunk交互。这里我们用免费、免部署的公共 SIP 测试服务sip2sip.info注意非商业用途仅用于验证协议栈连通性。3.1 创建 sip2sip 账户并获取凭证访问 https://www.sip2sip.info/ 点击 “Create Account”填写邮箱、用户名如testuser123、密码。注册后你会获得SIP URItestuser123sip2sip.info密码邮件中发送的 12 位随机字符串域名sip2sip.info推荐 STUN 服务器stun.sip2sip.info用于 NAT 穿透注意sip2sip 不支持 TLS 注册只支持 UDP/TCP因此我们暂时禁用 TLS避免证书错误干扰。3.2 配置 pjsua 命令行参数完成注册与呼叫pjsua 支持命令行参数直连无需写配置文件。以下是一条可直接复制粘贴运行的完整命令替换其中testuser123和YOUR_PASSWORD./pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu \ --id sip:testuser123sip2sip.info \ --registrar sip:sip2sip.info \ --realm sip2sip.info \ --username testuser123 \ --password YOUR_PASSWORD \ --proxy sip:sip2sip.info;lr \ --stun-srv stun.sip2sip.info \ --use-100rel \ --no-tcp \ --no-tls \ --log-file pjsua.log \ --log-level 5参数逐条解析为什么必须这样设--id你的 SIP AORAddress of Record格式必须为sip:usernamedomain少一个sip:或域名错误注册直接 400 Bad Request--registrar注册服务器地址必须与--realm一致且不能带端口sip2sip 默认 5060--proxy路由代理;lr表示 loose-router强制 pjsua 使用该代理转发所有请求绕过 DNS SRV 查询避免解析失败--stun-srvSTUN 服务器NAT 穿透成败关键。若不加此参数在家庭宽带下注册可能成功UDP 包能出但呼叫时对方无法回包因为你的私网 IP 无法被外网路由--no-tcp --no-tls明确禁用 TCP/TLS匹配 sip2sip 的 UDP-only 服务策略--log-level 5最高日志级别所有 SIP 消息包括 SDP都会打印到终端是排错唯一依据。3.3 观察注册成功与发起呼叫的完整信令流启动上述命令后观察终端输出几秒内应出现Registration success, contact is sip:xxx192.168.x.x:5060;...—— 表示注册成功contact地址是 pjsua 告诉服务器“请把我的呼叫发到这里”输入p查看当前注册状态显示State: Registered输入m进入拨号模式输入对方 SIP URI如sip:echosip2sip.info这是 sip2sip 提供的回声测试服务按回车等待几秒——若听到自己的声音从扬声器传出即宣告 RTP 媒体流打通。此时打开pjsua.log搜索INVITE和200 OK你会看到完整的 SIP 事务pjsua 发送INVITESDP 中包含maudio 4000 RTP/AVP 0 8 101表示支持 PCMU、PCMA、telephone-eventsip2sip 回100 Trying→180 Ringing→200 OKSDP 中maudio 5000 RTP/AVP 0选择 PCMUpjsua 发送ACKRTP 流开始双向传输。提示若呼叫后无声90% 是音频设备权限或 PulseAudio 配置问题。用pactl list sources short查看可用输入设备再在 pjsua 启动时加--play-file /dev/null --rec-file /dev/null强制使用默认设备排除文件播放干扰。4. SIP 软电话开发中的五大高频翻车点现象、根因与硬核解法SIP 协议看似简单实则是状态机、并发、NAT、防火墙、编解码协商的“压力测试场”。以下是我在多个模拟项目X 中反复踩过的坑按发生频率排序每一条都附带gdb或tcpdump可验证的定位方法。4.1 现象注册成功但呼叫时对方收不到 INVITEWireshark 显示只有 UDP 包发出无任何返回原因你的公网 IP 被运营商做了 CGNATCarrier-Grade NATSTUN 无法获取真实公网 IP导致contact头域写的是192.168.x.x对方服务器尝试往内网地址发包自然丢弃。解决第一步用curl ifconfig.me确认你的真实出口 IP再用stun.sip2sip.info:3478测试 STUN 是否穿透成功pjsua 日志中STUN mapped address应与ifconfig.me一致第二步若不一致必须启用 TURN中继。申请免费 TURN 服务如 coturn 自建或 Xirsys在 pjsua 中添加--turn-srv turn:your-turn-server.com --turn-user user --turn-pass pass第三步强制 pjsua 使用 TURN加参数--use-turn此时所有媒体流经中继代价是延迟增加 50ms。4.2 现象注册时返回401 Unauthorized重试后变成403 Forbidden原因--realm参数值错误。SIP Digest 认证中realm 是服务器定义的安全域标识符必须与WWW-Authenticate头中的 realm 完全一致区分大小写、空格。sip2sip 的 realm 是sip2sip.info但某些服务器返回SIP2SIP.INFO或sip2sip。解决启动 pjsua 时加--log-level 5在日志中搜索WWW-Authenticate找到realmxxx的原始值将--realm参数严格设为该值不可猜测若服务器返回多个 realm罕见pjsua 默认取第一个无需额外操作。4.3 现象呼叫建立后单向语音只能听对方自己说话对方听不见原因RTP 端口被防火墙拦截或音频设备采样率不匹配。pjsua 默认使用 8000Hz 采样率但某些 USB 声卡仅支持 44100Hz导致 ALSA 写入失败RTP 包无有效音频数据。解决用arecord -l和aplay -l列出声卡再用arecord -D plughw:0,0 -r 8000 -f S16_LE -d 3 test.wav测试 8kHz 录音是否成功若失败在 pjsua 启动时强制指定设备与采样率--snd-dev-id 0 --clock-rate 80000是声卡索引检查iptablessudo iptables -L -n | grep 4000确保 RTP 端口范围默认 4000-4999未被 DROP。4.4 现象pjsua 启动时报错PJLIB_UTIL_ERROR: SSL load error且--no-tls无效原因PJSIP 在 configure 阶段检测到 OpenSSL但运行时动态链接库路径错误。ldd ./pjsip-apps/bin/pjsua-* | grep ssl显示libssl.so.3 not found。解决Ubuntu 22.04 默认安装 OpenSSL 3但库名变为libssl.so.3而 PJSIP 编译时链接的是libssl.so软链接指向旧版手动创建软链接sudo ln -sf /usr/lib/x86_64-linux-gnu/libssl.so.3 /usr/lib/x86_64-linux-gnu/libssl.so更安全做法编译时用LDFLAGS-L/usr/lib/x86_64-linux-gnu -lssl -lcrypto显式指定。4.5 现象在 Docker 容器中运行 pjsua注册成功但无法收发 RTP原因Docker 默认网络模式bridge使容器拥有独立网络命名空间STUN 返回的172.17.x.x是容器内网 IP对外不可达且--network host模式下pjsua 绑定0.0.0.0:5060会与宿主机冲突。解决绝对不要用--network host使用--network bridge但必须映射端口-p 5060:5060/udp -p 4000-4999:4000-4999/udp关键在 pjsua 参数中强制指定--public-ip YOUR_HOST_PUBLIC_IP宿主机公网 IP并加--bound-addr 0.0.0.0让contact头域写入公网 IP若宿主机有防火墙开放对应 UDP 端口。5. 从“能用”到“可控”修改源码注入自定义逻辑的三个实战切口跑通 pjsua 只是入门。真正体现“基于 SIP 协议的软电话源代码”价值的地方在于你能精准修改哪一部分来满足业务需求。以下是我在某跨平台系统中落地的三个高复用性切口全部基于 PJSIP 2.14 源码树修改量均小于 50 行。5.1 切口一在 INVITE 发出前自动添加自定义 SIP 头域如 X-Custom-ID业务场景呼叫中心需要在每个呼出请求中嵌入工单 ID供后端系统追踪。RFC 允许任意X-开头的头域。修改位置pjsip/src/pjsua-lib/pjsua_call.c函数pjsua_call_make_call()操作在inv-pool分配后、pjsip_inv_invite()调用前插入// 在 pjsua_call_make_call() 函数中找到 inv-pool 创建后的代码块 pj_str_t hdr_name pj_str(X-Custom-ID); pj_str_t hdr_value pj_str(TICKET-12345); // 实际中可从外部变量读取 pjsip_generic_string_hdr *hdr pjsip_generic_string_hdr_create(inv-pool, hdr_name, hdr_value); pjsip_msg_add_hdr(inv-dlg-invite_req, (pjsip_hdr*)hdr);验证方法启动 pjsua拨号后查看日志中INVITE消息体确认X-Custom-ID: TICKET-12345存在。5.2 切口二拦截 200 OK 响应提取 SDP 中的音频编码器偏好业务场景需要根据对方支持的编解码器动态调整本地语音处理策略如对方只支持 G.711则关闭噪声抑制。修改位置pjsip/src/pjsua-lib/pjsua_call.c函数on_call_state()操作在if (call-inv call-inv-last_answer)分支内解析 SDP// 在 on_call_state() 中找到处理 PJSIP_INV_STATE_CONFIRMED 的代码块 if (call-inv-last_answer) { const pjmedia_sdp_session *sdp call-inv-last_answer; // 遍历 media 描述找 audio 行 for (int i 0; i sdp-media_count; i) { const pjmedia_sdp_media *m sdp-media[i]; if (pj_strcmp2(m-desc.media, audio) 0) { PJ_LOG(3,(THIS_FILE, Remote audio codecs: %.*s, (int)m-desc.fmt_count, m-desc.fmt)); // 此处可提取 m-desc.fmt[0] 获取首选编码器编号 } } }提示m-desc.fmt是pj_str_t数组存储编码器编号如0表示 PCMU需转换为整数并与pjmedia_codec_get_info()对照。5.3 切口三在通话中主动发送 DTMFRFC 2833而非 SIP INFO业务场景IVR 系统要求按键音走 RTP 带内传输保证低延迟和可靠性。修改位置pjsip/src/pjsua-lib/pjsua_call.c暴露pjsua_call_dial_dtmf()函数调用点操作在pjsua_app.c的命令行处理逻辑中如cmd_dtmf()函数调用// 替换原有的 SIP INFO 发送逻辑 pj_status_t status pjsua_call_dial_dtmf(call_id, 1234, NULL); if (status ! PJ_SUCCESS) { PJ_LOG(1,(THIS_FILE, DTMF send failed: %s, pj_strerror(status).ptr)); }关键参数说明pjsua_call_dial_dtmf()第三个参数为pjsua_dtmf_flag设为PJSUA_DTMF_USING_RFC2833即启用带内 DTMF若设为PJSUA_DTMF_USING_SIP_INFO则走 SIP INFO 消息。我的血泪经验所有 SIP 协议栈的“高级功能”如 REFER、UPDATE、PRACK都藏在pjsip/include/pjsip-ua的头文件里但文档极少。最可靠的方法是在源码中全局搜索关键词如pj_str_t STR_REFER找到对应消息构造函数再逆向工程调用链。不要迷信 API 文档要看pjsua_call.c里 pjsua 是怎么用的——它就是最佳实践。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

测试工程师成长路径:从功能测试到测试架构师的能力进阶指南

测试工程师成长路径:从功能测试到测试架构师的能力进阶指南

前阵子我面试一位五年经验的测试工程师,简历上写着“熟悉自动化测试”,结果我随口问了一句“接口测试的断言除了状态码还会验什么”,他支支吾吾说了半天,最后落点在“看返回结果对不对”。这个场景不是个例,聊测试工程…

2026/10/13 16:51:39 阅读更多 →
MySQL课件精讲:从E-R图到候选码的数据库设计核心

MySQL课件精讲:从E-R图到候选码的数据库设计核心

简介:这套《MySql数据库原理及应用》课件汇总共1个文件(pptx格式),压缩包大小13.29MB,覆盖整本教材的教学内容。资源面向数据库初学人员、高校师生及自学MySQL的读者,系统讲解数据库系统基础知识与MySQL应用…

2026/10/13 16:51:39 阅读更多 →
AI工程化能力三支柱:数据智能、模型架构与系统交付

AI工程化能力三支柱:数据智能、模型架构与系统交付

1. 这不是“学AI”,而是构建一套可迁移、能落地的工程化能力体系很多人点开“AI培训学什么”这类标题,第一反应是找速成班、抄代码、背模型名字——结果学了三个月,连数据怎么清洗都卡在pandas报错上;或者花两万块报了“大模型实战…

2026/10/13 16:50:38 阅读更多 →

最新新闻

PL/SQL智能补全插件实战:解决Oracle开发命名、跳转与上下文感知难题

PL/SQL智能补全插件实战:解决Oracle开发命名、跳转与上下文感知难题

/* 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 17:29:40 阅读更多 →
Grbl_ESP32:基于 ESP32 的 Grbl CNC 控制固件——功能全景、机器配置与编译部署实战

Grbl_ESP32:基于 ESP32 的 Grbl CNC 控制固件——功能全景、机器配置与编译部署实战

嵌入式硬件开发物联网工业制造 【免费下载链接】Grbl_Esp32 A port of Grbl CNC Firmware for ESP32 项目地址: https://gitcode.com/gh_mirrors/gr/Grbl_Esp32 点击查看 免费下载 Grbl_ESP32 是将经典 CNC 控制固件 Grbl 移植到 ESP32 平台的开源实现,…

2026/10/13 17:29:40 阅读更多 →
AIPD 2026会议全攻略:人工智能+产品设计交叉学科投稿与参会指南

AIPD 2026会议全攻略:人工智能+产品设计交叉学科投稿与参会指南

1. 核心价值拆解:为什么这场人工智能与产品设计会议值得关注每年这个时候,学术圈的朋友都在四处物色合适的国际会议,尤其是艺术设计类、交叉学科方向的老师和研究生。大家心里那杆秤其实就三个衡量标准:会议是否正规、出版检索是否…

2026/10/13 17:29:40 阅读更多 →
NSGA-Ⅲ求解梯级水电火电联合调度的Matlab实现解析

NSGA-Ⅲ求解梯级水电火电联合调度的Matlab实现解析

梯级水电和火电联调这种话题,做优化的人应该不陌生。水电机组启动快、调节灵活,但受来水和库容约束;火电机组出力稳定,但煤耗和排放都是大头。两者放一起做联合调度,本质上是个多目标、强约束、非线性的高维优化问题。…

2026/10/13 17:29:40 阅读更多 →
AIPD 2026:人工智能与产品设计交叉国际会议投稿全攻略

AIPD 2026:人工智能与产品设计交叉国际会议投稿全攻略

去年有个做智能硬件的朋友跟我聊,说想找一个“既认AI技术、又愿意谈产品落地”的会议,翻了一圈发现大多会议要么偏纯算法,要么偏纯商科管理。第二届人工智能与产品设计国际学术会议(AIPD 2026)这几年的定位恰好卡在这个…

2026/10/13 17:29:40 阅读更多 →
优卡CAD自动化原理:打版逻辑、放码引擎与COM接口实战

优卡CAD自动化原理:打版逻辑、放码引擎与COM接口实战

/* 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 17:28:39 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 18:11:17 阅读更多 →