我有一个使用Yahoo!的服务财务表yahoo.finance.xchange
。今天早上我注意到它已停止工作,因为突然雅虎!开始回复错误说:
{
"error": {
"lang": "en-US",
"description": "No definition found for Table yahoo.finance.xchange"
}
}
This is the request URL。有趣的事实:如果我尝试多次刷新查询,有时我会得到正确的响应但这很少发生(比如10%的时间)。几天前,一切都很好。
这是否意味着Yahoo API已关闭或我错过了什么因为API已更改?我将不胜感激任何帮助。
答案 0 :(得分:3)
由于我遇到了同样的问题并且它今天也开始了,其他人也在同一时间完全发布,并且大部分时间它仍然有效,我能找到的唯一解释是他们有一些最终的随机数据库错误,我们希望很快就能解决这个问题。刷新查询页面时,我也有20%的失败率。
我的猜测是他们使用许多服务器来处理请求(假设为8),并且其中一个是空的或者由于某些原因没有该表,所以每当它将查询指向该服务器时,错误就是返回。
临时解决方案:只需修改脚本即可重试3-4次。这样做对我来说是因为在5次尝试中至少有一次成功。
答案 1 :(得分:1)
我使用quote.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);
}
编辑以上内容不再有效。在这一点上,让我们忘记雅虎大声笑使用这个
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;
}
答案 2 :(得分:0)
同样的错误,我迁移到http://finance.yahoo.com 这是C#示例
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;
}
}
答案 3 :(得分:-1)
我遇到了同样的问题。
我需要在我的应用中使用汇率,所以我决定使用currencylayer.com API - 它们提供168种货币,包括贵金属和比特币。
我还使用webtask.io编写了一个微服务来缓存来自货币层的费率并进行交叉汇率计算。
我已经写过关于它的blog post
如果您想运行自己的微服务,请查看它,这很简单
答案 4 :(得分:-3)
我找到了解决方案,在我的情况下,只需将 http 更改为 https ,一切正常。