it-swarm.com.de

Keine Definition für Tabelle yahoo.finance.xchange gefunden

Ich habe einen Dienst, der ein Yahoo! Finanzierungstabelle yahoo.finance.xchange. Heute morgen habe ich bemerkt, dass es nicht mehr funktioniert, weil plötzlich Yahoo! hat begonnen, einen Fehler zu melden: 

{
    "error": {
    "lang": "en-US",
        "description": "No definition found for Table yahoo.finance.xchange"
    }
}

Dies ist die Anforderungs-URL . Interessante Tatsache: Wenn ich versuche, die Abfrage mehrmals zu aktualisieren, erhalte ich manchmal eine korrekte Antwort, die jedoch sehr selten vorkommt (etwa 10% der Zeit). Tage zuvor war alles in Ordnung. 

Bedeutet dies, dass die Yahoo-API nicht verfügbar ist oder fehlt mir etwas, weil die API geändert wurde? Ich würde mich über jede Hilfe freuen.

12
DolceVita

Da ich das gleiche Problem habe und heute auch damit angefangen habe, dass andere genau in derselben Zeit veröffentlicht wurden und die meiste Zeit noch funktioniert, kann ich nur feststellen, dass sie zufällige Datenbankfehler haben an ihrem Ende und wir können hoffen, dass dies bald gelöst wird. Ich habe auch eine Fehlerquote von 20% beim Aktualisieren der Seite der Abfrage.

Meine Vermutung ist, dass sie viele Server verwenden, um die Anfragen zu bearbeiten (sagen wir 8), und einer von ihnen ist leer oder hat diese Tabelle aus bestimmten Gründen nicht. Wenn also die Abfrage an diesen Server weitergeleitet wird, wird der Fehler zurückgegeben.

Temporäre Lösung: Ändern Sie einfach Ihr Skript, um es 3-4 Mal zu wiederholen. Das hat es für mich getan, weil bei 5 Versuchen mindestens einer gelingt.

3
FlorianB

Ich löse dieses Problem mithilfe von quote.yahoo.com anstelle des Dienstes query.yahooapis.com. Hier ist mein Code:

function devise($currency_from,$currency_to,$amount_from){
  $url = "http://quote.yahoo.com/d/quotes.csv?s=" . $currency_from . $currency_to . "=X" . "&f=l1&e=.csv";
  $handle  = fopen($url, "r");
  $exchange_rate = fread($handle, 2000);
  fclose($handle );
  $amount_to = $amount_from  * $exchange_rate;
  return round($amount_to,2);
}

BEARBEITEN funktioniert nicht mehr. An dieser Stelle wollen wir einfach Yahoo vergessen. Verwenden Sie dies stattdessen

function convertCurrency($from, $to, $amount)    
{
    $url = file_get_contents('https://free.currencyconverterapi.com/api/v5/convert?q=' . $from . '_' . $to . '&compact=ultra');
    $json = json_decode($url, true);
    $rate = implode(" ",$json);
    $total = $rate * $amount;
    $rounded = round($total);
    return $total;
}
1
Patrick Simard

Gleicher Fehler, ich migriere nach http://finance.yahoo.com .__

private static readonly ILog Log = LogManager.GetCurrentClassLogger();
    private int YahooTimeOut = 4000;
    private int Try { get; set; }

    public decimal GetRate(string from, string to)
    {
        var url =
            string.Format(
                "http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X", from, to);

        var request = (HttpWebRequest)WebRequest.Create(url);
        request.UseDefaultCredentials = true;
        request.ContentType = "text/csv";
        request.Timeout = YahooTimeOut;
        try
        {
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var resStream = response.GetResponseStream();
                using (var reader = new StreamReader(resStream))
                {
                    var html = reader.ReadToEnd();
                    var values = Regex.Split(html, ",");
                    var rate = Convert.ToDecimal(values[1], new CultureInfo("en-US"));
                    if (rate == 0)
                    {
                        Thread.Sleep(550);
                        ++Try;
                        return Try < 5 ? GetRate(from, to) : 0;
                    }
                    return rate;

                }
            }
        }
        catch (Exception ex)
        {
            Log.Warning("Get currency rate from Yahoo fail " + ex);
            Thread.Sleep(550);
            ++Try;
            return Try < 5 ? GetRate(from, to) : 0;
        }
    }
0
Dmitry Litus