Google Weather API 已永久關閉,許多網站需尋找替代方案。本文提供兩套完整的 PHP 實作,分別串接 Yahoo Weather API 與 新浪天氣 API,並包含快取機制、WOEID 城市代碼解析、錯誤處理等生產級功能。
注意:Yahoo Weather API 於 2019 年正式關閉,以下代碼僅作為「API 串接、XML 解析、快取設計」的架構參考。
class Weather {
static $url = 'https://xml.weather.yahoo.com/forecastrss?u=c&w=';
static $city = 'Beijing'; // 預設城市(需用拼音)
static $weatherXML = '';
static $woeid_file = 'woeid'; // WOEID 本地快取文件
static $file_path = 'data/'; // 快取目錄
// 獲取並快取 XML
static public function getXML($city = null) { ... }
// 解析 XML 獲取本週天氣
static public function analysisXML($simple) { ... }
// 獲取城市 WOEID(含 YQL 查詢與本地快取)
static private function getWOEID() { ... }
// XML 快取寫入
static private function cacheXML($contents) { ... }
// cURL 模擬請求
static private function vget($url) { ... }
}
// 使用範例
Weather::getXML('Changsha');
geo.places 表獲取。60*60*2 秒)。mb_convert_encoding)。新浪接口無需 WOEID,直接用城市中文名(URL 編碼後)即可查詢。
class Weather {
static $url = 'https://php.weather.sina.com.cn/xml.php?password=DJOYnieT8234jlsK&day=0&city=';
static $city = '%B1%B1%BE%A9'; // 北京的 GBK URL 編碼
static $weatherXML = '';
static $file_path = 'data/';
static public function getXML($city = null) {
if ($city !== null) {
$city = mb_convert_encoding($city, 'gbk', 'utf-8');
self::$city = urlencode($city);
}
// 快取邏輯同 Yahoo 版(2 小時)
// ...
$contents = self::vget(self::$url . self::$city);
self::cacheXML($contents);
self::analysisXML();
}
static public function analysisXML() {
$XML = simplexml_load_file(self::$weatherXML);
print_r($XML); // 實際專案請解析所需字段
}
// vget、cacheXML 同 Yahoo 版
}
Weather::getXML('長沙'); // 直接傳中文城市名
雖然 Yahoo 與新浪的舊版 API 已不再推薦用於新專案,但本文展示的「請求→快取→解析→降級」完整鏈路,是所有第三方 API 串接的通用最佳實踐。掌握這套模式,更換任何天氣服務商都能游刃有餘。