更新时间:2026-05-31
适合读者:想快速体验 Wingbits AI、调用 Wingbits Customer API、并把实时航班数据接入业务系统的开发者。
说明:截至本文整理时,Wingbits 公开开发者文档主要提供 Customer API,用于读取实时/历史航班数据;Wingbits AI 的自然语言 Agent 能力主要通过网页端使用。本文会把“AI Agent 使用”和“API 程序化调用”分开讲,避免把网页端能力误写成已公开的 Agent API。


一、Wingbits AI 核心功能与应用场景解析

Wingbits AI 的定位是“用自然语言监控天空”。它不是传统意义上的航班查询网站,而是把实时航空数据、地理区域监控、自动化告警和 AI Agent 结合起来,让用户用一句话描述监控目标,再让 Agent 持续运行。

从官方页面可以看到,Wingbits AI 的核心能力可以拆成四类:

  1. 实时空域问答
    用户可以直接询问某个区域、某架飞机、某类机队当前的飞行状态。例如:查询某机场附近的航班、查看某个 ICAO 地址对应飞机的实时位置、了解某片区域内是否存在异常活动。

  2. 自动化 Agent 监控
    用户可以创建持续运行的 Agent,让它在后台按设定频率检查空域数据,并在满足条件时发送提醒。典型场景包括:VIP 飞机活动提醒、某地区军机/公务机监控、机场延误与备降日报、GPS 干扰事件监控等。

  3. 告警与报告推送
    Wingbits AI 支持将告警或分析结果推送到 Slack、Teams、邮箱等协作工具,适合媒体、机场运营、物流、航空情报、OSINT 调查等团队使用。

  4. Customer API 数据接入
    对开发者来说,最重要的是 Wingbits Customer API。官方文档显示,该 API 基于 REST,只读访问,支持读取航班位置、航班详情、航迹路径、飞机详情以及 GPS 干扰相关数据。基础地址为:

https://customer-api.wingbits.com/

在这里插入图片描述


二、环境依赖检查与账号注册流程

如果只是体验 Wingbits AI 的网页端 Agent,准备一个浏览器和邮箱账号即可。如果要写代码调用 API,建议准备如下环境:

python --version
pip --version

推荐环境:

类型 建议版本或工具
Python 3.10+
HTTP 调试 curl、Apifox、Postman 任选其一
Python 依赖 requests、python-dotenv、pandas、folium
可视化 folium / plotly / kepler.gl
运行环境 本机、云服务器、定时任务、Docker 均可

安装依赖:

pip install requests python-dotenv pandas folium

账号注册流程建议按这个顺序走:

  1. 打开 Wingbits AI 官网:https://www.wingbits.ai/
  2. 点击 Set up your free agentGet started
  3. 进入 https://app.wingbits.ai/ 后完成注册或登录。
  4. 如果要调用 API,进入 Wingbits 账号后台或 API Dashboard,找到 API Key 管理入口。
  5. 如果后台没有 API Key 入口,通常说明当前账号套餐或权限尚未开通 Customer API,需要检查定价页或联系官方支持。

在这里插入图片描述


三、API 密钥获取与安全配置方法

Wingbits Customer API 使用 API Key 鉴权。官方文档说明,API Key 可以从 Wingbits 账号 Dashboard 获取,请求时需要把 Key 放进请求头或请求参数中。开发时更推荐放在请求头里,官方 OpenAPI 文档中的安全方案使用的是:

x-api-key: YOUR_API_KEY

不要把 API Key 写死在代码里,也不要提交到 Git 仓库。推荐使用环境变量或 .env 文件。

.env 示例:

WINGBITS_API_KEY=your_api_key_here
WINGBITS_BASE_URL=https://customer-api.wingbits.com

Python 读取配置:

from dotenv import load_dotenv
import os

load_dotenv()

API_KEY = os.getenv("WINGBITS_API_KEY")
BASE_URL = os.getenv("WINGBITS_BASE_URL", "https://customer-api.wingbits.com")

if not API_KEY:
    raise RuntimeError("请先配置 WINGBITS_API_KEY")

安全建议:

  • 只在服务端使用 API Key,不要放在前端 JavaScript、移动端包体或公开配置文件中。
  • 日志里只打印 Key 的前后几位,例如 wb_****abcd,不要打印完整 Key。
  • 团队协作时按环境区分 Key,例如 devstagingprod
  • 如果怀疑泄露,立即在 Dashboard 中删除旧 Key 并创建新 Key。
  • 生产环境优先使用云厂商 Secret Manager、Kubernetes Secret、GitHub Actions Secrets 等托管方案。

