一、接口能查到什么
接口盒子的这个接口一次性覆盖了实时台风 + 历史台风两类需求,而且数据粒度很细,不只是给你一个「台风名字」:
- 台风基础信息:中文名、英文名、国内编号、国际编号、代号寓意、当前状态(移动/停止)
- 逐时段实况路径:时间、经纬度、强度等级、中心气压、风速、移向、移速
- 风圈半径:7 级、10 级、12 级风圈,且按东北/东南/西南/西北四个象限分别给出
- 未来预报路径:12h / 24h / 36h / 48h / 72h / 96h / 120h 的预测位置、强度、气压、风速
换句话说,做一个台风路径动画或者影响范围评估,这套数据基本够用。
二、请求地址与参数
请求地址
https://cn.apihz.cn/api/tianqi/taifeng.php
请求方式:GET 或 POST 均可。
| 参数 | 名称 | 必填 | 说明 |
|---|---|---|---|
| id | 用户 ID | 是 | 用户中心的数字 ID,如 id=10000000 |
| key | 用户 KEY | 是 | 用户中心通讯秘钥 |
| year | 年份 | 否 | 2000 年到当前年,传此参数返回当年台风列表,与 no 二选一 |
| no | 台风编号 | 否 | 传此参数返回该台风详情,与 year 二选一 |
三、两种调用模式
模式 1:传 year ------ 拿某一年台风列表
比如 year=2026,返回的是这一年的台风清单,里面包含 list.no1这个台风唯一编号,再用它去查详情。
返回核心字段:
| 字段 | 含义 |
|---|---|
| list.no1 | 台风唯一编号,用来查详情 |
| list.no2 | 国内编号 |
| list.no3 | 国际编号 |
| list.namecn | 中文代号 |
| list.nameen | 英文代号 |
| list.explanation | 代号寓意 |
| list.type | start=移动,stop=停止 |
模式 2:传 no ------ 拿单个台风完整详情
这是最常用的姿势。拿到编号后,返回的数据包非常完整:
台风头部信息
| 字段 | 含义 |
|---|---|
| no1 / no2 / no3 | 各类编号 |
| namecn / nameen | 中英文名称 |
| explanation | 名字寓意 |
| type | 当前状态 |
datas 路径数据集(每个时间点一条)
| 字段 | 含义 |
|---|---|
| time_ymdh | 时间点 |
| lat / lon | 中心经纬度 |
| position_text | 坐标描述 |
| intensity_code / intensity_text | 强度代码与中文 |
| pressure_hpa | 中心最低气压 |
| wind_speed_ms | 中心风速 |
| intensity_desc | 强度完整文本 |
| move_dir_code / move_dir_text | 移向 |
| move_speed_kmh / move_desc | 移速 |
| wind_radius | 风圈数据集 |
| forecast_babj | 未来预报节点(一般只在最后一个时间段出现) |
风圈 wind_radius 子字段
| 字段 | 含义 |
|---|---|
| grade / grade_text | 风级代码与中文 |
| ne/se/sw/nw_radius_km | 四象限半径 |
| avg_radius_km | 四向平均半径,适合快速评估影响范围 |
预报 forecast_babj 子字段
| 字段 | 含义 |
|---|---|
| forecast_hour | 未来小时数 |
| target_time_ymdh | 预报时间 |
| lat / lon | 预测位置 |
| pressure_hpa / wind_speed_ms | 预测气压风速 |
| intensity_code / intensity_text | 预测强度 |
| forecast_desc | 预报描述 |
四、返回数据示例
失败返回
{"code":400,"msg":"查询失败,请重试。"}
成功返回(节选关键结构)
{
"code": 200,
"no1": "3257931",
"no2": "2609",
"no3": "2609",
"namecn": "巴威",
"nameen": "BAVI",
"explanation": "位于越南北部的山脉",
"type": "start",
"datas": [
{
"time_ymdh": "2026-07-02 08:00:00",
"lat": 11,
"lon": 160.1,
"position_text": "11.0°N, 159.4°E",
"intensity_code": "TS",
"intensity_text": "热带风暴",
"pressure_hpa": 998,
"wind_speed_ms": 18,
"intensity_desc": "热带风暴,中心气压998hPa,最大风速18m/s",
"move_dir_code": "WNW",
"move_dir_text": "西北西",
"move_speed_kmh": 20,
"move_desc": "向西北西移动,时速20公里",
"wind_radius": [
{
"grade": "30KTS",
"grade_text": "七级",
"grade_desc": "七级风圈(≥17.2m/s,风力7级)",
"ne_radius_km": 280,
"se_radius_km": 180,
"sw_radius_km": 180,
"nw_radius_km": 220,
"avg_radius_km": 215
}
]
}
],
"forecast_babj": [
{
"forecast_hour": 24,
"target_time_ymdh": "202607070600",
"lat": 17.2,
"lon": 133.4,
"pressure_hpa": 930,
"wind_speed_ms": 55,
"intensity_code": "SuperTY",
"intensity_text": "超强台风",
"forecast_desc": "24小时后:17.2°N, 133.4°E,超强台风,气压930hPa,风速55m/s"
}
]
}
五、PHP 调用示例
示例 1:GET 方式(最简单)
<?php
$apiUrl = 'https://接口盒子/api/tianqi/taifeng.php';
// 替换为自己的 ID 和 KEY
$userId = '10000000';
$userKey = '15he5h15ty854j5sr152hs2';
// 方式一:查 2026 年台风列表
$params = [
'id' => $userId,
'key' => $userKey,
'year' => 2026,
'no' => ''
];
// 方式二:查指定台风详情(拿到 no1 后使用)
// $params = [
// 'id' => $userId,
// 'key' => $userKey,
// 'year'=> '',
// 'no' => '3257931'
// ];
$url = $apiUrl . '?' . http_build_query($params);
$response = file_get_contents($url);
$data = json_decode($response, true);
if ($data['code'] == 200) {
echo "查询成功\n";
echo "台风名称:{$data['namecn']} ({$data['nameen']})\n";
echo "当前状态:{$data['type']}\n";
foreach ($data['datas'] as $item) {
echo "时间:{$item['time_ymdh']},位置:{$item['position_text']},强度:{$item['intensity_text']},风速:{$item['wind_speed_ms']}m/s\n";
}
// 未来预报
if (!empty($data['forecast_babj'])) {
echo "\n未来预报:\n";
foreach ($data['forecast_babj'] as $f) {
echo "{$f['forecast_desc']}\n";
}
}
} else {
echo "查询失败:{$data['msg']}\n";
}
示例 2:POST 方式(cURL,更规范)
<?php
$apiUrl = 'https://接口盒子/api/tianqi/taifeng.php';
$userId = '10000000';
$userKey = '15he5h15ty854j5sr152hs2';
$postData = [
'id' => $userId,
'key' => $userKey,
'year' => 2026,
'no' => ''
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo '请求错误:' . curl_error($ch);
exit;
}
curl_close($ch);
$data = json_decode($response, true);
header('Content-Type:text/html;charset=utf-8');
if ($data['code'] == 200) {
echo '<h3>台风:' . $data['namecn'] . ' ' . $data['nameen'] . '</h3>';
echo '<p>代号寓意:' . $data['explanation'] . '</p>';
echo '<p>当前状态:' . $data['type'] . '</p>';
echo '<h4>路径数据:</h4><ul>';
foreach ($data['datas'] as $v) {
echo "<li>{$v['time_ymdh']} | {$v['position_text']} | {$v['intensity_text']} | 风速{$v['wind_speed_ms']}m/s | {$v['move_desc']}</li>";
}
echo '</ul>';
} else {
echo '接口返回错误:' . $data['msg'];
}
六、Python 调用示例
示例 1:GET 方式
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import json
class TyphoonAPI:
def __init__(self, uid, ukey):
self.url = "https://接口盒子/api/tianqi/taifeng.php"
self.uid = uid
self.ukey = ukey
def query(self, year=None, no=None):
params = {
"id": self.uid,
"key": self.ukey,
"year": year,
"no": no
}
try:
resp = requests.get(self.url, params=params, timeout=10)
resp.raise_for_status()
return resp.json()
except Exception as e:
return {"code": 400, "msg": f"请求异常: {e}"}
if __name__ == "__main__":
# 替换为自己的 ID 和 KEY
api = TyphoonAPI(uid="10000000", ukey="15he5h15ty854j5sr152hs2")
# 1. 先查年份列表
data = api.query(year=2026)
# 2. 再查某个台风详情
# data = api.query(no="3257931")
if data.get("code") == 200:
print(f"台风:{data.get('namecn')}({data.get('nameen')})")
print(f"寓意:{data.get('explanation')}")
print(f"状态:{data.get('type')}")
print("-" * 60)
for item in data.get("datas", []):
print(
f"{item['time_ymdh']} | "
f"{item['position_text']} | "
f"{item['intensity_text']} | "
f"风速{item['wind_speed_ms']}m/s | "
f"{item['move_desc']}"
)
# 风圈信息
if data["datas"]:
last = data["datas"][-1]
for wr in last.get("wind_radius", []):
print(
f"风圈:{wr['grade_text']},"
f"四向平均半径{wr['avg_radius_km']}km,"
f"NE{wr['ne_radius_km']}/SE{wr['se_radius_km']}/"
f"SW{wr['sw_radius_km']}/NW{wr['nw_radius_km']}"
)
# 未来预报
if data.get("forecast_babj"):
print("\n未来预报:")
for f in data["forecast_babj"]:
print(f["forecast_desc"])
else:
print(f"查询失败:{data.get('msg')}")
示例 2:POST 方式
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
台风 API - Python POST 示例
"""
import requests
def query_typhoon(uid, ukey, year=None, no=None):
url = "https://接口盒子/api/tianqi/taifeng.php"
data = {
"id": uid,
"key": ukey,
"year": year,
"no": no
}
try:
resp = requests.post(url, data=data, timeout=10)
resp.raise_for_status()
return resp.json()
except Exception as e:
return {"code": 400, "msg": str(e)}
if __name__ == "__main__":
UID = "10000000"
UKEY = "15he5h15ty854j5sr152hs2"
result = query_typhoon(UID, UKEY, year=2026)
if result["code"] == 200:
# 如果是列表模式
if "list" in result:
print("2026 年台风列表:")
for t in result["list"]:
print(
f"编号:{t['no1']},"
f"中文名:{t['namecn']},"
f"英文名:{t['nameen']},"
f"状态:{t['type']}"
)
else:
print(f"台风详情:{result['namecn']}")
else:
print(f"错误:{result['msg']}")
七、常见坑位与注意事项
- year 和 no 必须传一个:两个都空会直接失败,推荐先用 year 拿列表、再用 no1 查详情。
- 历史年份范围:支持 2000 年到当前年份,查不到 1999 年的。
- 强度代码含义:TS=热带风暴、STS=强热带风暴、TY=台风、STY=强台风、SuperTY=超强台风,做可视化时可以直接映射颜色。
- 风圈 avg_radius_km 很好用:不想画四个象限,直接用平均值就能快速圈出影响范围。