RabbitMQ测试工具实战:从连通性验证到压测排查的完整指南
简介RabbitMQ测试工具是一款基于WPF自编写的消息队列调试应用面向需要与RabbitMQ打交道的开发者与运维人员用于解决连接配置、队列浏览、交换机管理、绑定关系可视化及消息收发验证等日常调试需求。资源包共9个文件以dll动态库、xml配置说明、ini参数文件、pdb调试符号和exe可执行程序为主压缩包约336KB体积轻便解压后即可运行主程序进行连接与操作。目前已有1754人学习下载说明其在消息队列调试场景中具有一定实用参考价值。工具覆盖连接管理、节点监控、队列与交换机操作、模板消息发送、日志查看及Management API调用等功能并配有绑定可视化界面便于理解消息路由路径同时可模拟高并发场景评估性能辅助排查队列积压与配置错误适合开发调试、性能测试与运维诊断等场景使用。1. RabbitMQ测试工具从“消息发出去了吗”到“到底卡在哪”你有没有遇到过这种场景订单系统说消息已经投递到 RabbitMQ 了库存系统说没收到两边日志翻了个底朝天最后发现是队列绑定的 routing key 写错了一个字母。更让人头疼的是这种问题在测试环境偶尔出现到了生产环境就变成“偶发丢消息”排查成本极高。RabbitMQ 测试工具要解决的就是这类“消息到底有没有进 Broker、有没有被消费、卡在哪个环节”的问题。它不是一个单一软件而是一类围绕 RabbitMQ 做连通性验证、消息收发压测、队列状态观测和故障注入的工具集合。适合谁用后端开发在联调前自测、测试工程师做消息链路验证、运维在 RabbitMQ 启动失败或性能抖动时做快速诊断。下面我按“先能连上、再能发对、最后能压出问题”的顺序把这条落地路径拆开讲。2. 先搞清楚测什么RabbitMQ 测试工具的四个观测面2.1 连通性、协议握手与 vhost 权限很多人以为“能 ping 通端口”就算 RabbitMQ 可用这是第一个翻车点。RabbitMQ 对外暴露的 5672 是 AMQP 协议端口15672 是管理插件 HTTP 端口4369 是 epmd 端口25672 是集群通信端口。测试工具首先要验证的是 AMQP 握手能不能完成而不是 TCP 连接能不能建立。常见做法是用pika或amqp-connection-manager写一个最小连接脚本指定 host、port、vhost、username、password 五个参数。其中 vhost 默认是/但生产环境往往按业务划分 vhost权限也按 vhost 隔离。如果用户对某个 vhost 没有configure、write、read中任意一个权限连接阶段就会直接返回ACCESS_REFUSED。这一步的测试目标不是“连上了”而是“连上之后能声明队列、能发消息、能消费”。2.2 消息路径exchange、routing key、queue、consumerRabbitMQ 的消息路径是producer 发到 exchangeexchange 根据类型和 routing key 路由到一个或多个 queueconsumer 从 queue 拉取或推送消费。测试工具要能逐段验证exchange 是否存在、类型是否正确direct、topic、fanout、headers、binding 是否建立、routing key 是否匹配、queue 是否有消费者、消息是否被 ack。很多“消息丢了”的案例其实是 exchange 类型选错。比如用 fanout 却指望 routing key 过滤或者用 topic 但通配符写成了order.*而实际 key 是order.create.us。测试工具的做法是发一条带唯一标记的消息然后在管理 API 里查队列的messages_ready和messages_unacknowledged再在消费端打印消息体形成闭环。2.3 管理 API 与监控指标RabbitMQ 的rabbitmq_management插件提供了 HTTP API测试工具可以调用/api/queues/{vhost}/{queue}获取队列深度、消费者数量、消息速率、内存占用等指标。这些指标比日志更直接。比如messages_ready持续增长而messages_unacknowledged为 0说明没有消费者或消费者不工作如果messages_unacknowledged很高说明消费者拿到了消息但没 ack可能是业务处理卡住或 prefetch 设置过大。测试工具应该能定时拉取这些指标并输出趋势而不是只看一个瞬间值。2.4 压测与故障注入连通性和路径验证通过后下一步是压测。测试工具要能模拟 N 个 producer 以固定速率发送消息同时 M 个 consumer 以不同 prefetch 消费观察队列深度、端到端延迟、broker 内存和磁盘 IO。故障注入包括随机断开 consumer 连接、模拟网络延迟、填满磁盘触发流控、重启节点观察镜像队列切换。这些测试不是为了“跑个数字”而是为了找到系统的拐点在多少消息速率下队列开始堆积在多少未 ack 消息下 broker 开始流控。3. 用 Python 写一个最小可用的 RabbitMQ 测试工具3.1 环境准备与依赖安装我一般用 Python 3.9 和pika库因为它足够轻能直接控制 AMQP 的每个动作。安装命令如下python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install pika requestspika是纯 Python 实现的 AMQP 0-9-1 客户端requests用来调管理 API。如果你在 Windows 上遇到rabbitmq启动失败先检查 Erlang 版本和 RabbitMQ 版本是否匹配常见做法是查官方兼容性表格但这里不展开安装教程只聚焦测试工具本身。3.2 连接与声明队列的测试脚本下面这段代码做三件事连接 RabbitMQ、声明一个 direct exchange 和队列、绑定 routing key。每个参数都从环境变量读取方便在不同环境切换。import os import pika # 从环境变量读取连接参数避免硬编码 host os.getenv(RABBITMQ_HOST, localhost) port int(os.getenv(RABBITMQ_PORT, 5672)) vhost os.getenv(RABBITMQ_VHOST, /) username os.getenv(RABBITMQ_USER, guest) password os.getenv(RABBITMQ_PASS, guest) credentials pika.PlainCredentials(username, password) params pika.ConnectionParameters( hosthost, portport, virtual_hostvhost, credentialscredentials, heartbeat30, # 心跳间隔防止长时间空闲被 broker 断开 blocked_connection_timeout10 # 连接被阻塞时的超时 ) connection pika.BlockingConnection(params) channel connection.channel() # 声明 exchange类型 direct持久化 channel.exchange_declare(exchangetest_exchange, exchange_typedirect, durableTrue) # 声明队列持久化 channel.queue_declare(queuetest_queue, durableTrue) # 绑定routing key 为 test_key channel.queue_bind(exchangetest_exchange, queuetest_queue, routing_keytest_key) print(连接成功exchange 和 queue 已声明并绑定) connection.close()逻辑说明PlainCredentials用用户名密码认证virtual_host指定 vhostheartbeat建议设为 30 秒太短会频繁心跳太长则故障发现慢。exchange_declare的durableTrue表示 broker 重启后 exchange 不丢失但注意消息本身要持久化还需要delivery_mode2。queue_bind的 routing key 必须和发送时一致否则消息会进不了队列。如果这一步报ChannelClosedByBroker: (403) ACCESS_REFUSED说明用户对 vhost 没有配置权限需要去管理后台加权限。3.3 发送与消费的闭环验证光声明不够要发一条消息并消费到才算闭环。下面代码发送一条带唯一 ID 的消息然后从队列消费并打印。import json import uuid import pika # 复用上面的连接参数 credentials pika.PlainCredentials(guest, guest) params pika.ConnectionParameters(hostlocalhost, port5672, virtual_host/, credentialscredentials) connection pika.BlockingConnection(params) channel connection.channel() # 发送消息delivery_mode2 表示消息持久化 msg_id str(uuid.uuid4()) body json.dumps({id: msg_id, payload: hello rabbitmq}) channel.basic_publish( exchangetest_exchange, routing_keytest_key, bodybody, propertiespika.BasicProperties(delivery_mode2, message_idmsg_id) ) print(f已发送消息id{msg_id}) # 消费消息auto_ackFalse 手动确认 method, properties, body channel.basic_get(queuetest_queue, auto_ackFalse) if method: print(f收到消息: {body.decode()}) channel.basic_ack(delivery_tagmethod.delivery_tag) else: print(队列为空没有收到消息) connection.close()逻辑说明basic_publish的routing_key必须和绑定一致delivery_mode2让消息写入磁盘。basic_get是同步拉取适合测试生产环境一般用basic_consume。auto_ackFalse配合basic_ack可以模拟“消费成功才确认”如果消费失败不 ack消息会重新入队。参数上message_id用于追踪expiration可以设置消息 TTLpriority设置优先级。如果basic_get返回None先检查队列的messages_ready是否大于 0再检查 routing key 和 exchange 类型。3.4 用管理 API 查队列状态发完消息后用 HTTP API 查队列深度比在管理界面点来点去更适合自动化。import requests url http://localhost:15672/api/queues/%2F/test_queue response requests.get(url, auth(guest, guest)) data response.json() print(fmessages_ready: {data[messages_ready]}) print(fmessages_unacknowledged: {data[messages_unacknowledged]}) print(fconsumers: {data[consumers]}) print(fmessage_stats.publish: {data.get(message_stats, {}).get(publish, 0)})注意 vhost 为/时 URL 里要写成%2F。messages_ready是待消费消息数messages_unacknowledged是已投递未确认数consumers是消费者数量。如果messages_ready一直涨而consumers为 0说明消费者没连上如果messages_unacknowledged很高说明消费者处理慢或 prefetch 太大。message_stats.publish是累计发布数可以用来对账。4. 压测与参数调优把队列压到拐点4.1 多生产者多消费者压测脚本单条消息验证通过后用多线程模拟并发。下面脚本启动 5 个 producer 线程和 3 个 consumer 线程持续 30 秒统计发送和消费数量。import threading import time import pika import json SENT 0 CONSUMED 0 LOCK threading.Lock() def producer(thread_id): global SENT credentials pika.PlainCredentials(guest, guest) params pika.ConnectionParameters(hostlocalhost, port5672, virtual_host/, credentialscredentials) connection pika.BlockingConnection(params) channel connection.channel() end_time time.time() 30 while time.time() end_time: body json.dumps({producer: thread_id, ts: time.time()}) channel.basic_publish(exchangetest_exchange, routing_keytest_key, bodybody, propertiespika.BasicProperties(delivery_mode2)) with LOCK: SENT 1 connection.close() def consumer(thread_id): global CONSUMED credentials pika.PlainCredentials(guest, guest) params pika.ConnectionParameters(hostlocalhost, port5672, virtual_host/, credentialscredentials) connection pika.BlockingConnection(params) channel connection.channel() channel.basic_qos(prefetch_count10) # 每次最多预取 10 条 end_time time.time() 30 while time.time() end_time: method, properties, body channel.basic_get(queuetest_queue, auto_ackFalse) if method: channel.basic_ack(delivery_tagmethod.delivery_tag) with LOCK: CONSUMED 1 else: time.sleep(0.01) connection.close() threads [] for i in range(5): t threading.Thread(targetproducer, args(i,)) threads.append(t) for i in range(3): t threading.Thread(targetconsumer, args(i,)) threads.append(t) for t in threads: t.start() for t in threads: t.join() print(f发送总数: {SENT}, 消费总数: {CONSUMED}, 差值: {SENT - CONSUMED})逻辑说明basic_qos(prefetch_count10)控制消费者未确认消息的上限太小会降低吞吐太大会导致内存堆积和消息倾斜。basic_get在循环里拉取没有消息时 sleep 10 毫秒避免空转。压测结束后SENT - CONSUMED就是队列里剩余的消息数可以用管理 API 核对。如果差值持续增大说明消费能力不足需要增加消费者或优化消费逻辑。4.2 关键参数prefetch、持久化、流控prefetch 是压测中最容易调错的参数。默认是 0 表示无限制消费者会一次性拿很多消息导致其他消费者空闲同时未 ack 消息占用内存。常见做法是设成 10 到 100 之间根据单条消息处理耗时调整。持久化方面delivery_mode2加durableTrue会显著降低吞吐因为每条消息都要刷盘。如果测试目标是吞吐量可以先关掉持久化如果测试可靠性必须打开。流控是 broker 在内存或磁盘达到阈值时阻塞连接测试工具要能观察到blocked状态管理 API 的/api/connections里有state字段。4.3 用 rabbitmqctl 看运行时状态除了 HTTP APIrabbitmqctl命令能看更底层的状态。常用命令rabbitmqctl list_queues name messages_ready messages_unacknowledged consumers rabbitmqctl list_connections name state channels rabbitmqctl statuslist_queues输出每个队列的待消费数、未确认数和消费者数。list_connections看连接状态blocked表示被流控。status看内存、磁盘、文件描述符。如果rabbitmq启动失败先看日志/var/log/rabbitmq/rabbithostname.log常见原因是 Erlang cookie 不一致、端口被占用、磁盘空间不足。5. 避坑与排查那些让我加班到凌晨的 RabbitMQ 测试问题5.1 消息发出去了但队列里没有现象producer 端basic_publish没报错但管理 API 查队列messages_ready为 0。原因exchange 没有绑定到任何队列或者 routing key 不匹配。RabbitMQ 的basic_publish默认不保证消息路由到队列如果没有匹配的 binding消息会被静默丢弃。解决发消息时设置mandatoryTrue并添加channel.add_on_return_callback回调当消息无法路由时会返回给 producer。另外用管理 API 查/api/exchanges/{vhost}/{exchange}/bindings/source确认绑定关系。5.2 消费者收到消息但队列深度不降现象消费者日志显示一直在处理消息但messages_ready不降或messages_unacknowledged很高。原因消费者没有调用basic_ack或者auto_ackTrue但处理过程中抛异常导致连接断开。解决检查代码里是否漏了basic_ack建议用auto_ackFalse手动确认。如果messages_unacknowledged持续增长检查prefetch_count是否过大以及消费者线程是否被阻塞。5.3 连接频繁断开重连现象测试脚本运行几分钟后报ConnectionResetError或ChannelClosedByBroker。原因心跳超时。RabbitMQ 默认心跳 60 秒如果客户端处理消息时间过长没有及时发送心跳broker 会断开连接。解决把heartbeat设为 30 秒并确保消费逻辑不要阻塞太久。如果单条消息处理超过心跳间隔把消息放到线程池处理主线程继续拉取。5.4 管理 API 返回 401 或 403现象用requests调管理 API 返回401 Unauthorized或403 Forbidden。原因用户名密码错误或者用户没有管理标签。解决检查用户是否有administrator标签或者至少对目标 vhost 有read权限。管理 API 的 vhost 为/时要写成%2F否则会 404。5.5 压测时 broker 内存暴涨现象压测几分钟后 RabbitMQ 内存占用超过阈值触发流控producer 被阻塞。原因消息堆积太多或者prefetch_count太大导致未 ack 消息占用大量内存。解决降低发送速率增加消费者调小prefetch_count设置队列的x-max-length或x-message-ttl防止无限堆积。用rabbitmqctl status看内存明细rabbitmqctl list_queues name memory看每个队列的内存占用。6. 进阶把测试工具做成可复用的 CLI 与结果判定前面几章的脚本适合一次性验证但如果你要反复测不同环境最好封装成命令行工具。我一般用argparse加一个配置文件把 host、port、vhost、exchange、queue、routing key、消息数量、并发数都做成参数。下面是一个简化版的 CLI 骨架import argparse import pika import json import time def run_test(args): credentials pika.PlainCredentials(args.user, args.password) params pika.ConnectionParameters(hostargs.host, portargs.port, virtual_hostargs.vhost, credentialscredentials, heartbeat30) connection pika.BlockingConnection(params) channel connection.channel() channel.queue_declare(queueargs.queue, durableTrue) start time.time() for i in range(args.count): body json.dumps({seq: i, ts: time.time()}) channel.basic_publish(exchangeargs.exchange, routing_keyargs.routing_key, bodybody, propertiespika.BasicProperties(delivery_mode2)) elapsed time.time() - start print(f发送 {args.count} 条消息耗时 {elapsed:.2f} 秒TPS{args.count/elapsed:.2f}) connection.close() if __name__ __main__: parser argparse.ArgumentParser(descriptionRabbitMQ 测试工具) parser.add_argument(--host, defaultlocalhost) parser.add_argument(--port, typeint, default5672) parser.add_argument(--vhost, default/) parser.add_argument(--user, defaultguest) parser.add_argument(--password, defaultguest) parser.add_argument(--exchange, defaulttest_exchange) parser.add_argument(--queue, defaulttest_queue) parser.add_argument(--routing-key, defaulttest_key) parser.add_argument(--count, typeint, default1000) args parser.parse_args() run_test(args)这个骨架可以扩展成子命令connect只测连接publish测发送consume测消费benchmark做压测。结果判定上我习惯看三个指标发送 TPS、消费 TPS、端到端延迟 P99。如果发送 TPS 高但消费 TPS 低说明消费端是瓶颈如果两者都低检查网络或 broker 资源。延迟 P99 超过业务容忍值就要查消费者处理逻辑或 prefetch 设置。还有一个容易被忽略的技巧用x-death头追踪死信。当消息被拒绝或 TTL 过期进入死信队列时x-death会记录原因和时间。测试工具可以在消费端打印这个头快速定位是消息过期还是被拒绝。另外管理 API 的/api/queues/{vhost}/{queue}返回的message_stats里有publish、deliver、ack的累计值压测前后各取一次差值就是实际吞吐。这些数字比日志可靠因为日志可能被采样或轮转。我自己的习惯是每次改完 RabbitMQ 配置或业务代码先跑一遍连通性脚本再跑 1000 条消息的闭环最后用压测脚本跑 30 秒。三步都过了才上预发环境。这套流程帮我省掉了至少三次“生产环境消息丢失”的紧急排查。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Spring Boot助农App毕业设计全流程:从需求拆解到订单实现

