CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - HttpWebRequest + Response = logowanie do serwera pocztowego
Strona 2 z 2

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: środa, 26 stycznia 2011, 23:01
przez Slynx
Nic, nic, nic... dalej nie akceptuje. Ciągle dostaje w odpowiedzi pusty formularz :/
Nie mam pojęcia co może być nie tak.
KOD cpp:     UKRYJ  
String ^responseData = "";

// Login, hasło, standardowe dane z formularza, wszystko według schematu. Te wartości są stałe. Jedynie był problem z URL, bo ten co wcześniej używaliśmy serwer odsyłał już pod wysłaniu formularza, a ten co dałem tutaj "flg=1", jest przed wysłaniem i zawsze jest taki sam (Przynajmniej przez moje kilkanaście prób).

String^ PostData = "login_username=login&login_password=pass&"
                +"subm=&serwis=nowa_poczta_wp&idu=99&url="
                 +"http://poczta.wp.pl/index.html?flg=1"
                 +"&savessl=0&logowaniessl=1&"
                +"minipoczta=0&tryLogin=1&countTest=1";

                                 try
                                 {
//Zmieniony adres na poprawny, czyli przed przekierowaniem.
                                         HttpWebRequest^ request = dynamic_cast<HttpWebRequest^> (WebRequest::Create("http://poczta.wp.pl"));
//Akceptowane dane. Tu był problem, ale wziąłem dane z Fiddlera. Jeśli serwer wysłał w takim formacie to musi i przyjąć.
                                         request->Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                                 request->AllowAutoRedirect = true;
//Identyfikacja na serwerze chyba bez znaczenia, wziąłem to co Fiddler wyrzucił, czyli Firefoxa
                                         request->UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
                                         request->Timeout= 600000;
                                         request->Method = "POST";
                                         if (request->Method == "POST")
                                         {
// Typ nagłówka przy wysyłaniu. Też dane z Fiddlera.
                                                 request->ContentType = "text/html; charset=iso-8859-2";
                                                 ASCIIEncoding^ encoding = gcnew ASCIIEncoding;
                                                 array<Byte ,1> ^ postByteArray = encoding->GetBytes(PostData);
                                                 request->ContentLength = postByteArray->Length;
                                                 Stream ^postStream = request->GetRequestStream();
                                                 postStream->Write(postByteArray, 0, postByteArray->Length);
                                                 postStream->Close();
                                         }

                                         HttpWebResponse ^response = dynamic_cast<HttpWebResponse^> (request->GetResponse());
                                         if (response->StatusCode == HttpStatusCode::OK)
                                         {
                                                 Stream ^responseStream = response->GetResponseStream();
                                                 StreamReader ^myStreamReader = gcnew StreamReader(responseStream);
                                                 responseData = myStreamReader->ReadToEnd();
                                         }
                                         response->Close();
                                 }
                                 catch (Exception ^e)
                                 {
                                         responseData = "Error:  " + e->Message;
                                 }
                                 richTextBox1->AppendText(responseData);
                         }
 


Wszystko to co najważniejsze wydaje się poprawne, albo o czymś jeszcze nie wiem :/ Nie wiem gdzie robię błąd, a ciężko jest to sprawdzić :/
Jak na razie jadę na debuggerze i szukam gdzie co może być nie tak, ale cienko to widzę...

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: czwartek, 27 stycznia 2011, 02:26
przez Slynx
Pokombinowałem jeszcze trochę tym. Zrobiłem coś podobnego dla gmaila. Wyszukałem trochę informacji. Znalazłem gotowe kody do logowania. Nic. Nic z tego nie działało. Domyślam się, że problem może być gdzie indziej. Nawet ręcznie wpisałem cały strumień (znaki cr +lf) i też nic. Jak na razie to nie mam żadnego pomysłu. Analizowałem to już dziesiątki razy, kodowanie, zapisywanie, ręcznie GET i POST, ale... zauważyłem jedną różnicę między przykładami,a moim kodem. Chodzi o zapis tablic byte i - ważniejsze - użyty string. Mój kod korzysta z NET-owego stringa, a wszystkie inne z std (pisane z małej litery i bez pointera). Nigdy się nie wgłębiałem w tak drobne różnice między tymi dwoma samymi typami, ale dane są przekazywane przez stringi, możliwe by czymś te dwa typy się tak różniły, że dane mogłyby być odczytane inaczej ? To dość dziwne pytanie, ale teraz to i o puste miejsce w kodzie będę się kłócił ; p Jutro spróbuję to samo napisać dla formularza rejestracji. Może problem leży gdzie indziej...:/

Aha, ten kod post wyżej jest trochę błędny, ale nie wiem czemu nie mogę z edytować posta.

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: czwartek, 27 stycznia 2011, 10:19
przez Cyfrowy Baron

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: czwartek, 27 stycznia 2011, 11:33
przez Slynx
Ok, dzięki za info. Podsumowanie ?
Piep**** klasy NET-owe, napisze to w curlu. Jak coś poskładam (najpierw muszę trochę poczytać dokumentację) to dam znać.

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: czwartek, 27 stycznia 2011, 16:07
przez polymorphism
Piep**** klasy NET-owe

