PHP利用天气API获取天气信息

??? 中国天气网提供了一些查询天气的API,访问时返回天气信息的JSON格式数据,解析就可以得到天气信息:

http://www.weather.com.cn/data/sk/101281601.html
http://www.weather.com.cn/data/cityinfo/101281601.html
http://m.weather.com.cn/data/101281601.html

后面一串数字为城市代码。

?返回的utf-8字符串

{"weatherinfo":{"city":"东莞","cityid":"101281601","temp":"22","WD":"东风","WS":"1级","SD":"90%","WSE":"1","time":"08:20","isRadar":"0","Radar":""}}
登录后复制

?所以首先要将城市名转换为城市代码,最简单的办法是通过读取一个文本文件来获取:

格式如:

101010100=北京 
101010200=海淀
101010300=朝阳
101010400=顺义
101010500=怀柔
101010600=通州
101010700=昌平
101010800=延庆
101010900=丰台
101011000=石景山
101011100=大兴
登录后复制

?

文本文件和PHP文件放在同一目录下;

于是PHP代码:


登录后复制
?运行结果:


PHP利用天候API获取天气信息-LMLPHP
方法二:

1.可以不用文件,而是从天气网服务器动态获取城市名和ID:

当访问这个地址

http://m.weather.com.cn/data5/city.xml?

服务器就会返还以下代码:

01|北京,02|上海,03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,09|河北,10|山西,11|陕西,12|山东,13|新疆,14|西藏,15|青海,16|甘肃,17|宁夏,18|河南,19|江苏,20|湖北,21|浙江,22|安徽,23|福建,24|江西,25|湖南,26|贵州,27|四川,28|广东,29|云南,30|广西,31|海南,32|香港,33|澳门,34|台湾
登录后复制
2.?这时,我们就知道了省份的代码;城市的代码是在省份的基础上扩展的,知道省份代码是第一步;同时我们也知道了省份名,这样,做下拉框让用户选地区也很简单:

知道了省份我们要看这个省有些什么市,就需要依据省份代码来获取不同的文件了,例如云南是05,我们要获取云南所有州市的信息就要访问:

http://m.weather.com.cn/data5/city29.xml?

返回文本:

2901|昆明,2902|大理,2903|红河,2904|曲靖,2905|保山,2906|文山,2907|玉溪,2908|楚雄,2909|普洱,2910|昭通,2911|临沧,2912|怒江,2913|迪庆,2914|丽江,2915|德宏,2916|西双版纳
登录后复制
?3.但是,这样还不够,我们还需要继续缩小范围,比如我们要知道大理州有哪些县级市和县,就需要继续访问:
?http://m.weather.com.cn/data5/city2902.xml

果然,返回结果:

290201|大理,290202|云龙,290203|漾濞,290204|永平,290205|宾川,290206|弥渡,290207|祥云,290208|巍山,290209|剑川,290210|洱源,290211|鹤庆,290212|南涧
登录后复制
?4.这时虽然可以找到所有城市名,但这个代码还不是最终的城市代码,所以还要再来一次,不如说要找宾川的代码:

?http://m.weather.com.cn/data5/city290205.xml

?
290205|101290205
登录后复制
?至此,读了四次,城市名和城市代码已获取到。

当然,解析数据也可以用Javascript来完成,但是由于Ajax不支持跨域名访问,所以将数据从中国天气网的服务器上获取到本地还需要一个简单服务器脚本来做代理,它的功能只是完成将请求的文件以字符串返还Javascript来做动态数据显示,所以:

首先要写一个读取字符串的php

getstr.php

登录后复制
?一个使用Ajax的js文件:

ajax.js

function Ajax(recvType) {
  var aj = new Object();
  aj.recvType = recvType ? recvType.toUpperCase() : 'HTML'//HTML XML
  aj.targetUrl = '';
  aj.sendString = '';
  aj.resultHandle = null;

  aj.createXMLHttpRequest = function() {
    var request = false;
    //window对象中有XMLHttpRequest存在就是非IE,包括(IE7,IE8)
    if (window.XMLHttpRequest) {
      request = new XMLHttpRequest();
      if (request.overrideMimeType) {
        request.overrideMimeType("text/xml");
      }
      //window对象中有ActiveXObject属性存在就是IE
    } else if (window.ActiveXObject) {
      var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
      for (var i = 0; i < versions.length; i++) {
        try {
          request = new ActiveXObject(versions[i]);
          if (request) {
            return request;
          }
        } catch(e) {
          request = false;
        }
      }
    }
    return request;
  }

  aj.XMLHttpRequest = aj.createXMLHttpRequest();

  aj.processHandle = function() {
    if (aj.XMLHttpRequest.readyState == 4) {
      if (aj.XMLHttpRequest.status == 200) {
        if (aj.recvType == "HTML")
          aj.resultHandle(aj.XMLHttpRequest.responseText);
        else if (aj.recvType == "XML")
          aj.resultHandle(aj.XMLHttpRequest.responseXML);
      }
    }
  }

  aj.get = function(targetUrl, resultHandle) {
    aj.targetUrl = targetUrl;

    if (resultHandle != null) {
      aj.XMLHttpRequest.onreadystatechange = aj.processHandle;
      aj.resultHandle = resultHandle;
    }
    if (window.XMLHttpRequest) {
      aj.XMLHttpRequest.open("get", aj.targetUrl);
      aj.XMLHttpRequest.send(null);
    } else {
      aj.XMLHttpRequest.open("get", aj.targetUrl, true);
      aj.XMLHttpRequest.send();
    }

  }

  aj.post = function(targetUrl, sendString, resultHandle) {
    aj.targetUrl = targetUrl;

    if ( typeof (sendString) == "object") {
      var str = "";
      for (var pro in sendString) {
        str += pro + "=" + sendString[pro] + "&";
      }
      aj.sendString = str.substr(0, str.length - 1);
    } else {
      aj.sendString = sendString;
    }

    if (resultHandle != null) {
      aj.XMLHttpRequest.onreadystatechange = aj.processHandle;
      aj.resultHandle = resultHandle;
    }

    aj.XMLHttpRequest.open("post", targetUrl);
    aj.XMLHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    aj.XMLHttpRequest.send(aj.sendString);

  }

  return aj;
}
登录后复制
?网页部分代码:

登录后复制
?运行结果:


PHP利用天候API获取天气信息-LMLPHP

这样做下拉框中的数据可以动态从天气网的服务器中读取过来再动态加载,因此也不用自己做转换了。
?

如果是有图片元素的数据,直接找到图片的链接,将图片链过来就可以了。


PHP利用天候API获取天气信息-LMLPHP
?完。

09-19 03:39