Пытаюсь авторизоваться, нифига не получается, сижу уже не один вечер с гуглом, идеи уже кончились. Снифал Http Analyzator-ом, Shark-ом. Вроде бы разницы между запросом из браузера и с шарпа нету, но на авторизацию возвращает ошибку, как будто что то не так с куками. Прошу помощи. PHP: using System;using System.Collections.Generic;using System.IO;using System.Net;using System.Net.Http;using System.Net.Http.Headers;using System.Threading.Tasks;namespace Bot{ public class Program { public const string MainUrl = "http://tiwar.ru"; public const string SignInUrl = "http://tiwar.ru/?sign_in=1"; static void Main(string[] args) { var profile = new Profile() { Login = "Login", Password = "Password" }; LogIn(profile).GetAwaiter().GetResult(); } public static async Task LogIn(Profile profile) { using (var handler = new HttpClientHandler() { CookieContainer = new CookieContainer(), AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }) { var uri = new Uri(MainUrl); using (HttpClient client = new HttpClient(handler)) { var servicePoint = ServicePointManager.FindServicePoint(uri); servicePoint.Expect100Continue = false; client.BaseAddress = uri; client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); client.DefaultRequestHeaders.TryAddWithoutValidation("Host", "tiwar.ru"); client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"); client.DefaultRequestHeaders.TryAddWithoutValidation("Connection", "Keep-Alive"); client.DefaultRequestHeaders.TryAddWithoutValidation("DNT", "1"); client.DefaultRequestHeaders.TryAddWithoutValidation("Upgrade-Insecure-Requests", "1"); client.DefaultRequestHeaders.TryAddWithoutValidation("Pragma", "no-cache"); client.DefaultRequestHeaders.TryAddWithoutValidation("Cache-Control", "no-cache"); var result = await client.GetAsync(uri).ConfigureAwait(false); var cookies = handler.CookieContainer.GetCookies(uri); var content = new Dictionary<string, string> { {"PHPSESSID", cookies[0].Value}, {"login", profile.Login}, { "pass", profile.Password} }; var requestLogin = new HttpRequestMessage(HttpMethod.Post, "") {Content = new FormUrlEncodedContent(content) }; requestLogin.Headers.Referrer = new Uri(SignInUrl + "&" + cookies[0]); var responseLogin = await client.SendAsync(requestLogin).ConfigureAwait(false); using (var responseStream = await responseLogin.Content.ReadAsStreamAsync().ConfigureAwait(false)) using (var streamReader = new StreamReader(responseStream)) { var htmlContent = await streamReader.ReadToEndAsync().ConfigureAwait(false); } } } } }}
UPD. Плюнул, и попробовал ручками добавить авторизационные кукисы в handler: PHP: public static async Task Loginv2() { using (var handler = new HttpClientHandler() { CookieContainer = new CookieContainer(), AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }) { var uri = new Uri(MainUrl); using (HttpClient client = new HttpClient(handler)) { var cookieLogin = new Cookie { Path = "/", HttpOnly = true, Expires = new DateTime(2019,02,11,14,19,30), Name = "login", Value = "Value" }; var cookieSessid = new Cookie { Name = "PHPSESSID", Value = "value2" }; handler.CookieContainer.Add(uri, cookieLogin); handler.CookieContainer.Add(uri, cookieSessid); client.BaseAddress = uri; client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"); client.DefaultRequestHeaders.TryAddWithoutValidation("Cache-Control", "no-cache"); client.DefaultRequestHeaders.TryAddWithoutValidation("Connection", "keep-alive"); client.DefaultRequestHeaders.TryAddWithoutValidation("DNT", "1"); client.DefaultRequestHeaders.TryAddWithoutValidation("Host", "tiwar.ru"); client.DefaultRequestHeaders.TryAddWithoutValidation("Pragma", "no-cache"); client.DefaultRequestHeaders.TryAddWithoutValidation("Referer", MainUrl); client.DefaultRequestHeaders.TryAddWithoutValidation("Upgrade-Insecure-Requests", "1"); client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"); var result = await client.GetAsync(uri).ConfigureAwait(false); using (var responseStream = await result.Content.ReadAsStreamAsync().ConfigureAwait(false)) using (var streamReader = new StreamReader(responseStream)) { var htmlContent = await streamReader.ReadToEndAsync().ConfigureAwait(false); } } } } И такой вариант проходит... Возвращается нормальный контент.
вопрос Code: public const string MainUrl = "http://tiwar.ru"; если вместо http->https это как то влияет??
Часа полтора одуплял в чем может быть причина ошибки авторизации, но потом понял, что после того как ты зашёл на главную страницу, тебе даётся ссылка с Cookie: Code: http://tiwar.ru/?sign_in=1&PHPSESSID=8d15faa98341f043453bc8087de12d23 Когда ты тупо получил Cookie из Header'ов и отправляешь POST запрос, сервер понимает, что ты не зашёл на ссылку с Cookie, а как только ты зашёл на ссылку авторизации, сервер скорее всего в сессию записывает какие-то данные, которые проверяет при авторизации. Spoiler: Auth Code Code: public static async Task LogIn(Profile profile) { using (var handler = new HttpClientHandler() { CookieContainer = new CookieContainer(), AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }) { var uri = new Uri(MainUrl); using (HttpClient client = new HttpClient(handler)) { //client. var servicePoint = ServicePointManager.FindServicePoint(uri); servicePoint.Expect100Continue = false; client.BaseAddress = uri; client.DefaultRequestHeaders.TryAddWithoutValidation("Host", "tiwar.ru"); client.DefaultRequestHeaders.TryAddWithoutValidation("Connection", "keep-alive"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "utf-8;q=0.7,*;q=0.3"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"); client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"); var result = await client.GetAsync(uri).ConfigureAwait(false); var cookies = handler.CookieContainer.GetCookies(uri); var content = new Dictionary<string, string> { { "PHPSESSID", cookies[0].Value }, { "login", profile.Login }, { "pass", profile.Password } }; result = await client.GetAsync(new Uri(SignInUrl + "&" + cookies[0])).ConfigureAwait(false); //string data = string.Format("login={0}&pass={1}", profile.Login, profile.Password); //StringContent cont = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded"); //cont.Headers.ContentType.MediaType = "application/x-www-form-urlencoded"; //cont.Headers.ContentType.CharSet = ""; var requestLogin = new HttpRequestMessage(HttpMethod.Post, "") { Content = new FormUrlEncodedContent(content) }; requestLogin.Headers.Referrer = new Uri(SignInUrl + "&" + cookies[0]); var responseLogin = await client.SendAsync(requestLogin).ConfigureAwait(false); using (var responseStream = await responseLogin.Content.ReadAsStreamAsync().ConfigureAwait(false)) using (var streamReader = new StreamReader(responseStream)) { var htmlContent = await streamReader.ReadToEndAsync().ConfigureAwait(false); if (htmlContent.Contains("Вы исчерпали лимит попыток")) { Console.WriteLine("Исчерпан лимит попыток авторизации ..."); } else if (htmlContent.Contains("Ошибка авторизации")) { Console.WriteLine("Ошибка авторизации ..."); } else if (htmlContent.Contains("Арена") && htmlContent.Contains("Пещера")) { Console.WriteLine("Успешная авторизация ..."); } } } } }