Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
1

Авторизация на сайте. POST - запрос

29.10.2015, 08:33. Показов 2665. Ответов 5

Миллион тем было, миллион тем будет.
Ниже процедура и 2 вызова.
для LDS - работает, для Life - получаю в response - 403 Forbidden.
Из-за id_msisdn_code (063/073/093) POST-запрос меняется, но как меняется?
И какие параметры брать для передачи, которые подписаны name? (msisdn и super_password соответственно)

Есть у кого-то предложения по этому поводу?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
static string CheckBySite(string site_name,  string login, 
                                  string pass,       string login_style, 
                                  string pass_style, string wordtofind, 
                                  string companyname,int afterword, int count) 
        {
            String secondStepForm3 = login_style+login+pass_style+pass;
            HttpWebRequest request3 = (HttpWebRequest)WebRequest.Create(site_name);
            request3.UserAgent = ".NET Framework Test Client";// "Opera/9.80";
            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 response = (HttpWebResponse)request3.GetResponse();
            
 
            string lol = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("KOI8-R")).ReadToEnd();
 
            int pos = lol.IndexOf(wordtofind); //если слово "Баланс есть на странице - мы авторизовались".
            if (pos != -1)
            {
                string test = lol.Substring(pos + afterword, count); //грубо говоря получили 6-значное число. Если упадёт до 5 значного заберёт одну кавычку.
                test = test.Replace('.', ','); //заменим точку на запятую для работы с числами.
                double numVal = Double.Parse(test) / 2; // для перевода в гривны делим на 2.
                lol = companyname + ": " + numVal.ToString() + " грн.";
            }
            else
                lol = companyname + " :Something wrong with site!"; 
 
            return lol;
        }
Вызов 1(работает):
C#
1
2
3
4
5
6
7
8
9
string lds_site = "https://stat.lds.net.ua";
            string lds_login = "login";
            string lds_pass = "pass";
            string lds_login_style = "username=";
            string lds_pass_style = "&userpass=";
            string lds_word_to_find = "Баланс";
            int    lds_after_word_sym = 277;
            int    lds_balans_length = 6;
            lds_result = CheckBySite(lds_site, lds_login, lds_pass,lds_login_style,lds_pass_style,lds_word_to_find, "LDS",lds_after_word_sym,lds_balans_length);
Вызов 2(не работает):
C#
1
2
3
4
5
6
7
8
9
10
11
12
tring life_site = "https://my.life.ua/ru/";
            string life_login = "number";
            string life_pass = "password";
            string life_login_style = "id_msisdn_code=063&id_msisdn="; //суть здесь
            string life_pass_style = "&super_password=";
            string life_word_to_find = "07.11.2014"; // дата регистрации, пофиг
            int life_after_word_sym = 277;
            int life_balans_length = 7;
            life_result = CheckBySite(life_site, life_login, 
                                     life_pass, life_login_style, 
                                     life_pass_style, life_word_to_find, "LIFE", 
                                     life_after_word_sym, life_balans_length);
Исходный код страницы 1 вызова(урезан до нужной части).
Кликните здесь для просмотра всего текста

HTML5
1
2
<tr><td class="form-legend-auth">Логин или лицевой счет</td><td><input type="text" name="username" id="username" value="" style="width:150px" class="nt-input"></td></tr>
        <tr><td class="form-legend-auth">Ваш пароль</td><td><input type="password" name="userpass" id="userpass" style="width:150px" class="nt-input"></td></tr>

Исходный код страницы 2 вызова(урезан до нужной части):
Кликните здесь для просмотра всего текста

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  <td>Введите ваш номер:</td>
              <td>
                <div class="phone-section">
                <select id="id_msisdn_code" name="msisdn_code" class="phone-select">
                  
                  <option value="063" >063</option>
                  
                  <option value="073" >073</option>
                  
                  <option value="093" >093</option>
                  
                </select>
                <input autocomplete="off" name="msisdn" maxlength="7" type="text" class="needValid" id="id_msisdn" />
                
                
                </div>
              </td>
            </tr>
            <tr>
              <td><label for="id_super_password">Введите Суперпароль:</label></td>
              <td>
                <div class="passwoard-section">
                  <input id="id_super_password" type="password" class="needValid noText-valid min6 password-valid" name="super_password" maxlength="6" />
                  <a href="javascript:void(0);" class="info-link">


Добавлено через 2 часа 12 минут
Параметры(2 вызов):
csrfmiddlewaretoken:"uRBEi8SbII2CSzVXMfPSIN7UiOALrovS"
msisdn_code:"063"
msisdn:"3335566"
super_password:"879645"

Ответ 2 вызов:
Кликните здесь для просмотра всего текста

<td>Введите ваш номер:</td>
<td>
<div class="phone-section">
<select id="id_msisdn_code" name="msisdn_code" class="phone-select">

<option value="063" selected="selected">063</option>

<option value="073" >073</option>

<option value="093" >093</option>

</select>
<input autocomplete="off" name="msisdn" maxlength="7" type="text" class="needValid" value="3335566" id="id_msisdn" />


</div>
</td>
</tr>
<tr>
<td><label for="id_super_password">Введите Суперпароль:</label></td>
<td>
<div class="passwoard-section">
<input name="super_password" value="879645" class="needValid noText-valid min6 password-valid" maxlength="6" type="password" id="id_super_password" />
<a href="javascript:void(0);" class="info-link">
<span class="info-sub">
<span class="hidden-icon">&nbsp;</span>
Получить СуперПароль можно, отправив SMS с текстом PAROL на номер 123
</span>
</a>

</div>
</td>
</tr>


Добавлено через 24 минуты
============================================================ ================
Финал:
Form Data(view parced):
Для 1 случая: username=23423423&userpass=123iop
Для 2 случая: csrfmiddlewaretoken=9fJjZkCexnx27y9v34paW7dLRP1IXS2o&msisdn_ code=063&msisdn=3452312&super_password=434353

Сие чудо берётся с Куки:
Cookie:csrftoken=9fJjZkCexnx27y9v34paW7dLRP1IXS2o; mylifeua-sessionid=f00a5e94ebae799253e58b9486677d21; __utmt=1; __utma=203133709.416984635.1446028403.1446028403.1446030470. 2; __utmb=203133709.1.10.1446030470; __utmc=203133709; __utmz=203133709.1446028403.1.1.utmcsr=(direct)|utmccn=(dire ct)|utmcmd=(none)

Вопросы по ходу дела меняются:
Как симитировать Куки или где они получаются?

Добавлено через 31 минуту
Ну и финал этого всего:
Получил куки с помощью этого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   static string GetCookie( string site)
        {
            string url = site;
 
            HttpWebRequest tQ = (HttpWebRequest)HttpWebRequest.Create(url);
            tQ.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            tQ.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0";
            tQ.ContentType = "application/x-www-form-urlencoded";
            tQ.Referer = url;
            HttpWebResponse tS = (HttpWebResponse)tQ.GetResponse();
 
            string tC = tS.Headers["Set-Cookie"];
 
            Console.WriteLine(tC);
            tS.Close();
            return tC;
        }
Впихнул их в запрос: String secondStepForm3 = cookie+login_style+login+pass_style+pass;


Итог один - Forbidden 403. Сдаюсь и надеюсь на помощь форума.

Добавлено через 17 часов 34 минуты
Жаль, наверное, слишком много букаф
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2015, 08:33
Ответы с готовыми решениями:

Авторизация на сайте ппри помощи post-запроса
На сайте есть форма входа: &lt;td class=&quot;bc&quot;&gt;&lt;table width=&quot;100%&quot; border=&quot;0&quot;...

Программная авторизация на сайте, POST-запрос
Ребят, я этим никогда не интересовался, поэтому простите, если вопрос глупый. Не могу программно...

POST запрос, авторизация на сайте Intertelecom
Пытаю написать программу, которая проверяет остаток средств на лицевом счете, чтобы пополнять...

Авторизация на сайте посредством Post запроса
Авторизация на сайте по средствам Post запроса На сайте есть форма входа: &lt;form...

5
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
23.11.2015, 12:12  [ТС] 2
Update 23.11.15:

Headers - Form Data:
csrfmiddlewaretoken=2wO8mU3ZOOrR66Ou7OawgMjau06aMAXD&msisdn_ code=063&msisdn=login&super_password=pass

Request Cookies:
__utma 203133709.1416894864.1447665665.1448264189.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=(direct)|utmccn=(direct)|utm cmd=(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

Вот такое вот дело генерируется при успешной авторизации.

Ну и текущий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   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 я не ухожу. Т.е. он считает что я не принимаю и не передаю Кукисы. не исключено что так и есть. Подскажите кто чем может.
0
443 / 298 / 63
Регистрация: 12.10.2009
Сообщений: 1,161
25.11.2015, 03:15 3
у тебя юзается протокол https сперва настрой его должным образом
перед запросом на сайт (life_site) выполни строчку
C#
1
ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
1
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
26.11.2015, 13:55  [ТС] 4
Цитата Сообщение от агерон Посмотреть сообщение
у тебя юзается протокол https сперва настрой его должным образом
перед запросом на сайт (life_site) выполни строчку
C#
1
ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
Спасибо.
Предыдущий https-сайт проглотил авторизацию и без этого, но там она значительно легче.

Воспользовался http-анализером.
1.
Запрос: При первом(самом первом) входе на сайт, нет ни csrf-токена ни Cookies(логично).
Ответ(200): вернулись csrf-токен и sessionID

2. После Ввода данных(логина и пароля и нажатия "Далее"):
Запрос: csrf-токен(изменённый!) и sessionID( и независимо от меня ещё Гугл Аналитика со своими параметрами, их обязательно передавать при запросе? Если да - то как их формировать?)
Ответ:(302 - Redirect): Вернуло другой код sessionID !

3. (Продолжение редиректов)
Запрос: token тот же, sessionID из 2 ответа и ГуглАналитика.
Ответ(302): sessionID, тот же что и в запросе(3).

4.
Запрос: token и SessionID с Запроса (3).
Ответ(200): Сессия-токен, и я попадаю на ту страницу, которая нужна.

================================================
Либо же, если не с нуля, то со старта сразу передаётся csrftoken(в качестве Cookie) в Get-запросе.
Как это сделать - совсем без понятия.
Не то чтобы "сделайте за меня", но я уже замахался с этим входом на сайт.
===============================================
И казалось бы, всё просто, но 403 Forbidden, и ни в какую.
0
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
28.11.2015, 22:42  [ТС] 5
Авторизация прошла успешно. Спасибо Опере и HttpAnalyzer.
Проблема с получением данных, кракозябры во всех предлагаемых кодировках.

Response.CharacterSet возвращает utf-8.
C#
1
2
3
4
using (StreamReader reader = new StreamReader(wres.GetResponseStream(),Encoding.UTF8))
                    {
                        html += reader.ReadToEnd();
                    }
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
static CookieContainer cc = new CookieContainer();
        static string[] cooks = new string[15];
        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");
        }
    }

Смог получить нормальный ответ!
Оказалось, причиной успешного запуска служит HTTPAnalyzer Stand-alone для мониторинга трафика. Стоит мне её выключить и в ответ я получаю кракозябры вместо текста, включаю - и получаю ответ.

Причина в этом на все 100%. 10 раз проверил. Как это возможно?
0
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
29.11.2015, 23:38  [ТС] 6
Цитата Сообщение от mr_mczakenberg Посмотреть сообщение
Причина в этом на все 100%. 10 раз проверил. Как это возможно?
Сам и отвечу. Благодаря тому, что Анализер еще и страницы декодит в процессе. А без него не декодит и получается каша.
Заменить ("Accept-Encoding","gzip,deflate") на ("Accept-Encoding","")


Спасибо за строчку с проверкой сертификата, SSL.

Топ можно закрывать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2015, 23:38

Авторизация на сайте по средствам POST запроса. Как расшифровать gzip ответ?
Всем привет, кто может мне помочь или кто тоже столкнулся с похожей проблемой! Проще говоря решил...

Авторизация на сайтах через WebBrowser или POST запрос
Здравствуйте, нигде не могу найти адекватное руководство как же залогинится на сайте через...

Авторизация на сайте через post запрос
Всем доброго времени суток. Я новичок в vb net (учусь кодить) недавно мне пришлось работать с post...

Авторизация на сайте через POST запрос и последующая работа с этого аккаунта
Вот допустим я могу авторизироваться на сайте через ПОСТ запрос, а как мне сделать чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru