Скачать файл с учетом авторизации C#

234
23 июня 2017, 05:57

Здравствуйте. Есть страничка, с которой необходимо скачать файл, предварительно авторизовавшись. Я делаю это так:

string loginURI = "http://tr.anidub.com/anime_tv/anime_ongoing/10140-tiraniya-vooruzhennyh-devushek-busou-shoujo-machiavellianism-01-iz-12.html";
            string reqString = "login_name=my_login&login_password=my_pass&login=submit";
            byte[] requestData = Encoding.UTF8.GetBytes(reqString);
            var request = (HttpWebRequest)WebRequest.Create(loginURI);
            request.AllowAutoRedirect = true;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = requestData.Length;
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            using (Stream S = request.GetRequestStream())
                S.Write(requestData, 0, requestData.Length);
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var newPageCode = new StreamReader(response.GetResponseStream()).ReadToEnd();
            }

Если проверить содержимое переменной newPageCode, то там будет исходный код уже авторизованной записи, т.е. все работает. Но теперь встает другой вопрос: как скачать файл с этой страницы, сохраняя авторизацию? Я пытаюсь делать это так:

using (var response = (HttpWebResponse)request.GetResponse())
            {
                var newPageCode = new StreamReader(response.GetResponseStream()).ReadToEnd();
                string tor_url = "http://tr.anidub.com/engine/download.php?id=20776";
                webClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36");
                webClient.Headers.Add(HttpRequestHeader.Referer, "http://tr.anidub.com/anime_tv/anime_ongoing/10140-tiraniya-vooruzhennyh-devushek-busou-shoujo-machiavellianism-01-iz-12.html");
                webClient.Headers.Add(HttpRequestHeader.Host, "tr.anidub.com");
                foreach (Cookie c in response.Cookies)
                {
                    webClient.Headers.Add(HttpRequestHeader.Cookie, c.ToString());
                }
                webClient.DownloadFile(new Uri(tor_url), disk.Text + "1.torrent");
                webClient.Dispose();
            }

Но так не работает... Что я делаю не так? Ну или может существует какой способ скачать файл, ссылка на который указана в переменной tor_url, используя HttpWebRequest / HttpWebResponse?

Answer 1

По-умолчанию элементы в заголовке при использовании метода webClient.Headers.Add разделяются запятой, но для заголовка Cookie элементы должны разделяться точкой с запятой.

using (WebClient webClient = new WebClient())
using (var response = (HttpWebResponse)request.GetResponse())
{
    var newPageCode = new StreamReader(response.GetResponseStream()).ReadToEnd();
    string tor_url = "http://tr.anidub.com/engine/download.php?id=20776";
    webClient.Headers.Add(HttpRequestHeader.Referer, "http://tr.anidub.com/anime_tv/anime_ongoing/10140-tiraniya-vooruzhennyh-devushek-busou-shoujo-machiavellianism-01-iz-12.html");
    string cookieHeader = "";
    foreach (Cookie c in response.Cookies)
    {
        cookieHeader += c + ";";
    }
    webClient.Headers.Add(HttpRequestHeader.Cookie, cookieHeader);
    webClient.DownloadFile(new Uri(tor_url), "1.torrent");
}
READ ALSO
Ресурсы стилей или странное поведение

Ресурсы стилей или странное поведение

У меня в компании есть библиотека с разными "кастомными" контролами для WPF"Кастомные", они лишь потому что там изменена визуальная составляющая,...

228
NoDoubleTreeView [требует правки]

NoDoubleTreeView [требует правки]

google не находит NoDoubleTreeView

180
Как вернуть значение функции [дубликат]

Как вернуть значение функции [дубликат]

На данный вопрос уже ответили:

267