调用YahooFinanceApi Nuget包报Failure to create client异常咨询
问题背景
可通过Nuget获取的YahooFinanceApi在数月前仍可正常运行,近期调用会抛出客户端创建失败的异常。
可复现问题的示例代码如下:
using YahooFinanceApi; var data = Yahoo.GetHistoricalAsync("MSFT", new DateTime(2021, 1, 1), DateTime.Now).Result;
运行上述程序的报错信息如下:
Unhandled exception. System.AggregateException: One or more errors occurred. (Failure to create client.) ---> System.Exception: Failure to create client. at YahooFinanceApi.YahooClientFactory.CreateClientAsync(CancellationToken token) at YahooFinanceApi.YahooClientFactory.GetClientAndCrumbAsync(Boolean reset, CancellationToken token) at YahooFinanceApi.Yahoo.GetResponseStreamAsync(String symbol, Nullable`1 startTime, Nullable`1 endTime, Period period, String events, CancellationToken token) at YahooFinanceApi.Yahoo.GetTicksAsync[ITick](String symbol, Nullable`1 startTime, Nullable`1 endTime, Period period, ShowOption showOption, Func`2 instanceFunction, CancellationToken token) at YahooFinanceApi.Yahoo.GetHistoricalAsync(String symbol, Nullable`1 startTime, Nullable`1 endTime, Period period, CancellationToken token) --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task`1.get_Result() at Program.<Main>$(String[] args) in C:\Users\dharm\Dropbox\Documents\VisualStudio\YahooFinanceApiSpx\YahooFinanceApiSpx\Program.cs:line 3
咨询问题
有什么可行的解决方案,能够让上述示例程序正常运行?
可行解决方案
这个报错的核心原因是原版YahooFinanceApi已经长期停止更新,没有适配雅虎财经近年调整的接口鉴权规则、反爬拦截策略,导致客户端初始化阶段过不了校验,直接抛出创建失败的异常。可以按自己的需求选下面的方案修复:
- 替换为社区维护的适配版本,操作最简单
直接卸载项目里装的原版YahooFinanceApi包,安装社区持续迭代的维护分支版本即可。这类版本已经适配了雅虎最新的Cookie校验、Crumb鉴权、请求头校验规则,装完之后原来写的代码不用改一行,就能正常拉取数据。 - 手动修改原版包的请求逻辑,适合不想换包的场景
- 修改
YahooClientFactory里的客户端初始化代码,给HttpClient加上标准浏览器的User-Agent请求头,原版默认带的空请求头会被雅虎接口直接拦截 - 补全鉴权流程:先请求雅虎财经主页拿到合法的Cookie集合,携带有效Cookie再请求Crumb接口拿到鉴权参数,后面所有拉取行情的请求都必须同时带有效Cookie和Crumb参数,才能正常返回数据
- 调整调用写法:别直接在同步上下文里用
.Result调用异步方法,很容易引发线程死锁,把调用逻辑放到异步方法里用await调用即可
- 修改
- 自行实现轻量请求逻辑,可控性最强
完全不用依赖第三方封装包,自己初始化一个带标准浏览器请求头的HttpClient,按照上面说的鉴权流程拿到有效Cookie和Crumb之后,直接请求雅虎财经的历史行情接口,自行解析返回的CSV格式行情数据就可以。整个逻辑加起来不到一百行代码,不会因为第三方包停更就无法使用,后续雅虎接口调整时也可以快速自行适配。
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

