Не найдено определения для таблицы 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, и все будет хорошо.