从零构建航班追踪可视化系统:数据获取、后端处理与前端展示全链路实践 这次我们来看一个名为“香港国际机场起飞的飞机们”的项目。从标题和有限的材料来看这很可能不是一个传统的软件或AI模型项目而更像是一个数据集、一个可视化应用或者一个专注于航空器追踪与展示的技术方案。它可能涉及对香港国际机场HKG离港航班的实时或历史数据进行采集、处理与呈现。对于技术爱好者、航空迷或数据分析师而言这类项目的核心价值在于其背后的技术栈和实现方式。它可能集成了航班数据API、地理信息系统GIS、实时数据流处理、以及前端可视化如Web地图等技术。本文将重点拆解如何从零开始构建一个类似的航空器追踪可视化系统涵盖从数据源获取、后端处理、到前端展示的全链路技术方案。我们将重点关注以下几个实操环节如何获取稳定可靠的航班数据接口包括免费与付费方案如何设计一个轻量级后端服务来清洗和转发数据以及如何使用流行的地图库如Leaflet、Mapbox在前端绘制动态的飞机轨迹。本文假设你具备基础的编程知识如Python、JavaScript并希望获得一个可落地、可扩展的参考实现。1. 核心能力速览能力项说明与实现方案项目类型航班数据可视化系统 / 实时数据流展示核心功能1. 接入航班动态数据源2. 过滤并聚焦香港国际机场HKG离港航班3. 在地图上实时/准实时显示飞机位置、航向、航班号等信息4. 支持历史数据查询与回放数据来源依赖第三方航班数据API如ADS-B Exchange, OpenSky Network, AviationStack等技术栈后端Python (Flask/FastAPI) / Node.js 前端JavaScript (Leaflet/Mapbox)部署方式可本地运行也可部署至云服务器需要公网IP用于数据接收或定时任务硬件门槛极低。核心是网络和API调用普通个人电脑即可运行开发环境生产环境对CPU和内存要求不高。是否支持API是。本项目本质就是构建一个提供航班数据的API服务。是否支持“批量”任务是。可以定时抓取数据并存储用于历史分析或批量导出。适合场景航空数据学习、技术演示、个人仪表盘、地理信息系统GIS入门实践。2. 适用场景与使用边界适合谁开发者与数据工程师想学习如何集成实时API、处理流数据、进行地理空间可视化。航空爱好者希望自己搭建一个个性化的航班追踪看板关注特定机场或航线。学生或研究者用于课程设计、数据分析项目研究机场流量、航班准点率等。能解决什么问题技术学习提供一个完整的、从数据到展现的全栈项目实践。数据获取解决从公开或商业渠道获取并解析航班数据的问题。定制化展示相比商业航班追踪网站自建系统可以完全自定义过滤条件如只看货机、特定航空公司、展示样式和交互逻辑。离线/私有化可以将数据处理后存储在本地进行离线分析或构建内部系统。不适合什么场景高精度、高实时性的专业应用免费数据源通常有延迟几分钟到几十分钟且覆盖率和精度无法与专业服务相比。商业用途许多免费API有严格的用途限制商业使用需购买授权。直接使用抓取的数据进行商业发布可能涉及法律风险。空中交通管制ATC等安全关键场景绝对禁止。此类系统仅供兴趣和研究不能用于任何与飞行安全相关的决策。合规与安全边界遵守API服务条款严格遵循所用数据提供商的使用限制如调用频率、数据缓存、署名要求。隐私注意虽然航班位置数据多为公开信息但应避免关联和展示涉及个人隐私的敏感信息。数据安全如果自建服务对外开放需做好基本的访问控制防止被恶意滥用导致API密钥泄露或服务器过载。3. 环境准备与前置条件构建这个系统你需要准备以下环境操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu) 均可。推荐使用Linux或WSL2以获得更好的开发体验。编程语言与环境Python 3.8用于后端数据抓取、处理和API服务。建议使用venv或conda创建虚拟环境。Node.js (可选)如果你更喜欢用Node.js写后端需要安装Node.js 16。现代浏览器Chrome, Firefox, Edge等用于前端展示。关键工具与库包管理pip(Python),npm或yarn(Node.js)。后端框架Flask或FastAPI(Python)或Express(Node.js)。本文以PythonFastAPI为例因其异步特性适合处理数据流。HTTP客户端requests或aiohttp(Python)用于调用航班数据API。前端地图库Leaflet或Mapbox GL JS。Leaflet更轻量、易上手Mapbox效果更炫酷但部分高级功能收费。数据存储 (可选)简单的数据缓存或历史记录可使用SQLite(sqlite3模块) 或Redis。大规模存储考虑PostgreSQL支持PostGIS地理扩展。网络稳定的互联网连接用于访问外部航班数据API。API密钥 (部分来源需要)注册相关数据服务商账号并获取API密钥。例如AviationStack、OpenSky Network注册后有一定免费额度。4. 安装部署与启动方式我们将项目拆分为后端数据服务和前端展示页面。首先搭建后端。4.1 后端服务搭建 (Python FastAPI)创建一个项目目录例如flight-tracker。mkdir flight-tracker cd flight-tracker python -m venv venv # 创建虚拟环境 # Windows: venv\Scripts\activate # Linux/macOS: source venv/bin/activate安装必要的Python包pip install fastapi uvicorn requests aiohttp sqlite3创建一个主应用文件main.pyfrom fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware import aiohttp import asyncio from typing import List, Optional import sqlite3 import time import os app FastAPI(title香港机场航班追踪API) # 允许前端跨域访问 app.add_middleware( CORSMiddleware, allow_origins[*], # 生产环境应替换为具体的前端域名 allow_credentialsTrue, allow_methods[*], allow_headers[*], ) # 配置 - 替换为你的API密钥和端点 # 示例使用 OpenSky Network 的匿名接口免费但有限制 OPENSKY_API_URL https://opensky-network.org/api/states/all # 或者使用 AviationStack (需注册) # AVIATIONSTACK_API_URL http://api.aviationstack.com/v1/flights # AVIATIONSTACK_API_KEY your_api_key_here # 初始化SQLite数据库用于简单缓存或历史记录 def init_db(): conn sqlite3.connect(flights.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS flight_history (icao24 TEXT, callsign TEXT, origin_country TEXT, longitude REAL, latitude REAL, baro_altitude REAL, velocity REAL, true_track REAL, timestamp INTEGER)) conn.commit() conn.close() init_db() app.get(/) async def root(): return {message: 香港国际机场离港航班追踪API服务已启动} app.get(/api/departures/hkg) async def get_hkg_departures(): 获取香港国际机场(HKG)附近的离港航班状态。 此示例从OpenSky Network获取全球数据并在后端过滤。 try: async with aiohttp.ClientSession() as session: async with session.get(OPENSKY_API_URL, timeout10) as response: if response.status ! 200: raise HTTPException(status_coderesponse.status, detail无法从数据源获取信息) data await response.json() states data.get(states, []) # 香港国际机场(HKG)大致坐标范围过滤 hkg_bbox (113.8, 22.2, 114.4, 22.6) # (lon_min, lat_min, lon_max, lat_max) departures [] for state in states: if state is None or len(state) 10: continue lon, lat state[5], state[6] # 简单判断飞机是否在香港机场附近区域且高度0已起飞 if (hkg_bbox[0] lon hkg_bbox[2] and hkg_bbox[1] lat hkg_bbox[3] and state[7] is not None and state[7] 100): # 气压高度大于100米 flight_info { icao24: state[0], # 飞机唯一标识 callsign: state[1] and state[1].strip() or N/A, # 航班号 origin_country: state[2], longitude: lon, latitude: lat, baro_altitude: state[7], # 气压高度 velocity: state[9], # 速度 (m/s) true_track: state[10], # 航向 (度) vertical_rate: state[11], # 垂直速率 squawk: state[14], } departures.append(flight_info) # 简单缓存到数据库示例 cache_to_db(departures) return {timestamp: int(time.time()), count: len(departures), flights: departures} except aiohttp.ClientError as e: raise HTTPException(status_code503, detailf网络请求失败: {e}) except asyncio.TimeoutError: raise HTTPException(status_code504, detail数据源请求超时) def cache_to_db(flights): 将航班数据缓存至SQLite conn sqlite3.connect(flights.db) c conn.cursor() ts int(time.time()) for f in flights: c.execute(INSERT INTO flight_history VALUES (?,?,?,?,?,?,?,?,?), (f[icao24], f[callsign], f[origin_country], f[longitude], f[latitude], f[baro_altitude], f[velocity], f[true_track], ts)) conn.commit() conn.close() if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8000)4.2 启动后端服务在项目目录下运行python main.py服务将在http://127.0.0.1:8000启动。访问http://127.0.0.1:8000/docs可以看到自动生成的API文档。访问http://127.0.0.1:8000/api/departures/hkg即可获取JSON格式的航班数据。4.3 前端页面搭建在项目目录下创建static文件夹并在其中创建index.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title香港国际机场离港航班实时追踪/title link relstylesheet hrefhttps://unpkg.com/leaflet1.9.4/dist/leaflet.css / script srchttps://unpkg.com/leaflet1.9.4/dist/leaflet.js/script style body { margin: 0; padding: 0; } #map { height: 100vh; width: 100vw; } #info-panel { position: absolute; top: 10px; right: 10px; background: white; padding: 10px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.2); z-index: 1000; max-width: 300px; font-family: sans-serif; } /style /head body div idinfo-panel h3香港国际机场 (HKG) 离港航班/h3 p数据更新间隔: span idupdateInterval10/span 秒/p p当前飞机数: span idflightCount0/span/p button onclickfetchFlights()手动刷新/button hr div idselectedFlightInfo点击地图上的飞机图标查看详情/div /div div idmap/div script // 初始化地图中心点设为香港国际机场 const map L.map(map).setView([22.3080, 113.9185], 11); L.tileLayer(https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png, { attribution: © OpenStreetMap contributors }).addTo(map); // 标记香港国际机场 L.marker([22.3080, 113.9185]).addTo(map) .bindPopup(b香港国际机场 (HKG)/b).openPopup(); const planeIcon L.icon({ iconUrl: https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png, // 可用自定义飞机图标 iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34] }); let flightMarkers {}; const apiUrl http://127.0.0.1:8000/api/departures/hkg; // 后端API地址 function fetchFlights() { fetch(apiUrl) .then(response response.json()) .then(data { document.getElementById(flightCount).textContent data.count; updateFlightMarkers(data.flights); }) .catch(err { console.error(获取航班数据失败:, err); document.getElementById(flightCount).textContent 获取失败; }); } function updateFlightMarkers(flights) { const newMarkers {}; flights.forEach(flight { const key flight.icao24; const lat flight.latitude; const lon flight.longitude; const callsign flight.callsign; if (flightMarkers[key]) { // 移动现有标记 flightMarkers[key].setLatLng([lat, lon]); } else { // 创建新标记 const marker L.marker([lat, lon], {icon: planeIcon}) .bindPopup(b航班:/b ${callsign}br b高度:/b ${(flight.baro_altitude * 3.28084).toFixed(0)} ftbr b速度:/b ${(flight.velocity * 1.94384).toFixed(0)} ktbr b航向:/b ${flight.true_track}°); marker.addTo(map); marker.on(click, () { document.getElementById(selectedFlightInfo).innerHTML b${callsign}/bbr高度: ${(flight.baro_altitude * 3.28084).toFixed(0)} ft; }); flightMarkers[key] marker; } newMarkers[key] flightMarkers[key]; }); // 移除已离开区域的飞机标记 for (const key in flightMarkers) { if (!newMarkers[key]) { map.removeLayer(flightMarkers[key]); } } flightMarkers newMarkers; } // 初始加载并设置定时器 fetchFlights(); setInterval(fetchFlights, 10000); // 每10秒更新一次 /script /body /html4.4 启动完整服务并访问确保后端服务 (python main.py) 正在运行。前端页面index.html可以直接用浏览器打开文件协议file://但由于跨域问题可能无法从后端获取数据。更佳的方式是使用一个简单的静态文件服务器并与后端同源或配置代理。一个快速的方法是修改后端main.py让 FastAPI 也托管静态文件。在main.py的app定义后添加from fastapi.staticfiles import StaticFiles app.mount(/static, StaticFiles(directorystatic), namestatic)然后将index.html中的apiUrl改为相对路径/api/departures/hkg。重启后端服务通过浏览器访问http://127.0.0.1:8000/static/index.html即可看到完整的地图与航班追踪界面。5. 功能测试与效果验证5.1 后端API接口测试首先验证数据获取链路是否通畅。测试目的确认后端服务能成功从数据源获取数据并正确过滤出香港机场附近的航班。操作步骤启动后端服务python main.py。打开浏览器或使用curl命令测试接口。使用curl测试curl -X GET http://127.0.0.1:8000/api/departures/hkg预期结果返回一个JSON对象结构类似{ timestamp: 1712345678, count: 15, flights: [ { icao24: abc123, callsign: CPA123, origin_country: China, longitude: 113.95, latitude: 22.32, baro_altitude: 3000.5, velocity: 250.0, true_track: 85.0, vertical_rate: 10.0, squawk: 1234 }, // ... 更多航班 ] }判断成功标准HTTP状态码为200。返回的JSON中包含flights数组。flights数组中的经纬度坐标应在香港附近。常见失败原因网络问题服务器无法访问外部数据API。检查网络连接或尝试在浏览器中直接打开OPENSKY_API_URL看是否返回数据。API限制免费API有调用频率限制短时间内频繁请求可能导致IP被暂时封锁。请降低请求频率。坐标过滤过严如果flights数组为空可能是当前时刻香港机场附近确实没有符合高度条件的航班或者预设的坐标范围 (hkg_bbox) 太小。可以适当扩大范围或暂时注释掉高度过滤条件进行测试。5.2 前端地图可视化测试测试目的确认前端页面能成功从后端API获取数据并在地图上正确显示飞机位置图标。操作步骤确保后端服务运行且已配置好静态文件服务或已解决跨域。在浏览器中打开前端页面如http://127.0.0.1:8000/static/index.html。观察页面加载情况。预期结果页面中心显示香港地区的地图并有一个标记显示香港国际机场位置。页面右上角信息面板显示“当前飞机数”大于0取决于实时流量。地图上出现多个飞机图标绿色标记分布在海面上空或陆地上空远离机场。点击飞机图标会弹出信息框显示航班号、高度、速度等信息。信息面板的“当前飞机数”会定期每10秒自动更新。判断成功标准地图正常加载无错误。能动态获取并显示飞机图标。图标位置随时间更新需要观察几分钟看飞机图标是否移动。常见失败原因跨域错误 (CORS)浏览器控制台出现CORS错误。需确保后端已正确配置CORS中间件如本文代码所示或前端与后端同源。API地址错误前端JavaScript中apiUrl变量指向的后端地址不正确。检查后端端口和路径。后端无数据如前所述后端API可能未返回数据导致前端flightCount为0。5.3 数据准确性验证测试目的粗略验证显示的数据是否合理。验证方法航班号显示的callsign通常为航空公司代码数字如“CPA123”国泰航空、“HDA123”香港航空。位置与航向飞机图标应主要出现在香港南部和西南部的海域上空航向true_track向东或东南离港飞往大洋方向。如果飞机出现在深圳上空且航向朝西那可能是到港航班说明过滤逻辑可能需要加强例如结合机场跑道方向或离港点判断。速度与高度离港航班速度通常在200-300节kt以上高度从几百英尺逐渐爬升。如果看到速度为0或极低可能是数据错误。6. 接口API与批量任务本项目构建的本身就是一个API服务。此外可以扩展其批量任务能力。6.1 API服务扩展上述示例只提供了一个获取当前快照的接口。可以扩展更多接口历史查询GET /api/history?icao24abc123startts1endts2航班详情GET /api/flight/{icao24}机场统计GET /api/airport/hkg/stats?date20240501在main.py中添加新的路由处理函数即可。6.2 批量数据抓取与存储对于历史分析需要定时抓取并存储数据。方案一使用定时任务 (Cron)创建一个单独的脚本crawler.pyimport requests import sqlite3 import time import schedule def fetch_and_store(): try: response requests.get(https://opensky-network.org/api/states/all, timeout30) data response.json() states data.get(states, []) conn sqlite3.connect(flights_history.db) c conn.cursor() ts int(time.time()) for state in states: # 存储所有数据或过滤后存储 if state and len(state) 10: c.execute(INSERT INTO all_flights_history VALUES (?,?,?,?,?,?,?,?,?,?), (state[0], state[1], state[2], state[5], state[6], state[7], state[9], state[10], state[11], ts)) conn.commit() conn.close() print(f[{time.ctime()}] 数据抓取成功记录数: {len(states)}) except Exception as e: print(f[{time.ctime()}] 抓取失败: {e}) # 每60秒执行一次 schedule.every(60).seconds.do(fetch_and_store) if __name__ __main__: while True: schedule.run_pending() time.sleep(1)然后使用nohup或systemd让此脚本在后台运行。方案二作为后端服务的一部分使用后台线程在FastAPI启动时启动一个后台线程来定时执行抓取任务将数据存入数据库。这样数据获取和API服务在同一个进程中。注意事项遵守频率限制仔细阅读所用数据源的条款不要超过免费额度。数据去重根据时间戳和飞机标识进行去重避免数据库膨胀。错误处理网络请求可能失败需要完善的重试和日志机制。7. 资源占用与性能观察本项目资源消耗极低主要瓶颈在于网络I/O和外部API调用。CPU与内存后端Python服务在空闲时CPU占用接近0%内存占用约50-100 MB取决于Python和框架。在抓取和处理数据瞬间会有小幅波动。网络带宽每次调用OpenSky的全局接口返回的JSON数据量大约在1-2 MB压缩后。定时抓取需考虑带宽和API限制。前端浏览器Leaflet地图和几十个标记对现代浏览器毫无压力。数据库使用SQLite存储历史数据初期增长缓慢。如果高频抓取全球数据数据库文件会快速增长需定期归档或清理。性能优化建议数据过滤前置如果可能使用数据源提供的区域查询接口如OpenSky的/api/states/all?lamin22.2lomin113.8lamax22.6lomax114.4只获取香港区域的数据大幅减少网络传输和后端处理压力。连接池与异步使用aiohttp进行异步HTTP请求避免在等待API响应时阻塞服务。数据缓存对前端请求的航班数据可以在内存中缓存5-10秒因为飞机位置变化不是秒级的减少对数据源和数据库的查询压力。静态资源CDN前端使用的Leaflet JS/CSS库使用公共CDN加快加载速度。8. 常见问题与排查方法问题现象可能原因排查方式解决方案后端服务启动失败端口被占用端口8000已被其他程序使用运行netstat -ano | findstr :8000(Win) 或lsof -i:8000(Linux/macOS)修改main.py中uvicorn.run的port参数如改为8001。访问http://127.0.0.1:8000/api/departures/hkg返回404或500错误1. 路由定义错误2. 外部API请求失败3. 代码语法错误1. 检查后端控制台日志2. 检查API URL和网络连通性3. 检查Python代码是否有缩进等语法错误1. 核对app.get的路由路径2. 尝试在浏览器中直接访问配置的OPENSKY_API_URL看是否返回数据3. 使用python -m py_compile main.py检查语法前端地图空白不显示地图1. 网络问题Leaflet CSS/JS未加载2. 地图容器#map的CSS高度为01. 浏览器F12控制台查看网络请求报错2. 检查元素样式1. 检查网络或更换Leaflet CDN源2. 确保#map的height和width样式设置正确前端能打开但看不到飞机图标flightCount为01. 后端API未返回数据2. 前端API地址 (apiUrl) 错误3. CORS跨域错误1. 直接访问后端API地址看是否有数据2. 浏览器F12控制台查看Network标签中前端对后端API的请求看状态码和响应3. 控制台查看是否有CORS错误1. 按5.1节排查后端问题2. 修正apiUrl3. 确保后端CORS配置正确或使用同源策略后端托管前端飞机图标位置不更新前端定时器 (setInterval) 未工作或后端数据无变化1. 检查浏览器控制台有无JS错误2. 手动点击“刷新”按钮看图标是否会更新位置1. 修复JS错误2. 如果手动刷新能更新检查setInterval逻辑如果手动刷新也不能更新问题在后端数据数据库文件增长过快抓取频率过高且未对数据进行去重或清理查看数据库文件大小和表内记录数1. 降低抓取频率2. 修改抓取逻辑只存储变化的数据或特定区域的数据3. 增加定时清理旧数据的任务9. 最佳实践与使用建议从简单开始逐步迭代先实现最基本的数据获取和显示功能确保整个链路跑通。然后再考虑添加历史查询、航班详情、多机场支持、更精美的UI等高级功能。重视数据源的选择与合规免费源OpenSky Network、ADS-B Exchange 是很好的起点但需注意其延迟、覆盖率和使用条款。商业源如需更高精度、更低延迟和更丰富的元数据如航班计划可考虑 AviationStack、FlightAware、Flightradar24 Business API 等但需要付费。始终遵守条款明确数据是否可用于公开项目、是否需要署名、是否有调用次数限制。设计合理的数据存储开发测试期用SQLite足够。如果数据量增大考虑迁移到 PostgreSQL PostGIS便于进行复杂的地理空间查询如“找出所有经过某区域的航班”。为数据表建立索引特别是时间戳 (timestamp) 和飞机标识 (icao24) 字段以加速查询。前端体验优化使用自定义的飞机图标并让图标根据航向 (true_track) 旋转使指向更直观。添加轨迹线显示飞机过去一段时间的飞行路径。实现地图聚类当缩放级别较小时将相近的飞机图标聚合显示。部署建议本地运行用于学习和测试。若要公开访问建议部署到云服务器如阿里云、腾讯云ECS。使用Nginx反向代理后端API和前端静态文件并配置SSL证书启用HTTPS。使用systemd或supervisor管理后端进程确保服务在异常退出后能自动重启。安全与隐私避免在公开页面上显示可能关联到具体个人或敏感行动的航班信息尽管ADS-B数据本身是公开的。如果使用商业API妥善保管API密钥不要将其硬编码在客户端JavaScript中。所有数据请求应通过你自己的后端服务转发。10. 总结与下一步这个“香港国际机场起飞的飞机们”项目本质上是一个经典的实时数据获取、处理与可视化案例。通过它你可以串联起API调用、后端服务开发、数据库操作和前端交互等多个技能点。最值得尝试的点在于其完整的链路和较低的门槛。你不需要昂贵的硬件或复杂的算法只需基础的编程知识就能搭建一个看得见、摸得着的动态系统亲眼看到数据如何从天空中的飞机经过网络、你的代码最终变成屏幕上移动的图标。最先应该验证的功能就是本文第5节描述的“后端API接口测试”和“前端地图可视化测试”。只要这两步通了整个项目就活了。最容易踩的坑主要是数据源的稳定性和跨域问题。免费API可能不稳定或有延迟初次接触CORS的前端开发者也常在此处受阻。按照第8节的排查方法大部分问题都能解决。后续可以继续扩展的方向非常多多机场支持扩展代码让用户可以选择查看北京首都机场、上海浦东机场等全球任何机场的航班。数据丰富化集成航班计划数据将实时位置与计划航班号、起降时间、机型等信息关联。高级分析基于历史数据分析机场高峰时段、热门航线、平均延误情况等。3D可视化使用Cesium.js等库在三维地球上展示航班效果更加震撼。移动端适配将前端页面优化为PWA渐进式Web应用在手机和平板上也能良好使用。建议将本文的代码作为起点根据你的兴趣和需求进行修改和扩展。在动手实践的过程中你会对网络编程、数据处理和地理信息系统有更深刻的理解。

相关新闻

最新新闻

AI开发新范式:从桑德斯公开信看安全、透明与责任框架的技术落地

AI开发新范式:从桑德斯公开信看安全、透明与责任框架的技术落地

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

2026/9/2 16:48:44
Spewer:给Codex/Claude Code加一层任务路由,让API账单不再失控

Spewer:给Codex/Claude Code加一层任务路由,让API账单不再失控

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

2026/9/2 16:48:44
工业自动化Modbus RTU协议转换实战:AM521与力准称重仪表通信集成

工业自动化Modbus RTU协议转换实战:AM521与力准称重仪表通信集成

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

2026/9/2 16:48:44
518超市播音软件v5.3实战:定时播音与语音合成部署指南

518超市播音软件v5.3实战:定时播音与语音合成部署指南

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

2026/9/2 16:48:44
计算机考研408算术移位一图流笔记:核心规则、易错点与高效复习路径

计算机考研408算术移位一图流笔记:核心规则、易错点与高效复习路径

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

2026/9/2 16:48:44
端到端视觉语言动作模型(VLA)技术原理与工程实践详解

端到端视觉语言动作模型(VLA)技术原理与工程实践详解

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

2026/9/2 16:43:44