四、首个 AI 调用请求的代码实现

这里需要先说清楚一个边界:目前公开文档中可直接编程调用的是 Wingbits Customer API,它提供实时航班和 GPS 相关数据;Wingbits AI 的自然语言 Agent 主要在网页端创建和运行。因此本文的“首个 AI 调用请求”采用开发者最容易落地的方式:先通过 API 拉取实时航班数据,再把这类数据接入自己的 AI 分析、告警或报表流程。

先检查服务是否可用:

curl https://customer-api.wingbits.com/health

如果服务正常,会返回类似 statustimestampversionuptime 等字段。

接下来查询 JFK 机场附近 30 海里范围内的航班:

curl -G "https://customer-api.wingbits.com/v1/flights" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "by=radius" \
  --data-urlencode "la=40.6413" \
  --data-urlencode "lo=-73.7781" \
  --data-urlencode "rad=30" \
  --data-urlencode "unit=nm"

Python 版本:

import os
import requests
from dotenv import load_dotenv

load_dotenv()

BASE_URL = os.getenv("WINGBITS_BASE_URL", "https://customer-api.wingbits.com")
API_KEY = os.getenv("WINGBITS_API_KEY")

headers = {
    "x-api-key": API_KEY,
}

params = {
    "by": "radius",
    "la": 40.6413,
    "lo": -73.7781,
    "rad": 30,
    "unit": "nm",
}

resp = requests.get(
    f"{BASE_URL}/v1/flights",
    headers=headers,
    params=params,
    timeout=(3.05, 15),
)

resp.raise_for_status()
flights = resp.json()

print(f"当前区域航班数量:{len(flights)}")
for item in flights[:5]:
    print(item.get("h"), item.get("f"), item.get("la"), item.get("lo"), item.get("ab"))

如果你希望做“自然语言 + 数据”的 AI 应用,可以把这一步作为数据层:先由 Wingbits API 获取实时航空数据,再交给自己的 LLM 做摘要、异常解释、日报生成或告警文本生成。


五、典型业务场景下的参数调优技巧

Wingbits Customer API 的 /v1/flights 支持按地理范围查询。常见参数如下:

参数 说明 调优建议
by 查询方式,boxradius 机场周边适合 radius,城市/航路区域适合 box
la 中心点纬度 范围:-90 到 90
lo 中心点经度 范围:-180 到 180
rad 半径 by=radius 时使用,单位由 unit 决定
w / h 宽度和高度 by=box 时使用
unit kmnm 航空场景更常用 nm
min_ab / max_ab 气压高度过滤,单位英尺 低空监控可设置 max_ab,巡航层分析可设置较高区间
categories 飞机类别代码,逗号分隔 用于过滤不同类型的航空器

几个典型场景:

机场运行监控

以机场坐标为圆心,半径设置为 20 到 50 海里,关注进近、离场和盘旋等待情况。可以用 max_ab 过滤低空阶段。

params = {
    "by": "radius",
    "la": 40.6413,
    "lo": -73.7781,
    "rad": 30,
    "unit": "nm",
    "max_ab": 12000,
}

区域空域态势

对一个城市或敏感区域做矩形框查询,适合做持续看板。

params = {
    "by": "box",
    "la": 34.0522,
    "lo": -118.2437,
    "w": 80,
    "h": 60,
    "unit": "nm",
}

多区域并行查询

官方文档提供 POST /v1/flights,可以一次查询多个地理区域,并用 alias 区分返回结果。适合同时监控多个机场、多个城市或多个业务区域。

payload = [
    {
        "alias": "jfk",
        "by": "radius",
        "la": 40.6413,
        "lo": -73.7781,
        "rad": 30,
        "unit": "nm",
    },
    {
        "alias": "lax",
        "by": "radius",
        "la": 33.9416,
        "lo": -118.4085,
        "rad": 30,
        "unit": "nm",
    },
]

resp = requests.post(
    f"{BASE_URL}/v1/flights",
    headers={**headers, "Content-Type": "application/json"},
    json=payload,
    timeout=(3.05, 20),
)
resp.raise_for_status()
data = resp.json()

GPS 干扰监控

GET /v1/gps/jam 用于获取指定边界框内的 GPS accuracy hexes。适合做区域异常热力图、日报或告警。

