【问题标题】:WebClient returning 403 error only for this website?WebClient 仅针对该网站返回 403 错误?
【发布时间】:2023-04-01 07:14:02
【问题描述】:

我正在尝试使用 C# WebClient 从这些链接下载文件,但出现 403 错误。

https://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=5&pageSize=500

https://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=4&pageSize=500

我尝试使用不同的用户代理,接受编码等。 我替换并尝试了从 url 到 http 的 https,但没有成功。 当我将这些 url 粘贴到 Chrome 或 FireFox 或 IE 中时,我可以下载文件,有时它会给出 403 错误,然后我将 https 从 url 替换为 http,它会下载。但是在webclient中没有成功 尝试 Fiddler 检查,没有成功 有人可以在你的系统中尝试,解决这个问题。

这是我的代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
WebClient client= new WebClient();
Uri request_url = new Uri("https://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=5&pageSize=500);
//tried http also http://www.digikey.com/product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=5&pageSize=500
client.Headers.Add("user-agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
client.DownloadFile(request_url, @"E:\123.csv");

我知道有很多与这个话题相关的话题,我都试过了,都没有成功,请不要标记重复。在你的系统中试试,这

注意:相同的代码适用于其他网站,仅适用于本网站会出错。

【问题讨论】:

  • 403 表示授权失败。您应该发送凭据吗?
  • 是的,Jesse de Wit,我关注了这个帖子stackoverflow.com/a/8021144/4414852,但没有成功。
  • 我认为这是没有正确 cookie 的问题。如果我将提供的链接之一复制到私人浏览器窗口中,我会收到 403 错误。如果我尝试刷新页面,它将起作用。查看调试控制台,我可以看到在 403 错误之后我有一个会话 cookie。如果我删除此 cookie,我会再次收到 403 错误。您需要以某种方式获取会话 cookie。
  • 嗨 amura cxg 你能告诉我如何获取会话 cookie。

标签: c# http-status-code-403 webclient webclient.uploaddata


【解决方案1】:

正如我在评论中提到的,这里的问题是服务器期望 cookie(特别是 'i10c.bdddb')存在,但不存在时会给出 403 错误。但是,cookie 与 403 响应一起发送。因此,您可以发出初始的垃圾请求,该请求将失败,但会为您提供 cookie。之后,您就可以正常进行了。

通过反复试验,我能够使用以下代码获取 CSV:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

CookieContainer cookieContainer = new CookieContainer();
Uri baseUri = new Uri("https://www.digikey.com");

using (HttpClientHandler handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (HttpClient client = new HttpClient(handler) { BaseAddress =  baseUri})
{
    //The User-Agent is required (what values work would need to be tested)
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0");

    //Make our initial junk request that will fail but get the cookie
    HttpResponseMessage getCookiesResponse = await client.GetAsync("/product-search/download.csv");

    //Check if we actually got cookies
    if (cookieContainer.GetCookies(baseUri).Count > 0)
    {
        //Try getting the data
        HttpResponseMessage dataResponse = await client.GetAsync("product-search/download.csv?FV=ffe00035&quantity=0&ColumnSort=0&page=4&pageSize=500");

        if(dataResponse.StatusCode == HttpStatusCode.OK)
        {
            Console.Write(await dataResponse.Content.ReadAsStringAsync());
        }
    }
    else
    {
        throw new Exception("Failed to get cookies!");
    }
}

备注

即使使用正确的 cookie,如果您不发送 User-Agent 标头,服务器也会返回 403。我不确定服务器对用户代理的期望,我只是复制了浏览器发送的值.

在检查是否已设置 cookie 时,最好验证您是否确实拥有 'i10c.bdddb' cookie,而不仅仅是检查是否有任何 cookie。

这只是一小段示例代码,因此并不是最简洁的。您可能需要查看FormUrlEncodedContent 以发送页码和其他参数。

【讨论】:

    【解决方案2】:

    我使用您的 URL 进行了测试,并且能够重现您的错误。我尝试使用查询字符串参数quantity=0 的任何请求似乎都以HTTP Error 403 失败。

    我建议请求一个大于零的quantity

    【讨论】:

    • 我认为这里不重要,我尝试删除其他查询字符串参数digikey.com/product-search/… 但没有用,我可以在 Chrome 和 Firefox 中下载
    • 如果您请求数量 0,您期望多少条记录?这是获取所有物品的信号吗?我会尝试使用其他浏览器。
    • 请试试这个digikey.com/product-search/…这个url没有数量,但是还是下载csv
    • 太棒了。那么quantity=0 肯定会给您带来问题。 点赞 ;-)
    【解决方案3】:

    HTTP 403 状态代码表示被禁止,因此您的凭据存在问题。好像你没有发送任何东西。如果您将它们添加到您的标题中,这应该可以正常工作:

    client.Headers.Add("Authorization", "token");
    

    或像这样发送它们:

     client.UseDefaultCredentials = true;
     client.Credentials = new NetworkCredential("username", "password");
    

    链接通过网络浏览器工作很可能是因为您已经过身份验证并且浏览器正在发送凭据/令牌。

    【讨论】:

    • 没有汤姆迪。该网站没有凭据。请在您的浏览器中尝试。
    • @ArunBanakar 由于授权失败,因此出现 403。如果您在浏览器中下载文件时并未真正授权自己,那么无论如何服务器都必须为您生成会话令牌。最有可能阻止人们直接下载文件。
    • 那么我该如何通过会话令牌修复... Tom Dee
    【解决方案4】:

    Digi-key 也有这个问题。

    我的解决方案是关闭我的 VPN 服务。

    【讨论】:

    • 考虑提供有关您的 VPN 客户端/服务、计算机操作系统等的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 2022-01-10
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多