Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

HttpWebRequest - Logowanie na MPCForum


Gość Pan Szymek

Rekomendowane odpowiedzi

Opublikowano

Ten poradnik piszę z myślą o ludziach, którzy znają podstawy działania protokołu HTTP oraz C#, jak i posiadają program Charles.

 

Na początek odpalamy Charlesa i przeglądarkę, a następnie przechodzimy na mpcforum.pl (jeżeli nic nie pokazało się w Charlesie ustaw proxy 127.0.0.1:8888). Teraz w przeglądarce wciskamy Logowanie i wpisujemy nasze dane. Teraz w Charlesie szukamy w drzewku od mpcforum.pl linku, na który wysyłamy dane POST.

kwmd.png

Przechodzimy do zakładki Request i wybieramy Raw z dolnych zakładek. Jak widzimy wysyłane są takie dane:

auth_key=880ea6a14ea49e853634fbdc5015a024&referer=http%3A%2F%2Fwww.mpcforum.pl%2F&ips_username=loginZMPC&ips_password=hasłoZMPC&rememberMe=1
W danych umieszczony jest auth_key, który zmienia się za każdym razem, zatem będziemy musieli go pobrać przed logowaniem (jeżeli chcesz go zobaczyć ręcznie to przejdź do kodu źródłowego przed zalogowaniem MPCForum, wciśnij CTRL+F i wpisz "auth_key").

 

Przejdźmy więc do kodu, na początek wykonamy GET (nie wysyłamy danych), aby pobrać kod źródłowy forum.

string authKey; //posłuży nam do przechowania auth_key
            var request = System.Net.WebRequest.Create("http://mpcforum.pl") as System.Net.HttpWebRequest;
                //tworzymy nowy obiekt typu WebRequest i rzutujemy go na HttpWebRequest, metoda Create przyjmuje jako parametr adres strony
            request.Method = "GET"; //nie wysylamy danych
            var ciastka = new System.Net.CookieContainer(); //tworzymy nasz pojemnik na ciastka
            request.CookieContainer = ciastka;
            using (var response = request.GetResponse() as System.Net.HttpWebResponse)
                //rozpoczynamy "pobieranie" odpowiedzi i rzutujemy ją z WebResponse na HttpWebResponse
            {
                ciastka.Add(response.Cookies); //dodajemy do pojemnika ciastka z nagłówka Set-Cookie
                using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
                    //otwieramy strumień, w którym czytamy odpowiedź
                {
                    string kodStrony = sr.ReadToEnd();
                    System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(kodStrony,
                                                                                                            "<input type='hidden' name='auth_key' value='(.*?)' />");
                    if (!match.Success) //nie znaleźliśmy
                        return;
                    authKey = match.Groups[1].Value;
                }
            }
Skoro mamy już auth_key możemy zalogować się na forum
request =
                System.Net.WebRequest.Create(
                    "http://www.mpcforum.pl/index.php?app=core&module=global&section=login&do=process") as
                HttpWebRequest; //url uzyskaliśmy dzięki charlesowi
            request.Method = "POST"; //tym razem wysyłamy dane
            request.ContentType = "application/x-www-form-urlencoded"; //dane jakiego rodzaju wysyłamy
            request.CookieContainer = ciastka;
            using (var stream = request.GetRequestStream()) //strumień pozwoli nam na wpisanie danych
            {
                byte[] buffer =
                    Encoding.UTF8.GetBytes(
                        string.Format(
                            "auth_key={0}&referer=http%3A%2F%2Fwww.mpcforum.pl%2F&ips_username={1}&ips_password={2}&rememberMe=1",
                            authKey, "login", "hasło")); //w stream dane wysyłamy w postaci bajtów
                stream.Write(buffer, 0, buffer.Length); //wysyłamy cała tablicę
            }
            using (var response = request.GetResponse() as HttpWebResponse)
            {
                ciastka.Add(response.Cookies);
                using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    string kodStrony = sr.ReadToEnd();
                    //teraz możemy sprawdzić, czy logowanie przebiegło prawidłowe itd.
                }
            }
I to już wszystko czego potrzebujesz, aby wykonać podstawowe operacje.

 

 

Cały kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string authKey; //posłuży nam do przechowania auth_key
            var request = System.Net.WebRequest.Create("http://mpcforum.pl") as System.Net.HttpWebRequest;
            //tworzymy nowy obiekt typu WebRequest i rzutujemy go na HttpWebRequest, metoda Create przyjmuje jako parametr adres strony
            request.Method = "GET"; //nie wysylamy danych
            var ciastka = new System.Net.CookieContainer(); //tworzymy nasz pojemnik na ciastka
            request.CookieContainer = ciastka;
            using (var response = request.GetResponse() as System.Net.HttpWebResponse)
                //rozpoczynamy "pobieranie" odpowiedzi i rzutujemy ją z WebResponse na HttpWebResponse
            {
                ciastka.Add(response.Cookies); //dodajemy do pojemnika ciastka z nagłówka Set-Cookie
                using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
                    //otwieramy strumień, w którym czytamy odpowiedź
                {
                    string kodStrony = sr.ReadToEnd();
                    System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(kodStrony,
                                                                                                            "<input type='hidden' name='auth_key' value='(.*?)' />");
                    if (!match.Success) //nie znaleźliśmy
                        return;
                    authKey = match.Groups[1].Value;
                }
            }
            request =
                System.Net.WebRequest.Create(
                    "http://www.mpcforum.pl/index.php?app=core&module=global&section=login&do=process") as
                HttpWebRequest; //url uzyskaliśmy dzięki charlesowi
            request.Method = "POST"; //tym razem wysyłamy dane
            request.ContentType = "application/x-www-form-urlencoded"; //dane jakiego rodzaju wysyłamy
            request.CookieContainer = ciastka;
            using (var stream = request.GetRequestStream()) //strumień pozwoli nam na wpisanie danych
            {
                byte[] buffer =
                    Encoding.UTF8.GetBytes(
                        string.Format(
                            "auth_key={0}&referer=http%3A%2F%2Fwww.mpcforum.pl%2F&ips_username={1}&ips_password={2}&rememberMe=1",
                            authKey, "login", "hasło")); //w stream dane wysyłamy w postaci bajtów
                stream.Write(buffer, 0, buffer.Length); //wysyłamy cała tablicę
            }
            using (var response = request.GetResponse() as HttpWebResponse)
            {
                ciastka.Add(response.Cookies);
                using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    string kodStrony = sr.ReadToEnd();
                    //teraz możemy sprawdzić, czy logowanie przebiegło prawidłowe itd.
                }
            }
        }
    }
}
Opublikowano

Kompletnie nie rozumiem tego kodu

 

System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(kodStrony,
"<input type='hidden' name='auth_key' value='(.*?)' />");
 

Co mogę wyszukać poprzez użycie czegoś takiego? Dlaczego w value jest '(.*?)' , Czy program szuka takich znaczków i zwraca nam to co stoi w tym miejscu?

 

Mam ten pierwszy kod na otrzymywanie danych, próbuję to zrobić na stronie gladiatus.pl.

 

                    System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(kodStrony,
                                                              "<a class='pngfix'style='cursor:pointer;' href='(.*?)'>Strona Domowa</a>");
 

Wsadziłem to coś w nawiasach do href z myślą, że zwróci mi coś co jest tam zapisane, jednak nic nie zwróciło, w tym kodzie zmieniałem liczby auth = match.Groups[1].Value; ,lecz to też nic nie dało

Jedyny działający bot do Gladiatusa 2015!!!

https://www.facebook.com/Gbot.vertek

Opublikowano

Vertek, dnia 09 Marz 2013 - 12:32, napisał:

Kompletnie nie rozumiem tego kodu

 

 


System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(kodStrony,
"<input type='hidden' name='auth_key' value='(.*?)' />");
Co mogę wyszukać poprzez użycie czegoś takiego? Dlaczego w value jest '(.*?)' , Czy program szuka takich znaczków i zwraca nam to co stoi w tym miejscu?

 

Mam ten pierwszy kod na otrzymywanie danych, próbuję to zrobić na stronie gladiatus.pl.


				    System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(kodStrony,
															  "<a class='pngfix'style='cursor:pointer;' href='(.*?)'>Strona Domowa</a>");
Wsadziłem to coś w nawiasach do href z myślą, że zwróci mi coś co jest tam zapisane, jednak nic nie zwróciło, w tym kodzie zmieniałem liczby auth = match.Groups[1].Value; ,lecz to też nic nie dało

 

http://pl.wikipedia.org/wiki/Wyrażenia_regularne
Zwróć uwagę, że cudzysłów w przeglądarce może być apostrofem przy czytaniu response.
Opublikowano

Zwróciłem, lecz nadal nie odpowiedziałeś mi na resztę pytań

 

@Edit

 

Utknąłem w pewnym momencie. Zrobiłem logowanie do gry, chyba działa bo nie wyskakuje żaden błąd ale chciałbym sprawdzić czy rzeczywiście loguje, chcę pobrać element, który występuje tylko po zalogowaniu " <a href="index.php?mod=settings&sh=f3ff3c88a5f0bcce1934ac4f72c38c57">Profil</a> " coś takiego, chcę z tego kodu pobrać sh, które jest za każdym razem inne, więc w miejscie f3ff3c88a5f0bcce1934ac4f72c38c57 wstawiam twoje wyrażenie regularne (.*?) Na stronie jest opisane *? jako Dopasowania poprzedniego elementu, zero lub więcej razy, ale jak kilka razy możliwie. Lecz nie bardzo wiem do czego ma go dopasować skoro chcę go pierwszy raz pobrać. Mógłbyś mi jeszcze powiedzieć dlaczego w nawiasie stoi kropka? Nie mogę tego znaleźć i nie wiem co ona oznacza

 

Możesz wytłumaczyć dokładnie te regex.match? Nie bardzo je rozumiem przez co nie mogę znaleźć tego sh :/

 

@edit

 

Te regex.match ma porównać wpisany kod do kodu strony, którą pobieram? Jeżeli w tym kodzie strony znajdzie mi mój kod, którego szukam to wtedy działa?

Jedyny działający bot do Gladiatusa 2015!!!

https://www.facebook.com/Gbot.vertek

  • 2 lata później...
Opublikowano

Poradnik nadal aktualny?

Przy debugowaniu wywala mi błąd:

 

 

e0cf672887.png

 

 

 

e307af6485.png

Serwer zwraca 520 Origin Error, zamiast 200 OK.

  • 3 tygodnie później...
  • 4 tygodnie później...
Opublikowano

Możliwe?? @Miszczu nie udzielił odpowiedzi na pytanie @d'emploi, tylko napisał, co mu zwraca serwer. Pytanie było, czy poradnik aktualny? Jeśli tak, to proszę o wytłumaczenie, na czym polega błąd, dlaczego tak się dzieje i co zrobić, by to działało poprawnie, bo jeśli się daje komuś cały kod tak jak podaje @Miszczu w pierwszym poście tego tematu, to użytkownicy oczekują, że będzie on spełniał swoje zadanie, a nie zwracał jakieś śmieszne errory, w przeciwnym wypadku, ten temat nie powinien mieć w nazwie "[TUT]"!!!! Pozdrawiam całą Elite i programistów MPC (Forum dla gimbazjanów).

Opublikowano

Możliwe?? @Miszczu nie udzielił odpowiedzi na pytanie @d'emploi, tylko napisał, co mu zwraca serwer. Pytanie było, czy poradnik aktualny? Jeśli tak, to proszę o wytłumaczenie, na czym polega błąd, dlaczego tak się dzieje i co zrobić, by to działało poprawnie, bo jeśli się daje komuś cały kod tak jak podaje @Miszczu w pierwszym poście tego tematu, to użytkownicy oczekują, że będzie on spełniał swoje zadanie, a nie zwracał jakieś śmieszne errory, w przeciwnym wypadku, ten temat nie powinien mieć w nazwie "[TUT]"!!!! Pozdrawiam całą Elite i programistów MPC (Forum dla gimbazjanów).

Poradnik zawsze będzie aktualny, po odpowiednich 'modyfikacjach' możesz go zastosować na każdej stronie.

Jeśli Ci nie działa to pewnie przez cloudflare http://prntscr.com/8bxag5(dokładnie nie wiem jak on działa.. cookiesy? ip?)

Opublikowano

@eXnR OFTOP ja jedynie oczekuję prawdy i dobrych Tutoriali od członków "ELITY", skoro oni tego samego oczekują od zwykłych użytkowników tego gimbazjańskiego Forum. Powinieneś od nich dostać teraz warna, a ode mnie masz Like, za to, że uważasz mnie za śmiesznego człowieka ;)

Opublikowano

@eXnR OFTOP ja jedynie oczekuję prawdy i dobrych Tutoriali od członków "ELITY", skoro oni tego samego oczekują od zwykłych użytkowników tego gimbazjańskiego Forum. Powinieneś od nich dostać teraz warna, a ode mnie masz Like, za to, że uważasz mnie za śmiesznego człowieka ;)

Nie będzie działać na każdej stronie bez modyfikacji, bo nie wszystkie mają identyczną budowę. Dodatkowo ten poradnik powstał ponad 2 lata temu, czyli gdy miałem membera lub kidmoda.

Zapodam tutaj słynną odpowiedź ze stacka na temat parsowania HTML używając wyrażeń regularnych :D

http://stackoverflow.com/a/1732454/1184953

Ogólnie rzadko używam wyrażeń regularnych, ale w tym wypadku poszukiwana wartość jest stała (do czasu zmian w szablonie), więc to nic złego.
Opublikowano

@eXnR OFTOP ja jedynie oczekuję prawdy i dobrych Tutoriali od członków "ELITY", skoro oni tego samego oczekują od zwykłych użytkowników tego gimbazjańskiego Forum. Powinieneś od nich dostać teraz warna, a ode mnie masz Like, za to, że uważasz mnie za śmiesznego człowieka ;)

Elita to ranga dla osób, które zrobiły coś dla forum w przeszłości. Nie zobowiązuje do NICZEGO.

W takim razie odpowiem Ci na pytanie: nie da się tego naprawić, 520 to błąd serwera, nie klienta. to błąd zwracany przez CloudFlare w przypadku złych headerów, rozwiązanie:

request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0";

Ważny jest UserAgent, Accept jest tak "for completeness"

Skończ proszę się kompromitować. Jesteś nikim.

  •  carbonx zmienił(a) tytuł na HttpWebRequest - Logowanie na MPCForum

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...