From MediaWiki.org
Jump to navigation Jump to search
MediaWiki extensions manual
Crystal Clear action run.svg
Release status: beta
Implementation Parser function
Description Grab weather from wundeground.com based on location
Author(s) (wookienztalk)
Latest version 1.0 (2011-11-13)
Database changes No
License No license specified
Download code is on this page
Hooks used
Translate the Wunderground extension if it is available at translatewiki.net
Check usage and version matrix.

What can this extension do?[edit]

If supplied with location data it will return a JSON stream of various weather data. This extension creates the tag <wunderground> </wunderground>, it takes various arguments e.g <wunderground arg="somewhere"> This arg can then be used to push to wunderground to return weather data based on this location.

See http://www.wunderground.com/weather/api/d/documentation.html for specifics of what you can push to wunderground.


In this case I am using ICAO codes for airport data, this is passed to wunderground as non ambiguous location data. Cities, Lat/Long and others can also be used. See Docs above and note slight change of URL ebing called. " /q/"airport" vs "/q/STATE/CITY"

NOTE: the Wunderground API has been discontinued, thus making this extension non-functinoal.
YOU WILL NEED TO APPLY FOR AN API KEY. It takes 2 minutes and is free. Here

Download instructions[edit]

Please cut and paste the code found below and place it in $IP/extensions/wunderground/wundeground.php. Note: $IP stands for the root directory of your MediaWiki installation, the same directory that holds LocalSettings.php.

# Weather Underground Extension
# by WookieNZ
# http://www.wookie.co.nz
# Usage:
# <wunderground airport="KLAX"></wunderground>

# Source and examples
# http://wunderground.com/weather/api/d/documentation.html

# Put this file in the wunderground directory in Extensions
# To activate the extension, include it from your LocalSettings.php
# with: require_once("extensions/wunderground/wunderground.php");
$wgHooks['ParserFirstCallInit'][] = "wfwunderground";

