0

I have created an Element for my project which loads the Google Weather API. Locally it works perfectly. The problem appeared when I uploaded it and when I gave it to a friend of mine to try it.

The code for the element is the following one

<?php
Configure::write('debug', 2);

$xml = simplexml_load_file('http://www.google.com/ig/api?weather=name_city');
$information = $xml->xpath("/xml_api_reply/weather/forecast_information");
$current = $xml->xpath("/xml_api_reply/weather/current_conditions");
$forecast_list = $xml->xpath("/xml_api_reply/weather/forecast_conditions");

?>
<html>
<head>
<title>Google Weather API</title>
</head>
<body>
<h1><?= print $information[0]->city['data']; ?></h1>
<h2>Today's weather</h2>
<div class="weather">
<?php $icon_today = (string) $current[0]->condition['data'];?>

<?php echo $this->Html->image('tick/'.$icon_today.'.png');?>
        <span class="condition">
        <?= $current[0]->temp_c['data'] ?>&deg; C,

        </span>
 </div>
<h2>Forecast</h2>
    <? foreach ($forecast_list as $forecast) : ?>
    <div class="weather">
    <?php $icon = (string) $forecast->condition['data'];?>
      <?php echo $this->Html->image('tick/'.$icon.'.png',array('width' => '45'));?>

        <div><?= $forecast->day_of_week['data']; ?></div>
        <span class="condition">
        <?php
        $low = (int) $forecast->low['data'];
        $high = (int) $forecast->high['data'];
        $low_celsius = (int) (($low - 32) * (5/9));
        $high_celsius = (int)(($high - 32) * (5/9));
        ?>
            <?= $low_celsius ?>&deg; C - <?= $high_celsius ?>&deg; C,
            <?= $forecast->condition['data'] ?>
        </span>
 </div>
<? endforeach ?>
</body>
</html>

When I uploaded it I got these messages

Warning (2): simplexml_load_file() [function.simplexml-load-file]:     
http://www.google.com/ig/api?weather=name_city: parser error : Document is empty     
[APP/View/Elements/weather.ctp, line 5]
Warning (2): simplexml_load_file() [function.simplexml-load-file]:   
[APP/View/Elements/weather.ctp, line 5]
Warning (2): simplexml_load_file() [function.simplexml-load-file]: ^ 
[APP/View/Elements/weather.ctp, line 5]
Warning (2): simplexml_load_file() [function.simplexml-load-file]: 
http://www.google.com/ig/api?weather=name_city:1: parser error : Start tag 
expected, '<' not found [APP/View/Elements/weather.ctp, line 5]
Warning (2): simplexml_load_file() [function.simplexml-load-file]:  
[APP/View/Elements/weather.ctp, line 5]
Warning (2): simplexml_load_file() [function.simplexml-load-file]: ^ 
[APP/View/Elements/weather.ctp, line 5]
Fatal error: Call to a member function xpath() on a non-object in 
/home/wwwsite/public_html/testing/app/View/Elements/weather.ctp on line 6

name_city has a real value. When I tried it on another computer there where other types of error ($forecast->day_of_week['data'] for example was not recognized as a valid variable). It seems that the online version is not able to receive data from Google Weather so the result is empty. Could anyone please tell me what to do?

user1496047
  • 51
  • 3
  • 10

2 Answers2

3

Google plans to shut down iGoogle and related APIs. Already stopped responding weather API from 27th August. You can use wunderground.com's api

0

There is currently an intermittent 403 Forbidden response to the Google Weather API that you are using. See Google Weather API 403 Error

The 403 response may be causing the empty document that you see in the first line of the results. Rerun the code again now both locally and on the server and see if the problem is intermittent.

The reason for the intermittent 403 response is not known but has been a problem since the 7th of August 2012 which is the time that you posted this problem.

Community
  • 1
  • 1
ClearCrescendo
  • 1,145
  • 11
  • 22
  • It might be that! I've checked with Chrome the "http://www.google.com/ig/api?weather=paris" and I got this message "403. That’s an error.Your client does not have permission to get URL /ig/api?weather=paris from this server. That’s all we know." Strangely with Firefox it works. The online version does not work. – user1496047 Aug 10 '12 at 14:14
  • I can reproduce the same thing here. It fails consistently from Chrome, intermittently from a variety of server situations and either works consistently or intermittently from Firefox. It is possible that the 403 is related to some type of CDN/edge change at Google as that could result in the intermittent behavior. We could speculate that Google's infrastructure handles/caches/treats Chrome differently to Firefox. – ClearCrescendo Aug 10 '12 at 14:52
  • Just did some tests and it isn't the ident string. It is something else in the header request that causes chrome to fail consistently. – ClearCrescendo Aug 10 '12 at 15:40