Skip to content

公开地图接口(natlan.io 首页「lay of the land」栏目)

GET /api/v1/public/map无鉴权、公开。一个接口喂两个区块:nodes/links 渲染世界地图,stats 供数据条(节点/会话/路由)三个数字。两面(TS Worker / Python 温备)同形实现。

响应

json
{
  "asn": 4242420028,
  "updated_at": "2026-07-13T22:14:44.128Z",
  "stats": { "nodes_online": 9, "bgp_sessions": 97, "routes": 2401 },
  "nodes": [
    { "label": "hkg", "lat": 22.3, "lon": 114.2, "online": true }
  ],
  "links": [ ["can", "hkg"], ["hkg", "tyo"] ]
}
字段语义
asn本网 ASN(取自节点 spec node.asn;无节点时 null
updated_at响应生成时刻(ISO 8601);命中缓存时为缓存生成时刻
stats.nodes_online在线物理节点数(health 为 ok/degraded 都算在线;stale/down 不算)
stats.bgp_sessions全 fleet established BGP 会话数(内 iBGP + 外 eBGP)
stats.routes各节点路由表规模的中位数(iBGP 收敛后趋同,代表网络表规模;非求和)
nodes[]地图城市点,label 升序。label = IATA 城市码(site);坐标为城市级、四舍五入 1 位小数;online = 该城市任一节点在线
links[]城市对([a, b]a < b 字典序,整体排序稳定),由节点级 IGP 邻接折叠去重

隐私裁剪(不变量)

同城多节点折叠为一个地图点、城内互联自环边剔除——node_id、IP、endpoint、 agent 版本、健康细节一概不出网nodes[] 元素只有 label/lat/lon/online 四个键。坐标 1 位小数 ≈ 11km 粒度,只到城市级。

缓存与 CORS

  • Cache-Control: public, max-age=300:浏览器与 CDN 各 5 分钟新鲜度。
  • TS 面另经 Workers Cache API 缓 300s(缓存键剥查询串——任意随机参数不可穿透)。
  • CORS:TS 面 CORS_ORIGINS(当前 *)放行;Python 面白名单已加 https://natlan.io(生产 TOML cors_origins)。

前端接法

js
const r = await fetch('https://api.natlan.io/api/v1/public/map');
const { stats, nodes, links } = await r.json();
// nodes → 地图打点(label 即城市码,online 控制点态)
// links → 以 label 查 nodes 坐标连弧线
// stats → 数据条三个数字,替换〔示例〕占位

轮询无意义(5 分钟缓存),页面加载取一次即可。