WebSocket自动化测试:自研脚本+AI辅助突破Apifox局限
用了快两年Apifox做接口自动化测试HTTP接口那一套跑得挺顺但一碰上WebSocket协议就像高速公路上突然踩进泥地。Apifox有WebSocket调试功能注意我说的是“调试”它能连上、能发消息、能看消息流可真要把它放进自动化测试体系里你会发现它连最基本的断言都做不了。这个问题卡了我挺久后来是用“代码自研测试脚本 AI辅助生成与排错”的思路绕过去的这中间踩了不少坑今天把整套方案拆开讲讲。先说结论WebSocket接口的自动化测试短期别指望工具厂商补全自己动手写小工具链才是稳的路子。而AI在这个过程里不是帮你“无脑生成一堆代码”它最值钱的地方在于帮你补测试用例矩阵、分析海量长连接日志、快速定位断线根因。下面从问题拆解、方案选型、实操过程、AI落地点到常见坑一条条讲清楚。1. 先看清问题Apifox的WebSocket支持到底缺在哪里1.1 WebSocket自动化测试的三个天然“硬骨头”WebSocket跟HTTP是两种完全不同的交互模型。HTTP是一次请求一次响应天然适合“发一个请求、等一个返回、验一个断言”的测试套路。WebSocket则是一条长连接连接建立之后服务端和客户端随时都能往对端推消息没有“请求-响应”这种成对关系。这给自动化测试带来三个麻烦消息时序不确定。客户端发个订阅请求服务端可能过1秒回ack也可能过10秒才推送业务数据中间还夹着心跳消息。消息类型混杂。一条连接上往往同时跑着心跳、业务事件、错误码、服务端主动通知测试脚本必须能区分消息类型。状态贯穿连接生命周期。HTTP测试是“无状态”的每条用例独立。WebSocket不一样登录握手、订阅频道、接收数据这几个动作的状态是串起来的一旦某个环节断线后面全部失效。所以做WebSocket自动化测试本质上是在写一个“长连接状态机”的测试驱动而不是简单“发一条消息、验一个返回”。1.2 Apifox现在的WebSocket能力边界Apifox对WebSocket的定位实话实说停留在“联调工具”而不是“自动化测试工具”。它做了一个WebSocket调试页输入URL、连上、发消息、看消息列表够你手工确认一下协议通不通。但再往下走问题就出来了不能对收到的消息做断言。哪怕服务端明确返回了错误码Apifox也没有“自动判断这帧消息是否符合预期”的能力全靠人眼盯着看。不收进自动化测试套件。HTTP用例可以导入自动化测试场景、跑断言、跑参数化WebSocket的调试请求没这条路。变量引用、断言脚本、前后置操作默认情况下都不覆盖WebSocket长连接场景。有些操作可以通过脚本绕但绕出来的东西既不优雅也不稳定。不支持“多帧消息”的等待和匹配。比如你发了一个请求服务端会连续推3帧消息Apifox没法表达“等第2帧出现并且字段满足条件再继续”。这也解释了为什么“WebSocket接口缺失”不是小问题而是根本性的能力缺口。你没法在Apifox内部完成长连接状态的建模所以必须外挂一套自己的执行引擎。1.3 更麻烦的长连接状态与断言就算退一步你手动把Apifox当“消息查看器”用测试脚本的逻辑还是得在别处写。比较典型的场景服务端推送一条登录结果typelogin_ack里面带一个code字段你要断言code200同时记录sid作为后续订阅凭证。这个动作在HTTP测试工具里是一个再普通不过的流程但在WebSocket的语境下它需要先收帧、解析帧、判断帧类型、提取字段、保存状态、再做下一步动作。Apifox给不了这套机制因为长连接的消息是多路复用的同一时刻可能收到5种类型的消息你不可能靠“发一次、等一次”把逻辑写完。这也是后面我要说的核心WebSocket自动化测试的真正主体是一个能维护连接状态、能循环接收消息、能按条件路由消息的代码层。2. 破局思路为什么是“代码自研 AI辅助”而不是“等官方更新”2.1 先做方案对比别急着动手在决定自己写之前我认真评估过四条路方案优点缺点结论等Apifox官方补齐WebSocket自动化能力0成本能力强生态统一时间不可控排期一拖再拖现有测试等不起不现实换用其他带WebSocket自动化的工具成熟商业工具确实能测要么收费重要么和现有接口资产割裂历史用例没法沉淀成本太高纯手写测试代码灵活可控能缕清协议开发周期长长连接用例维护成本高团队负担重可行但吃力代码自研 AI辅助既灵活又能提速AI承担脏活累活需要引入AI工具链对提示词能力有要求最终选择我这边的场景是有几十个WebSocket接口要回归涉及实时消息推送、在线状态、订阅/退订等业务要求的不是“测一次”而是每天在CI里跑很多次。等官方更新完全不现实换工具迁移成本更大所以最后落到第四套方案。2.2 整体架构设计这套方案不追求“推翻Apifox”相反它跟Apifox共存。Apifox继续承担接口文档源、团队协作、HTTP接口自动化测试的职责WebSocket自动化测试则拆成一套独立的工具链由几个模块组成连接管理模块负责建立连接、心跳维持、断线重连、连接状态监控。消息接收与路由模块核心是一个异步收帧循环把收到的每帧消息按type字段分发给对应处理器。断言模块支持多种匹配方式等某一帧、等多帧、等字段满足条件、超时控制。场景执行模块以Python脚本或pytest用例形式组织测试场景。数据与日志模块记录全量收发帧、断言结果、连接事件供后续AI分析。报告与CI集成模块生成统一报告把结果回填到Apifox的测试计划里作为补充记录。这套架构最核心的设计就是“消息队列 等待匹配器”。所有收到的消息先进队列断言不是直接“比对一次返回值”而是轮询队列里是否有符合条件的消息这个抽象能把WebSocket测试从“一次收发”变成“持续观察”。2.3 AI辅助在方案里的三种角色在这个架构里AI不是玩具我把它定位成三个角色代码脚手架生成器。搭连接管理、心跳、断线重连这类通用代码时AI生成速度非常快省掉大量查文档的时间。测试用例与参数矩阵生成器。它能根据接口文档快速列出一堆边界条件比如鉴权失败、消息体缺字段、订阅不存在的频道、发消息频率过高等等。日志分析诊断员。长连接测试跑起来之后日志量很大AI能帮我从日志里找到断线跟消息时序的因果关系这个后面单讲。一句话总结方案选型的逻辑Apifox负责它擅长的代码负责它必须承担的AI负责你不愿意做的重复思考。3. 实操从零开始搭一套WebSocket自动化测试体系3.1 环境准备与本地测试服务实操最怕没有可测的目标建议先起一个本地WebSocket回显服务把整条链路跑通再对接真实业务。我用的是Python生态的websockets库本地起服务端测试脚本就能连上去自测。# -*- coding: utf-8 -*- import asyncio import websockets async def echo(ws): async for message in ws: await ws.send(fecho: {message}) async def main(): async with websockets.serve(echo, 127.0.0.1, 8765): await asyncio.Future() if __name__ __main__: asyncio.run(main())测试脚本同样用websockets库。要注意websockets库有异步版和同步版异步版功能完整推荐直接用。本地回显服务跑通之后把服务换成真实业务地址框架不变只改消息解析逻辑就行。3.2 核心脚本连接、收发消息、断言先写一个能连上并循环收消息的基础版。这里最容易犯的错是“收一帧消息就结束”实际上长连接是持续收流的一定要用async for message in ws这种循环# -*- coding: utf-8 -*- import asyncio import json import websockets WS_URL wss://apidemo.example.org/ws/chat async def connect_and_listen(): async with websockets.connect(WS_URL) as ws: await ws.send(json.dumps({action: login, token: test_token})) async for message in ws: data json.loads(message) mtype data.get(type) print(f[RECV] {mtype}: {data}) if mtype login_ack: await ws.send(json.dumps({action: subscribe, topic: chat_msg})) elif mtype heartbeat_request: await ws.send(json.dumps({action: heartbeat_ack})) asyncio.run(connect_and_listen())这个版本完成的是“连接收流自动响应”还没有真正可断言的“测试”味道。要想做成自动化测试必须引入“等待匹配器”# -*- coding: utf-8 -*- import asyncio import json import websockets class WsTester: def __init__(self, url): self.url url self.queue asyncio.Queue() async def start(self): self.conn await websockets.connect(self.url) asyncio.create_task(self._receive_loop()) async def _receive_loop(self): async for raw in self.conn: try: await self.queue.put(json.loads(raw)) except json.JSONDecodeError: await self.queue.put({raw: raw}) async def wait_for(self, predicate, timeout5): loop asyncio.get_running_loop() deadline loop.time() timeout while loop.time() deadline: remaining deadline - loop.time() try: msg await asyncio.wait_for(self.queue.get(), timeoutremaining) except asyncio.TimeoutError: break if predicate(msg): return msg raise AssertionError(f等超时未找到满足条件的消息剩余队列大小{self.queue.qsize()}) async def main(): tester WsTester(wss://apidemo.example.org/ws/chat) await tester.start() await tester.conn.send(json.dumps({action: login, token: test_token})) login_ack await tester.wait_for(lambda m: m.get(type) login_ack) assert login_ack.get(code) 200, f登录失败: {login_ack} print(登录断言通过:, login_ack) asyncio.run(main())这段代码是整套方案的地基。wait_for的核心思路是把“收到任何消息”和“收到我关心的消息”解耦。你要断言的是“服务端最终会推送某一帧满足条件的消息”而不是“我发完之后立刻返回的内容”。用队列缓存所有消息用谓词函数匹配目标消息再配合超时控制WebSocket测试的逻辑就顺了。3.3 心跳、断线重连与多客户端WebSocket生产环境几乎都配了心跳机制服务端每隔一段时间发心跳帧检测连接是否还活着客户端不回应就会被踢下线。测试脚本必须兼容这个机制否则你跑着跑着会发现连接被服务端静默断开。心跳的写法和业务消息写在同一个收帧循环里识别出心跳帧就回一个ack注意心跳不能另起一个阻塞式recv否则会跟主收帧循环打架elif mtype heartbeat_request: await ws.send(json.dumps({action: heartbeat_ack}))断线重连是第二个容易踩坑的地方。WebSocket测试跑在CI里网络稍微抖动一下连接就断了测试直接失败。我的做法是给连接包一层重试逻辑async def connect_with_retry(url, retries3, delay2): for attempt in range(retries): try: return await websockets.connect(url) except Exception as exc: print(f第{attempt 1}次连接失败: {exc}) await asyncio.sleep(delay) raise ConnectionError(重试次数耗尽)多客户端并发测试更麻烦。很多WebSocket业务是“A用户发消息B用户收消息”这种场景必须同时起两个连接。我建议把WsTester封装成可复用的类每个用户一个实例并发的消息断言用asyncio.gather跑起来。这里最容易忽略的是两个连接共享同一个事件循环谁也不许阻塞循环所有等待都走异步队列。3.4 把结果接回Apifox与CI流水线自己写的测试脚本跑得再好也不能脱离整个测试体系。我的做法是把Apifox继续当作接口文档管理和HTTP自动化测试入口WebSocket脚本作为独立测试套件接入CI流水线跑完以后把报告路径和工作流回传。CI里的实际做法pytest管理WebSocket用例运行完生成JUnit XML和HTML报告通知到团队群。Apifox那边手工跑HTTP接口用例两侧结果汇总到同一份测试观察清单。不断言的脚本不叫测试不接入CI的自动化脚本早晚变成没人跑的玩具这一步别偷懒。4. AI辅助具体怎么用三个高效落地场景4.1 用大模型生成参数化测试用例骨架第一次用AI生成WebSocket测试代码时我犯过一个错直接让AI“生成完整的WebSocket测试脚本”结果它给了我一堆并不可用的样板因为真实的业务协议、消息类型、字段含义全在接口文档里。后来我改成“人写主干、AI补用例矩阵”的模式效果好很多。具体做法是把接口文档里的消息格式发过去让AI列出所有字段的取值边界生成一个参数化测试用例表。举个例子登录接口有token、device_id、version字段AI会给出这样的用例矩阵用例tokendevice_idversion预期正常登录有效设备A1.0.0login_ack code200token无效乱填设备A1.0.0login_ack code401token过期过期值设备A1.0.0login_ack code401缺device_id有效空1.0.0错误帧或断开老版本客户端有效设备A0.9.0版本不兼容提示人负责把表里的预期翻译成wait_for的谓词AI负责把边界条件列全这个分工比让AI直接写完整测试脚本要靠谱得多。4.2 用AI分析海量长连接日志WebSocket测试跑起来日志增速远超HTTP测试。服务端日志、客户端日志、连接断开事件、重连事件混在一起动辄几十万行。肉眼找断线根因非常折磨人。AI在这个场景里是真能救命的。我试过的做法是把客户端日志和报错上下文丢给大模型让它按时间线梳理“连接断开前后都发生了什么”。给提示词时先交代背景再给日志再问具体问题比如以下是某WebSocket客户端的连接日志请按时间顺序找出连接断开前发生了什么列出可能导致断线的事件并区分是客户端主动断开、服务端断开、网络异常还是心跳超时。实测下来AI能很快汇总出“心跳丢失次数、服务端主动close帧、超时未收到pong”这几类模式我再去代码里查对应路径定位速度快很多。这类分析任务不需要AI懂业务它只需要帮人把大日志归纳成几个可排查的方向。4.3 AI辅助的边界哪些事千万别交给AIAI用得越多越要清楚它的边界。我整理了几条原则协议格式和消息字段定义必须来自接口文档不能靠AI猜。AI生成的字段名再合理只要跟真实服务端不一致跑起来就是废的。断言逻辑不能全盘信任AI生成。AI生成“断言成功”的写法可能只是一个statements必须人工确认业务语义。不要把AI生成代码直接丢到生产测试主干里。建议先跑一遍本地回显服务确认逻辑没问题再对接真实环境。AI生成的日志分析结论只能作为线索最终根因必须由人工在代码或抓包里确认。边界清楚了AI才是一个可靠的提效工具而不是一个越帮越忙的队友。5. 常见问题与排查技巧实录5.1 长连接测试的典型故障速查表症状可能原因排查思路连接建立后立刻断开服务端鉴权失败、客户端未响应心跳、反向代理不支持Upgrade查服务端日志抓握手阶段是否返回401检查代理是否透传Upgrade头收不到任何业务消息订阅动作没成功、连接被静默断开、消息类型解析有误先打印全部原始帧确认消息确实没有再核对订阅请求参数断言超时等消息的谓词写错、消息时序与预期不一致、队列里被其他消息占满给wait_for打日志把收到的每帧type打印出来对照协议修正谓词心跳回得慢导致被动断开主收帧循环被阻塞心跳处理不及时禁止在收帧循环里做耗时操作心跳回执单独异步处理CI里偶发失败本地复现不了网络抖动、服务端限流、共享测试环境被其他任务干扰CI重试策略日志保留现场增加连接超时和重连缓冲5.2 调试技巧先抓帧再写断言我最想强调的一个实操习惯是第一版脚本永远先“只打印帧”不写任何断言。把原始消息全部打出来眼睛过一遍真实格式再动手写谓词函数。跳过这一步直接写断言大概率会在字段名上翻车。比如服务端返回的是status还是code是字符串200还是数字200这些细节只有真实帧才能告诉你。5.3 测试数据与独立环境WebSocket测试对测试环境纯净度的要求比HTTP高得多。HTTP接口跑失败了换个入参再来一次就行WebSocket一旦连接被服务端“拉黑”或限流后续所有连接都会失败。所以尽量准备独立的测试账号和独立的WebSocket服务跑完CI后把连接数清空。多人共用一套环境的场景为每个测试进程分配不同的标识避免细粒度状态互相污染。5.4 关于“AI说能修”的陷阱有一次连接老是断我把日志丢给AI它分析半天告诉我“可能是服务端设置的ping_interval太短”我照着把客户端调大结果断得更频繁。最后抓包才发现问题出在测试环境的网关关闭了空闲连接跟心跳参数没关系。所以AI分析日志只能给线索最终裁决必须靠抓包和源码。这里也提醒自己日志分析结论一定要标注置信度别让AI给一个确定句式就跟着改代码。6. 避坑经验血泪总结这套方案从第一版能跑到现在比较稳我经历了三个阶段的教训。第一阶段是“把Apifox硬当自动化工具用”。有人写脚本绕过Apifox的限制去操作WebSocket联调时可以一进CI就挂维护成本极高。这个方向果断放弃。第二阶段是“AI生成什么就用什么”。头几次让AI生成连接代码和断言逻辑看着没问题跑到真实环境全露馅光字段类型就返工了好几轮。后来改成AI生成骨架、人工校对协议才稳定下来。第三阶段是“日志不看问题就永远复现”。WebSocket问题有一个特征很多偶发问题复现不了不是不存在是日志没留够。后来所有脚本强制开启帧级日志连接事件、收发消息、断言结果全记录出问题才有的查。另外说一个容易被忽略的细节断言超时时间不要拍脑袋。心跳间隔如果是30秒你的断言超时至少要留足一个心跳周期否则消息还没来断言先超时了。我这里的经验值是“业务预期时间 心跳间隔 5秒缓冲”宁可让单条用例慢一点也不要制造不稳定闪断。7. 如果你也想搭一套直接参考这个顺序最简路径大概是先起本地回显服务写一个“连接等待匹配”的最小脚本跑通之后再加心跳、重连、多客户端然后接CI最后把真实业务协议接进来。AI在这个顺序里放在两个位置最值第一是生成连接管理和重连的基础代码第二是测试跑完后的日志分析。中间那段业务消息解析和断言谓词恰恰是人最应该亲自把关的部分。有一点我想强调Apifox仍然是团队接口资产的中心这个定位不用变。WebSocket自动化测试跑不进去不代表Apifox没用。它管HTTP接口、管文档、管协作我自研的脚本管长连接回归两边各司其职。将来如果Apifox补齐了WebSocket自动化那这套自研脚本也可以退化成一组补充脚本。工具会更新测试方法论和排查思路不会过时。我在实际项目中最大的体感是WebSocket自动化测试没有银弹核心是把“连接状态管理”和“消息流断言”这两个地基打好。AI能帮你少写很多模板代码、少熬很多看日志的夜但协议的严谨性和场景的理解还是得自己拿住。这套方案跑了大半年它给我的信心不在于每一个断言都绿而在于每次WebSocket服务端出了异常这套工具都能在发布之前把问题暴露出来。

