現在的網站都會有一些服務性的東東。如日歷,天氣預報等等!由於google 永久性關閉了天氣api 所以我又找了一個調用yahoo 和 新浪的天氣預報 api。
yahoo 天氣預報地址 http://developer.yahoo.com/weather/
廢話不多說直接代碼貼上:
<?php
header ( 'Content-Type: text/html; charset = utf-8' );
class weather {
static $url = 'http://xml.weather.yahoo.com/forecastrss?u=c&w=';
static $city = 'Beijing'; //默認城市北京 這裡要注意的是 city 要填拼音 我試過用中文有好幾個地區都調用不到
static $weatherXML = '';
static $woeid_file = "woeid";
static $file_path = "data/";
/**
* 獲得遠程xml並緩存到本地
*/
static public function getXML($city = null) {
if ($city != null){
self::$city = $city;
}
self::$weatherXML = self::$file_path . md5(self::$city) . '-weather.xml';
if (file_exists( self::$weatherXML )) {
$fileTime = filemtime ( self::$weatherXML );
$stater = time () - $fileTime - 60 * 60 * 2;
if ($stater > 0) {
return true;
}
}
//獲取woeid
$woeid = self::getWOEID();
self::$url = self::$url . $woeid[0];
//獲取當天 天氣
$XML = self::vget(self::$url);
//保存當天 天氣到文件
self::cacheXML($XML);
self::analysisXML($XML);
}
static public function analysisXML($simple) {
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
//本周天氣
$weekindex = $index['YWEATHER:FORECAST'];
$week = array();
foreach($weekindex as $k=>$v){
$week[$k] = $vals[$v]['attributes'];
}
unset($index);
unset($vals);
print_r($week);
/*
<yweather:forecast day="Wed" date="18 Sep 2013" low="20" high="32" text="Sunny" code="32"/>
* day 星期
* date 日期
* low 最低溫度
* high 最高溫度
* test 天氣狀態
* code 天氣圖標
*/
}
/*
* 取得地區WOEID碼
*/
static private function getWOEID(){
static $woeid = array();
if(isset($woeid[self::$city])){
return $woeid[self::$city];
}
if (file_exists( self::$file_path . self::$woeid_file )) {
$woeidSTR = file_get_contents(self::$file_path . self::$woeid_file);
$woeid = json_decode($woeidSTR , true);
if(isset($woeid[self::$city])){
return $woeid[self::$city];
}
}
$geoPlaces = "http://query.yahooapis.com/v1/public/yql?q=select%20woeid%20from%20geo.places%20where%20text='".self::$city."%20CH'";
$XML = simplexml_load_file( $geoPlaces );
if(isset($XML->results->place[0])){
$rs = $woeid[self::$city] = $XML->results->place[0]->woeid;
//保存到文件
$woeidSTR = json_encode($woeid);
file_put_contents(self::$file_path . self::$woeid_file, $woeidSTR);
return $rs;
}else{
//如果找不到城市 woeid 默認城市就改為 北京
self::$city = "Beijing";
return self::getWOEID();
}
}
/**
* 創建xml緩存
* @param $contents 要緩存的內容
*/
static private function cacheXML($contents) {
$contents = str_ireplace ( '<?xml version="1.0"?>', "<?xml version=\"1.0\"?> \n", $contents );
$contents = mb_convert_encoding ( $contents, 'utf-8', 'gbk' );
file_put_contents ( self::$weatherXML, $contents ) or die ( '沒有寫權限' );
}
/**
* 模擬獲取內容函數
* @param type $url
* @return type
*/
static private function vget($url) {
$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
$curl = curl_init (); // 啟動一個CURL會話
curl_setopt ( $curl, CURLOPT_URL, $url ); // 要訪問的地址
curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, 0 ); // 對認證證書來源的檢查
curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, 1 ); // 從證書中檢查SSL加密算法是否存在
curl_setopt ( $curl, CURLOPT_USERAGENT, $user_agent ); // 模擬用戶使用的浏覽器
@curl_setopt ( $curl, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自動跳轉
curl_setopt ( $curl, CURLOPT_AUTOREFERER, 1 ); // 自動設置Referer
curl_setopt ( $curl, CURLOPT_HTTPGET, 1 ); // 發送一個常規的Post請求
curl_setopt ( $curl, CURLOPT_TIMEOUT, 120 ); // 設置超時限制防止死循環
curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 顯示返回的Header區域內容
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 獲取的信息以文件流的形式返回
$tmpInfo = curl_exec ( $curl ); // 執行操作
if (curl_errno ( $curl )) {
curl_close ( $curl ); // 關閉CURL會話
die('Errno' . curl_error ( $curl )) ;
}
curl_close ( $curl ); // 關閉CURL會話
return $tmpInfo; // 返回數據
}
}
weather::getXML("Changsha");
新浪 http://php.weather.sina.com.cn
<?php
header ( 'Content-Type: text/html; charset = utf-8' );
class weather {
static $url = 'http://php.weather.sina.com.cn/xml.php?password=DJOYnieT8234jlsK&day=0&city=';//password是固定值
static $city = '%B1%B1%BE%A9'; //默認城市北京
static $weatherXML = '';
static $file_path = "data/";
/**
* 獲得遠程xml並緩存到本地
*/
static public function getXML($city = null) {
if ($city != null){
$city = mb_convert_encoding ( $city, 'gbk', 'utf-8' );
self::$city = urlencode($city);
}
self::$weatherXML = self::$file_path . md5(self::$city) . '-weather.xml';
if (file_exists( self::$weatherXML )) {
$fileTime = filemtime ( self::$weatherXML );
$stater = time () - $fileTime - 60 * 60 * 2;
if ($stater > 0) {
return true;
}
}
$contents = self::vget( self::$url . self::$city );
self::cacheXML ( $contents );
self::analysisXML();
}
/**
* 解析xml
*/
static public function analysisXML() {
$XML = simplexml_load_file(self::$weatherXML );
print_r($XML);
}
/**
* 創建xml緩存
* @param $contents 要緩存的內容
*/
static private function cacheXML($contents) {
$contents = str_ireplace ( '<?xml version="1.0"?>', "<?xml version=\"1.0\"?> \n", $contents );
file_put_contents ( self::$weatherXML, $contents ) or die ( '沒有寫權限' );
}
/**
* 模擬獲取內容函數
* @param type $url
* @return type
*/
static private function vget($url) {
$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
$curl = curl_init (); // 啟動一個CURL會話
curl_setopt ( $curl, CURLOPT_URL, $url ); // 要訪問的地址
curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, 0 ); // 對認證證書來源的檢查
curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, 1 ); // 從證書中檢查SSL加密算法是否存在
curl_setopt ( $curl, CURLOPT_USERAGENT, $user_agent ); // 模擬用戶使用的浏覽器
@curl_setopt ( $curl, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自動跳轉
curl_setopt ( $curl, CURLOPT_AUTOREFERER, 1 ); // 自動設置Referer
curl_setopt ( $curl, CURLOPT_HTTPGET, 1 ); // 發送一個常規的Post請求
curl_setopt ( $curl, CURLOPT_TIMEOUT, 120 ); // 設置超時限制防止死循環
curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 顯示返回的Header區域內容
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 獲取的信息以文件流的形式返回
$tmpInfo = curl_exec ( $curl ); // 執行操作
if (curl_errno ( $curl )) {
curl_close ( $curl ); // 關閉CURL會話
die('Errno' . curl_error ( $curl )) ;
}
curl_close ( $curl ); // 關閉CURL會話
return $tmpInfo; // 返回數據
}
}
weather::getXML();