params = {
    "min_lat": 24.0,
    "max_lat": 31.0,
    "min_lng": 46.0,
    "max_lng": 57.0,
    "date": "2026-05-31",
}

resp = requests.get(
    f"{BASE_URL}/v1/gps/jam",
    headers=headers,
    params=params,
    timeout=(3.05, 20),
)
resp.raise_for_status()
gps_data = resp.json()

六、返回数据解析与结果可视化展示

航班列表接口返回的是数组。常见字段可以这样理解:

字段 含义
h ICAO 24-bit aircraft address
la / lo 纬度、经度
f 航班号或 callsign
c 航空器类别
ab 气压高度
ag GPS 高度
gs 地速
sq 应答机 squawk code
t 数据类型,例如 ADSB、ADSC、MLAT
ra 数据接收时间
og 是否在地面

最小化解析函数:

def normalize_flight(item: dict) -> dict:
    return {
        "icao24": item.get("h"),
        "callsign": item.get("f"),
        "lat": item.get("la"),
        "lon": item.get("lo"),
        "altitude_barometric": item.get("ab"),
        "altitude_gps": item.get("ag"),
        "ground_speed": item.get("gs"),
        "squawk": item.get("sq"),
        "source_type": item.get("t"),
        "received_at": item.get("ra"),
        "on_ground": item.get("og"),
    }

用 folium 生成一张本地地图:

import folium

center = [40.6413, -73.7781]
flight_map = folium.Map(location=center, zoom_start=8, tiles="OpenStreetMap")

for item in flights:
    lat = item.get("la")
    lon = item.get("lo")
    if lat is None or lon is None:
        continue

    callsign = item.get("f") or "UNKNOWN"
    icao24 = item.get("h") or "-"
    altitude = item.get("ab") or "-"
    speed = item.get("gs") or "-"

    popup = f"""
    <b>{callsign}</b><br>
    ICAO24: {icao24}<br>
    Altitude: {altitude}<br>
    Ground Speed: {speed}
    """

    folium.CircleMarker(
        location=[lat, lon],
        radius=4,
        popup=popup,
        color="#0f766e",
        fill=True,
        fill_opacity=0.8,
    ).add_to(flight_map)

flight_map.save("wingbits_flights_map.html")
print("已生成 wingbits_flights_map.html")

生成地图后,用浏览器打开 wingbits_flights_map.html,即可看到航班点位分布。


七、常见连接超时与鉴权失败排查

建议先从 /health 开始排查:

curl https://customer-api.wingbits.com/health

如果 /health 正常,而业务接口失败,再看状态码。

状态码 常见原因 处理方式
400 参数不合法,例如经纬度超范围、缺少 radwh 等必填参数 对照接口文档检查参数
401 API Key 缺失、错误或已失效 检查 x-api-key 请求头,必要时重新生成 Key
402 当前套餐或余额不支持该请求 检查订阅计划、额度或账单状态
404 航班 ID、ICAO24 或路径不存在 确认查询对象是否仍在数据范围内
429 请求过于频繁或超过配额 降低并发,增加退避重试
500 服务端异常 记录请求参数和时间,稍后重试或联系支持

Python 中建议显式设置连接超时和读取超时:

resp = requests.get(
    f"{BASE_URL}/v1/flights",
    headers=headers,
    params=params,
    timeout=(3.05, 15),
)

排查顺序:

  1. 确认 URL 是 https://customer-api.wingbits.com/,不要使用 http
  2. 确认请求头名称是 x-api-key
  3. 确认本机或服务器网络可以访问外网。
  4. 确认代理、防火墙、公司网关没有拦截 HTTPS 请求。
  5. 将完整 URL、状态码、响应 body、请求耗时记录到日志,但不要记录完整 API Key。

八、并发调用限制与配额管理策略

官方文档说明,每个请求限制取决于当前订阅计划。Wingbits 官方博客也提到,自助 API Dashboard 支持使用量监控、套餐升级和免费额度测试。实际开发时,不要把 API 当成无限制数据流使用,应当主动做配额管理。

推荐策略:

  1. 请求分层
    对实时看板使用短周期刷新,对日报、周报、历史分析使用较低频率任务。

  2. 本地缓存
    对同一地区、同一时间窗口内的重复查询做 10 到 60 秒缓存。机场级态势通常不需要每个用户都打一次 API。

  3. 退避重试
    遇到 429 后不要立即重试,使用指数退避。

import time
import requests