相关新闻

JMeter数据落盘实践:用Simple Data Writer生成.jtl文件并回读分析

JMeter数据落盘实践:用Simple Data Writer生成.jtl文件并回读分析

这段时间团队在做接口性能回归,每次压测完,大家的第一反应都是盯着聚合报告截图,把平均响应时间和错误率贴到群里就算完事。直到有一次线上出现慢接口,需要回看压测时的采样数据,大家才发现聚合报告里的数据一关界面就…

2026/10/18 9:05:25 阅读更多 →
DataGrip如何让查询结果显示在SQL正下方:内联结果视图操作指南

DataGrip如何让查询结果显示在SQL正下方:内联结果视图操作指南

我们写 SQL 时经常会遇到一个很别扭的场景:改一行语句,就非要低头看底部工具窗口里的结果,脖子来回转、窗口来回切,改得越多越烦躁。最近就有位同事问我,DataGrip 里能不能让查询结果直接出现在 SQL 语句的正下方&…

2026/10/18 9:05:25 阅读更多 →
基于Spring Boot的电子健康档案管理系统设计与实现

基于Spring Boot的电子健康档案管理系统设计与实现

毕设选题年年都是老大难,尤其是Java方向的同学,既要技术栈拿得出手,又怕题目太复杂做不完。如果你正卡在选题这一步,我的建议很直接——基于 Spring Boot 的电子健康档案管理系统,这个方向值得你认真考虑。它属于典型的…