Spring Boot助农App毕业设计全流程:从需求拆解到订单实现

每年毕业季,被Spring Boot毕业设计折腾的同学不在少数。最近常有人问到一类题目——"基于Spring Boot的助农类App设计与实现",比如这个"帆林助农App",名字听起来平平无奇,但真正动手做起来,里面要…

2026/10/9 3:31:12 阅读更多 →
WNF状态通知机制:Windows内核级状态同步与调试应用

WNF状态通知机制:Windows内核级状态同步与调试应用

1. 为什么WNF不是“另一个通知机制”,而是Windows内核里被长期低估的通信枢纽很多人第一次在逆向分析或驱动开发文档里看到WNF(Windows Notification Facility)时,下意识会把它和Win32的PostMessage、COM的事件对象、或者.NET的IN…

2026/10/9 3:31:12 阅读更多 →
JavaWeb学生成绩管理系统课设包:JSP+Servlet+JDBC+MySQL完整实现与避坑指南

JavaWeb学生成绩管理系统课设包:JSP+Servlet+JDBC+MySQL完整实现与避坑指南

简介:这是一套面向高校课程设计、毕业设计与Java Web入门进阶的完整学生成绩管理系统源码包,基于JSP、Servlet、JDBC与MySQL实现,并引入MD5加密算法,覆盖学生、教师、管理员三类角色。学生端支持考勤管理、请假、选课、成绩查询与…

