如何解决来自雅虎财经的 cookie /crumb 请求?

问题描述 投票:0回答:1

我正在尝试下载雅虎财经历史报价。 经过一些请求后,雅虎开始回答不带引号,但带有错误字符串。

我读过 Yahoo 请求 cookie 和 crumb 机制,但我不明白。

这是我的 C# 代码。

你能帮我添加 cookie 和 crumb 请求吗?

 async Task DownloadQuoteFromYahoo(string symbol)
  {
      // Set symbol and date range for historical data            
      DateTime startDate = dtpUpdateFromDate.Value;
      DateTime endDate = dtpUpdateToDate.Value;

      string interval = "1d";                     //intervals: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo

      
      // Set URL for API request
      string url = string.Format("https://query1.finance.yahoo.com/v7/finance/download/{0}?period1={1}&period2={2}&interval={3}&events=history",
          symbol, (int)(startDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds, (int)(endDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds, interval);

      // Create HttpClient with custom user-agent
      HttpClient httpClient = new HttpClient();
      httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0");

      // Read response data
      var responseData = await GetWebContentAsync(url);
... }
c# yahoo-finance
1个回答
0
投票

虽然 StackOverflow 不是 让人们为你编写代码(更多的是为了调试),但我已经评估了你的代码,这是你的方法的更新版本,进行了必要的更改:

async Task DownloadQuoteFromYahoo(string symbol)
{
// Set symbol and date range for historical data
DateTime startDate = dtpUpdateFromDate.Value;
DateTime endDate = dtpUpdateToDate.Value;
string interval = "1d";

// Set URL for API request
string url = string.Format("(link unavailable)", symbol, (int)(startDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds, (int)(endDate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds, interval);

// Create HttpClient with custom user-agent
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0");

// Get cookie and crumb
var cookieAndCrumbResponse = await GetCookieAndCrumbAsync(symbol);
var cookie = cookieAndCrumbResponse.Cookies.FirstOrDefault(c => c.Name == "B");
var crumb = cookieAndCrumbResponse.Content.Split('"')[1];

// Set cookie and crumb in request headers
httpClient.DefaultRequestHeaders.Add("Cookie", $"B={cookie.Value}");
httpClient.DefaultRequestHeaders.Add("Crumb", crumb);

// Read response data
var responseData = await GetWebContentAsync(url);
...}

async Task
{
var cookieUrl = $"(link unavailable)";
var response = await httpClient.GetAsync(cookieUrl);
return response;
}

注意添加的

GetCookieAndCrumbAsync
方法,该方法从雅虎财经检索 cookie 和 crumb 值。然后,这些值将添加到
DownloadQuoteFromYahoo
方法中的请求标头中。

此外,请确保对两个请求(cookie 和 crumb 检索以及数据下载)使用相同的

HttpClient
实例,以保留 cookie 和 crumb 值。

这应该可以帮助您解决雅虎财经在几次请求后返回错误字符串的问题。 我有时间回答这个问题,并且希望您能反馈一下这个更新后的代码是否对您来说有效,或者不适用。

© www.soinside.com 2019 - 2024. All rights reserved.