Obteniendo datos de conversión de divisas de Yahooapis ahora que iGoogle se ha ido

Hasta ayer, tenía un sitio / aplicación de un organizador de presupuestos perfectamente operativo que trabajaba con iGoogle.

A través de PHP, usando la siguiente línea pequeña

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

y similar, pude obtener todo lo que necesitaba.

A partir de hoy, esto ya no funciona. Cuando analicé el problema, lo que sucedió es que Google se retiró de iGoogle. ¡Gorrón!

De todos modos, estaba buscando en otra parte pero no puedo encontrar nada que se ajuste a mis necesidades. REALMENTE me encantaría solucionarlo y ponerlo en funcionamiento de nuevo simplemente cambiando esta línea de código (es decir, cambiando la dirección de Google con la dirección de alguna otra API de divisas disponible), pero parece que ninguna lo hace.

La API de rate-exchange.appspot.com parece que podría ser un análogo de iGoogle, pero, por desgracia, nunca funciona. Sigo recibiendo un mensaje de “Sobre Cuota”.

(Aquí viene una pregunta inicial: ¿hay alguien que conozca una API sencilla y confiable de clasificación de iGoogle?)

Así que supongo que lo natural sería la función Yahoo YQL (al menos supongo que es tan confiable).

Las consultas de Yahoo se ven así:

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

Lo que realmente no puedo entender es cómo analizar estos datos. Muestra un XML.

Lo que solía tener es esto:

 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; } 

De modo que el usuario pudo obtener la tasa de cambio de una moneda de entrada como “USD” y una moneda de salida como “EUR” en una cantidad específica de dinero. Como dije, esto estaba funcionando maravillosamente hasta la noche de ayer.

¿Algunas ideas?

    ¡No importa! ¡Resuelto!

    Para cualquiera que esté interesado, esto es lo que hice para que mi código funcionara (con el mínimo de cambios posibles) con 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); 

    Esto es básicamente todo lo que necesita para obtener toda la información de intercambio que desea. Después de eso, lo usas todo de esta manera:

     amount*$toxxx['coin']; 

    Entonces, digamos que quería saber cuántos Euro son 100 USD en este momento:

     100*$toeur['usd']; 

    Pedazo de pastel!

    Sigue siendo una solución muy útil por QuestionerNo27. Desde principios de 2015, sin embargo, Yahoo YQL aparentemente cambió ligeramente la salida XML de su api. ‘Nombre’ ahora ya no se traduce en una cadena como ‘USD a EUR’, sino a ‘USD / EUR’ y debería en el código anterior estar referenciado de esta manera:

     $toeur = array( 'usd' => $exchange['USD/EUR'] 

    en lugar de

     $toeur = array( 'usd' => $exchange['USD to EUR'] 

    y de manera similar para otras conversiones de moneda.

    Creé una rutina para convertir la moneda basada en @ QuestionerNo27 http://jamhubsoftware.com/geoip/currencyconvertor.php?fromcur=USD&tocur=EUR&amount=1 puedes consumir esto

      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 ** // $conv = $fromcur . '/' . $tocur; $toeur = array( //<-- Create new array specific for conversion to one of the units needed. $tocur => $amt*$exchange[$conv], //<-- 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. $fromcur => $amt, "ex_amt" =>$amt*$exchange[$conv]); //<-- 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" echo json_encode($toeur); ?>