没有找到表yahoo.finance.xchange

时间:2017-08-24 08:54:34

标签: yahoo finance yql

我有一个使用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已更改?我将不胜感激任何帮助。

5 个答案:

答案 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 ,一切正常。