Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2015, 12:56   #1
krabich
Пользователь
 
Регистрация: 12.10.2013
Сообщений: 15
По умолчанию Авторизация на сайте. POST - запрос

Сайт my.life.ua

При успешной авторизации через браузер:

Headers - Form Data:
csrfmiddlewaretoken=2wO8mU3ZOOrR66O u7OawgMjau06aMAXD&msisdn_code=063&m sisdn=login&super_password=pass

Request Cookies:
__utma 203133709.1416894864.1447665665.144 8264189.1448269766.11 N/A N/A N/A 65
__utmb 203133709.1.10.1448269766 N/A N/A N/A 34
__utmc 203133709 N/A N/A N/A 18
__utmt 1 N/A N/A N/A 10
__utmz 203133709.1447665665.1.1.utmcsr=(di rect)|utmccn=(direct)|utmcmd=(none) N/A N/A N/A 77
_ga GA1.2.992902258.1447911217 N/A N/A N/A 32
_ym_isad 1 N/A N/A N/A 12
_ym_uid 1447911218167065657 N/A N/A N/A 29
csrftoken 2wO8mU3ZOOrR66Ou7OawgMjau06aMAXD N/A N/A N/A 44
mylifeua-sessionid dc79348fcd818c2cf7e46c989369f5d3 N/A N/A N/A 53
Response Cookies
mylifeua-sessionid 91dc60045c2f75836681eccb3e91d941

Код:
string life_site = "https://my.life.ua/ru/";
            string life_login = "login";
            string life_pass = "pass";
            string life_POST_REQUEST = "&msisdn_code=063&msisdn=" + life_login + "&super_password=" + life_pass;
            string life_word_to_find = "Баланс";
            //int life_after_word_sym = 277 - life_word_to_find.Length;
CookieContainer cont = new CookieContainer();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(life_site);
            request.CookieContainer = new CookieContainer();
 
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 
            CookieCollection cc = new CookieCollection();
            cc = response.Cookies;
            cont.Add(cc);                               
 
            String secondStepForm3 = response.Cookies.ToString() + life_POST_REQUEST;
            HttpWebRequest request3 = (HttpWebRequest)WebRequest.Create(life_site);
            request3.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:41.0) Gecko/20100101 Firefox/41.0";
            request3.Method = "POST";
            request3.ContentType = "application/x-www-form-urlencoded";
            
            byte[] EncodedPostParams3 = Encoding.Default.GetBytes(secondStepForm3);
            request3.ContentLength = EncodedPostParams3.Length;
            request3.GetRequestStream().Write(EncodedPostParams3, 0, EncodedPostParams3.Length);
            request3.GetRequestStream().Close();
 
            HttpWebResponse response4 = (HttpWebResponse)request3.GetResponse(); //ForBidden 403 вылетает здесь.
 
 
            string data = new StreamReader(response4.GetResponseStream(), Encoding.GetEncoding("KOI8-R")).ReadToEnd();
            double sum =  ParseString(data, life_word_to_find, life_after_word_sym);
В этом коде 403 Forbidden как ни крути. Где-то я не передаю/неправильно передаю Cookies.
Есть предположения как сделать? Логин и пароль из соображений безопасности,увы, предоставить не могу.
krabich вне форума Ответить с цитированием
Старый 23.11.2015, 13:04   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Где вы вообще что то передаете?
come-on вне форума Ответить с цитированием
Старый 23.11.2015, 13:11   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так может и не в куках дело, а например реферер проверяется.

Или куки неправильно передали.

Возьмите например Fiddler и сравните свой запрос с запросом браузера.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.11.2015, 13:14   #4
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
String secondStepForm3 = response.Cookies.ToString() + life_POST_REQUEST;
byte[] EncodedPostParams3 = Encoding.Default.GetBytes(secondSte pForm3);
request3.ContentLength = EncodedPostParams3.Length;
request3.GetRequestStream().Write(E ncodedPostParams3, 0, EncodedPostParams3.Length);
request3.GetRequestStream().Close() ;
это совсем плохо, куки надо передовать в куках, а с данными можно проще

request3.ContentLength = life_POST_REQUEST.Length;
StreamWriter stream = new StreamWriter(request3.GetRequestStr eam());
stream.Write(life_POST_REQUEST);
stream.Close();

Последний раз редактировалось come-on; 23.11.2015 в 13:17.
come-on вне форума Ответить с цитированием
Старый 23.11.2015, 13:46   #5
krabich
Пользователь
 
