上次做飞信天气预报的时候简单搜索了一下中国天气网的 API ,当然是没有官方文档的,最初是谁挖掘出来的也不可考了。刚才在增加新功能的时候又顺手搜了一下相关资料,发现这个 API 还真不简单。中国天气网有三个 API 适用于不同场合的使用。

http://m.weather.com.cn/data/101050101.html 这个接口返回的格式如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
    "weatherinfo": {
        "city": "城市中文名",
        "city_en": "城市英文名", 
        "date_y": "发布日期", 
        "date": "", 
        "week": "周信息", 
        "fchh": "信息发布时的整点小时数(感谢读者 白白乌鸦 的提醒)", 
        "cityid": "城市ID", 
        "temp1": "今日气温", 
        "temp2": "明日气温", 
        "temp3": "第三日气温", 
        "temp4": "第四日气温", 
        "temp5": "第五日气温", 
        "temp6": "第六日气温", 
        "tempF1": "今日气温(华氏)", 
        "tempF2": "明日气温(华氏)", 
        "tempF3": "第三日气温(华氏)", 
        "tempF4": "第四日气温(华氏)", 
        "tempF5": "第五日气温(华氏)", 
        "tempF6": "第六日气温(华氏)", 
        "weather1": "今日天气", 
        "weather2": "明日天气", 
        "weather3": "第三日天气", 
        "weather4": "第四日天气", 
        "weather5": "第五日天气", 
        "weather6": "第六日天气", 
        "img1": "天气图标编号,此处的编号及其图片获取规则尚不清楚,如有知道详情的恳请评论告知,我将添加说明", 
        "img2": "99", 
        "img3": "0", 
        "img4": "1", 
        "img5": "4", 
        "img6": "7", 
        "img7": "1", 
        "img8": "99", 
        "img9": "0", 
        "img10": "99", 
        "img11": "0", 
        "img12": "99", 
        "img_single": "? 可能是天气图标编号", 
        "img_title1": "? 可能是天气图标对应的 title", 
        "img_title2": "多云", 
        "img_title3": "晴", 
        "img_title4": "多云", 
        "img_title5": "雷阵雨", 
        "img_title6": "小雨", 
        "img_title7": "多云", 
        "img_title8": "多云", 
        "img_title9": "晴", 
        "img_title10": "晴", 
        "img_title11": "晴", 
        "img_title12": "晴", 
        "img_title_single": "? 可能是天气图标对应的 title", 
        "wind1": "今日风向风力信息", 
        "wind2": "明日风向风力信息", 
        "wind3": "第三日风向风力信息", 
        "wind4": "第四日风向风力信息", 
        "wind5": "第五日风向风力信息", 
        "wind6": "第六日风向风力信息", 
        "fx1": "西南风", 
        "fx2": "西风", 
        "fl1": "今日风力信息", 
        "fl2": "明日风力信息", 
        "fl3": "第三日风力信息", 
        "fl4": "第四日风力信息", 
        "fl5": "第五日风力信息", 
        "fl6": "第六日风力信息", 
        "index": "热",
        "index_d": "天气较热,建议着短裙、短裤、短套装、T恤等夏季服装。年老体弱者宜着长袖衬衫和单裤。",
        "index48": "炎热",
        "index48_d": "天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。",
        "index_uv": "紫外线信息", 
        "index48_uv": "48 小时紫外线信息", 
        "index_xc": "洗车指数(感谢读者 刘睿 的提醒)", 
        "index_tr": "旅游指数", 
        "index_co": "舒适指数", 
        "st1": "25",
        "st2": "17",
        "st3": "28",
        "st4": "19",
        "st5": "18",
        "st6": "16",
        "index_cl": "晨练指数", 
        "index_ls": "晾晒指数", 
        "index_ag": "感冒指数(感谢读者 刘睿 的提醒)" 
    }
}

上面这个就是我现在在用的,返回的数据最全面,也是绝大多数博客中都会介绍的。另外还有两个接口比较简洁。

http://www.weather.com.cn/data/sk/101010100.html 这个接口返回的数据是实况数据,像下面这样的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
    "weatherinfo": {
        "city": "城市中文名", 
        "cityid": "城市 ID", 
        "temp": "温度", 
        "WD": "风向", 
        "WS": "风力", 
        "SD": "湿度", 
        "WSE": "1", 
        "time": "发布时间", 
        "isRadar": "是否有雷达图", 
        "Radar": "雷达图编号,雷达图的地址在 http://www.weather.com.cn/html/radar/雷达图编号.shtml" 
    }
}

还有一个接口http://www.weather.com.cn/data/cityinfo/101010100.html 这个接口返回的数据如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
    "weatherinfo": {
        "city": "城市中文名", 
        "cityid": "城市 ID", 
        "temp1": "22℃", 
        "temp2": "31℃", 
        "weather": "天气", 
        "img1": "? 天气图标编号", 
        "img2": "? 天气图标编号", 
        "ptime": "发布时间" 
    }
}

另外中国天气网还有一个根据 IP 来判断访问者所在地的引擎,地址在http://61.4.185.48:81/ ,直接访问的话会提示“This is the geoip engine created for weather.com.cn. ”,访问http://61.4.185.48:81/g/ 可以返回你的 IP 所在地相应信息,包括 IP 和城市编号,但是没有城市名称。


2013 年 8 月 2 日更新

返回数据最多的那个接口,即本文中最开始介绍的接口,其中的图片获取规则因为博文发布时间久远,我已经遗忘了。如果有哪位读者知道的话,恳请评论告知,我好添加到文章中,方便各位的共享。

