Python解析阿里云物联网透传数据:从二进制帧到物模型对齐
1. 从设备上报的十六进制报文说起搞物联网项目的人迟早会撞上这么一幕设备侧辛辛苦苦把传感器数据打包成二进制帧发上云结果在控制台里看到的是一串类似010300000002C40B的东西。你盯着这串字符心里清楚温度、湿度、电量全藏在里面但就是没法直接拿来用。这就是数据解析要解决的问题——把设备原始报文翻译成人类和业务系统都能读懂的结构化数据。阿里云物联网平台在这块提供了一套完整的链路设备通过物模型TSL定义属性、事件和服务上报时既可以用物模型的标准 JSON 格式也可以走透传模式上报原始字节流再由云端或本地做脚本解析。Python 在这个环节里扮演了两个角色一是跑在网关或边缘服务器上做本地解析二是通过 SDK 调用云端接口做数据拉取和二次处理。我这次要聊的就是围绕 Python 把这条链路打通重点放在透传数据的解析逻辑、物模型的对齐方式以及实际跑起来之后那些文档里不会写的坑。适合读这篇的人有三类刚接触物联网平台、被透传报文卡住的新手已经能跑通基础收发、但解析逻辑写得一团糟想重构的开发者还有需要在边缘侧做实时解析、对延迟和稳定性有要求的工程人员。下面我按实际项目里的推进顺序来展开从数据怎么上来、怎么解、怎么对齐物模型一直讲到批量处理和排错。2. 透传上报与物模型上报的路线选择2.1 两种上报模式的本质差异阿里云物联网平台的设备接入数据上行有两条路。第一条是物模型直报设备直接把 JSON 发到物模型对应的 Topic比如/sys/{productKey}/{deviceName}/thing/event/property/postpayload 长这样{ id: 123, version: 1.0, params: { Temperature: 25.3, Humidity: 61.2 } }云端拿到之后直接按物模型定义校验、存储、流转你不需要写任何解析代码。第二条是透传上报设备把自定义的二进制帧发到/sys/{productKey}/{deviceName}/user/update这类自定义 Topic云端不认识里面的内容需要你在控制台配置一个数据解析脚本或者把数据流转到函数计算、消息队列再由 Python 消费解析。选哪条路取决于你的设备侧约束。我做过的一个环境监测项目设备用的是低功耗单片机RAM 只有几 KB跑 JSON 序列化库根本不现实只能自己拼二进制帧那就必须走透传。反过来如果设备侧是 Linux 网关、算力充足直接上物模型 JSON 最省事云端校验、报警、可视化全都现成。2.2 为什么很多团队最终选了透传加自解析透传看起来麻烦但实际项目里选它的比例不低原因有几个。一是流量成本一个包含温度、湿度、电量、信号强度的 JSON 报文动辄一百多字节而二进制帧可能只要十几个字节设备量大、上报频繁时差距很明显。二是设备兼容性很多存量设备用的是 Modbus、自定义串口协议改造成本高透传能让它们原样接入。三是解析逻辑可控脚本在自己手里字段怎么映射、异常值怎么处理全由业务决定不受物模型固定结构的限制。但透传的代价也很直接你得自己维护一套解析脚本设备协议一改脚本就得跟着改而且云端脚本的调试体验远不如本地 Python 舒服。所以我的建议是如果设备侧能改优先物模型直报如果改不动或者流量敏感再上透传同时把解析逻辑尽量收敛到一个可测试的 Python 模块里别散落在各处。2.3 数据解析脚本在链路中的位置透传模式下数据解析脚本挂在产品的数据解析配置里设备上报的原始 payload 会先经过这个脚本转成物模型格式的 JSON再进入后续的存储和流转。脚本用的是 JavaScript 引擎这点要注意不是 Python。很多人第一次配的时候以为能写 Python结果发现语法不对。那 Python 在哪用两个地方。一是本地或边缘解析网关收到设备数据后直接用 Python 解解完再决定是本地处理还是转发上云。二是云端二次处理数据通过规则引擎流转到消息队列或函数计算Python 消费这些消息做深度加工。所以完整的链路往往是设备二进制帧 → 云端 JS 脚本做基础解析 → 流转到消息队列 → Python 做业务级处理。理解这个分工后面写代码才不会放错位置。3. 用 Python 拆解二进制帧的完整过程3.1 从字节序和帧结构开始解析二进制帧第一步永远是搞清楚帧结构。假设某设备上报的报文是01 03 04 00 FA 01 2C 3A 8F我们得先知道每个字节代表什么。常见的自定义帧会包含帧头、设备地址、功能码、数据长度、数据区、校验位。上面这串里01可能是设备地址03是功能码04表示后面有 4 个字节的数据00 FA和01 2C是两组测量值最后3A 8F是 CRC 校验。Python 里处理字节流核心工具是struct模块和int.from_bytes。struct.unpack适合结构固定的帧格式字符串能精确描述每个字段的类型和长度。比如解析两个 16 位无符号整数import struct raw bytes.fromhex(01030400FA012C3A8F) # 跳过前3字节取中间4字节 data raw[3:7] value1, value2 struct.unpack(HH, data) print(value1, value2) # 250 300这里的表示大端序H是无符号短整型。字节序搞错是新手最常见的错误设备用大端你按小端解出来的数值能差出几万倍。判断字节序的办法是拿一个已知值去试比如设备文档说温度范围是 -40 到 80 度你解出来一个 30000那基本就是字节序反了。3.2 校验位验证不能省上面那串报文末尾的3A 8F是 CRC16 校验。很多新手图省事直接跳过校验结果设备偶尔发上来一帧被干扰的数据解析出来的温度是 600 度直接触发误报警。校验这一步必须做而且要在解析数据之前做。Python 实现 CRC16 校验Modbus 常用的多项式是0xA001def crc16_modbus(data: bytes) - int: crc 0xFFFF for byte in data: crc ^ byte for _ in range(8): if crc 0x0001: crc (crc 1) ^ 0xA001 else: crc 1 return crc raw bytes.fromhex(01030400FA012C3A8F) payload raw[:-2] expected int.from_bytes(raw[-2:], little) actual crc16_modbus(payload) print(expected actual)注意 CRC 的字节序和数值字节序经常不一致Modbus 的 CRC 是低字节在前所以取校验值时用little。这个细节文档里往往一笔带过但错了就是校验永远不过。3.3 把原始值换算成物理量解析出整数只是中间步骤真正要的是物理量。设备上报的通常是放大后的整数比如温度乘了 10湿度乘了 10电量是毫伏。换算逻辑要写清楚而且要用常量或配置管理别硬编码在解析函数里。SCALE_FACTORS { temperature: 0.1, humidity: 0.1, voltage: 0.001, } def to_physical(raw_value: int, field: str) - float: factor SCALE_FACTORS.get(field, 1.0) return round(raw_value * factor, 2)我踩过的一个坑是负温度的处理。设备用有符号数表示温度范围 -40 到 80如果按无符号解-10 度会变成 65526。这时候struct的格式字符要用h有符号短整型而不是H。判断依据很简单看设备文档里这个字段有没有负数范围有就必须用有符号类型。3.4 解析函数的组织方式一个产品往往有多种报文类型比如心跳帧、数据帧、报警帧帧头或功能码不同。这时候别写一个巨大的 if-else用字典做分发更清晰def parse_frame(raw: bytes) - dict: if not verify_crc(raw): raise ValueError(CRC check failed) func_code raw[1] parser PARSERS.get(func_code) if parser is None: raise ValueError(fUnknown func code: {func_code}) return parser(raw) PARSERS { 0x03: parse_data_frame, 0x04: parse_alarm_frame, 0x05: parse_heartbeat_frame, }这样加新帧类型只要注册一个函数主流程不动。实测下来这种结构在协议迭代时省事很多尤其是设备厂商中途改协议的情况。4. 解析结果与物模型的字段对齐4.1 物模型标识符的命名约束解析出来的字典字段名不能随便起得和物模型里的标识符对上。物模型标识符有命名规范只允许字母、数字、下划线不能以数字开头长度有限制。我见过有人解析出来用中文键名流转到规则引擎时直接报错。对齐的时候建议维护一张映射表把设备协议字段和物模型标识符对应起来设备字段原始偏移数据类型物模型标识符单位温度3-4int16Temperature摄氏度湿度5-6uint16Humidity百分比电量7-8uint16BatteryLevel毫伏信号9uint8SignalStrengthdBm这张表是解析脚本和物模型之间的契约改任何一边都要同步更新。我习惯把它写成一个 Python 字典解析函数直接引用避免手写字符串拼错。4.2 数据类型转换的边界情况物模型对数据类型有要求int32、float、double、bool、text 各有范围。解析出来的值如果超出范围云端会拒绝。比如电量用 uint16 表示毫伏最大 65535 毫伏换算成伏是 65.535如果物模型定义成 int32 存伏特那没问题但如果定义成 int32 存毫伏也没问题。真正容易出问题的是浮点数精度物模型 float 是单精度Python 默认是双精度赋值时可能丢精度。处理办法是在解析阶段就做一次显式转换import numpy as np def to_float32(value: float) - float: return float(np.float32(value))这样能保证本地算出来的值和云端存的值一致避免对账时发现两边差一点点。4.3 时间戳和时区设备上报的时间戳经常是本地时间或者设备开机后的毫秒数而物模型和云端存储用的是 UTC 毫秒时间戳。这个转换不做数据在时序上就是乱的。我一般要求设备直接上报 UTC 毫秒如果设备做不到就在解析时补一个服务器接收时间同时把设备原始时间作为扩展字段存下来。import time def normalize_timestamp(device_ts: int | None) - int: if device_ts is None: return int(time.time() * 1000) return device_ts时区问题在跨区域部署时特别明显一个在东部时区采集的数据如果按本地时间存到了西部时区的分析系统里就会错位。统一用 UTC 是唯一省心的做法。5. 批量解析的性能与稳定性处理5.1 单条解析和批量解析的差异小规模场景下一条一条解析没问题。但设备上千、上报频率到秒级时解析就成了瓶颈。我做过一个压测纯 Python 逐条解析加 CRC 校验单核每秒大概能处理两万条左右如果每条还要做字符串格式化和字典构造会降到一万以下。批量解析的优化方向有几个。一是减少对象创建解析函数里别频繁构造临时列表和字典能复用就复用。二是用生成器处理大批量数据时不要一次性读进内存def iter_parse(raw_list): for raw in raw_list: try: yield parse_frame(raw) except ValueError as e: log_error(raw, e) continue这样内存占用是常数级的而且单条出错不影响整体。5.2 异常数据的隔离设备数据里一定会有脏数据CRC 错的、长度不对的、字段值超范围的。这些数据不能直接丢也不能让它们中断整个解析流程。我的做法是分三层处理CRC 和长度错误直接丢弃并计数字段值超范围做截断或标记为无效解析异常记录原始报文到死信队列方便事后排查。def safe_parse(raw: bytes) - dict | None: try: result parse_frame(raw) except ValueError: metrics.increment(parse_failed) dead_letter_queue.put(raw) return None return sanitize(result)sanitize负责把超范围的值处理掉比如温度超过 100 度标记为无效而不是直接上报。5.3 并发解析的取舍Python 有 GIL多线程做 CPU 密集的解析并不能真正并行。如果解析逻辑重用多进程如果只是 IO 等待多用异步。实际项目里我更多用多进程池把解析任务分片from concurrent.futures import ProcessPoolExecutor def batch_parse(raw_list, workers4): with ProcessPoolExecutor(max_workersworkers) as executor: results list(executor.map(parse_frame, raw_list)) return results但多进程有序列化开销数据量小的时候反而更慢。我的经验是单批超过一千条再考虑多进程否则单线程加生成器就够了。6. 联调阶段那些文档没写的坑6.1 云端脚本和本地 Python 结果不一致最让人头疼的问题之一本地 Python 解析出来的值是对的配到云端 JS 脚本后结果对不上。原因通常是 JS 的位运算和 Python 不一样。JS 的位运算默认按 32 位有符号整数处理处理 16 位数据时如果没做掩码符号位会出问题。比如0x8000在 JS 里按位运算会变成负数。解决办法是在 JS 脚本里显式做无符号处理或者干脆把复杂解析放在 Python 侧云端脚本只做透传。我现在倾向于后者云端脚本越简单越好复杂逻辑全放 Python这样调试也方便。6.2 Topic 权限和订阅关系设备上报的 Topic 和 Python 消费的 Topic 不是一回事。设备发到/user/update数据经过规则引擎流转后可能到了另一个 Topic 或者消息队列。如果 Python 订阅的 Topic 没配对就会一直收不到数据但设备侧显示发送成功很容易误判成解析问题。排查这类问题的顺序是先确认设备上报成功看设备日志再确认规则引擎流转配置正确看流转日志最后确认 Python 订阅的 Topic 和消费组正确。三步都过了再怀疑解析代码。6.3 消息重复和乱序物联网平台的消息投递是至少一次语义意味着同一条消息可能被消费多次。Python 侧如果不做幂等就会重复入库。幂等键一般用设备名加时间戳加消息 ID入库前查一下是否已存在。乱序问题在设备网络不稳定时很常见后发的数据先到。如果业务对时序敏感得在解析时带上设备侧时间戳入库后按时间戳排序而不是按接收顺序。6.4 内存泄漏的隐蔽来源长时间运行的 Python 解析服务内存缓慢上涨是常见问题。原因往往不是解析逻辑本身而是日志对象、连接池、缓存没设上限。我遇到过一次解析服务跑了一周内存涨到几个 G最后定位到是异常处理里把原始报文全存进了一个列表做事后分析结果那个列表从来没清理过。排查内存问题用tracemalloc或者objgraph定期 dump 对象数量比盲目加内存有效得多。7. 一套可复用的解析模块该怎么搭7.1 目录结构和职责划分把解析逻辑做成独立模块别和业务代码混在一起。我的习惯结构是这样parser/ __init__.py frame.py # 帧结构定义和 CRC codec.py # 字节编解码 fields.py # 字段映射和换算 models.py # 物模型对齐 errors.py # 自定义异常frame.py只管帧层面的东西codec.py管字节和数值转换fields.py管业务字段models.py管和物模型的对接。这样分层之后换设备协议只动frame.py和fields.py物模型变了只动models.py。7.2 配置驱动的字段定义字段映射别写死在代码里用配置驱动。可以用 YAML 或 JSON 描述每个字段的偏移、类型、换算系数、物模型标识符fields: - name: temperature offset: 3 type: int16 scale: 0.1 tsl_id: Temperature unit: celsius - name: humidity offset: 5 type: uint16 scale: 0.1 tsl_id: Humidity unit: percent解析器读配置生成解析逻辑加字段改配置就行不用改代码。这个做法在多设备型号的项目里特别值一个解析器能适配多种设备。7.3 单元测试和回归用例解析代码必须有测试而且要覆盖边界情况最小值、最大值、负值、CRC 错误、长度不足。我一般会收集真实设备的历史报文做回归用例每次改解析逻辑跑一遍确保没破坏已有行为。import pytest def test_parse_temperature_negative(): raw build_frame(temperature-10) result parse_frame(raw) assert result[Temperature] -10.0 def test_parse_crc_error(): raw build_frame(temperature25) raw raw[:-1] bytes([raw[-1] ^ 0xFF]) with pytest.raises(ValueError): parse_frame(raw)这些用例积累下来就是项目的资产新人接手时看测试比看文档快。7.4 日志和可观测性解析服务上线后出问题靠日志定位。日志要记录关键信息原始报文十六进制、解析结果、耗时、异常堆栈。但原始报文别全量打量大时用采样异常时全打。import logging logger logging.getLogger(__name__) def parse_with_logging(raw: bytes) - dict | None: start time.perf_counter() try: result parse_frame(raw) elapsed time.perf_counter() - start logger.debug(parsed %s in %.3fms, raw.hex(), elapsed * 1000) return result except Exception: logger.exception(parse failed for %s, raw.hex()) return None耗时指标能帮你发现性能退化异常日志能帮你定位脏数据来源。这两样东西平时不起眼出问题时是救命的。8. 我在实际项目里踩过的几个具体坑第一个坑是字节序假设错误。有次接一个新设备文档写的是大端我按大端解结果温度一直是负的。后来发现文档写错了实际是小端。教训是别全信文档拿已知环境下的数据验证一遍再写解析。第二个坑是CRC 初始值。不同厂商的 CRC16 初始值不一样有的是 0xFFFF有的是 0x0000还有的是 0x1D0F。我遇到过一次校验死活不过最后发现是初始值不对。现在我的做法是让设备厂商提供一段带校验的样例报文用样例反推参数。第三个坑是浮点数精度。电量上报是毫伏整数换算成伏特是除以 1000Python 里1234 / 1000得到1.234但存到物模型 float 后可能变成1.2339999。对账时发现差一点点排查半天。后来统一在解析阶段用round到合理位数再转 float32。第四个坑是时区。设备上报的是本地时间服务器按 UTC 存结果数据在图表上整体偏移了几个小时。这个坑不报错但数据全错而且不容易发现。现在我的规范是设备侧一律上报 UTC 毫秒做不到的就在解析时补服务器时间。第五个坑是消息积压。设备量上来后Python 消费速度跟不上消息队列积压。排查发现是解析函数里做了一次同步的数据库查询每条消息都查一次。改成批量查询加本地缓存后吞吐量上去了。这个坑的教训是解析链路里别做重 IO解析就是解析存储和查询分开。这些坑单看都不复杂但凑在一起能让一个项目延期好几天。写解析代码的时候多留个心眼把校验、边界、日志做扎实后面省下的时间远超前期投入。