2026/10/18 9:04:25 阅读更多 →

最新新闻

Cursor 编辑器从入门到高效使用:AI 代码补全与项目实操指南

Cursor 编辑器从入门到高效使用:AI 代码补全与项目实操指南

我最初是从一次毫无准备的试用开始的。同事把编辑器快捷键发给我,说了一句“你试试直接按 Tab”,然后我的光标就自动补完了一整段文件读取代码。那一刻我意识到,这已经不是旧时代那个只会补全关键字拼写的“智能输入法”了,而是一…

2026/10/18 18:29:59 阅读更多 →
《2025企业级AI应用报告》深度拆解:从模型竞赛到业务落地的完整路径与避坑指南

《2025企业级AI应用报告》深度拆解:从模型竞赛到业务落地的完整路径与避坑指南

《2025年国内企业级AI应用行业研究报告》出来之后,我身边做企业服务、数字化转型的同行基本都在转。说实话,市面上AI分析内容不少,但大多数停留在模型参数、榜单评测、消费级玩法,真正把“企业级应用”讲透的很少。这份报告把视角…

2026/10/18 18:29:58 阅读更多 →
瑞萨RA6M5+Qt遥控小车:FSP配置、PWM驱动与串口协议实战

瑞萨RA6M5+Qt遥控小车:FSP配置、PWM驱动与串口协议实战