Nie pieprzone klasy .NET-owe, tylko żeś to źle napisał :) Na jaki adres wysyłasz posta?

W kodzie formularza masz:
KOD html:     UKRYJ  
<form action="/login_poczta.html" method="post" ...>

czyli POSTa wysyłasz na adres <url formularza>/login_poczta.html. Dla jasności, url-em formularza, w tym konkretnym przypadku, nie jest poczta.wp.pl, tylko adres z przekierowania. Czyli ściągasz formularz i pobierasz aktualny URL. Oczywiście action może zawierać pełny URL - to tak nawiasem.

No i obsługa ciastek jest ważna...

napisze to w curlu.

CUrl nie rozwiąże problemów związanych z brakiem wiedzy na temat protokołu HTTP.

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: czwartek, 27 stycznia 2011, 17:01
przez Slynx
Nie pieprzone klasy .NET-owe, tylko żeś to źle napisał :) Na jaki adres wysyłasz posta?

Nie pieprzone tylko pieprze ; p A to też jest różnica ; p Kompletnie zmienia sens zdania (Ah, ta cenzura ; p)

CUrl nie rozwiąże problemów związanych z brakiem wiedzy na temat protokołu HTTP


Po części tak, po części nie. Pod Curlem sam nad wszystkim panuje, a tu miałem problem ze zrozumieniem co ta klasa tak na prawdę wysyła i czy jak zbuduje własne żądanie i wstawie mu je w strumień, to czy on przypadkiem nie dopisze jeszcze swoich kawałków kodu (żeby nie było np. podwójne POST czy coś w tym stylu). Poza tym, do curla jest chyba więcej przykładów ; p
A po n-te curl działa na bibliotekach std(w tej przestrzeni). Tak samo, jak moje funkcje szyfrujące i generujące CRC32. Pisząc pod NET miałem spory dylemat czy i jak to w ogóle optymalizować (mieszanie klas NET-owych i c++ natywnego), a tak nie będę miał z tym problemu. Co więcej, to na czym najbardziej mi zależało będę mógł zapisać pod asm, bo NET w ogóle nie akceptuje inline asm. Jakby na to nie patrzeć, same plusy. A te które wymagają do działania .NET po prostu dodam do innej klasy.

A brak wiedzy na temat HTTP ? No na pewno trochę tak, czytam, czytam i tak potrafię potem przeoczyć główne elementy ;)

No i obsługa ciastek jest ważna...

Nie jestem pewien czy to będzie konieczne przez cały proces logowania i grzebania w skrzynce. Poprzez httpwebrequest jest chyba opcja utrzymania połączenia (keep-alive), tak by serwer cały czas oczekiwał, więc o ile sesja nie zostanie zerwana to w ogóle cookies nie będą istotne. Ale jak mówię, pewien nie jestem.

I jeszcze coś. Curl umożliwi mi jednolitą obsługę wszystkich funkcji. Http, smtp, imap, pop3, ssl. Wszystko w jednym miejscu i w jednej formie. Zobaczę co i jak. Nawet jeśli to poskładam przy pomocy httpwebrequest to w późniejszym czasie i tak na pewno zostaną te elementy przepisane do curla.

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: niedziela, 30 stycznia 2011, 21:27
przez Darek_C++
Przecież do obsługi poczty w tym wypadku czytania wiadomości nie stosuje się żądań HTTP POST/GET, ale protokół POP3, IMAP i sockety .
Łączysz się z serwerem pop3.wp.pl na porcie 110, logujesz i wysyłając odpowiednie komendy z protokołu pop3 wykonujesz wybrane operacje.

Poniżej przedstawiona jest przykładowa sesja POP3 (z serwerem cucipop), w której klient kolejno:

* podaje identyfikator użytkownika, którego poczta będzie ściągana (polecenie user),
* podaje hasło (polecenie pass),
* prosi o listę wiadomości oczekujących na ściągnięcie (polecenie list),
* ściąga pierwszą (i akurat w tym przypadku ostatnią) z wiadomości (polecenie retr),
* kasuje wiadomość po jej ściągnięciu (polecenie dele),
* kończy sesję (polecenie quit).

http://pl.wikipedia.org/wiki/POP3
http://4programmers.net/Delphi/INDY#id-POP3
itd...

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: poniedziałek, 31 stycznia 2011, 09:45
przez Cyfrowy Baron
Darek_C++ napisał(a):Przecież do obsługi poczty w tym wypadku czytania wiadomości nie stosuje się żądań HTTP POST/GET, ale protokół POP3, IMAP i sockety .


Chcesz powiedzieć, że za pomocą przeglądarki a więc protokołu HTTP nie da się odebrać i wysłać poczty?! :shock:

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: poniedziałek, 31 stycznia 2011, 12:37
przez polymorphism
Chce powiedzieć to, co już zostało przeze mnie powiedziane, że do obsługi poczty są inne, specjalnie do tego celu stworzone protokoły. HTTP nie jest protokołem służącym do obsługi poczty. A to, że możesz sobie w przeglądarce przejrzeć pocztę, czy też ją wysłać, wynika tylko i wyłącznie z tego, że tak została zaprojektowana strona www. Cała obsługa poczty odbywa się po stronie serwera.

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: środa, 2 lutego 2011, 18:11
przez Darek_C++
Cyfrowy Baron napisał(a):Chcesz powiedzieć, że za pomocą przeglądarki a więc protokołu HTTP nie da się odebrać i wysłać poczty?! :shock:
Dokładnie tak za pomocą protokułu HTTP nie odbierzesz poczty z serwera pocztowego. Jedynie co można to " zalogować się" na stronę systemu pocztowego np poczta.wp.pl i parsując kod HTML wyciągnąć jakieś dane nazwijmy to dane emaili. Tak samo wyślesz email, ale tylko dlatego, że pośredniczy w tym interfejs sytemu pocztowego opartego o stronę www. Tylko, że wystarczy zmiana w interfejsie pocztowym bo zamiana w nazwach div, itd i tak skonstruowany program już leży.

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: środa, 2 lutego 2011, 19:33
przez Cyfrowy Baron
Nie zmienia to jednak faktu, że za pomocą protokołu HTTP lub HTTPS łączysz się z tzw. interfejsem webmail. Przeglądarka, która jest tylko programem potrafi połączyć się z tym interfejsem i pobrać lub wysłać e-mail. Takoż więc nic nie stoi na przeszkodzie by napisać program, który będzie działał podobnie jak przeglądarka, czyli połączy się z interfejsem webmail i pobierze lub wyśle wiadomości.
Tylko, że wystarczy zmiana w interfejsie pocztowym bo zamiana w nazwach div, itd i tak skonstruowany program już leży.


Gdyby tak było, to po każdej zmianie w interfejsie webmail przeglądarka musiałaby się zaktualizować by być zgodna z tym interfejsem, jednak tak nie jest, gdyż interfejs webmail jest zawsze zgodny z protokołem HTTP nawet jeżeli zaszły w nim zmiany, to są one zgodne z tym protokołem.

To co piszesz znaczy tylko tyle, że nie da się odebrać lub wysłać poczty za pomocą funkcji GET i POST. Program musi połączyć się z interfejsem webmail i sterować tym właśnie interfejsem.

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: środa, 2 lutego 2011, 19:48
przez Darek_C++
Z całym szacunkiem, ale w tym wypadku CB jesteś w wielkim błędzie.

Logując się na w serwisie pocztowym za pomocą przeglądarki widzimy dokładnie to co przygotował nam wydawca danego systemu pocztowego np poczta.wp.pl i przeglądarka pobiera zawsze aktualny wygląd interfejsu - strony, kodu HTML. Ty co najwyżej możesz przeprasować ten kod w celu wyciągnięcia z niego danych.

Co innego gdyby wydawca systemu pocztowego udostępniał API w HTTP GET, ale nośnikiem danych był by plik oparty o XML jak mamy w RSS'ach, lub XML-RPC.

Do obsługi poczty stworzono protokół POP3 i jego następcę IMAP i SMTP do wysyłania wiadomości do serwera pocztowego które nie maja nic wspólnego z protokołem HTTP przy którym tak się upierasz ;)

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: czwartek, 3 lutego 2011, 09:29
przez Cyfrowy Baron
Interfejs webmail nie jest programem lecz skryptem obsługiwanym przez przeglądarkę. Po stronie użytkownika przeglądarka przetwarza ten skrypt i wysyła konkretne polecenia do serwera. Interfejs graficzny nie jest konieczny do realizacji zadań przez programu, gdyż wszystko ogranicza się do wymiany informacji między klientem a serwerem. Wystarczy więc napisać program, który wcale nie musi ładować interfejsu graficznego, wystarczy, że załaduje i przetworzy skrypt webmail, a następnie prześle i odbierze dane do/od serwera.
Ty widzisz webmail jako interfejs graficzny i wchodzisz z założenia, że do odebrania poczty za pomocą przeglądarki, trzeba klikać na przyciski. Ja natomiast widzę skrypt, który do działania nie potrzebuje interfejsu graficznego, który służy jedynie ułatwieniu komunikacji klienta z serwerem.
Poczta jest obsługiwana przez protokoły SMTP i POP3, ale w przypadku przeglądarki odbywa się to tak: przeglądarka -> HTTP -> webmail -> serwer -> SMTP & POP3

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postNapisane: poniedziałek, 21 marca 2011, 15:42
przez Slynx
Tak w ramach uaktualnienia - już wszystko ogarnąłem. Mam piękne logowanie do strony przez http, kreator kont, przeglądanie, odbieranie i wysyłanie maili. Wszystko działa idealnie i jednak zrobione na .NET, bo jak pisałem w innym temacie - nie udało mi się ponownie "uruchomić" bibliotek curla w projekcie. Przeszedłem na klasy NET-owe i poszło błyskawicznie. Teraz jak to czytam to aż wstyd, że takie głupie pytania zadawałem :D Ale i tak dzięki za cierpliwość, zwłaszcza dla polymorphism.