相关新闻

二维点云ICP算法原理推导与实战:从目标函数到闭式解

二维点云ICP算法原理推导与实战:从目标函数到闭式解

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

2026/10/14 1:32:09 阅读更多 →
Kinect 2.0相机标定全流程:RGB与深度图对齐的精度提升指南

Kinect 2.0相机标定全流程:RGB与深度图对齐的精度提升指南

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

2026/10/14 1:32:09 阅读更多 →
STM32F103+VS1003嵌入式MP3播放器稳定播放320kbps实战

STM32F103+VS1003嵌入式MP3播放器稳定播放320kbps实战

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

2026/10/14 1:32:09 阅读更多 →

最新新闻

LaTeX 2025环境配置:texlive + TeXstudio

LaTeX 2025环境配置:texlive + TeXstudio

文章目录Latex2025环境配置一、LaTeX 简介1.1 什么是 LaTeX?1.2 为什么使用 LaTeX?1.3 如何开始使用 LaTeX?二、texlive下载安装2.1 texlive下载2.2 texlive安装2.3 常见问题2.3.1 用管理员权限打开install-tl-windows.bat 报错2.3.2 Latex安…

2026/10/14 2:20:23 阅读更多 →
从工勘图到资源库:提交 nVisual Studio 与机房设计全生命周期的闭环