$wgExtensionCredits['parserhook'][] = array(
        'name' => 'Wunderground Extension',
        'description' => 'Displays Weather Forecast from wunderground.com',
        'author' => 'Wookie',
        'url' => 'https://www.mediawiki.org/wiki/Extension:Wunderground',
        'version' => '1.0'
function wfwunderground(Parser &$parser) {
    global $wgParser;
    # registers the <wunderground> extension tags with the WikiText parser
    $wgParser->setHook( "wunderground", "renderwunderground" );
    return true;
# The callback function for converting the input text to HTML output
function renderwunderground( $input, $argv ) {
// escape airport to prevent XSS
	$argv['airport'] = htmlspecialchars($argv['airport']) ;
	$json_string = file_get_contents("http://api.wunderground.com/api/YOURAPIKEYHERE/geolookup/conditions/q/".$argv['airport'].".json");
	$parsed_json = json_decode($json_string);
	$location = $parsed_json->{'location'}->{'city'};
	$temp_f = $parsed_json->{'current_observation'}->{'temp_f'};
	$output= '<div style="width: 300px; height: 250px; background-image: url( http://vortex.accuweather.com/adcbin/netweather_v2/backgrounds/lhtblue_300x250_bg.jpg ); background-repeat: no-repeat; background-color: #3BA6C9;" ></div>';
	$output .= '<div><p>The current Temp is '.$temp_f.' farenheit</p></div>';

    return $output;


To install this extension, add the following to LocalSettings.php:


Configuration parameters[edit]

The JSON stream returns the following structure of data (sample data included):

object(stdClass)#176 (3) { 
["response"]=> object(stdClass)#175 (3) { 
	["version"]=> string(3) "0.1" 
	["termsofService"]=> string(52) "http://www.wunderground.com/weather/api/d/terms.html" 
	["features"]=> object(stdClass)#177 (2) { 
		["geolookup"]=> int(1) 
		["conditions"]=> int(1) } } 

["location"]=> object(stdClass)#178 (17) { 
	["type"]=> string(8) "INTLCITY" 
	["country"]=> string(2) "CI" 
	["country_iso3166"]=> string(2) "CN" 
	["country_name"]=> string(5) "China" 
	["state"]=> string(2) "HK" 
	["city"]=> string(23) "Hong Kong International"
	["tz_short"]=> string(3) "HKT"
	["tz_long"]=> string(14) "Asia/Hong_Kong"
	["lat"]=> string(11) "22.30888939" 
	["lon"]=> string(12) "113.91471863" 
	["zip"]=> string(5) "00000"
	["magic"]=> string(1) "4" 
	["wmo"]=> string(5) "45007" 
	["l"]=> string(20) "/q/zmw:00000.4.45007"
	["requesturl"]=> string(26) "global/stations/45007.html"
	["wuiurl"]=> string(54) "http://www.wunderground.com/global/stations/45007.html"
	["nearby_weather_stations"]=> object(stdClass)#179 (2) {
		["airport"]=> object(stdClass)#180 (1) { 
			["station"]=> array(4) {
				[0]=> object(stdClass)#181 (6) {
					["city"]=> string(32) "Hong Kong Inter-National Airport" 
					["state"]=> string(0) "" 
					["country"]=> string(9) "Hong Kong" 
					["icao"]=> string(4) "VHHH" 
					["lat"]=> string(11) "22.33333206" 
					["lon"]=> string(12) "114.18333435" } 

				[1]=> object(stdClass)#182 (6) {
					["city"]=> string(9) "Hong Kong" 
					["state"]=> string(0) ""
					["country"]=> string(2) "CI" 
					["icao"]=> string(4) "VHHH" 
					["lat"]=> string(11) "22.30999947" 
					["lon"]=> string(12) "113.91000366" } 

				[2]=> object(stdClass)#183 (6) { 
					["city"]=> string(8) "Shenzhen" 
					["state"]=> string(0) "" 
					["country"]=> string(2) "CI" 
					["icao"]=> string(4) "ZGSZ" 
					["lat"]=> string(11) "22.54999924" 
					["lon"]=> string(12) "114.09999847" } 
				[3]=> object(stdClass)#184 (6) { 
					["city"]=> string(5) "Taipa" 
					["state"]=> string(0) "" 
					["country"]=> string(2) "MU" 
					["icao"]=> string(4) "VMMC" 
					["lat"]=> string(11) "22.17000008" 
					["lon"]=> string(12) "113.56999969" } } } 

		["pws"]=> object(stdClass)#185 (1) { 
			["station"]=> array(6) { 
				[0]=> object(stdClass)#186 (7) { 
					["neighborhood"]=> string(20) "Tai O, Lantau Island" 
					["city"]=> string(9) "Hong Kong" 
					["state"]=> string(5) "HKSAR" 
					["country"]=> string(5) "CHINA" 
					["id"]=> string(9) "IHKSARHO2"
					["distance_km"]=> int(8) 
					["distance_mi"]=> int(4) } 
				[1]=> object(stdClass)#187 (7) { 
					["neighborhood"]=> string(30) "APRSWXNET Discovery College HK"
					["city"]=> string(9) "Hong Kong" 
					["state"]=> string(2) "HK" 
					["country"]=> string(2) "CI" 
					["id"]=> string(6) "MD8470" 
					["distance_km"]=> int(10) 
					["distance_mi"]=> int(6) }
				[2]=> object(stdClass)#188 (7) {
					["neighborhood"]=> string(12) "Lei Cheng Uk" 
					["city"]=> string(14) "Cheung Sha Wan" 
					["state"]=> string(9) "Hong Kong"
					["country"]=> string(5) "CHINA"
					["id"]=> string(9) "IU9999U63" 
					["distance_km"]=> int(25) 
					["distance_mi"]=> int(15) } 
				[3]=> object(stdClass)#189 (7) {
					["neighborhood"]=> string(14) "Sha Pa Village"
					["city"]=> string(6) "Tai Po"
					["state"]=> string(2) "NT" 
					["country"]=> string(9) "HONG KONG" 
					["id"]=> string(9) "ISDSTANL2" 
					["distance_km"]=> int(27) 
					["distance_mi"]=> int(16) }
				[4]=> object(stdClass)#190 (7) { 
					["neighborhood"]=> string(19) "Ma Yau Tong Village" 
					["city"]=> string(8) "Sai Kung"
					["state"]=> string(9) "HONG KONG" 
					["country"]=> string(5) "China"
					["id"]=> string(9) "IHONGKON9"
					["distance_km"]=> int(34)
					["distance_mi"]=> int(20) } 
				[5]=> object(stdClass)#191 (7) { 
					["neighborhood"]=> string(20) "APRSWXNET Saikung HK"
					["city"]=> string(8) "Junk Bay" 
					["state"]=> string(2) "HK"
					["country"]=> string(2) "CI" 
					["id"]=> string(6) "MD2902"
					["distance_km"]=> int(35) 
					["distance_mi"]=> int(21) } } } } } 