def request_with_backoff(url, *, headers, params=None, max_retries=3):
    for attempt in range(max_retries):
        resp = requests.get(url, headers=headers, params=params, timeout=(3.05, 15))

        if resp.status_code != 429:
            resp.raise_for_status()
            return resp.json()

        sleep_seconds = 2 ** attempt
        time.sleep(sleep_seconds)

    raise RuntimeError("请求超过重试次数,可能已经触发限流")
  1. 按业务拆额度
    生产系统里至少区分三类调用:用户即时查询、后台定时任务、告警任务。不要让低优先级任务挤占告警额度。

  2. 监控用量
    每次请求记录接口名、状态码、耗时、返回数量和业务方。每天聚合一次,及时发现异常增长。


九、本地调试工具与日志监控方案

本地调试可以使用三类工具:

工具 适合场景
curl 快速验证连通性、鉴权和参数
Apifox / Postman 保存接口集合、团队共享调试参数
Python 脚本 接入业务逻辑、可视化和自动化任务

推荐把日志统一成结构化格式:

import logging
import time

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
)

def fetch_flights(params):
    started = time.time()
    url = f"{BASE_URL}/v1/flights"

    try:
        resp = requests.get(url, headers=headers, params=params, timeout=(3.05, 15))
        elapsed_ms = int((time.time() - started) * 1000)

        logging.info(
            "wingbits_request endpoint=%s status=%s elapsed_ms=%s",
            "/v1/flights",
            resp.status_code,
            elapsed_ms,
        )

        resp.raise_for_status()
        return resp.json()

    except requests.Timeout:
        logging.exception("wingbits_timeout endpoint=/v1/flights")
        raise
    except requests.HTTPError:
        logging.exception("wingbits_http_error body=%s", resp.text[:500])
        raise

日志里建议保留:

  • endpoint
  • status_code
  • elapsed_ms
  • params 的脱敏版本
  • 返回数据条数
  • 业务调用方
  • 错误响应前 500 个字符

不建议记录:

  • 完整 API Key
  • 用户隐私数据
  • 大量原始响应 body
  • 可反推出敏感监控目标的完整任务配置

十、从 Demo 到生产环境的部署要点

Demo 能跑通,不代表生产环境就稳定。上线前至少补齐以下能力。

1. 服务端代理

如果你的产品有 Web 前端,不要让浏览器直接调用 Wingbits API。正确做法是:

Browser -> Your Backend -> Wingbits Customer API

这样可以隐藏 API Key,也方便统一做限流、缓存、日志和权限控制。

2. 配置与密钥管理

生产环境使用 Secret Manager 或 CI/CD Secret 注入,不要把 .env 文件上传到服务器镜像或代码仓库。

3. 错误处理

400401402429 做明确提示。尤其是 402429,它们通常和套餐、配额、调用频率有关,应当进入监控系统。

4. 缓存与降级

实时数据业务很容易被刷新按钮打爆。建议按接口和区域缓存:

cache_key = endpoint + sorted(params)
ttl = 10s ~ 60s

当上游 API 临时不可用时,可以返回最近一次成功结果,并在页面上标记数据更新时间。

5. 任务调度

后台 Agent 或定时任务要避免所有任务同时触发。可以按业务优先级错峰执行,例如每分钟第 0 秒跑机场告警,第 15 秒跑日报数据,第 30 秒跑可视化刷新。

6. 可观测性

生产环境至少监控以下指标:

  • API 成功率
  • P95 / P99 响应耗时
  • 401402429 数量
  • 每日请求总量
  • 每个业务模块请求量
  • 告警任务漏检或延迟次数

7. 合规与数据使用边界

航空数据可能涉及商业、媒体、OSINT 和安全场景。上线前要明确数据用途、保存周期、访问权限和告警分发范围。对于 VIP、OSINT、敏感区域监控等场景,应当遵守平台条款和当地法律法规。


小结

Wingbits AI 更适合做“空域监控 Agent”和“航空数据自动化告警”,而 Wingbits Customer API 适合开发者把实时航班、飞机详情、航迹和 GPS 干扰数据接入自己的系统。

新手上手时建议先走三步:

  1. 在网页端创建一个 Wingbits AI Agent,理解自然语言监控流程。
  2. /health/v1/flights 跑通第一条 API 请求。
  3. 在本地完成数据解析、地图可视化、日志和限流,再考虑部署到生产环境。

只要把 API Key 管好、请求频率控好、日志和异常处理补齐,从 Demo 走到生产并不复杂。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