首次釋出,2019-11-29 修正連線問題
由 Cyujin Sai 老師開發的即時空氣品質及天氣區塊
$showcity = '彰化市'; //設定欲顯示之中文城市名稱!若不填或將本行註解掉,則依下方設定來顯示! //主要AQI資料來源參數:若不使用epa資料,請將 $sitename 行註解掉,或留空值!(注意!主要AQI資料來源早上7:30~8:30之間可能會斷線) $url = 'https://opendata.epa.gov.tw/api/v1/AQI/?skip=0&top=1000&format=json'; $link = 'https://taqm.epa.gov.tw/taqm/tw/'; //$sitename = '彰化'; //設定要擷取資料的站台,請參考上方 $url 網頁資料 SiteName 欄位!若錯誤,會使用 aqicn 數據! //$sitename = '屏東(琉球)'; //主要氣溫查詢參數:如果不要顯示當地氣溫,請將 $tempid 留空,或將下行註解掉! $tempid = '141'; //可用 Firefox 瀏覽器至 https://works.ioa.tw/weather/api/all.json 查詢代碼 //以下詳細天氣連結,請二選一 //$templink = 'https://works.ioa.tw/weather/maps.html'; //ioa 天氣地圖連結 $templink = 'https://www.cwb.gov.tw/m/f/town368/1000701.php'; //氣象局鄉鎮預報連結,請搜尋後修改網址 //次要AQI資料來源參數: $cityid = '1618'; //若有設定$city,此處可以不填,但建議填寫! $city = 'changhua'; //若有設定$cityid,此處可以不填,但建議填寫! $token = '32f529a1fc2b16476338548abb4f281f22509d94'; //可沿用此Token (Air Quality Open Data Platform API Token),或至 https://aqicn.org/data-platform/token/ 申請 //欲更改城市位置,可至 https://campus-xoops.tn.edu.tw/modules/tad_modules/index.php?module_sn=100 查看縣市鄉鎮的英文名稱,並於上方填入城市代號或英文名稱! //AIRQ 在地空氣品質查詢參數:如果不要顯示AIRQ在地空氣品質,請將 $airqn 留空,也可將 $airq 或 $airqn 註解掉! $airq = "http://www.airq.org.tw/Home/realtime10m"; //AIRQ 官網提供資料來源 $airqn = "東芳國小"; //AIRQ 監測點名稱,可至 http://www.airq.org.tw/Home/Value 查詢! $airql = "http://www.airq.org.tw/Home/Value"; //AIRQ 官網連結 //AQI 各等級版面預覽測試 //$test_aqiv = '123'; //只有測試時才填入欲顯示之 AQI 值,平時請設定為空值 或 將本行註解掉! //等級範圍:1.良好 0~50 2.普通 51~100 3.輕度污染 101~150 4.中度污染 151~200 // 5.重度污染 201~300 6.嚴重污染 301~500 // get_aqi_json 函數 if (!function_exists('get_aqi_json')) { function get_aqi_json($url) { $data = ''; if (function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $url); //curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0"); //curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36'); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt($ch, CURLOPT_TIMEOUT, 2); $data = curl_exec($ch); curl_close($ch); } else { $arrContextOptions = array( "ssl" => array( "verify_peer" => false, "verify_peer_name" => false, ), ); $data = file_get_contents($url, false, stream_context_create($arrContextOptions)); } return $data; } } //主要AQI資料來源 if (!empty($sitename)) { $data = get_aqi_json($url); if (!empty($data)) { $json = json_decode($data, 1); $data = array_column($json, null, 'SiteName'); $aqiv = $data[$sitename]['AQI']; //AQI值 $pm25 = $data[$sitename]['PM2.5']; //PM2.5值 $windspeed = $data[$sitename]['WindSpeed']; //風速 $winddirec = $data[$sitename]['WindDirec']; //風向 $utime = strtotime($data[$sitename]['PublishTime']); //時間戳~數據update時間 $udate = date('Ymd',$utime); //數據update日期 $utime = date('Y年n月j日 G時i分', $utime); //數據update時間 if (empty($showcity)&&!empty($aqiv)) { if (strpos($sitename,"(")) { $showcity = substr($sitename, strpos($sitename,"(")+1, strpos($sitename,")")-strpos($sitename,"(")-1 ); } else { $showcity = $sitename; } } if (is_numeric($winddirec)) { //$winde = array("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"); //$windc = array("北", "北北東", "東北", "東北東", "東", "東南東", "東南", "南南東", "南", "南南西", "西南", "西南西", "西", "西北西", "西北", "北北西"); $windc = array("北", "偏北", "東北", "偏東", "東", "偏東", "東南", "偏南", "南", "偏南", "西南", "偏西", "西", "偏西", "西北", "偏北"); $winds = array("↓", "↓", "↙", "←", "←", "←", "↖", "↑", "↑", "↑", "↗", "→", "→", "→", "↘", "↓"); $windr = (ceil(($winddirec/22.5)+0.5)-1)%16; //$winde = $winde[$windr]; //$winde = "<img border=0 src=https://www.cwb.gov.tw/m/assets/images/wind/{$winde}.png>"; $windc = $windc[$windr]; $winds = $winds[$windr]; } if (!empty($city)) {$cityname = ucfirst($city);} $detail = $link; } } //次要AQI資料來源 if (empty($aqiv)) { if (empty($cityid)) { $url = "http://api.waqi.info/search/?token={$token}&keyword={$city}"; $data = get_aqi_json($url); if (!empty($data)) { $json = json_decode($data, 1); $cityid = $json['data'][0]['uid']; } else { echo "<a href='http://aqicn.org/city/taiwan/$city/' target='_blank'>抓不到 $city 的城市代號資料,請稍後重試</a>"; } } if (!empty($cityid)&&empty($aqiv)) { //$url1 = "https://api.waqi.info/api/feed/@{$cityid}/obs.en.json"; $url1 = "https://api.waqi.info/feed/@{$cityid}/?token={$token}"; $data1 = get_aqi_json($url1); if (!empty($data1)) { $aqi = json_decode($data1, 1); $cityname = $aqi['data']['city']['name']; //城市名 $cityname = substr($cityname, 0, strpos($cityname,',')); $cityname = ucfirst($cityname); $detail = $aqi['data']['city']['url']; //詳細資料連結網址 $pm25 = $aqi['data']['iaqi']['pm25']['v']; //PM2.5 //$aqiv = $aqi['data']['aqi']; //AQI值 if (!empty($tempid)&&empty($tempv)) { $tempv = $aqi['data']['iaqi']['t']['v']; //溫度 if (is_numeric($tempv)) { $tempv = round($tempv,1); $weather = " <span style='font-size: 0.8em;'>{$tempv}<sup>°c</sup></span>"; } } if (empty($showcity)) { if (!empty($sitename)) { if (strpos($sitename,"(")) { $showcity = substr($sitename, strpos($sitename,"(")+1, strpos($sitename,")")-strpos($sitename,"(")-1 ); } else { $showcity = $sitename; } } else { $showcity = $cityname; } } $microtime = microtime(true) * 1000; $url2 = "https://alpha.waqi.info/xservices/refresh:{$cityid}?_" . $microtime; $data2 = get_aqi_json($url2); if (!empty($data2)) { $now = json_decode($data2, 1); $aqiv = $now['aqiv']; //AQI值 $utime = $now['mtime']; //時間戳~數據update時間 $udate = date('Ymd',$utime); //數據update日期 //$utime = date('Y年m月d日 H時i分', $utime); $utime = date('Y年n月j日 G時i分', $utime); } else { echo "<a href='http://aqicn.org/city/taiwan/$city/' target='_blank'>抓不到 $city 的空氣資料,請稍後重試,或點此連結觀看原始網站資料</a>"; } } else { echo "<a href='http://aqicn.org/city/taiwan/$city/' target='_blank'>抓不到指定城市 $city 的資料,請稍後重試,或點此連到原始網站觀看資料</a>"; } } } //主要氣溫查詢 if (!empty($tempid)) { $url = "https://works.ioa.tw/weather/api/weathers/{$tempid}.json"; $data = get_aqi_json($url); if (!empty($data)) { $json = json_decode($data, 1); if (is_numeric($json['temperature'])) { $tempv = round($json['temperature'],1); //溫度 } $temph = strtotime($json['at']); //更新時間 $desc = $json['desc']; //天氣敘述 $tempf = round($json['felt_air_temp'],1); //體感溫度 $humidity = $json['humidity']; //濕度 $rainfall = $json['rainfall']; //雨量 $sunrise = $json['sunrise']; //日出時間 $sunset = $json['sunset']; //日落時間 $weather = $json['img']; //天氣圖檔名稱 if ($udate == date('Ymd',$temph)) { $temph = date('G時i分', $temph); } else { $temph = date('n月j日G時i分', $temph); } $desc = "【天氣概況】 {$desc} 當前溫度:{$tempv}°c 體感溫度:{$tempf}°c 當前濕度:{$humidity} % 當前雨量:{$rainfall} mm 當前風速:{$windspeed} m/sec 當前風向:{$winds}{$windc}風 {$winddirec}° 日出時間:{$sunrise} 日落時間:{$sunset} 天氣數據於 {$temph} 更新"; $weather = "<img src='https://works.ioa.tw/weather/img/weathers/zeusdesign/{$weather}' style='height: 1.6em;' border='0'>"; } if (is_numeric($tempv)) { $tempv = round($tempv,1); $weather = "<a target='_blank' href='{$templink}' title='$desc' style='color: white;' onMouseOver=\"this.style.backgroundColor='#0F0'\" onMouseOut=\"this.style.backgroundColor=''\">{$weather}<span style='font-size: 0.8em;' title='$desc'>{$tempv}<sup>°c</sup></span></a>"; } } //AIRQ 在地空氣品質查詢 if (!empty($airq)&&!empty($airqn)) { $data = get_aqi_json($airq); if (!empty($data)) { $json = json_decode($data, 1); $data = array_column($json, null, 'Name'); $airqv = $data[$airqn]['Value']; //PM2.5 十分鐘平均數值 $airqt = $data[$airqn]['EndTime']; //產出數據時間 $airqt = substr($airqt, strpos($airqt," "), strlen($airqt)); if (is_numeric($airqv)) { $airqv = round($airqv,1); if (is_numeric($pm25)) { $pm25 = round($pm25,1); $pm25 = " ~PM2.5資料對比~ {$showcity} :{$pm25} {$airqn}:{$airqv}"; } else { $pm25 = ""; } $airqv = "<span style='font-size: 0.8em;' title='【PM2.5 微型感測器】 {$airqt} 十分鐘平均數值{$pm25}'><a target='_blank' href='{$airql}' style='color: white;' onMouseOver=\"this.style.color='#00F'\" onMouseOut=\"this.style.color='#FFF'\">{$airqn}PM2.5平均:{$airqv}</a>"; }else{ $airqv = "<span style='font-size: 0.8em;' title='目前沒有 {$airqn} PM2.5 資料, 請按此查看即時數值!'><a target='_blank' href='{$airql}' style='color: white;' onMouseOver=\"this.style.color='#00F'\" onMouseOut=\"this.style.color='#FFF'\">PM2.5 微型感測器</a>"; } } } if ($test_aqiv) { $aqiv = $test_aqiv; $showcity = "測試!"; } if (!empty($aqiv)) { if ($aqiv <= 50) { $n = 1; $rank = "良好"; $range = "0~50:良好 Good"; $desc = "????空氣質量令人滿意,基本無空氣污染"; $suggest = "????各類人群可正常活動"; $color = '#009966'; $color2 = 'rgba(0, 153, 102, 0.1)'; } elseif ($aqiv <= 100) { $n = 2; $rank = "普通"; $range = "51~100:普通 Moderate"; $desc = "????空氣質量可接受,但某些污染物可能對極少數異常敏感人群健康有較弱影響"; $suggest = "????極少數異常敏感人群應減少戶外活動"; $color = '#FFCC00'; $color2 = 'rgba(255, 222, 51, 0.1)'; } elseif ($aqiv <= 150) { $n = 3; $rank = "<span style='font-size: 0.7em;'>輕度污染</span>"; $range = "101~150:輕度污染 Unhealthy for Sensitive Groups"; $desc = "????易感人群症狀有輕度加劇,健康人群出現刺激症狀"; $suggest = "????<span style='color: #FF0000;'>對敏感族群不健康!</span><br>兒童、老年人及心臟病、呼吸系統疾病患者應減少長時間、高強度的戶外鍛鍊"; $color = '#FF9933'; $color2 = 'rgba(255, 153, 51, 0.1)'; } elseif ($aqiv <= 200) { $n = 4; $rank = "<span style='font-size: 0.7em;'>中度污染</span>"; $range = "151~200:中度污染 Unhealthy"; $desc = "????進一步加劇易感人群症狀,可能對健康人群心臟、呼吸系統有影響"; $suggest = "????<span style='color: #FF0000;'>對所有族群不健康!</span><br>兒童、老年人及心臟病、呼吸系統疾病患者避免長時間、高強度的戶外鍛鍊,一般人群適量減少戶外運動"; $color = '#CC0033'; $color2 = 'rgba(204, 0, 51, 0.1)'; } elseif ($aqiv <= 300) { $n = 5; $rank = "<span style='font-size: 0.7em;'>重度污染</span>"; $range = "201~300:重度污染 Very Unhealthy"; $desc = "????心臟病和肺病患者症狀顯著加劇,運動耐受力降低,健康人群普遍出現症狀"; $suggest = "????<span style='color: #FF0000;'>非常不健康!</span><br>兒童、老年人及心臟病、肺病患者應停留在室內,停止戶外運動,一般人群減少戶外運動"; $color = '#660099'; $color2 = 'rgba(102, 0, 153, 0.1)'; } else { $n = 6; $rank = "<span style='font-size: 0.7em;'>嚴重污染</span>"; $range = "301~500:嚴重污染 Hazardous"; $desc = "????健康人群運動耐受力降低,有明顯強烈症狀,提前出現某些疾病"; $suggest = "????<span style='color: #FF0000;'>危害!</span>兒童、老年人和病人應停留在室內,避免體力消耗,一般人群避免戶外活動"; $color = '#7E0023'; $color2 = 'rgba(126, 0, 35, 0.1)'; } $widget = " <div style='border: 1px solid $color; border-radius: 6px; width: 100%; background: $color; padding: 0x; '> <div style=\"font-family: 'Microsoft JhengHei','Segoe UI',Arial,Verdana,fantasy; margin: 4px 4px; text-align:center;\"> <div style='font-size: 1.4em; font-weight: bold; color: white;'><span title='Real-time Air Quality'>即時空氣品質</span><br><a href='{$detail}' target='_blank' title='按此查看 {$showcity} 即時空氣品質詳細資料' onMouseOver=\"this.style.backgroundColor='#0F0'\" onMouseOut=\"this.style.backgroundColor=''\" '>{$showcity}</a>{$weather}</div> <div style='font-size: 0.8em; color: white;' title='資料更新時間 Updated Time'>{$utime}</div> </div> <div style=\"font-family: 'Microsoft JhengHei','Segoe UI',Arial,Verdana,fantasy; margin: 4px 4px; padding: 8px 4px 4px; background-color: white; position: relative; overflow: hidden; border-radius: 6px;\"> <div style='font-size: 1.8em; font-weight: bold; text-align:center;' title='AQI 值 {$range}';> <span style='font-family: Verdana; background-color: {$color}; color: white; padding: 2px 4px; text-shadow: rgb(3, 3, 3) 1px 1px 1px; border-radius: 6px;'>{$aqiv}</span> <span style='color: {$color};'>{$rank}</span> </div> <div style=\"font-family: 'Microsoft JhengHei','Segoe UI',Arial,Verdana,fantasy; margin: 4px 4px 4px 4px; font-size:0.9em;\"> <div style=\"margin: 4px 0px;\">{$desc}</div> <div style=\"margin: 4px 0px;\">{$suggest}</div> </div> <img src='https://campus-xoops.tn.edu.tw/uploads/aqi_{$n}.svg' style='width:80px; height:80px; position: absolute; bottom: 6px; right:40px;'> </div> <div style=\"font-family: 'Segoe UI',Arial,Verdana,fantasy; margin: 4px 4px 4px 4px; font-size:14px;\"> </div> <div style='color: white; text-align:center;'>{$airqv}</div> </div>"; echo $widget; }
PHP腳本
左邊
首次釋出
2019-11-29 修正連線問題