从工勘图到资源库:提交 nVisual Studio 与机房设计全生命周期的闭环

从工勘图到资源库:提交 nVisual Studio 与机房设计全生命周期的闭环摘要:工勘图纸的价值在「进入可检索、可复用资源库」之后才被放大——本地文件解决现场与交付,平台解决长期资产。DCDesigner 的「提交 nVisual Studio」把工勘 JSON 一键回…

2026/10/14 2:20:23 阅读更多 →
因果推断教材实战:从AB实验到双重机器学习与策略学习

因果推断教材实战:从AB实验到双重机器学习与策略学习

简介:这份资源是斯坦福大学Stefan Wager于2024年9月更新的《Causal Inference: A Statistical Learning Approach》教科书草稿,面向数据科学、统计学、经济学与公共政策领域的学习者和研究者,帮助其系统掌握基于统计学习方法的因果推断理论与…

2026/10/14 2:20:23 阅读更多 →
游集美Day1:逛完学村走老巷,被这几家街坊常来的小店拦住了脚步

游集美Day1:逛完学村走老巷,被这几家街坊常来的小店拦住了脚步

很多人来集美,打卡完嘉庚建筑、龙舟池,拍几张照片就匆匆返程。 但集美真正动人的烟火,不在网红打卡点,藏在黄昏的社区老巷。 这条路线我按地理位置理顺,不跨区乱跑,骑行顺路,慢逛无赶路压力&…

2026/10/14 2:20:23 阅读更多 →
系统辨识实战教案:M序列设计、RLS实现与工业白化检验

系统辨识实战教案:M序列设计、RLS实现与工业白化检验

简介:本资源是一份面向自动化专业本科生与研究生的《系统辨识》课程教案,聚焦工程建模核心能力培养,解决从实际系统数据中构建可用数学模型的关键问题。教案覆盖实体与模型本质辨析、Zadeh三要素(数据/模型类/准则)理论…

2026/10/14 2:20:23 阅读更多 →
AI 辅助科研溯源闸门:输入·命令·决策·证据四类记录的失败含义与当天最小实验

AI 辅助科研溯源闸门:输入·命令·决策·证据四类记录的失败含义与当天最小实验

千笔-AIWritePaper https://www.aiwritepaper.com Agent 能很快从原始表跑出一张宇宙学风格的斜率图,不等于结果可审查。缺了输入校验和,文件可以被静默替换;命令行事后改参,YAML 里仍写着旧参数;决策条目没有理由&am…

2026/10/14 2:19:23 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战: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/13 22:01:27 阅读更多 →
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 阅读更多 →