2026/10/9 3:30:12 阅读更多 →

最新新闻

ASP.NET C# ERP源码二次开发:从部署到改造全流程实战

ASP.NET C# ERP源码二次开发:从部署到改造全流程实战

简介:这是一份面向.NET开发团队的ASP.NET C#大型综合管理系统源码包,定位于大型ERP与全能后台管理系统的项目样板,适合具备一定C#基础、希望直接参考完整工程结构或进行二次开发的中高级开发者。压缩包约52.88MB,以zip格式提供&am…

2026/10/9 4:01:29 阅读更多 →
t3code 整合 Claude Code 与 Codex:Electron 多引擎 AI 编程工具架构解析

t3code 整合 Claude Code 与 Codex:Electron 多引擎 AI 编程工具架构解析

1. 从 t3code 这个标题说起:它到底想解决什么问题第一次看到 “t3code” 这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个围绕 AI 编程工具做整合或增强的项目。为什么这么判断?因为把标题和它周围那一圈热搜词放在一起看…

2026/10/9 4:01:29 阅读更多 →
Agent-Reach:多Agent协作的触达与编排实战指南

Agent-Reach:多Agent协作的触达与编排实战指南

去年下半年我接手了一个多Agent协作项目,前期单体Agent玩得很溜,结果一上多Agent就翻车——20多个Agent挂在一起互相调用,上午还跑得好好的,下午某几个Agent就开始失联,任务直接在中间环节卡死。折腾了两周&#xff0c…

