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

HttpWebRequest + Response = logowanie do serwera pocztowego

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Slynx » środa, 26 stycznia 2011, 23:01

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ę...
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Slynx » czwartek, 27 stycznia 2011, 02:26

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.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Cyfrowy Baron » czwartek, 27 stycznia 2011, 10:19


Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Slynx
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Slynx » czwartek, 27 stycznia 2011, 11:33

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ć.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez polymorphism » czwartek, 27 stycznia 2011, 16:07

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Slynx » czwartek, 27 stycznia 2011, 17:01

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.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Darek_C++ » niedziela, 30 stycznia 2011, 21:27

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...
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Cyfrowy Baron » poniedziałek, 31 stycznia 2011, 09:45

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:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez polymorphism » poniedziałek, 31 stycznia 2011, 12:37

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Darek_C++ » środa, 2 lutego 2011, 18:11

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.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Cyfrowy Baron » środa, 2 lutego 2011, 19:33

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Darek_C++ » środa, 2 lutego 2011, 19:48

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 ;)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Cyfrowy Baron » czwartek, 3 lutego 2011, 09:29

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
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: HttpWebRequest + Response = logowanie do serwera pocztowego

Nowy postprzez Slynx » poniedziałek, 21 marca 2011, 15:42

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.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Firefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości

cron