x-kom hosting

[C#] Program umożliwiający logowanie się na stronie

wuldemar95
utworzono
utworzono (edytowane)

Witam! 

Chciałbym napisać program, który posiadając trzy kontrolki (przykładowo dwa textboxy - login i hasło i jednego buttona), umożliwia logowanie się na konkretnej stronie, przez wysłanie danych z textboxa login i textboxa haslo na tę stronę. (Przykładowo na pocztę, forum, fb)

Nie mam jednak pojęcia od czego zacząć. Mam za sobą mały edytor tekstu i inne mniejsze programy zaliczeniowe do technikum ale chyba nic co w nich wykorzystywałem nie przyda mi się do stworzenia tego programu.

Znalazłem kilka "gotowców" jak to zrobić, jednak nic z nich nie rozumiem (jedynie tyle że wysyłanie danych odbywa się dzięki metodzie POST lub/i GET), i żaden po przerobieniu na moje potrzeby (czyli bez porad specjalistów, jedynie moje domysły) nie działa. Zero reakcji na buttona. 

Chciałbym wiedzieć jak napisać taki program i umieć wytłumaczyć co robi dana linijka kodu.

Prosił bym o kilka podpowiedzi od czego zacząć, co powinienem wiedzieć, co mi jest potrzebne, co być musi a co niekoniecznie.

EDIT:

Znalazłem kod, który wygląda na przyzwoity:

 

//GET
                CookieContainer cookies = new CookieContainer();

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://strona.pl/logowanie.php");
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
                request.Method = "GET";
                request.CookieContainer = cookies;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                response.Close();

                //POST
                request = (HttpWebRequest)HttpWebRequest.Create("http://strona.pl/logowanie.php");
                request.Method = "POST";
                request.CookieContainer = cookies;
                string login = "login";
                string password = "haslo";
                string loginData = String.Format("_action={0}&url={1}&idu={2}&serwis={3}&enticket={4}&othk={5}&login_username={6}&login_password={7}&countTest={8}",
                             "login", "%2F", "100", "wp.pl", "", "0", login, password, "1");
                request.ContentType = "application/x-www-form-urlencoded";
                byte[] loginDataBytes = Encoding.ASCII.GetBytes(loginData);
                Stream postData = request.GetRequestStream();
                postData.Write(loginDataBytes, 0, loginDataBytes.Length);
                postData.Close();
                response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                webBrowser1.DocumentText = (new StreamReader(stream, Encoding.GetEncoding("iso-8859-2"))).ReadToEnd();
                stream.Close(); 
                response.Close();

Jednak wywala mi błąd do linijki:
 

webBrowser1.DocumentText = (new StreamReader(stream, Encoding.GetEncoding("iso-8859-2"))).ReadToEnd();

A konkretnie do webBrowser1.
Błąd:  
"Error 1 The name 'webBrowser1' does not exist in the current context"

Czym jest ta nazwa? To może być jakaś kontrolka w jego programie? Skopiowałem wszystko, dokładnie tak jak podawane było w poradniku (zmieniłem naturalnie stronę, login i haslo) i wywala mi błąd. Myślałem, że nie mam przestrzeni nazw, ale nic na ten tema nie znalazłem, oprócz tego, że klasa WebBrowser znajduje się w przestrzeni System.Windows.Forms której akurat używam.

rafalluz
komentarz
komentarz

Kontrolka WebBrowser z Windows Forms, należy dodać na formatkę w designerze.

  • Dobra wypowiedź 1
wuldemar95
komentarz
komentarz (edytowane)

Dziękuje, problem zniknął ale pojawił się następny.

Gdy naciskam buttona, który ma wysyłać login i hasło na stronę crashuje mi program i podświetla się linijka:
 

 HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Za co ona odpowiada, i co ewentualnie powinienem zmienić aby wyeliminować ten problem?

EDIT:
Z tego co zrozumiałem, linijka ta tworzy obiekt, który przechowuje odpowiedzi ze strony.

rafalluz
komentarz
komentarz

Co to znaczy "crashuje"? Masz wyjątek? Czy pustą odpowiedź?

rokko
komentarz
komentarz (edytowane)

Podaj treść błędu ze środowiska IDE wtedy będzie można konkretnie doradzić, teraz to jak szukanie igły w stogu siana. Ewentualnie załącz do wiadomości projekt to wtedy każdy będzie mógł go uruchomić i sprawdzić w czym rzecz.

wuldemar95
komentarz
komentarz (edytowane)

Podaj treść błędu ze środowiska IDE wtedy będzie można konkretnie doradzić, teraz to jak szukanie igły w stogu siana. Ewentualnie załącz do wiadomości projekt to wtedy każdy będzie mógł go uruchomić i sprawdzić w czym rzecz.

 

System.Net.WebException

"The remote server returned an error: (404) Not Found."

rokko
komentarz
komentarz

No to wiemy już wszystko.
Kwestia obsługi błedów.
Kod należy objąć w
try {} catch {} i przechwycić błąd WebException.

  • Dobra wypowiedź 1
wuldemar95
komentarz
komentarz (edytowane)

Co konkretnie mam wrzucić w try, bo jeśli wrzucając tylko tę linijkę wywołuje masę errorów. Każdy wszędzie tam, gdzie pojawiło się response. Tak jak by response nie było zdefiniowane. 
I co w catch dać.

rafalluz
komentarz
komentarz (edytowane)

Albo sprawdzić, czy URL podany w WebRequest jest poprawny. Jeśli na chamca przekopiowałeś strona.pl/logowanie.php, to nie jest.

 

Czy należy objąć try/catch, zależy, czy user wprowadza adres strony. Jeśli wprowadza, należy objąć cały blok pracujący na odpowiedzi w try i w catchu dać znać o błędzie, gdy wyjątek wystąpi, bo user może walnąć literówkę i tak się zdarza. W finally należy czyścić zasoby zajęte podczas operacji.

 

Alternatywnie (lepiej) użyć składni using() dla HttpWebResponse i StreamReadera, bo wtedy na pewno zasoby zwolnią się poprawnie. Nadal jednak trzeba zrobić try/catch, tylko tym razem bez finally.

 

Jeżeli adres jest zakodowany na stałe, to należy po prostu go poprawić.

rokko
komentarz
komentarz (edytowane)

Jak dodasz samo catch przechwycisz wszystkie błędy, jak chcesz konkretny wyjątek obsłużyć dodać trzeba catch (nazwawyjątku zmienna) {instrukcja}

Możesz nic nie dodawać, możesz również wyświetlić userowi komunikat (messagebox), możesz też zapisać info do pliku log.txt, możesz zrobić coś innego, co? Wszystko zależy od developera aplikacji czyli od Ciebie ;)

