更新
This commit is contained in:
412
api/tq/city.php
Normal file
412
api/tq/city.php
Normal file
@@ -0,0 +1,412 @@
|
||||
<?php
|
||||
//城市数组,每一个key,对应着天气预报接口中的城市id
|
||||
$Citys=array (
|
||||
54511 => '北京 ',
|
||||
58367 => '上海 ',
|
||||
54517 => '天津 ',
|
||||
57516 => '重庆 ',
|
||||
45005 => '香港 ',
|
||||
45011 => '澳门 ',
|
||||
50953 => '哈尔滨 ',
|
||||
50745 => '齐齐哈尔 ',
|
||||
54094 => '牡丹江 ',
|
||||
50842 => '大庆 ',
|
||||
50774 => '伊春 ',
|
||||
50884 => '双鸭山 ',
|
||||
50775 => '鹤岗 ',
|
||||
50978 => '鸡西 ',
|
||||
50873 => '佳木斯 ',
|
||||
50971 => '七台河 ',
|
||||
50468 => '黑河 ',
|
||||
50853 => '绥化 ',
|
||||
50442 => '大兴安岭 ',
|
||||
54161 => '长春 ',
|
||||
54172 => '吉林 ',
|
||||
54371 => '白山 ',
|
||||
50936 => '白城 ',
|
||||
54157 => '四平 ',
|
||||
50946 => '松原 ',
|
||||
54260 => '辽源 ',
|
||||
50945 => '大安 ',
|
||||
54363 => '通化 ',
|
||||
54342 => '沈阳 ',
|
||||
54662 => '大连 ',
|
||||
54453 => '葫芦岛 ',
|
||||
54660 => '旅顺 ',
|
||||
54346 => '本溪 ',
|
||||
54353 => '抚顺 ',
|
||||
54249 => '铁岭 ',
|
||||
54347 => '辽阳 ',
|
||||
54471 => '营口 ',
|
||||
54237 => '阜新 ',
|
||||
54324 => '朝阳 ',
|
||||
54337 => '锦州 ',
|
||||
54497 => '丹东 ',
|
||||
54339 => '鞍山 ',
|
||||
53463 => '呼和浩特 ',
|
||||
54102 => '锡林浩特 ',
|
||||
53446 => '包头 ',
|
||||
54218 => '赤峰 ',
|
||||
50527 => '海拉尔 ',
|
||||
53512 => '乌海 ',
|
||||
53543 => '鄂尔多斯 ',
|
||||
54135 => '通辽 ',
|
||||
53698 => '石家庄 ',
|
||||
54534 => '唐山 ',
|
||||
54401 => '张家口 ',
|
||||
54515 => '廊坊 ',
|
||||
53798 => '邢台 ',
|
||||
53892 => '邯郸 ',
|
||||
54616 => '沧州 ',
|
||||
54702 => '衡水 ',
|
||||
54423 => '承德 ',
|
||||
54602 => '保定 ',
|
||||
54449 => '秦皇岛 ',
|
||||
57083 => '郑州 ',
|
||||
57091 => '开封 ',
|
||||
57073 => '洛阳 ',
|
||||
57171 => '平顶山 ',
|
||||
53982 => '焦作 ',
|
||||
53990 => '鹤壁 ',
|
||||
53986 => '新乡 ',
|
||||
53898 => '安阳 ',
|
||||
54900 => '濮阳 ',
|
||||
57089 => '许昌 ',
|
||||
57186 => '漯河 ',
|
||||
57051 => '三门峡 ',
|
||||
57178 => '南阳 ',
|
||||
58005 => '商丘 ',
|
||||
57297 => '信阳 ',
|
||||
57195 => '周口 ',
|
||||
57290 => '驻马店 ',
|
||||
54823 => '济南 ',
|
||||
54857 => '青岛 ',
|
||||
54830 => '淄博 ',
|
||||
54774 => '威海 ',
|
||||
54918 => '曲阜 ',
|
||||
54938 => '临沂 ',
|
||||
54765 => '烟台 ',
|
||||
58024 => '枣庄 ',
|
||||
54806 => '聊城 ',
|
||||
54915 => '济宁 ',
|
||||
54906 => '菏泽 ',
|
||||
54827 => '泰安 ',
|
||||
54945 => '日照 ',
|
||||
54736 => '东营 ',
|
||||
54714 => '德州 ',
|
||||
54734 => '滨州 ',
|
||||
54828 => '莱芜 ',
|
||||
54843 => '潍坊 ',
|
||||
53772 => '太原 ',
|
||||
53782 => '阳泉 ',
|
||||
53976 => '晋城 ',
|
||||
53778 => '晋中 ',
|
||||
53868 => '临汾 ',
|
||||
53959 => '运城 ',
|
||||
53882 => '长治 ',
|
||||
53578 => '朔州 ',
|
||||
53674 => '忻州 ',
|
||||
53487 => '大同 ',
|
||||
58238 => '南京 ',
|
||||
58357 => '苏州 ',
|
||||
58356 => '昆山 ',
|
||||
58259 => '南通 ',
|
||||
58377 => '太仓 ',
|
||||
58349 => '吴县 ',
|
||||
58027 => '徐州 ',
|
||||
58346 => '宜兴 ',
|
||||
58248 => '镇江 ',
|
||||
58145 => '淮安 ',
|
||||
58352 => '常熟 ',
|
||||
58151 => '盐城 ',
|
||||
58246 => '泰州 ',
|
||||
58354 => '无锡 ',
|
||||
58044 => '连云港 ',
|
||||
58245 => '扬州 ',
|
||||
58343 => '常州 ',
|
||||
58131 => '宿迁 ',
|
||||
58321 => '合肥 ',
|
||||
58326 => '巢湖 ',
|
||||
58221 => '蚌埠 ',
|
||||
58424 => '安庆 ',
|
||||
58311 => '六安 ',
|
||||
58236 => '滁州 ',
|
||||
58336 => '马鞍山 ',
|
||||
58203 => '阜阳 ',
|
||||
58433 => '宣城 ',
|
||||
58429 => '铜陵 ',
|
||||
58116 => '淮北 ',
|
||||
58334 => '芜湖 ',
|
||||
58122 => '宿州 ',
|
||||
58224 => '淮南 ',
|
||||
58427 => '池州 ',
|
||||
57036 => '西安 ',
|
||||
53955 => '韩城 ',
|
||||
57245 => '安康 ',
|
||||
57127 => '汉中 ',
|
||||
57016 => '宝鸡 ',
|
||||
57048 => '咸阳 ',
|
||||
53646 => '榆林 ',
|
||||
57045 => '渭南 ',
|
||||
57143 => '商洛 ',
|
||||
53947 => '铜川 ',
|
||||
53845 => '延安 ',
|
||||
53614 => '银川 ',
|
||||
53817 => '固原 ',
|
||||
53704 => '中卫 ',
|
||||
53518 => '石嘴山 ',
|
||||
53612 => '吴忠 ',
|
||||
52889 => '兰州 ',
|
||||
52896 => '白银 ',
|
||||
53829 => '庆阳 ',
|
||||
52533 => '酒泉 ',
|
||||
57006 => '天水 ',
|
||||
52679 => '武威 ',
|
||||
52652 => '张掖 ',
|
||||
50741 => '甘南 ',
|
||||
52984 => '临夏 ',
|
||||
53915 => '平凉 ',
|
||||
52995 => '定西 ',
|
||||
52675 => '金昌 ',
|
||||
52866 => '西宁 ',
|
||||
52754 => '海北 ',
|
||||
52737 => '海西 ',
|
||||
56065 => '黄南 ',
|
||||
56043 => '果洛 ',
|
||||
56029 => '玉树 ',
|
||||
52875 => '海东 ',
|
||||
52856 => '海南 ',
|
||||
57494 => '武汉 ',
|
||||
57461 => '宜昌 ',
|
||||
57498 => '黄冈 ',
|
||||
57447 => '恩施 ',
|
||||
57476 => '荆州 ',
|
||||
57362 => '神农架 ',
|
||||
57256 => '十堰 ',
|
||||
57590 => '咸宁 ',
|
||||
57278 => '襄樊 ',
|
||||
57482 => '孝感 ',
|
||||
57381 => '随州 ',
|
||||
58407 => '黄石 ',
|
||||
57377 => '荆门 ',
|
||||
57496 => '鄂州 ',
|
||||
57679 => '长沙 ',
|
||||
57766 => '邵阳 ',
|
||||
57662 => '常德 ',
|
||||
57972 => '郴州 ',
|
||||
57649 => '吉首 ',
|
||||
57780 => '株洲 ',
|
||||
57763 => '娄底 ',
|
||||
57773 => '湘潭 ',
|
||||
57674 => '益阳 ',
|
||||
57866 => '永州 ',
|
||||
57584 => '岳阳 ',
|
||||
57872 => '衡阳 ',
|
||||
57749 => '怀化 ',
|
||||
57771 => '韶山 ',
|
||||
57558 => '张家界 ',
|
||||
58457 => '杭州 ',
|
||||
58450 => '湖州 ',
|
||||
58549 => '金华 ',
|
||||
58563 => '宁波 ',
|
||||
58646 => '丽水 ',
|
||||
58453 => '绍兴 ',
|
||||
58633 => '衢州 ',
|
||||
58452 => '嘉兴 ',
|
||||
58660 => '台州 ',
|
||||
58477 => '舟山 ',
|
||||
58659 => '温州 ',
|
||||
58606 => '南昌 ',
|
||||
57786 => '萍乡 ',
|
||||
58502 => '九江 ',
|
||||
58637 => '上饶 ',
|
||||
58617 => '抚州 ',
|
||||
57799 => '吉安 ',
|
||||
58627 => '鹰潭 ',
|
||||
57793 => '宜春 ',
|
||||
57796 => '新余 ',
|
||||
58527 => '景德镇 ',
|
||||
57993 => '赣州 ',
|
||||
58847 => '福州 ',
|
||||
59134 => '厦门 ',
|
||||
58927 => '龙岩 ',
|
||||
58834 => '南平 ',
|
||||
58846 => '宁德 ',
|
||||
58946 => '莆田 ',
|
||||
59137 => '泉州 ',
|
||||
58828 => '三明 ',
|
||||
59126 => '漳州 ',
|
||||
57816 => '贵阳 ',
|
||||
57806 => '安顺 ',
|
||||
57609 => '赤水 ',
|
||||
57713 => '遵义 ',
|
||||
57741 => '铜仁 ',
|
||||
56693 => '六盘水 ',
|
||||
57707 => '毕节 ',
|
||||
57825 => '凯里 ',
|
||||
57827 => '都匀 ',
|
||||
56294 => '成都 ',
|
||||
57602 => '泸州 ',
|
||||
57504 => '内江 ',
|
||||
56571 => '凉山 ',
|
||||
56171 => '阿坝 ',
|
||||
57313 => '巴中 ',
|
||||
57206 => '广元 ',
|
||||
56386 => '乐山 ',
|
||||
56196 => '绵阳 ',
|
||||
56198 => '德阳 ',
|
||||
56666 => '攀枝花 ',
|
||||
56287 => '雅安 ',
|
||||
56492 => '宜宾 ',
|
||||
56396 => '自贡 ',
|
||||
56146 => '甘孜州 ',
|
||||
57328 => '达州 ',
|
||||
56298 => '资阳 ',
|
||||
57415 => '广安 ',
|
||||
57405 => '遂宁 ',
|
||||
56391 => '眉山 ',
|
||||
57411 => '南充 ',
|
||||
59287 => '广州 ',
|
||||
59493 => '深圳 ',
|
||||
59312 => '潮州 ',
|
||||
59082 => '韶关 ',
|
||||
59658 => '湛江 ',
|
||||
59298 => '惠州 ',
|
||||
59280 => '清远 ',
|
||||
59289 => '东莞 ',
|
||||
59473 => '江门 ',
|
||||
59659 => '茂名 ',
|
||||
59278 => '肇庆 ',
|
||||
59501 => '汕尾 ',
|
||||
59293 => '河源 ',
|
||||
59315 => '揭阳 ',
|
||||
59117 => '梅州 ',
|
||||
59485 => '中山 ',
|
||||
59269 => '德庆 ',
|
||||
59663 => '阳江 ',
|
||||
59471 => '云浮 ',
|
||||
59488 => '珠海 ',
|
||||
59316 => '汕头 ',
|
||||
59431 => '南宁 ',
|
||||
57957 => '桂林 ',
|
||||
59051 => '阳朔 ',
|
||||
59046 => '柳州 ',
|
||||
59265 => '梧州 ',
|
||||
59453 => '玉林 ',
|
||||
59254 => '桂平 ',
|
||||
59065 => '贺州 ',
|
||||
59632 => '钦州 ',
|
||||
59249 => '贵港 ',
|
||||
59635 => '防城港 ',
|
||||
59211 => '百色 ',
|
||||
59644 => '北海 ',
|
||||
59023 => '河池 ',
|
||||
59242 => '来宾 ',
|
||||
59425 => '崇左 ',
|
||||
56778 => '昆明 ',
|
||||
56748 => '保山 ',
|
||||
56768 => '楚雄 ',
|
||||
56844 => '德宏 ',
|
||||
56975 => '红河 ',
|
||||
56951 => '临沧 ',
|
||||
56533 => '怒江 ',
|
||||
56783 => '曲靖 ',
|
||||
56964 => '思茅 ',
|
||||
56994 => '文山 ',
|
||||
56875 => '玉溪 ',
|
||||
56586 => '昭通 ',
|
||||
56651 => '丽江 ',
|
||||
56751 => '大理 ',
|
||||
59758 => '海口 ',
|
||||
59948 => '三亚 ',
|
||||
59845 => '儋州 ',
|
||||
59757 => '琼山 ',
|
||||
59941 => '通什 ',
|
||||
59856 => '文昌 ',
|
||||
51463 => '乌鲁木齐 ',
|
||||
51076 => '阿勒泰 ',
|
||||
51628 => '阿克苏 ',
|
||||
51368 => '昌吉 ',
|
||||
52203 => '哈密 ',
|
||||
51828 => '和田 ',
|
||||
51709 => '喀什 ',
|
||||
51243 => '克拉玛依 ',
|
||||
51356 => '石河子 ',
|
||||
51133 => '塔城 ',
|
||||
51656 => '库尔勒 ',
|
||||
51573 => '吐鲁番 ',
|
||||
55591 => '拉萨 ',
|
||||
55437 => '阿里 ',
|
||||
56137 => '昌都 ',
|
||||
55299 => '那曲 ',
|
||||
55578 => '日喀则 ',
|
||||
55598 => '山南 ',
|
||||
56312 => '林芝 ',
|
||||
58968 => '台北 ',
|
||||
59554 => '高雄 ',
|
||||
17060 => '伊斯坦布尔 ISTANBUL ',
|
||||
40754 => '德黑兰 TEHRAN ',
|
||||
41781 => '卡拉奇 KARACHI ',
|
||||
42182 => '新德里 NEW DELHI ',
|
||||
43466 => '科伦坡 COLOMBO ',
|
||||
47108 => '汉城 SEOUL ',
|
||||
47159 => '釜山 BUSAN ',
|
||||
47662 => '东京 TOKYO ',
|
||||
48097 => '仰光 YANGON ',
|
||||
48454 => '曼谷 BANGKOK ',
|
||||
48647 => '吉隆坡 KUALA LUMPUR ',
|
||||
48820 => '河内 HA NOI ',
|
||||
96745 => '雅加达 JAKARTA ',
|
||||
10141 => '汉堡 HAMBURG ',
|
||||
10381 => '柏林 BERLIN ',
|
||||
10637 => '法兰克福 FRANKFURT ',
|
||||
11034 => '维也纳 VIENNA ',
|
||||
16066 => '米兰 MILANO ',
|
||||
16235 => '罗马 ROMA ',
|
||||
16701 => '雅典 ATHENS ',
|
||||
2484 => '斯德哥尔摩 STOCKHOLM ',
|
||||
27612 => '莫斯科 MOSKVA ',
|
||||
3334 => '曼彻斯特 MANCHESTER ',
|
||||
3779 => '伦敦 LONDON ',
|
||||
6240 => '阿姆斯特丹 AMSTERDAM ',
|
||||
6451 => '布鲁塞尔 BRUSSELES ',
|
||||
6660 => '苏黎世 ZURICH ',
|
||||
6700 => '日内瓦 GENEVE ',
|
||||
61291 => '巴马科 BAMAKO ',
|
||||
63450 => '亚的斯亚贝巴 ADDIS ABABA ',
|
||||
63740 => '内罗毕 NAIROBI ',
|
||||
65472 => '阿克拉 ACCRA ',
|
||||
67341 => '马普托 MAPUTO ',
|
||||
68368 => '约翰内斯堡 JOHANNESBURG ',
|
||||
68396 => '曼齐尼 MANZINI ',
|
||||
68816 => '开普敦 CAPE TOWN ',
|
||||
71624 => '多伦多 TORONTO ',
|
||||
71627 => '蒙特利尔 MONTREAL ',
|
||||
71628 => '渥太华 OTTAWA ',
|
||||
71892 => '温哥华 VANCOUVER ',
|
||||
72202 => '迈阿密 MIAMI ',
|
||||
72219 => '亚特兰大 ATLANTA ',
|
||||
72243 => '休斯敦 HOUSTON ',
|
||||
72295 => '洛杉矶 LOS ANGELES ',
|
||||
72386 => '拉斯维加斯 LAS VEGAS ',
|
||||
72403 => '华盛顿 WASHINGTON DC ',
|
||||
72503 => '纽约 NEW YORK ',
|
||||
72509 => '波士顿 BOSTON ',
|
||||
72530 => '芝加哥 CHICAGO ',
|
||||
72793 => '西雅图 SEATTLE ',
|
||||
78264 => '圣地亚哥 SANTIAGO DE CUBA ',
|
||||
80222 => '波哥大 BOGOTA ',
|
||||
84628 => '利马 LIMA ',
|
||||
85799 => '蒙特港 PUERTO MONTT ',
|
||||
87585 => '布宜诺斯艾利斯 BUENOS AIRES ',
|
||||
93110 => '奥克兰 AUCKLAND ',
|
||||
93436 => '惠灵顿 WELLINGTON ',
|
||||
94767 => '悉尼 SYDNEY ',
|
||||
94868 => '墨尔本 MELBOURNE ',
|
||||
94926 => '堪培拉 CANBERRA ',
|
||||
59279 => '佛山 ',
|
||||
53753 => '吕梁 ',
|
||||
51431 => '伊宁 ')
|
||||
;
|
||||
|
||||
?>
|
||||
299
api/tq/index.php
299
api/tq/index.php
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
$file = 'counter.dat';
|
||||
$file = 'counter.dat';
|
||||
|
||||
// 读取并自增
|
||||
$counter = (int)@file_get_contents($file);
|
||||
@@ -7,238 +7,67 @@ $counter++;
|
||||
|
||||
// 使用 LOCK_EX 防止并发写入冲突
|
||||
file_put_contents($file, $counter, LOCK_EX);
|
||||
?>
|
||||
<?php
|
||||
// 天气查询 API - 使用国内平台数据
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
// 获取参数
|
||||
$city = $_GET['city'] ?? $_GET['q'] ?? null;
|
||||
$type = $_GET['type'] ?? 'json'; // json, xml
|
||||
$lang = $_GET['lang'] ?? 'zh'; // zh, en
|
||||
|
||||
// 验证参数
|
||||
if (!$city) {
|
||||
http_response_code(400);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'code' => 400,
|
||||
'message' => '缺少必要参数: city (城市名称)',
|
||||
'example' => '/api/tq/?city=北京&type=json&lang=zh'
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 非法字符检查
|
||||
if (!preg_match('/^[\u4e00-\u9fff\w\s\-]+$/u', $city) || strlen($city) > 50) {
|
||||
http_response_code(400);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'code' => 400,
|
||||
'message' => '无效的城市名称'
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
$result = null;
|
||||
$error = null;
|
||||
|
||||
// 方案1: 心知天气 API (国内数据源,优先使用)
|
||||
// 方案2: 和风天气 API (国内数据源)
|
||||
// 方案3: wttr.in (备选)
|
||||
|
||||
// 尝试方案1: 心知天气 API (中国天气网数据)
|
||||
$url1 = "https://api.seniverse.com/v1/now.json?location=" . urlencode($city) . "&language=" . ($lang === 'en' ? 'en' : 'zh-Hans');
|
||||
|
||||
$ch1 = curl_init();
|
||||
curl_setopt($ch1, CURLOPT_URL, $url1);
|
||||
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch1, CURLOPT_TIMEOUT, 8);
|
||||
curl_setopt($ch1, CURLOPT_USERAGENT, 'Mozilla/5.0 QuickAPI/1.0');
|
||||
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, false);
|
||||
|
||||
$response1 = curl_exec($ch1);
|
||||
$http_code1 = curl_getinfo($ch1, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch1);
|
||||
|
||||
if ($http_code1 == 200 && $response1) {
|
||||
$data1 = json_decode($response1, true);
|
||||
|
||||
if ($data1 && isset($data1['results']) && count($data1['results']) > 0) {
|
||||
$results = $data1['results'][0];
|
||||
$location = $results['location'];
|
||||
$now = $results['now'];
|
||||
|
||||
$result = [
|
||||
'status' => 'success',
|
||||
'code' => 200,
|
||||
'city' => $location['name'] ?? $city,
|
||||
'region' => $location['country'] ?? null,
|
||||
'coordinates' => [
|
||||
'latitude' => (float)$location['lat'] ?? null,
|
||||
'longitude' => (float)$location['lon'] ?? null
|
||||
],
|
||||
'current' => [
|
||||
'temperature' => (float)$now['temperature'] ?? null,
|
||||
'feels_like' => (float)$now['feels_like'] ?? null,
|
||||
'condition' => $now['text'] ?? 'Unknown',
|
||||
'condition_code' => $now['code'] ?? null,
|
||||
'wind_speed' => (float)$now['wind_speed'] ?? null,
|
||||
'wind_speed_kph' => ((float)$now['wind_speed'] * 3.6) ?? null,
|
||||
'wind_direction' => $now['wind_direction'] ?? null,
|
||||
'wind_direction_code' => $now['wind_direction_code'] ?? null,
|
||||
'humidity' => (int)$now['humidity'] ?? null,
|
||||
'visibility' => (float)$now['visibility'] ?? null,
|
||||
'pressure' => (int)$now['pressure'] ?? null
|
||||
],
|
||||
'source' => '心知天气',
|
||||
'updated_at' => date('Y-m-d H:i:s')
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// 如果方案1失败,尝试方案2: 和风天气 API
|
||||
if (!$result) {
|
||||
$url2 = "https://devapi.qweather.com/v7/weather/now?location=" . urlencode($city) . "&lang=" . ($lang === 'en' ? 'en' : 'zh');
|
||||
|
||||
$ch2 = curl_init();
|
||||
curl_setopt($ch2, CURLOPT_URL, $url2);
|
||||
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch2, CURLOPT_TIMEOUT, 8);
|
||||
curl_setopt($ch2, CURLOPT_USERAGENT, 'Mozilla/5.0 QuickAPI/1.0');
|
||||
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false);
|
||||
|
||||
$response2 = curl_exec($ch2);
|
||||
$http_code2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch2);
|
||||
|
||||
if ($http_code2 == 200 && $response2) {
|
||||
$data2 = json_decode($response2, true);
|
||||
|
||||
if ($data2 && isset($data2['now'])) {
|
||||
$now = $data2['now'];
|
||||
|
||||
$result = [
|
||||
'status' => 'success',
|
||||
'code' => 200,
|
||||
'city' => $city,
|
||||
'current' => [
|
||||
'temperature' => (int)$now['temp'] ?? null,
|
||||
'feels_like' => (int)$now['feelsLike'] ?? null,
|
||||
'condition_code' => $now['icon'] ?? null,
|
||||
'condition' => $now['text'] ?? 'Unknown',
|
||||
'wind_speed' => (float)$now['windSpeed'] ?? null,
|
||||
'wind_direction' => $now['windDir'] ?? null,
|
||||
'wind_direction_code' => (int)$now['wind_degree'] ?? null,
|
||||
'humidity' => (int)$now['humidity'] ?? null,
|
||||
'pressure' => (int)$now['pressure'] ?? null,
|
||||
'visibility' => (int)$now['vis'] ?? null,
|
||||
'dew_point' => (int)$now['dewPoint'] ?? null
|
||||
],
|
||||
'source' => '和风天气',
|
||||
'updated_at' => date('Y-m-d H:i:s')
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果国内方案都失败,尝试方案3: wttr.in (备选)
|
||||
if (!$result) {
|
||||
$url3 = "https://wttr.in/" . urlencode($city) . "?format=j1&lang=" . ($lang === 'en' ? 'en' : 'zh-CN');
|
||||
|
||||
$ch3 = curl_init();
|
||||
curl_setopt($ch3, CURLOPT_URL, $url3);
|
||||
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch3, CURLOPT_TIMEOUT, 8);
|
||||
curl_setopt($ch3, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) QuickAPI/1.0');
|
||||
curl_setopt($ch3, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($ch3, CURLOPT_SSL_VERIFYHOST, false);
|
||||
|
||||
$response3 = curl_exec($ch3);
|
||||
$http_code3 = curl_getinfo($ch3, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch3);
|
||||
|
||||
if ($http_code3 == 200 && $response3) {
|
||||
$data3 = json_decode($response3, true);
|
||||
|
||||
if ($data3 && isset($data3['current_condition'])) {
|
||||
$current = $data3['current_condition'][0];
|
||||
$desc = $current['desc'] ?? [];
|
||||
|
||||
$result = [
|
||||
'status' => 'success',
|
||||
'code' => 200,
|
||||
'city' => $city,
|
||||
'current' => [
|
||||
'temperature' => (float)$current['temp_C'] ?? null,
|
||||
'temperature_f' => (float)$current['temp_F'] ?? null,
|
||||
'feels_like' => (float)$current['FeelsLikeC'] ?? null,
|
||||
'condition' => is_array($desc) ? ($desc[$lang === 'en' ? 'en' : 'zh-CN'] ?? $desc[0] ?? 'Unknown') : 'Unknown',
|
||||
'humidity' => (int)$current['humidity'] ?? null,
|
||||
'wind_speed' => (float)$current['windspeedKmph'] ?? null,
|
||||
'wind_speed_ms' => (float)$current['windspeedKmph'] / 3.6 ?? null,
|
||||
'wind_direction' => $current['winddir16Point'] ?? null,
|
||||
'pressure' => (int)$current['pressure'] ?? null,
|
||||
'precipitation' => (float)$current['precipMM'] ?? null,
|
||||
'visibility' => (float)$current['visibility'] ?? null,
|
||||
'uv_index' => (int)$current['uvIndex'] ?? null,
|
||||
'cloud_cover' => (int)$current['cloudcover'] ?? null
|
||||
],
|
||||
'source' => 'wttr.in',
|
||||
'updated_at' => date('Y-m-d H:i:s')
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 返回结果
|
||||
if ($result) {
|
||||
if ($type === 'xml' || $type === 'XML') {
|
||||
header('Content-type: application/xml; charset=UTF-8');
|
||||
echo arrayToXml($result, null, null, 'weather');
|
||||
} else {
|
||||
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
}
|
||||
} else {
|
||||
http_response_code(500);
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'code' => 500,
|
||||
'message' => $error ?? '天气服务暂时不可用',
|
||||
'tips' => '请尝试使用其他城市名称或稍后再试'
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
|
||||
// 数组转XML函数
|
||||
function arrayToXml($arr, $dom = null, $node = null, $root = 'root', $cdata = false) {
|
||||
if (!$dom) {
|
||||
$dom = new DOMDocument('1.0', 'utf-8');
|
||||
}
|
||||
if (!$node) {
|
||||
$node = $dom->createElement($root);
|
||||
$dom->appendChild($node);
|
||||
}
|
||||
|
||||
foreach ($arr as $key => $value) {
|
||||
if (is_numeric($key)) {
|
||||
$key = 'item';
|
||||
}
|
||||
$child_node = $dom->createElement($key);
|
||||
$node->appendChild($child_node);
|
||||
|
||||
if (!is_array($value)) {
|
||||
if (!$cdata) {
|
||||
$data = $dom->createTextNode((string)$value);
|
||||
} else {
|
||||
$data = $dom->createCDATASection((string)$value);
|
||||
}
|
||||
$child_node->appendChild($data);
|
||||
} else {
|
||||
arrayToXml($value, $dom, $child_node, $root, $cdata);
|
||||
}
|
||||
}
|
||||
|
||||
return $dom->saveXML();
|
||||
}
|
||||
header("Content-type: text/html; charset=UTF-8");
|
||||
if(!$_GET['msg'])exit("抱歉,出错了!\n请输入城市名!");
|
||||
$msg = $_GET['msg'];
|
||||
$n = $_GET['n'];
|
||||
$str = file_get_contents("compress.zlib://http://m.nmc.cn/f/rest/autocomplete?q=$msg&limit=10×tamp=1547115792491");//56691|威宁|553100|贵州省|weining|AGZ
|
||||
$str=str_replace('|','<br>',$str);
|
||||
$str = str_replace(PHP_EOL,'<hr><hr>', $str);
|
||||
$str = "<hr>".$str."<hr>";
|
||||
$stre = '/<hr>(.*?)<br>(.*?)<br>(.*?)<br>(.*?)<br>(.*?)<br>(.*?)<hr>/';
|
||||
$result = preg_match_all($stre,$str,$trstr);
|
||||
if($result== 0){
|
||||
echo "搜索不到与".$_GET["msg"]."的相关天气,请稍后重试或换个关键词试试。";
|
||||
}else{
|
||||
if($result== 1){
|
||||
$a=$trstr[1][0];
|
||||
$data = file_get_contents("compress.zlib://http://m.nmc.cn/f/rest/real/".$a."");
|
||||
preg_match_all('/"city":"(.*?)","province":"(.*?)"},"week":"(.*?)","moon":"(.*?)","jie_qi":"(.*?)","publish_time":"(.*?)","weather":{"temperature":(.*?),"temperatureDiff":(.*?),"airpressure":(.*?),"humidity":(.*?),"rain":(.*?),"rcomfort":(.*?),"icomfort":(.*?),"info":"(.*?)","img":"(.*?)","feelst":(.*?)},"wind":{"direct":"(.*?)","power":"(.*?)","speed":"(.*?)"},"warn":{"alert":"(.*?)","pic":"(.*?)","province":"(.*?)","city":"(.*?)","url":"(.*?)","issuecontent":"(.*?)"/',$data,$data);//1地名,2省,5节气,6更新时间,7现在温度,9气压,10湿度,12舒适度,14天气,16体感温度,17风向,18风力,19风速,
|
||||
$a = $data[1][0]; //小地名
|
||||
$b = $data[2][0]; //省
|
||||
$s = $data[5][0]; //节气
|
||||
$c = $data[6][0]; //更新时间
|
||||
$d = $data[7][0]; //现在温度
|
||||
$e = $data[9][0]; //气压hPa,
|
||||
$f = $data[10][0]; //湿度
|
||||
$g = $data[12][0]; //舒适度
|
||||
$h = $data[14][0]; //天气情况
|
||||
$i = $data[16][0]; //体感温度
|
||||
$q = $data[17][0]; //风向
|
||||
$w = $data[18][0]; //程度
|
||||
$r = $data[25][0]; //预警
|
||||
echo "".$a."[".$b."]\\n\\n天气:".$h." 舒适度:".$g."\\n时实温度:".$d."℃ 体感:".$i."℃\\n气压:".$e."hPa 湿度:".$f."%\\n风向:".$q." 程度:".$w."";
|
||||
if($r== 9999){}else{echo "\\n预警提示:$r";}
|
||||
echo "\\n更新时间:".$c."\\n".$s."";
|
||||
}else{
|
||||
if($n== null){
|
||||
for( $i = 0 ; $i < $result && $i < 15 ; $i ++ ){
|
||||
$s=$trstr[2][$i];//小地名
|
||||
$c=$trstr[4][$i];//省
|
||||
echo ($i+1).":".$c."$s\n";}
|
||||
echo "共搜索到与【".$_GET["msg"]."】的相关天气信息".$result."条!";
|
||||
}else{
|
||||
$n = $_GET['n'];
|
||||
$i=($n-1);
|
||||
$a=$trstr[1][$i];//id
|
||||
$data = file_get_contents("compress.zlib://http://m.nmc.cn/f/rest/real/".$a."");
|
||||
preg_match_all('/"city":"(.*?)","province":"(.*?)"},"week":"(.*?)","moon":"(.*?)","jie_qi":"(.*?)","publish_time":"(.*?)","weather":{"temperature":(.*?),"temperatureDiff":(.*?),"airpressure":(.*?),"humidity":(.*?),"rain":(.*?),"rcomfort":(.*?),"icomfort":(.*?),"info":"(.*?)","img":"(.*?)","feelst":(.*?)},"wind":{"direct":"(.*?)","power":"(.*?)","speed":"(.*?)"},"warn":{"alert":"(.*?)","pic":"(.*?)","province":"(.*?)","city":"(.*?)","url":"(.*?)","issuecontent":"(.*?)"/',$data,$data);//1地名,2省,5节气,6更新时间,7现在温度,9气压,10湿度,12舒适度,14天气,16体感温度,17风向,18风力,19风速,
|
||||
$a = $data[1][0]; //小地名
|
||||
$b = $data[2][0]; //省
|
||||
$s = $data[5][0]; //节气
|
||||
$c = $data[6][0]; //更新时间
|
||||
$d = $data[7][0]; //现在温度
|
||||
$e = $data[9][0]; //气压hPa,
|
||||
$f = $data[10][0]; //湿度
|
||||
$g = $data[12][0]; //舒适度
|
||||
$h = $data[14][0]; //天气情况
|
||||
$i = $data[16][0]; //体感温度
|
||||
$q = $data[17][0]; //风向
|
||||
$w = $data[18][0]; //程度
|
||||
$s = $data[19][0]; //风速m/s
|
||||
$r = $data[25][0]; //预警
|
||||
echo "".$a."[".$b."]\r\n\r\n天气:".$h." 舒适度:".$g."\r\n时实温度:".$d."℃ 体感:".$i."℃\r\n气压:".$e."hPa 湿度:".$f."%\r\n风向:".$q." 程度:".$w."";
|
||||
if($r== 9999){}else{echo "\r\n预警提示:$r";}
|
||||
echo "\r\n更新时间:".$c."\r\n".$s."";}}}
|
||||
?>
|
||||
Reference in New Issue
Block a user