另外,天气网本身有另一个用于 Flash 的接口。在天气网上查询任意一个城市的天气,可以看到其页面上有一个 Flash 绘制的“整点天气实况”,就是当天的气温曲线。里面的数据是从 http://flash.weather.com.cn/sk2/101050101.xml 这个接口获得的。返回数据如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0"?>
<sktq id="101050101" ptime="13-08-02 16:00" city="哈尔滨">
     <qw h="16" wd="30" fx="190" fl="2" js="0" sd="64"/>
     <qw h="15" wd="30" fx="203" fl="3" js="0" sd="61"/>
     <qw h="14" wd="30" fx="174" fl="3" js="0" sd="63"/>
     <qw h="13" wd="30" fx="179" fl="3" js="0" sd="62"/>
     <qw h="12" wd="29" fx="162" fl="3" js="0" sd="66"/>
     <qw h="11" wd="29" fx="214" fl="2" js="0" sd="66"/>
     <qw h="10" wd="28" fx="214" fl="2" js="0" sd="70"/>
     <qw h="09" wd="28" fx="220" fl="2" js="0" sd="70"/>
     <qw h="08" wd="26" fx="178" fl="2" js="0" sd="75"/>
     <qw h="07" wd="25" fx="145" fl="1" js="0" sd="76"/>
     <qw h="06" wd="24" fx="171" fl="1" js="0" sd="79"/>
     <qw h="05" wd="24" fx="131" fl="2" js="0" sd="79"/>
     <qw h="04" wd="24" fx="146" fl="2" js="0" sd="77"/>
     <qw h="03" wd="24" fx="163" fl="2" js="0" sd="75"/>
     <qw h="02" wd="24" fx="126" fl="2" js="0" sd="84"/>
     <qw h="01" wd="24" fx="127" fl="1" js="0" sd="81"/>
     <qw h="00" wd="25" fx="137" fl="2" js="0" sd="78"/>
     <qw h="23" wd="25" fx="99" fl="2" js="0" sd="78"/>
     <qw h="22" wd="25" fx="140" fl="2" js="0" sd="76"/>
     <qw h="21" wd="26" fx="133" fl="2" js="0" sd="78"/>
     <qw h="20" wd="27" fx="149" fl="1" js="0" sd="71"/>
     <qw h="19" wd="28" fx="187" fl="2" js="0" sd="67"/>
     <qw h="18" wd="29" fx="161" fl="2" js="0" sd="59"/>
     <qw h="17" wd="30" fx="138" fl="2" js="0" sd="60"/>
     <qw h="16" wd="30" fx="130" fl="3" js="0" sd="57"/>
</sktq>

稍作解析: sktq 是“实况天气”的汉语拼音首字母缩写,这个节点的 id 是城市 ID ,ptime 即是发布时间, city 是城市的名称。根节点内是一系列 qw 节点, qw 即是“气温”的汉语拼音缩写;每个节点中, h 是整点小时数,即此节点数据发布时间的小时位; wd 是温度,以摄氏计; fx 是风向,貌似是个角度,具体的规则我还不太清楚; fl 是风力级数; js 是降水,以毫米计; sd 是相对湿度,以百分数计。这一系列节点是以时间逆序排列的,也就是说,接近当前时间的排在前面。

要使用这个接口的数据,跟其他接口一样,也需要解决读者评论中提到的跨域问题,我个人的建议是用自己的服务器做代理转发,经过代理层之后是要用 JSON 还是 JSONP 或者 Flash 跨域,就随自己喜好和项目需求了吧。


2013 年 8 月 22 日更新

四个图片接口依次如下:http://m.weather.com.cn/img/c0.gifhttp://m.weather.com.cn/img/b0.gifhttp://www.weather.com.cn/m/i/weatherpic/29x20/d0.gifhttp://www.weather.com.cn/m2/i/icon_weather/29x20/n00.gif 。其中图片编号 99 代表空图片。

对于想手动获取城市代码的朋友,也有几个接口提供给大家。获取省级代码的接口: http://www.weather.com.cn/data/list3/city.xml?level=1 ,获取城市代码的接口(比如安徽省是 22 ): http://www.weather.com.cn/data/list3/city22.xml?level=2 ,获取区域代码的接口(比如安庆是 2206): http://www.weather.com.cn/data/list3/city2206.xml?level=3 。需要注意的是这几个接口并不是返回 XML 文档,而是返回纯文本,需要自行分割匹配。

Flash 实况地址在这里: http://flash.weather.com.cn/sk2/shikuang.swf?id=101050101

本次更新的内容都来自于 http://g.kehou.com/t1033317914.html,在此对接口的挖掘者和分享者表示感谢!也感谢读者朋友的反馈。


2014年4月25日更新

本文可能无法及时更新,因为我也并不是一直都在使用这些接口。 3月份开始中国天气网貌似对一些数据源进行了处理,对未验证的请求会返回旧的数据。 解决方法,个人认为比较完整的一个总结在这里:国内有哪些城市较完整可以免费使用的天气 API 接口?

另外一篇从中国天气网移动版页面上分析来的接口说明,看这里:开发笔记-获取天气数据接口

反正现在总体来看,移动版页面的数据源判定比较简单,最多也就是对 Referer 进行判断而已,建议使用。 桌面版网页的数据源虽然有一个实况接口还可以使用,但是想必验证会趋于严格。有兴趣的也可以继续挖掘:) 。