wuldemar95 utworzono 18 kwietnia 2014 utworzono 18 kwietnia 2014 (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 18 kwietnia 2014 komentarz 18 kwietnia 2014 Kontrolka WebBrowser z Windows Forms, należy dodać na formatkę w designerze. 1
wuldemar95 komentarz 18 kwietnia 2014 Autor komentarz 18 kwietnia 2014 (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 19 kwietnia 2014 komentarz 19 kwietnia 2014 Co to znaczy "crashuje"? Masz wyjątek? Czy pustą odpowiedź?
rokko komentarz 19 kwietnia 2014 komentarz 19 kwietnia 2014 (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 19 kwietnia 2014 Autor komentarz 19 kwietnia 2014 (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 19 kwietnia 2014 komentarz 19 kwietnia 2014 No to wiemy już wszystko. Kwestia obsługi błedów. Kod należy objąć w try {} catch {} i przechwycić błąd WebException. 1
wuldemar95 komentarz 19 kwietnia 2014 Autor komentarz 19 kwietnia 2014 (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 19 kwietnia 2014 komentarz 19 kwietnia 2014 (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 19 kwietnia 2014 komentarz 19 kwietnia 2014 (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 19 kwietnia 2014 Autor komentarz 19 kwietnia 2014 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 19 kwietnia 2014 komentarz 19 kwietnia 2014 Na gmaila powinno zadziałać gmail.com, a serwer z automatu zrobi przekierowanie na stronę logowania.
rokko komentarz 19 kwietnia 2014 komentarz 19 kwietnia 2014 https://accounts.google.com/ServiceLoginAuth
wuldemar95 komentarz 19 kwietnia 2014 Autor komentarz 19 kwietnia 2014 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 19 kwietnia 2014 komentarz 19 kwietnia 2014 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 19 kwietnia 2014 komentarz 19 kwietnia 2014 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 19 kwietnia 2014 Autor komentarz 19 kwietnia 2014 (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 19 kwietnia 2014 komentarz 19 kwietnia 2014 (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 19 kwietnia 2014 komentarz 19 kwietnia 2014 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 24 kwietnia 2014 Autor komentarz 24 kwietnia 2014 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.