Авторизация на сайте через C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by FlyBird, 15 Feb 2010.

  1. FlyBird

    FlyBird Elder - Старейшина

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    В общем думаю, что тема поднималась не раз, но толком ничего не нашла. В гугле есть пара тем приятных, по их образу и писала, но что-то где-то явно не так.
    Естественно свой код есть и я его приведу ниже.
    Суть в том, что есть форма на сайте и она передает методом post логин, пароль и сервер. Я пытаюсь отправить через C# POST запрос на форму авторизации. На выходе у меня приходит что-то не понятное. абракадабра или html в каком-то шифре. Кто знает может в gzip :confused:

    Код моего запроса приведен ниже.
    Если у кого-то есть своим, то буду рада их почитать.
    Code:
    string _ContentLength = "user=LOGIN&password=******&server_select=1";
    
                // Делаем массив байтов
                ASCIIEncoding encoder = new ASCIIEncoding();
                byte[] POSTArray = encoder.GetBytes(_ContentLength);
    
                // Готовим запрос
                HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(@"http://www.SITE.ru/index.php?action=login");
                System.Net.ServicePointManager.Expect100Continue = false;
                httpRequest.Method = "POST";
                httpRequest.ProtocolVersion = HttpVersion.Version10;
                httpRequest.Referer = "http://www.SITE.ru/index.php?action=login&user=LOGIN&password=******&server_select=1";
                httpRequest.ContentType = "application/x-www-form-urlencoded";
                httpRequest.Headers.Add("Accept-Language", "ru,en-us;q=0.7,en;q=0.3");
                httpRequest.Headers.Add("Accept-Encoding", "gzip,deflate");
                httpRequest.Headers.Add("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");
                httpRequest.Headers.Add("Keep-Alive", "115");
                //httpRequest.Headers.Add("Connection", "keep-alive");
                httpRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2) Gecko/20100115 MRA 5.6 (build 03278) Firefox/3.6 sputnik unknown";
                httpRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                httpRequest.ContentLength = POSTArray.Length;
                httpRequest.KeepAlive = true;
    
                // Шлем запрос
                Stream stream = httpRequest.GetRequestStream();
                StreamWriter sv = new StreamWriter(stream);
                sv.Write(_ContentLength);
                stream.Write(POSTArray, 0, POSTArray.Length);
                stream.Close();
    
                //WebResponse webResponse = httpRequest.GetResponse();
                HttpWebResponse webResponse = (HttpWebResponse)httpRequest.GetResponse();
                // Читаем страницу с формой
                StreamReader sr = new StreamReader(webResponse.GetResponseStream());
                string tmp = "";
                while (sr.Peek() >= 0) 
                    tmp += sr.ReadLine();
                File.WriteAllText(@"C:\aaa.txt", tmp);
                webResponse.Close();
    
     
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    ужс =\
    Авторизация заключается в том чтобы пихнуть кукисы вовремя.

    В принципе можно вот так:

    Code:
    protected override string SendPost(string url, string postData, string referer, bool allowRedirect)
            {
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.AllowAutoRedirect = allowRedirect;
                httpWebRequest.Method = "POST";
                httpWebRequest.UserAgent = UserAgent;
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                if (!string.IsNullOrEmpty(Proxy))
                {
                    httpWebRequest.Proxy = new WebProxy(Proxy);
                }
                if (!string.IsNullOrEmpty(Cookies))
                {
                    httpWebRequest.Headers.Add(HttpRequestHeader.Cookie, Cookies);
                }
                if (!string.IsNullOrEmpty(referer))
                {
                    httpWebRequest.Referer = referer;
                }
                var buffer = Encoding.ASCII.GetBytes(postData);
                httpWebRequest.ContentLength = buffer.Length;
                using (var writer = httpWebRequest.GetRequestStream())
                {
                    writer.Write(buffer, 0, buffer.Length);
                }
                using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
                {
                    Cookies = string.IsNullOrEmpty(httpWebResponse.Headers["Set-Cookie"]) ? "" : httpWebResponse.Headers["Set-Cookie"];
                    using (var stream = httpWebResponse.GetResponseStream())
                    {
                        using (var reader = new StreamReader(stream, Encoding.GetEncoding(1251)))
                        {
                            return reader.ReadToEnd();
                        }
                    }
                }
            }
    
     
  3. FlyBird

    FlyBird Elder - Старейшина

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Ваш код делает все тоже самое, просто вы его в отдельную ф-цию перенесли.
    Я же в тестовом режиме пробую получить контент. Затем ф-ция уйдет в dll в красивом виде. Кстати нужно добавить строку иначе работать не будет.
    Code:
    httpWebRequest.ProtocolVersion = HttpVersion.Version10;
    Ваша ф-ция вернула то же что и моя.
    Расскажу, я пытаюсь проломиться вот сюда
    http://www.voyna-plemyon.ru
    У меня ругается на мир. Не верно выбран мир.
     
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    user=LOGIN&clear=true&password=PWD&server=ru1

    а у вас:
    user=LOGIN&password=******&server_select=1
     
  5. FlyBird

    FlyBird Elder - Старейшина

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Неее... Это тут так. А в коде у меня по человечески.
    Именно &server_select=ru1
     
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    не обещаю что сделаю, но скиньте в личку учетку, может быть попробую с авторизацией помочь.
     
  7. FlyBird

    FlyBird Elder - Старейшина

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Письмо отправлено.
     
  8. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Code:
    class Program
        {
            private static bool SendPost(string url, string postData)
            {
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.Method = "POST";
                httpWebRequest.UserAgent = "User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)";
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.ProtocolVersion = HttpVersion.Version10;
                httpWebRequest.Referer = "http://www.voyna-plemyon.ru/";
                var buffer = Encoding.ASCII.GetBytes(postData);
                httpWebRequest.ContentLength = buffer.Length;
                using (var writer = httpWebRequest.GetRequestStream())
                {
                    writer.Write(buffer, 0, buffer.Length);
                }
                using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
                {
                    var location = httpWebResponse.Headers.Get("Location") ?? "";
                    return location.IndexOf("server_id=ru1", StringComparison.InvariantCulture) != -1;
                }
            }
    
            static void Main(string[] args)
            {
                var user = "";
                var pwd = "";
    
                var b = SendPost("http://www.voyna-plemyon.ru/index.php?action=login", string.Format("user={0}&clear=true&password={1}&server=ru1", user, pwd));
                Console.WriteLine(b);
            }
        }
    
    пропускает.
     
  9. FEV

    FEV Member

    Joined:
    23 Sep 2009
    Messages:
    15
    Likes Received:
    7
    Reputations:
    0
    вместо
    нужно
    httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
     
  10. FlyBird

    FlyBird Elder - Старейшина

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Верхний скрипт возвращает false
    Если вставить
    httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    То результат моего скрипта не меняется.

    Похоже, что я из второго части поговорки про лыжи =(
     
  11. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    дааа, реально лыжи. У меня true.

    и это - httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

    не надо.

    фраемворк само собой 3.5
     
    1 person likes this.
  12. FlyBird

    FlyBird Elder - Старейшина

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Ааааа... он зараза.
    Пока до конца не пройдешь, он почему-то мне ничего не возвращал.
    Т.е. пока я не выберу расу за кого играть, он пишет err...
    Все гуд, твой прошел, а мой нет. Спасибо всем огромное. Дальше ковыряемс.
     
    #12 FlyBird, 16 Feb 2010
    Last edited: 16 Feb 2010
  13. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Подойдет ли выше описанная реализация, для входа на deviantart.com?!


    Очень нужна просто авторизация(через textBox чтобы вводить логин и пароль), программить на C# начал совсем недавно, поэтому еще не совсем понимаю, что где и как.. :(
     
    #13 F&D, 25 May 2010
    Last edited: 25 May 2010
  14. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Смотри исходный код страницы!
     
  15. FlyBird

    FlyBird Elder - Старейшина

    Joined:
    14 Oct 2007
    Messages:
    46
    Likes Received:
    5
    Reputations:
    0
    Конечно подойдет.
    Там только имена нужно будет менять.

    Я сейчас замарочился над винформами, чтобы моя прога делала за меня многие вещи пока я сплю, к примеру.
     
  16. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    :confused:
     
  17. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    FlyBird программы зло. делай робота )
    лично я не особо понимаю прикола автоматизации серфинга web-а. регеры чекеры кликеры накрутки рейтинга и прочая лабуда это ясно - не ясно что прога может делать за тебя пока ты спишь? фотографировать тебя с вебкамеры и постить фоты на вконтакте в режими реал тайм? ))

    не ну бота можно написать со стандартным набором
    типа привет как дела
    привет нормально
    че делаешь? печатаю тебе а ты че?
    ... молодец.
    угу ага ясно ммм

    З.Ы надо будет написать себе такого под IM протоколы хех
     
    _________________________
  18. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5

    False - это значит работает?! :(
    Или нет? Если правильно интерпритировать это слово, то не работает.
     
  19. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Сам скрипт работает, но я не знаю, корректно ли.
    Как можно его модифицировать, чтобы можно было ВВОДИТЬ через textBox(ы) - логин и пароль?!