找不到“yahoo.finance.xchange”表的定义。

12

我有一个服务使用了雅虎财经表yahoo.finance.xchange,但今天早上发现停止工作了,因为突然间雅虎返回了一个错误:

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

这是请求URL。有趣的事实是,如果我尝试多次刷新查询,有时会得到正确的响应,但是这很少发生(约占10%)。几天前,一切都正常。

这是否意味着Yahoo API出现问题或者API已更改而我不知道?感激任何帮助。


有相同的问题,有任何消息吗? - Bukashk0zzz
1
看起来他们刚刚关闭了这个API。难以置信。 - DolceVita
1
用户Eduardo Cezarino在相似的主题贴上发布了这个https://i.stack.imgur.com/0vEZ2.png。 - DanielZ
1
与此同时,我将我的服务切换到了欧洲央行的数据源http://fixer.io/。它提供了有限的货币列表。至少也是一些东西。 - DolceVita
@PhucVuong 请查看我的博客文章 - https://ayastreb.me/currency-exchange-microservice-with-webtask/ - 我编写了一个微服务来提供货币汇率。 - a.yastreb
显示剩余4条评论
5个回答

3
自从今天开始,我也遇到了同样的问题,而且其他人也在同一时间发布了完全相同的帖子,尽管它大部分时间还是有效的,但我唯一能找到的解释就是他们自己的数据库存在一些随机的错误,我们可以希望这个问题很快得到解决。当我刷新查询页面时,有20%的失败率。
我猜他们使用多个服务器处理请求(假设为8个),其中一个服务器为空或由于某些原因没有该表,因此每当将查询定向到该服务器时,就会返回错误。 临时解决方案:只需修改您的脚本以重试3-4次即可。对我来说,这样做就可以解决问题,因为在5次尝试中至少有一次成功。

我有类似的理论。由于这会影响最终用户,我认为雅虎会发布关于此事的Twitter动态,但我并未找到。 - Phil
是的,这个解决方案实际上不错。我会将其作为永久性解决方案。我最多重试10次,如果一直失败,我就会回退到一天前的备份。备份可以是内存中的,也可以序列化到某个文件或数据库中,并在回退时反序列化。我从来没有对雅虎有信任感。 - walv

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

尝试了一下,得到了这样的响应:雅虎关闭了该API,因为它被用于违反他们的服务条款:"我们注意到该服务正在违反雅虎的服务条款。因此,该服务正在被取消。请参考finance.yahoo.com进行所有未来的市场和股票数据研究。" - DocRattie

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

-1

我也遇到了同样的问题。

我需要在我的应用程序中使用汇率,所以我决定使用currencylayer.com API - 它们提供168种货币,包括贵金属和比特币。

我还使用webtask.io编写了一个微服务来缓存来自currencylayer的汇率并进行交叉汇率计算。

我还写了一篇博客文章介绍这个过程。

如果你想运行自己的微服务,请查看它,它非常容易。


-3

我找到了解决方案,对于我的情况,只需要将 http 更改为 https,一切都可以正常运作。


首先,在我的帖子中,我提供了使用https模式的URL。 其次 - 不,它不起作用,它随机工作。 80%的请求被拒绝。 - DolceVita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接