C# Авторизация в браузерной игре POST запросом

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by boraicho, 9 Feb 2018.

  1. boraicho

    boraicho New Member

    Joined:
    8 Feb 2018
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Пытаюсь авторизоваться, нифига не получается, сижу уже не один вечер с гуглом, идеи уже кончились. Снифал 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<stringstring>
                        {
                            {
    "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);
                        }
                    }
                }
            }
        }
    }
     
  2. boraicho

    boraicho New Member

    Joined:
    8 Feb 2018
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    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(uricookieLogin);
                        
    handler.CookieContainer.Add(uricookieSessid);

                        
    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);
                        }
                    }
                }
            }
    И такой вариант проходит... Возвращается нормальный контент.
     
  3. less_Grow

    less_Grow New Member

    Joined:
    17 Feb 2018
    Messages:
    5
    Likes Received:
    3
    Reputations:
    0
    вопрос
    Code:
    public const string MainUrl = "http://tiwar.ru";
    если вместо http->https это как то влияет??
     
  4. boraicho

    boraicho New Member

    Joined:
    8 Feb 2018
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    По идее не должно. У них там все по http ходит.
     
  5. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Часа полтора одуплял в чем может быть причина ошибки авторизации, но потом понял, что после того как ты зашёл на главную страницу, тебе даётся ссылка с Cookie:
    Code:
    http://tiwar.ru/?sign_in=1&PHPSESSID=8d15faa98341f043453bc8087de12d23
    Когда ты тупо получил Cookie из Header'ов и отправляешь POST запрос, сервер понимает, что ты не зашёл на ссылку с Cookie, а как только ты зашёл на ссылку авторизации, сервер скорее всего в сессию записывает какие-то данные, которые проверяет при авторизации.

    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("Успешная авторизация ...");
                            }
                            
                        }
                    }
                }
            }
     
    boraicho and Yokohama-man like this.