Indy 10 - проблема

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

  1. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Вобщем надо авторизироваться на wap.odnoklassniki.ru. В опере все норм.

    Отправляет заголовки:
    Code:
    POST /dk?st_id=login&tkn=1247 HTTP/1.1
    User-Agent: Opera/9.52 (Windows NT 5.1; U; en)
    Host: mg2.odnoklassniki.ru
    Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    Referer: http://wap.odnoklassniki.ru/dk?st_id=main&tkn=1321
    Connection: Keep-Alive
    Content-Length: 98
    Content-Type: application/x-www-form-urlencoded
    
    fr_button=on&fr_email=agakamran%40mail.ru&fr_password=7646037&fr_go=%D0%92%D0%BE%D0%B9%D1%82%D0%B8
    Получает заголовки:
    Code:
    HTTP/1.1 302 Found
    Server: Resin/2.1.16
    Cache-Control: private
    Location: http://mg2.odnoklassniki.ru/dk;jsessionid=a9fQlIQnP909?st_id=userMain&tkn=7251
    Set-Cookie: JSESSIONID=a9fQlIQnP909; path=/
    Content-Length: 116
    Connection: close
    Date: Fri, 24 Jul 2009 15:23:35 GMT
    Дальше есс-но редиректит, отправляя заголовки:
    Code:
    GET /dk;jsessionid=a9fQlIQnP909?st_id=userMain&tkn=7251 HTTP/1.1
    User-Agent: Opera/9.52 (Windows NT 5.1; U; en)
    Host: mg2.odnoklassniki.ru
    Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    Referer: http://wap.odnoklassniki.ru/dk?st_id=main&tkn=1321
    Cookie: JSESSIONID=a9fQlIQnP909
    Cookie2: $Version=1
    Connection: Keep-Alive, TE
    TE: deflate, gzip, chunked, identity, trailers
    
    Получает заголовки:
    Code:
    HTTP/1.1 200 OK
    Server: Resin/2.1.16
    Last-Modified: Tue, 04 Dec 2050 11:03:49 GMT
    Pragma: no-cache
    Cache-Control: no-cache, must-revalidate
    Content-Type: text/html;charset=UTF-8
    Connection: close
    Transfer-Encoding: chunked
    Date: Fri, 24 Jul 2009 15:23:38 GMT
    Ну и тело тоже...

    Через инди - не хочет.

    Отправляет заголовки:
    Code:
    POST /dk?st_id=login&tkn=7844 HTTP/1.0
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 117
    Connection: Keep-Alive, TE
    TE: deflate, gzip, chunked, identity, trailers
    Host: wap.odnoklassniki.ru
    Accept: text/html, */*
    Accept-Encoding: identity
    User-Agent: Mozilla/3.0 (compatible; Indy Library)
    
    fr_button=ons&fr_email=agakamran@mail.ru&fr_password=7646037&fr_go=%25D0%2592%25D0%25BE%25D0%25B9%25D1%2582%25D0%25B8
    Получает заголовки:
    Code:
    HTTP/1.0 302 Found
    Server: Resin/2.1.16
    Cache-Control: no-cache
    Location: http://wap.odnoklassniki.ru/dk;jsessionid=akkkZlcCROtb?st_id=userMain&tkn=4654
    Expires: Thu, 01 Dec 1994 16:00:00 GMT
    Set-Cookie: JSESSIONID=akkkZlcCROtb; path=/
    Content-Length: 116
    Date: Fri, 24 Jul 2009 15:32:16 GMT
    Редиректит, отправляя заголовки:
    Code:
    POST /dk;jsessionid=akkkZlcCROtb?st_id=userMain&tkn=4654 HTTP/1.0
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 117
    Connection: Keep-Alive, TE
    TE: deflate, gzip, chunked, identity, trailers
    Host: wap.odnoklassniki.ru
    Accept: text/html, */*
    Accept-Encoding: identity
    User-Agent: Mozilla/3.0 (compatible; Indy Library)
    Cookie: JSESSIONID=akkkZlcCROtb
    
    fr_button=ons&fr_email=agakamran@mail.ru&fr_password=7646037&fr_go=%25D0%2592%25D0%25BE%25D0%25B9%25D1%2582%25D0%25B8
    Но получает ошибку №400 Bad Request.
    Code:
    HTTP/1.0 400 Bad Request
    Server: Resin/2.1.16
    Cache-Control: no-cache
    Expires: Thu, 01 Dec 1994 16:00:00 GMT
    Set-Cookie: JSESSIONID=; expires=Thu, 01-Dec-1994 16:00:00 GMT
    Set-Cookie: AUTHCODE=; domain=.odnoklassniki.ru; path=/; expires=Thu, 01-Dec-1994 16:00:00 GMT
    Content-Type: text/html
    Content-Length: 135
    Date: Fri, 24 Jul 2009 15:32:19 GMT
    После этого еррормесадж - 400...

    HandleRedirects стоит true.

    Собственно, почему?
    Прошу помощи...
     
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    А зачем через инди слать 2 раза запрос на авторизацию, причем второй раз почему то к /dk;jsessionid=akkkZlcCROtb?st_id=userMain&tkn=4654
     
    _________________________
  3. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    В опере все ок - сначала отправляются заголовки, опера получает куки, с которыми гетом открывает страничку...

    А вот инди почему-то постом её открывает, хотя у меня идет всего один пост-запрос, и никаких гетов:
    Code:
           PostData:=TStringList.Create;
           PostData.Add('fr_button=ons');
           PostData.Add('fr_email='+RegExp1.Match[1]);
           PostData.Add('fr_password='+RegExp1.Match[2]);
           PostData.Add('fr_go=%D0%92%D0%BE%D0%B9%D1%82%D0%B8');
          IdHTTP1.Post('http://wap.odnoklassniki.ru/dk?st_id=login&tkn=7844',PostData);
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Так убери HandleRedirects и обрабатывай редирект самостоятельно
     
    _________________________
  5. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Убираю HandleRedirects - выскакивает 302 ошибка...
     
  6. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Почему ошибка то, это редирект, который ты должен обработать.
    Если он выскакивает в виде исключения, то пиши запрос в try catch
     
    _________________________
    1 person likes this.
  7. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    А вот этого я не знаю :(...
     
  8. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    24
    Reputations:
    -1
    try except, try finally, try ti_idiot
    Прежде чем кодить, почитай немного литературы...
    Вылетает эксепшен, и то под дебагером...а с помощью выше описанных функций ты сможешь обойти это! Ололо
     
    2 people like this.
  9. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Ты что то неправильно делаешь. Я с Indy не работал, поэтому сразу не могу сказать, как правильно делать.

    В общем твоя программа не правильно начинает отправлять заголовки, начиная от редиректа. Опера отправляет GET-запрос, а твоя программа POST-запрос, да и еще добавляет переменные к телу от предыдущего запроса.

    Выложи сюда проект, посмотрим, что можно сделать. А еще для таких программ (и вообще любых других, которые работают с сетью) советую использовать Winsock.
     
    #9 Chrome~, 25 Jul 2009
    Last edited: 25 Jul 2009
  10. ZdezBilYa

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

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19

    1.
    Code:
    PostData.Add('fr_go=%D0%92%D0%BE%D0%B9%D1%82%D0%B8');
    можно написать просто
    Code:
    PostData.Add('fr_go=Войти');
    Во всяком случае, у меня так нормально работает. Ну это так, совет чисто для удобства))
    2.
    Code:
    IdHTTP1.Post('http://wap.odnoklassniki.ru/dk?st_id=login&tkn=7844',PostData);
    ссылку, куда посылать POST-запрос нужно парсить с предыдущей страницы.
    т.е. сначала делаем Get-запрос:
    Code:
    StrPage:=IdHTTP1.Get('http://wap.odnoklassniki.ru/');
    затем парсим StrPage и ищем ссылку вида http://wap.odnoklassniki.ru/dk?st_id=login&tkn=7844, где число в конце меняется каждый раз (именно поэтому и надо парсить).
    Затем заголовки делаю такие:
    Code:
    IdHTTP1.Request.UserAgent:='Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00';
           IdHTTP1.Request.Accept:='text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1';
           IdHTTP1.Request.AcceptLanguage:='ru,ru-RU;q=0.9,en;q=0.8';
           IdHTTP1.Request.AcceptCharSet:='iso-8859-1, utf-8, utf-16, *;q=0.1';
           IdHTTP1.Request.AcceptEncoding:='deflate, gzip, x-gzip, identity, *;q=0';
    IdHTTP1.Request.ContentType: application/x-www-form-urlencoded;
    Ну и POST-запрос после этого уже делаешь.

    HandleRedirects включен
    CookieManager подключен
    Всё работает
     
    1 person likes this.