["current_observation"]=> object(stdClass)#192 (47) {
	["image"]=> object(stdClass)#193 (3) { 
		["url"]=> string(53) "http://icons-ak.wxug.com/graphics/wu2/logo_130x80.png"
		["title"]=> string(19) "Weather Underground"
		["link"]=> string(27) "http://www.wunderground.com" } 
	["display_location"]=> object(stdClass)#194 (10) { 
		["full"]=> string(34) "Hong Kong International, Hong Kong" 
		["city"]=> string(23) "Hong Kong International" 
		["state"]=> string(2) "HK" 
		["state_name"]=> string(9) "Hong Kong"
		["country"]=> string(2) "CI" 
		["country_iso3166"]=> string(2) "CN" 
		["zip"]=> string(5) "00000" 
		["latitude"]=> string(11) "22.30888939"
		["longitude"]=> string(12) "113.91471863"
		["elevation"]=> string(10) "5.00000000" } 
	["observation_location"]=> object(stdClass)#195 (8) { 
		["full"]=> string(11) "Hong Kong, " 
		["city"]=> string(9) "Hong Kong"
		["state"]=> string(0) "" 
		["country"]=> string(2) "CI" 
		["country_iso3166"]=> string(2) "CN" 
		["latitude"]=> string(11) "22.30999947"
		["longitude"]=> string(12) "113.91000366" 
		["elevation"]=> string(5) "26 ft" } 
	["estimated"]=> object(stdClass)#196 (0) { }
	["station_id"]=> string(4) "VHHH" 
	["observation_time"]=> string(41) "Last Updated on November 14, 10:00 PM CST" 
	["observation_time_rfc822"]=> string(31) "Mon, 14 Nov 2011 22:00:00 +0800" 
	["observation_epoch"]=> string(10) "1321279200"
	["local_time_rfc822"]=> string(31) "Mon, 14 Nov 2011 22:06:36 +0800" 
	["local_epoch"]=> string(10) "1321279596"
	["local_tz_short"]=> string(3) "HKT" 
	["local_tz_long"]=> string(14) "Asia/Hong_Kong" 
	["weather"]=> string(13) "Partly Cloudy"
	["temperature_string"]=> string(11) "75 F (24 C)"
 	["temp_f"]=> int(75) 
	["temp_c"]=> int(24) 
	["relative_humidity"]=> string(3) "69%" 
	["wind_string"]=> string(22) "From the ESE at 10 MPH" 
	["wind_dir"]=> string(3) "ESE" 
	["wind_degrees"]=> int(120) 
	["wind_mph"]=> int(10)
	["wind_gust_mph"]=> int(0) 
	["pressure_mb"]=> string(4) "1019"
	["pressure_in"]=> string(5) "30.09" 
	["pressure_trend"]=> string(1) "0"
	["dewpoint_string"]=> string(11) "64 F (18 C)" 
	["dewpoint_f"]=> int(64) 
	["dewpoint_c"]=> int(18)
	["heat_index_string"]=> string(2) "NA" 
	["heat_index_f"]=> string(2) "NA"
	["heat_index_c"]=> string(2) "NA"
	["windchill_string"]=> string(2) "NA"
	["windchill_f"]=> string(2) "NA" 
	["windchill_c"]=> string(2) "NA"
	["visibility_mi"]=> string(3) "6.2" 
	["visibility_km"]=> string(4) "10.0"
	["precip_1hr_string"]=> string(25) "-9999.00 in (-9999.00 mm)" 
	["precip_1hr_in"]=> string(8) "-9999.00"
	["precip_1hr_metric"]=> string(8) "-9999.00" 
	["precip_today_string"]=> string(16) "0.00 in (0.0 mm)" 
	["precip_today_in"]=> string(4) "0.00"
	["precip_today_metric"]=> string(3) "0.0" 
	["icon"]=> string(12) "partlycloudy" 
	["icon_url"]=> string(50) "http://icons-ak.wxug.com/i/c/k/nt_partlycloudy.gif" 
	["forecast_url"]=> string(54) "http://www.wunderground.com/global/stations/45007.html" 
	["history_url"]=> string(77) "http://www.wunderground.com/history/airport/VHHH/2011/11/14/DailyHistory.html" 
	["ob_url"]=> string(90) "http://www.wunderground.com/cgi-bin/findweather/getForecast?query=22.30999947,113.91000366"