Регистрация: 12.10.2013
Сообщений: 15
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
Где вы вообще что то передаете?
Через Ctrl+SHIFT+C в Опере отследил вид POST-запроса.
Получил куки вида(см.ниже до &msisdn) и положил в запрос.

csrfmiddlewaretoken=2wO8mU3ZOOrR66O u7OawgMjau06aMAXD&msisdn_code=063&m sisdn=login&super_password=pass

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну так может и не в куках дело, а например реферер проверяется.

Или куки неправильно передали.

Возьмите например Fiddler и сравните свой запрос с запросом браузера.
Может проверяется, может неправильно передал, именно поэтому я здесь.
Fiddler в инспекторе написал то же:
Set-Cookie: csrftoken=94TmkzQtBna5SdpgYlRs01bWM 6F7hJ51; expires=Mon, 21-Nov-2016 10:33:47 GMT; httponly; Max-Age=31449600; Path=/; secure

Set-Cookie:
mylifeua-sessionid=598fd204a9547f632b23599d1 fb737ae; httponly; Path=/; secure
Где смотреть POST-запрос не нашёл, но собственно его я нашёл в Опере.

=====================
Относительно последнего (кукисы нужно передавать в кукисах)
Код:
CookieCollection cc = new CookieCollection();
            cc = response.Cookies;
            cont.Add(cc);
------------------------------
request3.CookieContainer = cont;
так?
=======================
Вот уходящие Request Headers при входе на сайт(ещё до авторизации):
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, lzma, sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:_ym_uid=1447911218167065657; _ga=GA1.2.992902258.1447911217; _ym_isad=1; csrftoken=Hj7WO1Re0QJKnMLdi2DJ1fmn1 tjXGqhH; mylifeua-sessionid=9966695f80cbe556e558a2829 1a48354; __utmt=1; __utma=203133709.1416894864.1447665 665.1448269766.1448276367.12; __utmb=203133709.1.10.1448276367; __utmc=203133709; __utmz=203133709.1447665665.1.1.utm csr=(direct)|utmccn=(direct)|utmcmd =(none)
Host:my.life.ua
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36 OPR/33.0.1990.115 (Edition Campaign 67)

Что странно. На другой сайт, в Request Cookies тоже имеются __utma и __utmz , а так же PHPSESSID.
В программе ничего из этого не передавал, но авторизация проходит успешно.
Т.е., все __utm* не обязательны для передачи, как я понял.

Последний раз редактировалось krabich; 23.11.2015 в 14:05.
krabich вне форума Ответить с цитированием
Старый 23.11.2015, 13:58   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так я и говорю сравните в Фидлере запрос браузера с запросом своего приложения, исправьте то, что отличается.

А как вы в Фидлере нашли куки, но не нашли POST запрос? На вкладке Inspectors справа все данные выбранного запроса.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.11.2015, 14:56   #7
krabich
Пользователь
 
Регистрация: 12.10.2013
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну так я и говорю сравните в Фидлере запрос браузера с запросом своего приложения, исправьте то, что отличается.

А как вы в Фидлере нашли куки, но не нашли POST запрос? На вкладке Inspectors справа все данные выбранного запроса.
Пойду курить Fiddler, даже там, где я успешно авторизовался, через Fiddler не могу.

==================
По результатам отпишусь.
Спасибо.
krabich вне форума Ответить с цитированием
Старый 23.11.2015, 15:32   #8
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
Через Ctrl+SHIFT+C в Опере отследил вид POST-запроса.
В опере вы можете только посмотреть структуру и как заполняеться запрос, чем - это ваша задача.
Цитата:
Получил куки вида(см.ниже до &msisdn) и положил в запрос.

csrfmiddlewaretoken=2wO8mU3ZOOrR66O u7OawgMjau06aMAXD&msisdn_code=063&m sisdn=login&super_password=pass
Это не куки а тело запроса, тоже вам надо заполнить руками.
Изучите структуры, раз уж взялись за такие вещи.
come-on вне форума Ответить с цитированием
Старый 28.11.2015, 20:10   #9
krabich
Пользователь
 
Регистрация: 12.10.2013
Сообщений: 15
По умолчанию

Авторизация прошла успешно. Спасибо Опере и HttpAnalyzer.
Проблема с получением данных, кракозябры во всех предлагаемых кодировках.

Response.CharacterSet возвращает utf-8.
Код:
using (StreamReader  eader = new StreamReader(wres.GetResponseStream(),Encoding.UTF8))
                    {
                        html += reader.ReadToEnd();
                    }
В итоге получаю кракозябры.
Дальше - лучше:
Сохранил страницу в html-формате. Открыл в Ворде, поигрался с кодировками. Действительно, открывает нормально только для UTF-8. И после этого(внимание!) программа начинает присылать данные корректно.
Обрадовался, сохранил рабочий вариант, начал приводить к основной программе.
В основной проге проверил - не работает. Вернулся на ту, которую сохранил - тоже перестала работать.

При каждом запуске программы при выводе в консоли первые 9 символов всегда разные!


Что за магия могла произойти?

Текущий код:
Код:
namespace ConsoleApplication1
{
    class Program
    {
        static CookieContainer cc = new CookieContainer();
        static string[] cooks = new string[2];
        static string UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:42.0) Gecko/20100101 Firefox/42.0";
        static string host = "my.life.ua";
        static string Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        static string AcceptLanguage = "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3";
        static string Encod = "gzip, deflate";
        static string Referer = "https://my.life.ua/ru/";
        static string ContentType = "application/x-www-form-urlencoded";


        static double SendRequest(string site, string method)
        {
            ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;

            HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(site);
            wreq.Accept = Accept;
            wreq.UserAgent = UserAgent;
            wreq.Method = method;
            wreq.CookieContainer = cc;
            wreq.Headers.Add("Accept-Language", AcceptLanguage);
            wreq.Headers.Add("Accept-Encoding", Encod);

            wreq.KeepAlive = true;
            if (method == "POST")
            {
                wreq.Referer = Referer;
                wreq.ContentType = ContentType;
                wreq.Host = host;
                string POST_Request = "csrfmiddlewaretoken=" + cooks[0] + "&msisdn_code=063&msisdn=login&super_password=pass";
                byte[] EncodedPostParams3 = Encoding.UTF8.GetBytes(POST_Request);
                wreq.ContentLength = EncodedPostParams3.Length;
                wreq.GetRequestStream().Write(EncodedPostParams3, 0, EncodedPostParams3.Length);
                wreq.GetRequestStream().Close();
                HttpWebResponse wres = (HttpWebResponse)wreq.GetResponse();
                string html = "";
                
                if (wres.StatusCode == HttpStatusCode.OK)
                {
                    using (StreamReader reader = new StreamReader(wres.GetResponseStream(),Encoding.UTF8))
                    {
                        html += reader.ReadToEnd(); //здесь ловим кракозябровый ответ
                        html = Regex.Replace(html, "<[^>]+>", string.Empty);
                        html = html.Replace(" ", string.Empty);
                        string pattern = "\\s+";
                        string replacement = " ";
                        Regex rgx = new Regex(pattern);
                        html = rgx.Replace(html, replacement);
                        int pos = html.IndexOf("07.11.2014");
                        if (pos != -1)
                            html = html.Substring(pos + 11, 6);
                        else
                            html = "Error";

                        Console.WriteLine(html);

                    }
                    Console.ReadLine();
                }
                else if (wres.StatusCode == HttpStatusCode.Forbidden)
                {
                    //CheckByModem(life_pnum);
                    return 0;
                }

            }
            else
            {
                HttpWebResponse wres = (HttpWebResponse)wreq.GetResponse();
                int i = 0;
                if (wres.Cookies.Count > 1)
                {
                    foreach (Cookie cook in wres.Cookies)
                    {
                        cooks[i] += cook.Value;
                        i++;
                    }
                }
                else cooks[1] = wres.Cookies.ToString();
            }
            return 0;
        }

        static void Main(string[] args)
        {
            string site = "https://my.life.ua/ru/";
            SendRequest(site, "GET");
            SendRequest(site, "POST");
        }
    }
}

Последний раз редактировалось krabich; 28.11.2015 в 20:24.
krabich вне форума Ответить с цитированием
Старый 28.11.2015, 20:46   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я б WebClient использовал вместо HttpWebRequest, там достаточно установить свойство Encoding, ну и вообще меньше кода писать.

Вот простой наследник WebClient с CookieContainer'ом если что https://gist.github.com/AlexP11223/e814a5ef8e741ead1632

И вместо регекспов для парсинга HTML обычно гораздо проще использовать HtmlAgilityPack (XPath).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авторизация на UCOZ с idHTTP.Post Stalkker247 Работа с сетью в Delphi 15 14.03.2012 13:34
Авторизация на vbulletin (POST) IndomiX Работа с сетью в Delphi 10 19.02.2012 21:11
https авторизация, обычный POST запрос не получается нужна какая дополнительная деталь temkas C# (си шарп) 1 06.12.2011 08:26
Post авторизация fenix19910 C# (си шарп) 0 21.07.2011 21:05
Хитрая авторизация на сайте метод post OkeaH Работа с сетью в Delphi 8 27.02.2009 19:49