更新 #2: 这是旧的。 我认为这里不再有任何东西起作用,因为 API 往往会在几年内发生变化。 如果您正在寻找可以正常工作的与天气相关的代码示例,您可能需要在其他地方寻找。
更新 #1: 本文于 2008 年 4 月 30 日更新,以解决雅虎提供数据的方式发生的一项小变化 更新的下载
使用一些魔法和技巧(阅读:PHP 和 CSS),我们可以自动根据外面的天气实时改变网站的外观! 在我们创建的 示例网站 中,页眉图形会根据晴朗、雨、雪和多云这四种不同风格之一进行更改。
步骤 1:设计天气图形
我们的示例网站会更改页眉图形以及侧边栏中的图标,以描述天气。 为了举例,我们只创建了四种不同的天气情况,默认为晴朗。
步骤 2:检索天气信息
雅虎有一个天气信息 API。 我们可以非常轻松地使用以下格式的 URL 访问它
http://weather.yahooapis.com/forecastrss?p=97211&u=f
五位数是您的邮政编码,“f”代表“华氏度”(更改为“c”代表“摄氏度”)。 信息以 XML 格式提供,您自己决定如何解析数据。 由于我们只关心“yweather:condition”元素的“text”属性,我们将避免创建 XML 解析对象并使用简短的正则表达式。
正则表达式返回 yweather 元素的文本后,我们将使用 str_replace() 和 strtolower 将字符串格式化为代表性的 CSS 类。
步骤 3:将天气信息转换为 CSS 类
以下是 PHP 代码
<?php
/* get xml, find match */
/* get the weather from Yahoo */
$data = get_data("http://weather.yahooapis.com/forecastrss?p=97211&u=f");
$weather_class = format_result(get_match('/<yweather:condition text="(.*)"/isU',$data));
/* debug to see what we got back */
//echo '<pre style="background:#fff;font-size:12px;">['; print_r($weather); echo ']</pre>';
/* format the result */
function format_result($input)
{
return strtolower(str_replace(array(' ', '(', ')'), array('-', '-', ''), $input));
}
/* helper: does regex */
function get_match($regex,$content)
{
preg_match($regex,$content,$matches);
return $matches[1];
}
/* gets the xml data from Alexa */
function get_data($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$xml = curl_exec($ch);
curl_close($ch);
return $xml;
}
?>
现在我们有一个可以回显的变量,它代表我们提供的邮政编码的当前天气
<div class="header header-<?php echo $weather_class; ?>">
<!-- Change the class above to change the header graphic -->
</div>
步骤 4:为每个类编写 CSS 代码
.header {
width: 782px; height: 150px;
/* DEFAULTS TO SUNNY */
background: url(images/header-sunny.png) no-repeat center center black;
}
.header-rain {
background: url(images/header-rain.png) no-repeat center center black;
}
header-snow {
background: url(images/header-snow.png) no-repeat center center black;
}
.header-sunny, .header-fair {
background: url(images/header-sunny.png) no-repeat center center black;
}
.header-partly-cloudy, .header-cloudy, .header-mostly-cloudy {
background: url(images/header-partlycloudy.png) no-repeat center center black;
}
步骤 5:扩展这个想法
请注意,我们对“部分多云”、“多云”和“大部分多云”的天气状况使用“部分多云”图形。 您自己决定要变得多具体。 以下是雅虎可能提供的所有天气状况的完整列表:
0 tornado
1 tropical storm
2 hurricane
3 severe thunderstorms
4 thunderstorms
5 mixed rain and snow
6 mixed rain and sleet
7 mixed snow and sleet
8 freezing drizzle
9 drizzle
10 freezing rain
11 showers
12 showers
13 snow flurries
14 light snow showers
15 blowing snow
16 snow
17 hail
18 sleet
19 dust
20 foggy
21 haze
22 smoky
23 blustery
24 windy
25 cold
26 cloudy
27 mostly cloudy (night)
28 mostly cloudy (day)
29 partly cloudy (night)
30 partly cloudy (day)
31 clear (night)
32 sunny
33 fair (night)
34 fair (day)
35 mixed rain and hail
36 hot
37 isolated thunderstorms
38 scattered thunderstorms
39 scattered thunderstorms
40 scattered showers
41 heavy snow
42 scattered snow showers
43 heavy snow
44 partly cloudy
45 thundershowers
46 snow showers
47 isolated thundershowers
对于这个示例,您会注意到我们还使用了硬编码的邮政编码,必须在 PHP 中更改,才能更改网站将根据其外观进行更改的天气位置。 但是,如果网站知道访问者的邮政编码,并根据他们的天气而不是您的天气改变网站的外观,那不是很酷吗? 这种类型的编码需要超出本教程范围的服务和专业知识,但快速谷歌搜索会显示一些可能使这种情况发生的 service,比如 IP2Location.
玩得开心! - 告诉我是否有人实际使用了它,我很想看看您用它做了什么。
哇,感谢您的分享! 我在过去两个月里尝试过这样做,但不知何故变得很懒...
我刚刚访问了您的网站并订阅了。 :D
不错的简短教程。
我一直很喜欢 Dunstan Orchard 在 他的博客 上使用的页眉/天气图像,但除了分享图形之外,他从来没有提供任何有关它的教程。 不过我理解他,我相信他投入了很多精力在上面。(单击右侧页眉下方名为“全景信息”的标签,了解更多信息。)
非常非常有趣,哈哈 :)
这真的很酷!
我不知道在哪里,但我一定要用它!
Oli
附注:您可以轻松地通过查看 weather.yahoo.com 检索(例如)德语提要。 只需检索您的天气,然后使用火狐内置的 RSS 功能来捕获 RSS URL。
很酷的技巧,谢谢。
您的 PHP 代码中的调试行有一个小错误,您需要说 print_r($weather_class) 而不是 print_r($weather)。
哇! 我不知道我是否有耐心为每个州创建一个图形... 不过说实话,如果英国开始出现热带风暴,我的网站的美观将是我最不关心的! 嗯... 这点需要注意,这在英国有效吗?
很棒的帖子,我喜欢它... 就像 Paranaque Scandal...
很酷... 但世界其他地方呢? 您是否有每个人都可以使用的脚本或位置?
很酷的教程,我想我会在我的 WordPress 博客上试试。
非常感谢!
评论中使用的那些 Gravatar 也非常酷,这也是一个我会考虑的不错功能 :)
真是个好主意! 谢谢
几个月前我在 IBM 的网站上看到了几乎完全相同的主题 - 收集得不错!
看看这个网站:http://www.sky-catcher.nl
超过二十万张天空图片,可根据知识共享许可使用。
我建议不要将类应用于将接收样式的元素,而是(并且已经)将类添加到 body 元素中。
这样,您可以控制整个网站,而不仅仅是一个特定元素(及其子元素)
<body class=’rainy’>
body.rainy #header {rainy-bg.gif} body.sunny #header {sunny-bg.gif} 等等..
哇,真是个好主意! 这可以与 IP 地址相关联。
干杯,
praveen。
如果您要查找美国以外地区的的天气预报,请在 http://weather.yahoo.com/ 进行搜索。结果 URL 将类似于 http://weather.yahoo.com/forecast/KSXX0037.html。只需获取 forecast/ 之后和 .html 之前的部分,即可将其用于位置。
http://weather.yahooapis.com/forecastrss?p=CAXX0212&u=c 将获取我所在位置的天气预报。
您比我更快,Snook - 感谢您指出这一点。
最初,我打算将此提升到一个新的水平,即获取用户的 IP 地址,找到他们的位置,并根据他们的位置提供天气预报。问题是我不想支持任何服务,尤其是付费服务,将 IP 地址转换为邮政编码。
希望我提供的信息对每个人来说都是一个很好的起点。
我可能也需要在我的博客上使用这个功能。这是一个非常酷的技巧,我相信它会比你想象的更受欢迎。干得好,David 和 Chris!
非常感谢!我一直想知道如何与天气同步,已经有一年多了。我用 JavaScript 弄清楚了如何根据一天中的时间更改 CSS,但这要大胆得多。再次感谢,希望你能看到一些很棒的例子。
几个月前,当我看到那篇 IBM 文章时,我经历了完全相同的事情,Walsh。
非常好,非常棒。我一直想做这样的事情,也许还可以使用一天中的时间(以及日出/日落时间)来推送一些日出/日落或夜景照片。
谢谢。
附注:雅虎的服务器很大,但一个小型的本地文件缓存来保存结果几分钟甚至更长时间会很有帮助。
每小时缓存一次结果是一个好主意。我试图保持脚本简单,但这将是一个不错的、简单的补充。
这太棒了,感谢你的帖子!我需要在某一天尝试一下这个功能!
我以前在我的页面上也有天气预报,不过那是几年前的事了。
我有一个下拉菜单,可以从中选择一些欧洲首都。我不知道是否有人查看过天气预报,但我认为这是一个不错的功能,当我在我的网站上时,我总是知道巴黎的实际天气是否与我的网站上描述的一致;-)
现在,你当然可以将此功能与 IP2location 服务结合起来。
Léonie.
paranoiaparadise
我在我的网站上试用了一下,它似乎运行良好。再次感谢你的这篇帖子!
太棒了,我很快就会发布带有这个功能的网址!
类似的想法以前就有人做过,用音乐视频来展示根据当地观众天气变化的不同的图像。这个是基于 Flash 的,但它提供了一些关于可能性的想法。 theunseenvideo.com
我还应该指出,上面的教程可以很容易地修改为根据天气交换整个 CSS 文件,从而为用户带来非常动态的体验。(我梦想着当我下雪时,我网站的所有内容都堆在屏幕底部…)
这看起来很棒。我有一个博客网站,专门介绍加拿大惠斯勒的天气和雪况。我并不擅长编码之类的,但我必须多学习一下,看看是否可以将它整合到我的博客中。如果我能设置一个标题,使用真实的雪山图片,并且根据天气变化而改变,那就太棒了。
感谢您提供的信息,希望我能想出一个好的方法来使用它。
非常棒,自从我切换到允许使用 curl 的网络主机后。感谢 1*10E6。
不错的教程。可惜我无法让它工作。使用你提供的代码,它根本无法返回天气信息。
你有没有提供示例的压缩包,我可以用来调试吗?
除了这个问题,这是一个很棒的想法,而且非常有用。
谢谢。
嘿 Mark,我认为我一直想把它做成可下载的示例,但我忘了添加链接!请看这里。
下载天气切换器
您好!感谢您的教程。
我一直在寻找解析雅虎天气 RSS 的 PHP 教程,这个教程帮了我很大的忙。
我想在我的页面上显示完整的 weather 信息,有什么好主意吗?
我在 PHP 代码中实现了这个功能,它运行良好,但在一周前突然停止工作了,我不知道为什么。
你能帮我一下吗?
我也在寻找同样的东西,你找到什么了吗?
您好。
很棒的教程。谢谢 :)。我修改了您的想法,所以我的网站没有更改标题,而是更改了我的 Southpark 头像,根据天气变化而穿不同的衣服。
我的问题是,选项“晴天、雨天、风天、多云”没有在我的页面上的标签中插入。有没有什么限制,可以更改文件或文件夹的权限来包含 XML 文件?
我所做的就是,创建一个名为 weather.php 的文件,创建不同的头像作为 png 文件,在我的主题中调用变量,放到我想要的位置,并在我的样式表中插入 CSS 代码。
此致
Frank
抱歉,我的英语不好。
对于在美国以外地区遇到问题的任何人,请务必阅读上面 Jonathan Snook 的评论。
我一直尝试,但似乎无法在 Safari 上使用它。
有人有什么想法吗?我认为问题出在默认标题中的某个地方。
任何遇到此问题的人,请注意,雅虎更改了一些内容,我们必须更新 PHP 中的一行代码才能使其再次工作。
$weather_class = format_result(get_match(‘/
是否可以根据风速等特定参数更改 png 图片?
如果是,怎么做?
感谢您的文章,David。我用它来实现根据我所在位置的温度旋转背景图片。
感谢您的文章和编码示例。
我目前正在尝试弄清楚如何以相同的方式实现 7 天预报。这开始变得很痛苦。呵呵。
R.
您好,感谢您的文章。但我遇到一个问题。我来自土耳其伊斯坦布尔。伊斯坦布尔的通用邮政编码是 34000,我所在地区的邮政编码是 34330。但在雅虎天气 API 中,这些邮政编码无效。
当我尝试获取天气数据时,
(http://weather.yahooapis.com/forecastrss?p=34000&u=c 和
http://weather.yahooapis.com/forecastrss?p=34330&u=c)
我遇到了这个错误
抱歉,未找到您的位置“34000”。请重试。
抱歉,未找到您的位置“34330”。请重试。
你能帮我一下吗?
@Eray Alakese - 请查看上面 Snook 的评论(#16),了解如何找到用于国际位置的合适“邮政编码”。
Chris - 很棒的教程,我可能会在我的下一次重新设计中使用它。
谢谢!
-Rob
非常感谢 Rob :)
@David Walsh 试试这个网站,他们允许您下载他们使用的数据库,这意味着您可以在本地使用它。 http://software77.net/cgi-bin/ip-country/geo-ip.pl
PS:右上角有一个 RSS 按钮 :)
您好。
只想告诉你,阅读你的文章启发我在我的网站上使用雅虎天气提要。
我的网站允许用户选择他们的城市(目前仅限英国)并以页面背景的形式显示天气。
我还添加了一点 php 来检测用户当前时间并相应地更改网站。诚然,这仅基于用户计算机的时间。将来,我将使其与用户的 IP 或他们选择的位置相关联。
所以谢谢!
如果你想查看它,你可以在 http://www.jealousdesigns.co.uk 上看到它。
(使用 FireFox 查看完整网站……IE 不喜欢大的下拉菜单,所以必须缩小它……)
干杯。
Andy
我很乐意,Eray。
正如我之前提到的,尽管很麻烦,我不得不走另一条路,而这个 天气 MOD 就是我想到的。
邮政编码功能通常基于美国,但如果找不到天气状况,您 **可以** 输入 **城市名称**,例如,如果您输入 **海得拉巴**,它将显示一个下拉组合框并显示所有存在的海得拉巴实例,例如
海得拉巴,印度
海得拉巴,巴基斯坦
您可以从那里选择。
感谢您提供的灵感!!!
此致
Rob。
阅读完本教程后,我受到启发,做了一个小型网站,用于显示当前时间和天气数据。
http://web.ics.purdue.edu/~dcfritz/files/Sandbox/TODAW/timeofdayandweather.html
太阳和月亮围绕中心旋转,反映着时间。背景也反映了时间,亮度不同。夜间为暗,白天为亮蓝色。月亮显示当前的月相(满月等)。天气数据显示在中心。
当我汇总我的天气和月相信息时,我没有使用本教程中使用的正则表达式。相反,我切换到使用内置的 php 函数将 xml 转换为 php 数组。然后,我将选定的 php 数组回显到 html 元素中,以便它们可以传递给 javascript。
我发布了所有源代码,如果你想看看。
感谢您的教程。它对我非常有用…
非常感谢这篇文章。
我认为这是一种很好的 SMO 技术。
这种风格可以吸引很多访客。
可以为这个脚本添加更多功能,比如小时时间功能。
谢谢
非常棒,我该如何用 .NET 编写这个代码?
嗨,
我非常喜欢这个教程。
我有一个问题!是否可以显示温度?
谢谢。