2026/10/9 4:01:29 阅读更多 →
基于Hadoop和Spark的信贷风控系统架构与落地实践

基于Hadoop和Spark的信贷风控系统架构与落地实践

简介:面向大数据金融信贷风控领域学习者和毕业设计开发者的完整项目源码包,基于Hadoop与Spark技术栈实现信贷风险控制系统,覆盖数据接入、流式处理、风控逻辑及可视化等环节,适合课程设计、毕设或项目初期演示。压缩包内共69个文件…

2026/10/9 4:01:29 阅读更多 →
pstack-claude:本地化进程栈+AI诊断的轻量级系统调试方案

pstack-claude:本地化进程栈+AI诊断的轻量级系统调试方案

1. 项目概述:pstack-claude 是什么,它解决的是哪类开发者的实际痛点?pstack-claude 这个名字乍看像一个工具组合词,但拆解后立刻能抓住核心——它不是某个官方发布的软件包,而是开发者社区中自发形成的一套轻量级本地化…

2026/10/9 4:01:29 阅读更多 →
JavaWeb在线问卷调查系统课程设计:结构部署与核心代码解析

JavaWeb在线问卷调查系统课程设计:结构部署与核心代码解析

简介:基于JavaWeb的在线问卷调查系统课程设计源码包,面向需要完成Java课设、毕设或学习Servlet/JSP与Spring Boot整合开发的学生和开发者。系统覆盖用户注册登录、问卷创建与填写、管理员统一管理、多题型支持(单选、多选、文本题&#xff09…

2026/10/9 4:00:29 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →