Не найдено определения для таблицы yahoo.finance.xchange

У меня есть служба, которая использует Yahoo! Финансовая таблица yahoo.finance.xchange. Сегодня утром я заметил, что он перестает работать, потому что внезапно Yahoo! начал возвращать сообщение об ошибке:

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

Это URL-адрес запроса. Интересный факт: если я пытаюсь обновить запрос несколько раз, иногда я возвращаю правильный ответ, но это случается очень редко (например, в 10% случаев). За несколько дней до этого все было хорошо.

Означает ли это, что Yahoo API не работает или я что-то упускаю, потому что API был изменен? Я был бы признателен за любую помощь.

Ответ 1

Так как у меня та же проблема и что она началась и сегодня, что другие пришли к сообщению точно в одно и то же время, и что она по-прежнему работает большую часть времени, единственное объяснение, которое я могу найти, это то, что у них есть некоторые случайные ошибки базы данных на их конце, и мы можем надеяться, что это будет решено в ближайшее время. У меня также есть 20% -ная ошибка при обновлении страницы запроса.

Я предполагаю, что они используют много серверов для обработки запросов (пусть говорят 8) и что один из них пуст или не имеет этой таблицы по некоторым причинам, поэтому всякий раз, когда он направляет запрос на этот сервер, ошибка вернулся.

Временное решение: Просто измените свой script, чтобы повторить попытку 3-4 раза. Это сделало это для меня, потому что из 5 попыток по крайней мере один преуспевает.

Ответ 2

Я решаю эту проблему, используя quot.yahoo.com вместо сервиса query.yahooapis.com. Здесь мой код:

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

Ответ 3

Такая же ошибка, я перехожу к 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;
        }
    }

Ответ 4

У меня такая же проблема.

Мне нужны курсы обмена в моем приложении, поэтому я решил использовать API-интерфейс currencylayer.com - они дают 168 валют, включая драгоценные металлы и биткойн.

Я также написал микросервис, используя webtask.io для кеширования ставок из валютного слоя и выполнения кросс-курсовых расчетов.

И я написал сообщение в блоге об этом 🤓

Проверьте это, если вы хотите запустить свой собственный микросервис, это довольно легко 😉

Ответ 5

Я нашел решение, в моем случае, просто изменил http на https, и все будет хорошо.