wuldemar95
komentarz
komentarz

Czyli adres nie jest poprawny, bo przekopiowany na "chamca". W takim razie, skąd mogę wziąć poprawny adres np. aby zalogować się na gmaila?

rafalluz
komentarz
komentarz

Na gmaila powinno zadziałać gmail.com, a serwer z automatu zrobi przekierowanie na stronę logowania.

rokko
komentarz
komentarz

https://accounts.google.com/ServiceLoginAuth
wuldemar95
komentarz
komentarz
https://accounts.google.com/ServiceLoginAuth

To znaczy nie konkretnie o gmaila mi chodziło. To był tylko przykład xd. Miałem nadzieje, że podpowiecie mi jak znaleźć taki adres dla obojętnie jakiej strony

rokko
komentarz
komentarz

wuldemar95, jeśli budujesz bota to zwykle pod konkretny serwis, gdzie znasz doskonale adres logowania, oczywiście można robić patterny pod auto-odszukiwanie linków do stron logowania/rejestracji aczkolwiek tam także musisz mieć zestaw informacji, które wykorzystasz w procesie eksploracji.

rafalluz
komentarz
komentarz

To znaczy nie konkretnie o gmaila mi chodziło. To był tylko przykład xd. Miałem nadzieje, że podpowiecie mi jak znaleźć taki adres dla obojętnie jakiej strony

 

