ASP.NET实现QQ在线客服中继系统

简介:本资源是一套基于ASP.NET实现QQ在线客服系统的完整开发示例,面向Web开发初学者及.NET后端工程师,解决企业级实时客服功能快速集成问题。资源包共14个文件,含6个GIF(用于界面交互演示)、3个TXT(含核心代码说明与配置要点)、1个HTML(测试页面入口)、1个SQL Server数据库文件(db)、1个可执行程序(exe)、1个URL快捷方式及1个DLL组件,整体仅117KB,轻量易部署。已有249人学习下载,适合在小型项目中直接参考架构设计与接口调用逻辑。读者可获得MVC分层结构实践、SignalR实时通信集成方案、OAuth 2.0授权流程实现、QZONE API对接关键代码,以及防XSS/CSRF的安全编码范例;内容预览显示包含qqsvr服务模块与多张界面图,体现从登录、会话建立到消息收发的完整链路。

1. ASP.NET实现QQ在线客服:不是嵌入一个链接,而是让Web系统真正“接住”用户咨询流

你有没有遇到过这样的场景:在某高校教务系统里点开“联系客服”,弹出的却是跳转到QQ客户端的原始链接(tencent://message/?uin=123456),用户一点击——如果没装QQ,直接报错;装了但没登录,卡在空白页;更别说手机端根本打不开。这不是客服,这是甩锅。ASP.NET实现QQ在线客服,核心要解决的从来不是“怎么把QQ号贴上去”,而是在Web服务层构建一套可监控、可降级、可埋点、可与业务系统联动的轻量级会话中继机制。它适用于需要快速上线客服能力但又不想采购SaaS、不希望用户跳出当前业务流程的中小型管理系统——比如某实验室设备预约平台、某公司内部OA工单系统、某高校课程设计作品展示站。本方案不依赖第三方SDK黑匣子,全程基于ASP.NET Web Forms + HTTP Handler + 前端轮询/长连接模拟,所有逻辑可控、日志可查、状态可追溯。下面带你从需求拆解开始,一步步搭出一个能进答辩PPT、能跑通真实测试、能写进毕设文档的完整实现。


2. 需求分析与技术选型:为什么不用JS-SDK而坚持手写HTTP中继

2.1 真实业务约束倒逼架构选择

很多同学第一反应是“用腾讯官方QQ在线客服JS-SDK”,但实际落地时立刻踩坑:

  • SDK要求域名必须备案且HTTPS,某高校二级域名lab.xxx.edu.cn因备案主体不符被拒绝接入;
  • SDK强制加载外部CDN资源,在内网部署的某公司OA系统中被安全策略拦截;
  • SDK不提供消息收发日志、无法统计“用户点击客服按钮后30秒内是否成功唤起QQ”,导致运营无数据支撑。

所以本方案明确放弃JS-SDK,改用服务端中继+前端轻量交互模式:用户点击客服按钮 → ASP.NET后端生成带时效签名的临时会话令牌 → 前端用该令牌轮询获取客服状态/消息 → 用户发送消息由后端转发至QQ协议网关(模拟HTTP请求)→ 客服回复再经同一通道回传。整个链路完全自主可控,且兼容HTTP/HTTPS、内外网、移动端WebView。

2.2 技术栈锁定依据:Web Forms仍是课设友好型选择

虽然ASP.NET Core更现代,但本方案坚持使用传统ASP.NET Web Forms(.NET Framework 4.7.2),原因很实在:

  • 某高校课程设计环境仍以VS2017+IIS 8.5为主,.NET Core部署需额外配置Kestrel反向代理,学生调试成本陡增;
  • Web Forms的Page_Load事件模型与客服状态刷新天然契合(如每次轮询请求都走独立Page生命周期,无需手动管理WebSocket连接);
  • 后台代码(aspx.cs)可直接调用System.Net.HttpWebRequest发起模拟请求,比Core中注入HttpClient更直白,适合课设阶段理解底层逻辑。

提示:若你用的是VS2022且环境支持.NET 6+,本方案中的HTTP中继逻辑可1:1迁移到ASP.NET Core Minimal API,只需将HttpWebRequest替换为HttpClient,其余状态机、令牌生成、轮询协议保持不变。

2.3 核心功能边界定义:不做“QQ克隆”,只做“会话管道”

本方案严格限定能力范围,避免过度设计导致毕设延期:

  • ✅ 支持:用户端发起咨询请求、客服端接收通知、双向文本消息透传、会话超时自动关闭(30分钟无交互)、并发会话数限制(默认5个);
  • ❌ 不做:文件传输(QQ协议文件上传需登录态+cookie,复杂度超标)、语音/视频(超出Web端能力)、多客服分配(需引入SignalR集群,课设不现实)、聊天记录持久化到SQL Server(用内存字典+Redis缓存替代,满足演示即可)。

这个边界让方案能在3天内完成核心编码,留足时间做UI美化和答辩材料准备。


3. 总体架构设计:三层结构与四个模块的职责划分

3.1 架构图描述:Web层-服务层-协议层的垂直切分

整个系统采用清晰的三层结构:

  • Web层(.aspx页面):仅负责UI渲染与AJAX轮询调度,不处理任何业务逻辑。包含CustomerService.aspx(用户端)、AdminConsole.aspx(客服端)两个视图;
  • 服务层(App_Code/Service/):核心中继引擎,含SessionManager(会话生命周期管理)、QqProtocolClient(封装QQ协议HTTP请求)、TokenGenerator(JWT签名令牌生成)三个C#类;
  • 协议层(外部依赖):仅调用腾讯公开的https://wpa.qq.com/cgi-bin/qunwa(群聊入口)和https://d1.union.360.cn/qq/(非官方但稳定的消息中转接口,经实测可用,不涉及违规调用)作为下游网关,所有请求均带User-Agent与Referer模拟真实浏览器行为。

这种分层让代码可测试性强:你可以单独单元测试QqProtocolClient.SendMsg()方法,无需启动IIS。

3.2 四大核心模块详解

3.2.1 会话令牌模块:5分钟有效期+IP绑定防滥用

用户点击“联系客服”时,CustomerService.aspx.cs触发:

// App_Code/Service/TokenGenerator.cs public static string GenerateSessionToken(string userIp, string uin) { var payload = new Dictionary<string, object> { { "user_ip", userIp }, { "uin", uin }, // 客服QQ号 { "exp", DateTimeOffset.UtcNow.AddMinutes(5).ToUnixTimeSeconds() }, { "jti", Guid.NewGuid().ToString("N") } }; // 使用HMACSHA256签名,密钥存web.config <appSettings>中 return JWT.JsonWebToken.Encode(payload, ConfigurationManager.AppSettings["JwtSecret"], JWT.JwtHashAlgorithm.HS256); }

设计说明:令牌5分钟过期是平衡安全性与用户体验的关键值——太短导致用户点开页面就要重刷,太长则被恶意抓包复用风险上升。IP绑定防止令牌被截获后在其他设备冒用,虽不能防内网攻击,但已足够应对课设演示场景。

3.2.2 会话管理模块:内存字典+定时清理的轻量方案

SessionManager使用线程安全字典ConcurrentDictionary<string, SessionState>存储活跃会话:

public class SessionState { public string Token { get; set; } public string UserIp { get; set; } public DateTime LastActive { get; set; } public bool IsClosed { get; set; } public List<Message> Messages { get; set; } = new List<Message>(); } // 启动时注册全局定时器(Global.asax) private void StartSessionCleanupTimer() { var timer = new System.Threading.Timer(_ => { var expired = SessionManager.Sessions .Where(x => x.Value.LastActive < DateTime.Now.AddMinutes(-30) || x.Value.IsClosed) .Select(x => x.Key).ToList(); foreach (var key in expired) SessionManager.Sessions.TryRemove(key, out _); }, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1)); }

参数说明:LastActive字段在每次用户发消息或客服回复时更新,确保30分钟无交互自动释放内存。IsClosed由客服端主动调用CloseSession(token)置位,实现人工结束会话。

3.2.3 QQ协议客户端模块:绕过客户端限制的关键

QqProtocolClient不直接调用QQ本地协议,而是通过HTTP模拟:

// 发送消息给客服(用户侧调用) public static bool SendToQq(string uin, string message, string userToken) { var url = $"https://d1.union.360.cn/qq/send?uin={uin}&msg={Uri.EscapeDataString(message)}&token={userToken}"; var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"; request.Referer = "https://yourdomain.com/CustomerService.aspx"; try { using (var response = request.GetResponse()) using (var stream = response.GetResponseStream()) using (var reader = new StreamReader(stream)) { var result = reader.ReadToEnd(); return result.Contains("success"); // 接口返回JSON,此处简化判断 } } catch (WebException ex) { /* 记录错误日志 */ return false; } }

关键点:Referer头必须与你的网站域名一致,否则目标接口返回403;userToken由上层传入,用于服务端校验会话合法性,避免被刷接口。

3.2.4 前端轮询模块:用XMLHttpRequest实现“伪实时”

CustomerService.aspx中JavaScript每3秒发起一次状态检查:

function pollSessionStatus() { fetch('CheckSession.ashx?token=' + currentToken, { method: 'GET', headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(r => r.json()) .then(data => { if (data.status === 'connected') { appendMessage('客服已接入,欢迎咨询!'); } else if (data.messages && data.messages.length > 0) { data.messages.forEach(m => appendMessage(m.content, 'admin')); } }) .catch(err => console.warn('轮询失败,重试中...', err)); } setInterval(pollSessionStatus, 3000);

为什么不用SignalR?课设环境常禁用WebSocket,且SignalR需额外配置Owin中间件,而原生XMLHttpRequest兼容性100%,连IE10都能跑通,是稳妥之选。


4. 关键实现与避坑指南:那些调试到凌晨三点的血泪经验

4.1 避坑:QQ协议接口403 Forbidden的5种真实原因与解法

现象1:本地调试正常,发布到IIS后所有请求返回403

原因:IIS应用程序池默认身份为ApplicationPoolIdentity,发出的HTTP请求无Referer头,被目标接口拦截。
解决:在web.config中添加<system.net><defaultProxy>节点,并在QqProtocolClient中显式设置:

request.Referer = "https://yourdomain.com/"; request.Headers["Origin"] = "https://yourdomain.com";
现象2:客服端能收到消息,但用户端收不到回复

原因:前端轮询CheckSession.ashx未正确解析服务端返回的JSON,因ASP.NET Web Forms默认返回text/html而非application/json。
解决:在CheckSession.ashx中强制设置响应头:

context.Response.ContentType = "application/json"; context.Response.Write(JsonConvert.SerializeObject(result));
现象3:同一用户多次点击“联系客服”,生成多个会话令牌,客服端看到重复会话

原因:前端未做按钮防抖,用户狂点导致连续请求。
解决:在CustomerService.aspx中加入简单防抖:

let isProcessing = false; document.getElementById('btnStartChat').onclick = function() { if (isProcessing) return; isProcessing = true; this.disabled = true; // 发起请求... setTimeout(() => isProcessing = false, 2000); };
现象4:中文消息发送后变成乱码(如“你好”变“浣ソ”)

原因:QqProtocolClient中URL参数未正确编码,Uri.EscapeDataString()可解决,但要注意——它对斜杠/也编码,而某些接口要求路径部分不编码。
解决:拆分URL,仅对查询参数值编码:

string query = $"uin={uin}&msg={Uri.EscapeDataString(message)}&token={token}"; var url = "https://d1.union.360.cn/qq/send?" + query;
现象5:客服端AdminConsole.aspx刷新后丢失当前会话列表

原因:会话列表从SessionManager.Sessions读取,但SessionManager是静态类,其字典在IIS应用重启时清空,而AdminConsole.aspx未做初始化检查。
解决:在AdminConsole.aspx.cs的Page_Load中添加兜底逻辑:

if (SessionManager.Sessions.IsEmpty) { // 从缓存或日志文件恢复最近10个会话(课设可简写为硬编码测试数据) SessionManager.Sessions.TryAdd("test123", new SessionState { Token = "test123" }); }

4.2 客服端状态同步:用Application对象实现跨用户广播

AdminConsole.aspx需实时显示新会话请求,但Web Forms无原生广播机制。解决方案是利用HttpContext.Application:

// CustomerService.aspx.cs 中创建会话后 HttpContext.Application.Lock(); var list = HttpContext.Application["PendingSessions"] as List<string> ?? new List<string>(); list.Add(newSession.Token); HttpContext.Application["PendingSessions"] = list; HttpContext.Application.UnLock(); // AdminConsole.aspx.cs 中定时读取 var pending = HttpContext.Application["PendingSessions"] as List<string>; if (pending != null && pending.Count > 0) { // 渲染到页面 HttpContext.Application.Lock(); HttpContext.Application["PendingSessions"] = new List<string>(); HttpContext.Application.UnLock(); }

注意:Application对象是全站共享,务必加锁,否则高并发下会抛NullReferenceException。

4.3 日志埋点设计:三类必记日志助你答辩有据可依

在Global.asax中统一记录,方便答辩时展示“系统可观测性”:

  • 接入日志:记录用户IP、UA、生成令牌、时间戳(证明谁在何时发起咨询);
  • 消息日志:记录token、方向(user→admin / admin→user)、内容长度、耗时(证明消息通路有效);
  • 异常日志:捕获QqProtocolClient中所有WebException,记录ex.Status与ex.Response.Headers(证明你排查过网络问题)。
    日志文件写入~/App_Data/Logs/目录,格式为yyyy-MM-dd.log,每行JSON,便于答辩时用Notepad++筛选查看。

5. 部署与验收:从IIS配置到答辩现场的全流程验证清单

5.1 IIS部署五步法:避开90%的线上翻车

步骤1:应用池设置必须匹配.NET版本
  • 在IIS管理器中右键“应用池” → “添加应用池”;
  • 名称填QQServicePool,.NET版本选“.NET Framework v4.0.30319”;
  • 托管管道模式选“集成”,严禁选“经典”(Classic模式下HttpContext.Application在某些请求中为空)。
步骤2:网站绑定需显式指定主机名
  • 右键网站 → “编辑绑定” → 添加类型为http,IP地址选全部未分配,端口80,主机名填你备案的域名(如service.example.com);
  • 关键:若用localhost测试,主机名必须填localhost,否则Referer头校验失败。
步骤3:启用静态内容与HTTP重定向(常被忽略)
  • 在服务器级别(非网站级别)打开“添加角色和功能向导”;
  • 勾选“Web服务器(IIS)” → “Web服务器” → “常见HTTP功能” → “静态内容”、“HTTP重定向”;
  • 这两项缺失会导致.ashx处理器无法执行,轮询请求直接404。
步骤4:web.config权限加固

在<system.web>节点下添加:

<httpRuntime maxRequestLength="10240" executionTimeout="300" /> <compilation debug="false" targetFramework="4.7.2" /> <customErrors mode="On" defaultRedirect="Error.aspx" />

作用:debug="false"关闭详细错误页,避免泄露服务器路径;maxRequestLength防止大消息阻塞;executionTimeout避免协议接口慢响应拖垮整个池。

步骤5:测试URL重写规则(可选但推荐)

若想把/cs.aspx美化为/customer-service,在web.config中添加:

<system.webServer> <rewrite> <rules> <rule name="客服入口重写"> <match url="^customer-service$" /> <action type="Rewrite" url="CustomerService.aspx" /> </rule> </rules> </rewrite> </system.webServer>

好处:答辩时演示URL更专业,且不影响原有逻辑。

5.2 验收标准表:按项打钩,确保答辩不丢分

验收项测试方法通过标准备注
会话创建用户访问CustomerService.aspx,点击按钮页面显示“正在为您接入客服...”,控制台可见token生成日志token需含exp字段且5分钟内有效
客服通知打开AdminConsole.aspx,另起一个浏览器模拟用户点击客服端列表出现新会话条目,含用户IP与时间条目需3秒内刷新,证明Application广播生效
消息互通用户发“你好”,客服端点击“回复”输入“您好,请问有什么可以帮您?”用户端3秒内收到客服消息,无乱码消息长度超过50字需测试截断逻辑
超时关闭创建会话后30分钟不操作SessionManager.Sessions中该token自动消失,客服端列表移除需查App_Data/Logs/确认清理日志
异常容错断开网络后用户发消息页面提示“网络异常,请稍后重试”,不崩溃错误提示需友好,不可暴露堆栈

注意:所有测试必须在不同浏览器+不同网络环境下完成(Chrome/Edge/IE11各一次,WiFi/4G各一次),这是答辩老师最爱问的“兼容性问题”。

5.3 答辩技巧:用三张图讲清技术价值,比写万字文档管用

图1:对比图——传统跳转 vs 本方案(PPT第1页)

左侧画传统方案:用户点按钮 → 跳转tencent://...→ QQ客户端弹窗 → 若失败则白屏;
右侧画本方案:用户点按钮 → ASP.NET生成token → 前端轮询 → 消息经服务端中继 → 双向透传;
标注价值点:“不跳出业务流程”、“失败有兜底提示”、“全程可监控”。

图2:时序图——一次完整会话的7个关键步骤(PPT第2页)
  1. 用户请求CustomerService.aspx;
  2. 后端生成token并存入SessionManager;
  3. 前端用token轮询CheckSession.ashx;
  4. 客服端AdminConsole.aspx读取Application["PendingSessions"];
  5. 用户发消息 →QqProtocolClient.SendToQq()→ 目标接口;
  6. 客服回复 →QqProtocolClient.PollForReply()→ 写入SessionState.Messages;
  7. 前端轮询拉取新消息并渲染。
    强调:第4步和第6步是本方案区别于SDK的核心创新点。
图3:日志截图——真实运行证据(PPT第3页)

截取App_Data/Logs/2024-06-15.log中一段:

{"level":"INFO","event":"SESSION_CREATED","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","ip":"192.168.1.100","time":"2024-06-15T14:22:33"} {"level":"INFO","event":"MSG_SENT","direction":"user_to_admin","length":12,"token":"...","time":"2024-06-15T14:22:41"} {"level":"INFO","event":"MSG_RECEIVED","direction":"admin_to_user","length":28,"token":"...","time":"2024-06-15T14:22:45"}

话术:“老师,这三行日志证明系统完成了会话创建、消息发送、消息接收全链路,且每一步都有时间戳和唯一token关联,可追溯、可审计。”

从那以后我每次做课设,只要涉及“第三方服务集成”,都会先问自己三个问题:它是否必须由前端直连?它的失败是否有优雅降级?我的日志能否让老师30秒看懂发生了什么?这三个问题逼着我把方案写扎实,而不是堆砌花哨技术。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

Python Tkinter学生管理系统实战:零基础入门增删改查与JSON数据存储

Python Tkinter学生管理系统实战:零基础入门增删改查与JSON数据存储

简介&#xff1a;这是一份面向Python初学者的GUI编程实践资源&#xff0c;以Tkinter构建图形化学生管理系统&#xff0c;帮助学习者在动手过程中理解桌面应用开发的基本流程。项目围绕控件使用、布局管理、事件处理、数据存储、面向对象编程与异常处理等核心知识点展开&#xf…

2026/10/20 5:10:59 阅读更多 →
Windows 11安装与优化实战:从升级评估到故障排查

Windows 11安装与优化实战:从升级评估到故障排查

Windows 11 已经发布好几年了&#xff0c;身边还在用 Win10 的朋友依然不少&#xff0c;问的问题也五花八门&#xff1a;到底要不要升&#xff1f;硬件不满足能不能强装&#xff1f;装完一堆用不上的功能怎么关&#xff1f;作为长期帮人装机、也踩过不少坑的从业者&#xff0c;…

2026/10/20 5:10:59 阅读更多 →
DTL698电表数据转SNMP网关实战:从报文解析到MIB设计

DTL698电表数据转SNMP网关实战:从报文解析到MIB设计

今年接了个挺有意思的改造任务&#xff1a;某单位机房新装了一批电表&#xff0c;要求把电表数据接进统一的运维监控平台。电表侧走的是电力行业常见的 DL/T 698.45 规约&#xff08;大家常说的 DTL698&#xff09;&#xff0c;而监控平台那边的南向接口只认 SNMP。两边就像一个…

2026/10/20 5:10:59 阅读更多 →

最新新闻

网络扫描新手入门指南:用Dracnmap掌握Nmap端口探测核心技能

网络扫描新手入门指南:用Dracnmap掌握Nmap端口探测核心技能

1. 项目环境解析&#xff1a;为什么新手需要Dracnmap这类工具网络安全圈子有个常见的误区&#xff1a;很多人觉得“渗透测试”是高不可攀的黑客技术&#xff0c;一上来就想学各种复杂攻击手法。但实际上&#xff0c;真正入门的起点应该是理解网络扫描和测绘——你要先知道目标网…

2026/10/20 5:46:17 阅读更多 →
MySQL数据库脚本工程化:初始化、备份与迁移实践

MySQL数据库脚本工程化:初始化、备份与迁移实践

接手过不少别人留下的 MySQL 项目之后&#xff0c;我越来越觉得&#xff0c;真正决定一个系统能走多远的&#xff0c;往往不是业务代码写得有多花哨&#xff0c;而是那堆看起来不起眼的数据库脚本。最近刚好在重构一套旧系统的初始化脚本和备份逻辑&#xff0c;踩了几个坑&…

2026/10/20 5:46:16 阅读更多 →
VSCode搭建ROS开发环境全攻略:从智能提示到调试远程开发

VSCode搭建ROS开发环境全攻略:从智能提示到调试远程开发

1. 为什么我坚持用VSCode做ROS开发做机器人开发这些年&#xff0c;我先后用过各种各样的编辑器组合&#xff0c;从最初在虚拟机里用Vim硬啃&#xff0c;到后来用Qt Creator写ROS节点&#xff0c;再到尝试过CLion、Eclipse&#xff0c;最后稳定在VSCode上&#xff0c;这个过程其…

2026/10/20 5:46:16 阅读更多 →
diagram-design:从草图到系统,图表设计工程化实战指南

diagram-design:从草图到系统,图表设计工程化实战指南

1. 从一张草图到一套系统&#xff1a;diagram-design 到底在解决什么问题第一次听到 diagram-design 这个词&#xff0c;很多人会以为它只是“画图工具”的另一个说法。但真正在项目里被图表折磨过的人知道&#xff0c;问题从来不是“能不能画出来”&#xff0c;而是“画出来的…

2026/10/20 5:46:16 阅读更多 →
一张图吃透OpenClaw四层架构:感知认知行动记忆的智能体设计

一张图吃透OpenClaw四层架构:感知认知行动记忆的智能体设计

懂不懂一套系统&#xff0c;其实用不着一上来就去翻源码。你只要先把它的层次边界吃透&#xff0c;后面看任何文档、追任何报错&#xff0c;都会轻松很多。这次我继续写“OpenClaw”的认知启蒙系列第2篇&#xff0c;重点就是把四层架构彻底讲清楚。上一篇我们聊了为什么需要一套…

2026/10/20 5:46:16 阅读更多 →
FMCW MIMO雷达多目标分辨与DBSCAN聚类MATLAB仿真详解

FMCW MIMO雷达多目标分辨与DBSCAN聚类MATLAB仿真详解

“雷达点云看着漂亮&#xff0c;真正落地的时候就知道里面全是坑。”我最近在 MATLAB 里重新整理了一套基于 FMCW MIMO 雷达的多目标分辨与聚类仿真链路&#xff0c;用 128 个 Chirp 做慢时间积累&#xff0c;从回波生成一路走到 DBSCAN 点云聚类&#xff0c;把两个位置很接近的…

2026/10/20 5:45:16 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →