之所以会弄出这个命题, 是突然之间的一个想法: 想让博客的背景随着访问者当地的天气变化而变化. 好天气, 微笑的晴天娃娃; 下雨天, 晶莹的水滴点点; 飘雪了, 唯美的白色浪漫.
虽然目的简单, 做起来缺有点绕路, 单从数据源来说, 各提供天气服务的网站都不会公开天气预报的接口, 只能在网路上搜寻大家撞见的地址.
一、腾讯网天气预报
腾讯有一个获取天气预报的脚本, 已经将函数封装好, 直接使用就能获得访问者当地的天气情况, 稍加修改就能实现目标.
获取最新脚本请按此;
如果新版本不能使用, 获取本站存档请按此.
如果有一个名为 Weather
的元素, 使用下面的代码就能将其内容替换为天气情况:
1 | <script src="j.minisite.weather.js"></script> |
这一函数完成了以下工作:
- 读取名为
QQ_IPAddress
的 Cookie, 如果存在则载入保存的省名、城市名, 跳到第三步; - 访问 http://fw.qq.com:80/ipaddress 获得省名、城市名, 保存 Cookie;
- 获得城市编号;
- 通过 http://weather.news.qq.com/inc/minisite_[城市编号].js 获得天气字符串, 加入链接.
分析执行速度, 第一次执行发出两次请求, 第二次由于保存了 Cookie, 发出的请求减少为一次, 速度较好.
如果要实现天气背景, 应修改 j.minisite.weather.js, 使其直接返回天气而不是替换元素.
二、中国天气网
中国天气网的接口比腾讯的麻烦, 但是它给出的天气可以用数字表示, 这一点比腾讯方便.
这网站没有给我们留下直接使用的脚本, 还得自己开工, 需要完成以下工作:
- 访问 http://61.4.185.48:81/g/, 得到城市编号;
- 下载 http://m.weather.com.cn/data/[城市编号].html 的内容, 这是一段 JSON 数据;
- 分析数据, 得到天气
由于涉及到跨站请求, 单纯的通过 JavaScript 是不能达成目标的, 必须使用 AJAX 中转, 或者纯 PHP 方式实现.
至于获得的 JSON 数据, 只要把它当作一段普通的字符串, 使用正则匹配:
/(\"img1\":\").*?([^\"]+)/i
可以获得天气代码;/(\"weather1\":\").*?([^\"]+)/i
可以获得天气描述.
使用天气代码更方便, 因为它是一个范围从 0 到 31 的数字, 访问 http://m.weather.com.cn/weather_img/[天气代码].gif 即可获知实际含义.
分析执行速度, 第一次执行发出两次请求 (AJAX 还更慢), 可以将通过 Cookie 保存城市编号, 这样第二次只需执行后两步, 减少一次请求; 或者通过生命周期较短的 Cookie 保存天气, 因为天气背景不用那么实时 :-), 请求数为零.