首次釋出,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://www.tad0616.net/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 修正連線問題