С# Авторизация на OD.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by noCnuHeJIonaTou, 23 Jul 2009.

  1. noCnuHeJIonaTou

    noCnuHeJIonaTou New Member

    Joined:
    15 Mar 2009
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    Нужно программно (Visual Studio - C#) пройти авторизацию на сайте www.odnoklassniki.ru.
    Юзаю Http Analyzer.
    Составил GET запрос:

    Code:
    private void button4_Click(object sender, EventArgs e)
    { 
    HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.odnoklassniki.ru");
    myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.37 Safari/530.5"; 
    myHttpWebRequest.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
    myHttpWebRequest.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4"); 
    HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
    StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream()); 
    MessageBox.Show(myStreamReader.ReadToEnd()); 
    string sCookies = ""; 
    if (!String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"])) 
    { 
    sCookies = myHttpWebResponse.Headers["Set-Cookie"]; 
    }
    }
    Это вроде верно, в MessageBox получается начальная страничка.

    Нашел кое-какую информацию, но не могу разобраться.
    Запутался с составлением POST запроса, нужно отправить на сайт лог и пасс, подскажите как? или на наглядном примере объясните)
    либо приму ссылочки с полезной инфой.
     
  2. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Писал для себя на VB.NET на VS2008TS, думаю не составит труда перевести на C#
    Code:
        Public Function Request(Dim Login as String, Dim Pass as String, ByVal URL as String, Dim RegEx_Parse as String, Dim RegEx_Denial as String)
            Dim StreamReader As StreamReader = Nothing
            Dim StreamWriter As StreamWriter = Nothing
            Dim RegEx As New System.Text.RegularExpressions.Regex("")
            Dim Match As System.Text.RegularExpressions.Match
            Dim Req As HttpWebRequest = Nothing
            Dim Resp As HttpWebResponse = Nothing
            Dim Send As String = "login=" & Login & "&pass=" & Pass
            Dim Content As String = Nothing
    
            Dim Cookie As New CookieCollection
            Cookie.Add(New Cookie("name", "value", "path", "domain")) 'Если нужно используем кукисы + атачим их
    
            Dim Result As String = Nothing
    
            Try
                Req = WebRequest.Create(Site.URL)
                Req.Method = WebRequestMethods.Http.Post
                Req.ContentLength = Send.Length
                Req.ContentType = "application/x-www-form-urlencoded"
                Req.CookieContainer = New CookieContainer 'Создаём контейнер для кукисов
                Req.CookieContainer.Add(Cookie) 'Атачим кукисы
    
                StreamWriter = New StreamWriter(Req.GetRequestStream, System.Text.Encoding.Default)
                StreamWriter.Write(Send)
                StreamWriter.Close()
    
                Resp = Req.GetResponse
                Cookie = Resp.Cookies 'Получаем Кукисы
    
                StreamReader = New System.IO.StreamReader(Resp.GetResponseStream, System.Text.Encoding.Default)
                Content = StreamReader.ReadToEnd
    
                Match = RegEx.Match(Content, Site.RegEx_Denial, RegexOptions.Singleline Or RegexOptions.IgnoreCase)
    
                If Match.Success = False Then
                    Match = RegEx.Match(Content, Site.RegEx_Parse, RegexOptions.Singleline Or RegexOptions.IgnoreCase)
    
                    If Match.Success = True Then
                        Result = Match.Groups(1).Value
                    End If
                End If
    
                Resp.Close()
                StreamReader.Close()
            Catch ex As Exception
                MsgBox("Ошибка " & ex.Message)
            End Try
    
            Return Result
        End Function
    
    Отправка данных + парсинг ответа регексами
     
    #2 FireFenix, 23 Jul 2009
    Last edited: 23 Jul 2009
  3. noCnuHeJIonaTou

    noCnuHeJIonaTou New Member

    Joined:
    15 Mar 2009
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    Что такое есть регекс Оо?
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Регуля́рные выраже́ния (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэ́кспы или ре́гексы) — система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи образцов для поиска. (с) wiki
     
    _________________________
  5. noCnuHeJIonaTou

    noCnuHeJIonaTou New Member

    Joined:
    15 Mar 2009
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    Вот написал вроде POST запрос:

    Code:
            public void post_request(string Login,string Pass)
            {
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://wg53.odnoklassniki.ru/cdk/st.cmd/login/tkn/718");
                myHttpWebRequest.Method = "POST";
                myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.37 Safari/530.5";
                myHttpWebRequest.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
                myHttpWebRequest.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
                String Send = "st.posted=set&st.email="+Login+"&st.password="+Pass+"+&button_go=%D0%92%D0%BE%D0%B9%D1%82%D0%B8";
                byte[] ByteArr = System.Text.Encoding.Default.GetBytes(Send);
                myHttpWebRequest.ContentLength = ByteArr.Length;
                myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
               
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                StreamReader myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream());
                
                MessageBox.Show(myStreamReader.ReadToEnd());
            }
    
    на выходе как я понимаю получаю все время "неверный логин или пароль" . проблема в кодировке? или код кривой?)