简介:面向嵌入式与物联网入门者的瑞萨RA6M5遥控小车完整工程,整合FSP图形化配置、Keil开发环境与Qt Android跨端联调。整套方案利用板载电容按键一键启动,触发ESP8266无线模块初始化;手机端应用开启服务后,小车即可上报…

2026/10/18 18:29:58 阅读更多 →
链表高频面试题:双指针一次遍历求倒数第k个节点

链表高频面试题:双指针一次遍历求倒数第k个节点

1. 从一道高频面试题说起“面试题.返回倒数第k个节点”这行标题,过去几年我见过太多次了——不管是校招还是社招,不管是后端岗还是客户端岗,这道题出现的频率高得离谱。它考察的知识点不算难,却能把一个人的基本功底子摸得清清楚楚…

2026/10/18 18:29:58 阅读更多 →
BrowserSkill:用CLI驱动Chrome的浏览器自动化工具,让AI Agent轻松操控浏览器

BrowserSkill:用CLI驱动Chrome的浏览器自动化工具,让AI Agent轻松操控浏览器

1. 从命令行到浏览器:BrowserSkill 到底在解决什么问题第一次看到 BrowserSkill 这个名字,我脑子里蹦出来的画面是:一个跑在终端里的命令行工具,能直接操控 Chrome 浏览器,把网页打开、点击、填表、截图、抓数据这一整…

2026/10/18 18:29:58 阅读更多 →
SolidWorks本地AI插件:DeepSeek-R1驱动的工程智能体

SolidWorks本地AI插件:DeepSeek-R1驱动的工程智能体

简介:本资源是面向SolidWorks中高级用户与二次开发工程师的DeepSeek智能插件项目源码包,旨在解决CAD设计过程中建模效率低、参数优化依赖人工等痛点,支持智能建模、AI辅助参数调优等高阶功能。压缩包仅4KB,含3个核心文件&#xff…

2026/10/18 18:28:58 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →