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

Узнай цену своей работы

Формулировка задачи:

Миллион тем было, миллион тем будет. Ниже процедура и 2 вызова. для LDS - работает, для Life - получаю в response - 403 Forbidden. Из-за id_msisdn_code (063/073/093) POST-запрос меняется, но как меняется? И какие параметры брать для передачи, которые подписаны name? (msisdn и super_password соответственно) Есть у кого-то предложения по этому поводу?
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(работает):
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(не работает):
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 вызова(урезан до нужной части).
<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 вызова(урезан до нужной части):
  <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 вызов): 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>
============================================================================ Финал: 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=(direct)|utmcmd=(none) Вопросы по ходу дела меняются: Как симитировать Куки или где они получаются?
Ну и финал этого всего: Получил куки с помощью этого:
   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. Сдаюсь и надеюсь на помощь форума.
Жаль, наверное, слишком много букаф

Решение задачи: «Авторизация на сайте. POST - запрос»

textual
Листинг программы
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");
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы