WebClient возвращает ошибку 403 только для этого сайта? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь загрузить файл по этим ссылкам с помощью 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

Я пытался использовать разные пользовательские агенты, принимать кодировки и т. Д. Я заменил и попробовал https на http с URL, но безуспешно. Когда я вставляю эти URL-адреса в Chrome, FireFox или IE, я могу загрузить файл, иногда он выдает ошибку 403, затем я заменяю https на http из URL-адреса, он загружается. Но нет успеха в веб-клиенте Пробовал Фиддлера проверять, безуспешно Может кто-нибудь попробовать в вашей системе, решить эту проблему.

Вот мой код:

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");

Я знаю, что есть много тем, связанных с этой темой, я пробовал все из них, безуспешно, пожалуйста, не отмечайте дубликаты. Попробуйте в своей системе это <10 строк кода. </p>

Примечание: тот же код работает для других сайтов, только для этого сайта он выдает ошибку.

Ответы [ 3 ]

1 голос
/ 17 июня 2019

Как я уже упоминал в своем комментарии, проблема заключается в том, что сервер ожидает наличия файла 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 было бы неплохо проверить, действительно ли у вас файл cookie i10c.bdddb, вместо того, чтобы просто проверять наличие файлов cookie.

Это просто небольшой пример кода, поэтому он не самый чистый.Возможно, вы захотите заглянуть в FormUrlEncodedContent, чтобы отправить номер страницы и другие параметры.

0 голосов
/ 17 июня 2019

Код статуса HTTP 403 означает запрещенный, поэтому возникла проблема с вашими учетными данными. Похоже, что вы не отправляете. Если вы добавите их в свой заголовок, это должно нормально работать так:

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

или отправив их так:

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

Скорее всего, ссылки работают через веб-браузеры, потому что вы уже прошли аутентификацию и браузер отправляет учетные данные / токен.

0 голосов
/ 17 июня 2019

Я проверил ваш URL и смог воспроизвести вашу ошибку.Любые запросы, которые я пробую с параметром строки запроса quantity=0, кажутся неудачными с HTTP Error 403.

. Я бы предложил запросить quantity больше нуля.

...