Search code examples
phpapicurrencyyqligoogle

Getting currency conversion data from Yahooapis now that iGoogle is gone


Up until yesterday I had a perfectly working budget organizer site/app working with iGoogle.

Through PHP, using the following little line

file_get_contents('http://www.google.com/ig/calculator?hl=en&q=1usd=?eur');

and similar I was able to get all I needed.

As of today, this is no longer working. When I looked into the issue, what has happened is that Google has retired iGoogle. Bummer!

Anyway, I was looking around elsewhere but I can't find anything that fits my needs. I would REALLY love to just fix it and get it running again by just switching this one line of code (i.e. changing the Google address with the address of some other currency API available) but it seems like none does.

The API from rate-exchange.appspot.com seems like it could be a iGoogle analog but, alas, it never works. I keep getting an "Over Quota" message.

(Here comes an initial question: anybody out there know of a simple, reliable, iGoogle-sort API?)

So I guess the natural thing would be to the Yahoo YQL feature (at least I suppose it is as reliable).

Yahoo's queries look like this:

http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.xchange where pair in ("USDEUR", "USDJPY", "USDBGN")&env=store://datatables.org/alltableswithkeys

What I really can't figure out is how to parse this data. It outputs an XML.

What I used to have is this:

function exchange($inputAmount,$inputCurrency,$outputCurrency) {
    $exchange = file_get_contents('http://www.google.com/ig/calculator?hl=en&q='.$inputAmount.$inputCurrency.'=?'.$outputCurrency);
    $exchange = explode('"', $exchange);
    $exchange = explode('.', $exchange['3']);
    $exchange[0] = str_replace(" ", "",preg_replace('/\D/', '',  $exchange[0]));
    if(isset($exchange[1])){
        $exchange[1] = str_replace(" ", "",preg_replace('/\D/', '', $exchange[1]));
        $exchange = $exchange[0].".".$exchange[1];        
    } else{
        $exchange = $exchange[0];
    }
    return $exchange;
}

So the user was able to get the exchange rate from an input currency such as "USD" and an output currency such as "EUR" on a specific amount of money. As I said, this was working swimmingly up until yesterday night.

Any ideas?


Solution

  • Never mind! Solved it!

    For anyone interested, here's what I did to get my code to work (with the least chnges possible) with the Yahoo YQL:

    // ** GET EXCHANGE INFO FROM YAHOO YQL ** //
    $url = 'http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.xchange where pair in ("USDEUR", "EURUSD")&env=store://datatables.org/alltableswithkeys'; //<-- Get the YQL info from Yahoo (here I'm only interested in converting from USD to EUR and vice-versa; you should add all conversion pairs you need).
    $xml = simplexml_load_file($url) or die("Exchange feed not loading!"); //<-- Load the XML file into PHP variable.
    $exchange = array(); //<-- Build an array to hold the data we need.
    for($i=0; $i<2; $i++): //<-- For loop to get data specific to each exchange pair (you should change 2 to the actual amount of pairs you're querying for).
        $name = (string)$xml->results->rate[$i]->Name; //<-- Get the name of the pair and turn it into a string (this looks like this: "USD to EUR").
        $rate = (string)$xml->results->rate[$i]->Rate; //<-- Do the same for the actual rate resulting from the conversion.
        $exchange[$name] = $rate; //<-- Put the data pairs into the array.
    endfor; //<-- End for loop. :)
    // ** WORK WITH EXCHANGE INFO ** //
    $toeur = array( //<-- Create new array specific for conversion to one of the units needed.
             'usd' => $exchange['USD to EUR'], //<-- Create an array key for each unit used. In this case, in order to get the conversion of USD to EUR I ask for it from my $exchange array with the pair Name.
             'eur' => 1); //<-- The way I coded the app, I found it more practical to also create a conversion for the unit into itself and simply use a 1, which translates into "do not convert"
    $tousd = array(
             'eur' => $exchange['EUR to USD'],
             'usd' => 1);
    

    This is basically all you need to get all the exchange info you want. After that, you use it all something like this:

    amount*$toxxx['coin'];
    

    So, say I wanted to know how many Euro is 100 USD right now:

    100*$toeur['usd'];
    

    Piece of cake!