Nie ma czegoś takiego.

 

Możesz wejść na stronę główną, przejrzeć wszystkie linki zawarte wgłąb i sprawdzić, który zawiera formularz logowania. Ale wg mnie to strata czasu. Lepiej ustalić odgórnie serwisy do logowania i znaleźć odpowiednią stronę ręcznie. Bo co ci po automatycznym logowaniu do x stron? I tak z odpowiedzią będziesz robił coś innego zależnie od serwisu...

wuldemar95
komentarz
komentarz (edytowane)

Nie robię bota. Muszę zrobić mały programik na zaliczenie do szkoły. 
Chcę się dowiedzieć skąd wziąć adres, ponieważ ten przekopiowany na "chamca" nie działa. 
Strona to 
moodle.ezst-tarnow.pl 

 

Skąd mam wziąć link, przy którym nie będzie wywalało błędu.
I jeszcze jedno. 

Jest możliwość, aby po wprowadzeniu loginu i hasła strona (już po zalogowaniu) wyświetlała się w przeglądarce, a nie w kontrolce webBrowser?
Jeśli tak to w jaki sposób mogę to zrobić?
 

EDIT:

Link odpowiedni znalazłem, błędu nie wywala, do webBrowsera zostaje wczytana strona ale strona logowania, a nie ta, która powinna się wyświetlić już po zalogowaniu.
Co może być tego przyczyną? 

I nadal proszę o rady, jak zrobić aby strona ta otwierała się nie w programie ale w przeglądarce (np. ustawionej na danym komputerze jako domyślna)

rokko
komentarz
komentarz (edytowane)
http://www.moodle.ezst-tarnow.pl/login/index.php

Strona logowania do użycia przez kontrolkę WebBrowser.

 

 

Jest możliwość, aby po wprowadzeniu loginu i hasła strona (już po zalogowaniu) wyświetlała się w przeglądarce, a nie w kontrolce webBrowser?

 

Nie próbowalem przenosić wykonania bo to jest zbędne przy tworzeniu botów. Tam najlepiej jak wszystko wykonywane jest w tle.

Przy użyciu zewnętrznych frameworków pewnie da się. Trzeba by posprawdzać możliwości poszczególnych jak WatIn, choć on  nie współpracuje z najnowszymi przeglądarkami.

http://watin.org/

EDIT:

 

Co może być tego przyczyną?

Trzeba by dokładnie prześledzić wykonanie i zobaczyć co dokładnie serwer zwraca, użyć sniffera na aplikacji, zrobić normalnie logowanie choćby na Firefox i sprawdzić nagłówki wysyłane i odbierane, później odnieść to do napisanej aplikacji. Ze snifferów ja osobiście do diagnozowania poprawności botów używam Fiddlera, prosty i dobry, wspiera wtyczki.

rafalluz
komentarz
komentarz

http://www.moodle.ezst-tarnow.pl/login/index.php

 

Jest możliwość, aby po wprowadzeniu loginu i hasła strona (już po zalogowaniu) wyświetlała się w przeglądarce, a nie w kontrolce webBrowser?
Jeśli tak to w jaki sposób mogę to zrobić?

 

Co dokładnie masz na myśli? De facto kontrolka webBrowser JEST przeglądarką, opartą na silniku zintegrowanego w systemie IE. I dlatego też jeśli używasz kontrolki możesz logować się na stronę BEZ układania ręcznie WebRequest i WebResponse - tamto jest potrzebne, gdy nie chcesz wizualnie się logować, a mimo to pobrać dane wymagające logowania.

wuldemar95
komentarz
komentarz

Tymczasowo nie mam czasu zajmować się tym programem, ale w przyszłości z pewnością do niego powrócę, dlatego tematu nie zamykam.

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.