Logowanie do stron przeprowadza się na ogół przy użyciu metody POST. Jakie dane wysyłane są tą metodą do serwera można podejrzeć jeżeli połączenie nie jest szyfrowane pod snifferami, ja polecam dość prosty WireShark (jak go używać pokazują tutoriale na YT). Poniżej przykład jak logować się na naszą klasę. Funkcja HttpAction przerobiona na podstawie kodu, który kiedyś zasugerował mi Misiekd. Funkcja SimpleParse jest również jego autorstwa i wyciąga z kodu strony pewne dane. Oczywiście logowanie na wiele stron jest indywidualne, najlepiej WireSharkiem wcześniej trzeba prześledzić co jest i pod jaki adres wysyłane. Jeżeli po wysyłaniu metodą POST w zmiennej Document nic nie ma (ma ona rozmiar 0) to znaczy że są jeszcze jakieś dodatkowe przekierowania, które trzeba obsłuzyć. Czasami, jak w przypadku FaceBooka, aby się zalogowac trzeba odwiedzić wcześnej metodą GET stronę główną aby uzyskać odpowiednie ciasteczka. Większośc zmiennych użytych tutajk jak FPage czy FUrl są oczywiście typu string i zadeklarowano je w sekcji public formatki głownej, jak i wspomniane funkcje. Natomiast SynHttp to obiekt typu THttpSend z modułu httpsend, który jest oczywiście kiedy trzeba tworzony, a kiedy już niepotrzebny zwalniany. Mam nadzieję, że kod poniższy coś Tobie podpowie. Często logowanie do wielu serwisów to tylko kwestia odpowiedniego wysłania metodą POST danych podstawionych w zmiennej typu string. Nie trzeba do tego tworzyć osobnej funkcji jak tutaj, ale czasami jak schemat się powtarza do kilku zadan to można tak sobie ułatwić. Czasami taka funkcja nie przydaje się, bo trzeba zrobić na przykład po POST, kolejny POST na inną stronę. A i jakbyś stwierdzil, że masz w zwróconym kodzie informacje o BAD REQUEST albo coś w tym stylu, to na ogół pomaga na to czyszczenie nagłowków przez Headers.Clear, tak jak widać w poniższym kodzie, bo inaczej nie chce działać. Oczywiście poniższy kod to tylko pewien fragment pewnego programu. Podaje w celach edukacyjncyh żeby Ciebie naprowadzić jak można się logować na stronę.
//...
type
THttpAction = (acGet, acPost);
//...
const
Redir_C = 'Location: ';
Referer_C = 'Referer: ';
Base_Url = 'http://nk.pl/';
Default_MimeType = 'application/x-www-form-urlencoded';
Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.7.62 Version/11.01';
//...
function SimpleParse(StrBegin, StrEnd, Str : string) : string;
var
B, E : integer;
begin
Result := '';
if StrBegin = '' then
begin
B := 1;
end
else
begin
B := Pos(StrBegin, Str);
end;
if B > 0 then
begin
Str := Copy(Str, B + Length(StrBegin), MaxInt);
if StrEnd = '' then
begin
E := Length(Str) + 1;
end
else
begin
E := Pos(StrEnd, Str);
end;
if E > 0 then
begin
Result := Copy(Str, 1, E - 1);
end;
end;
end;
//...
procedure TMainForm.HttpAction(WhatAction : THttpAction; Encode, InsertHeader : boolean);
var
I, RedirPos : integer;
Action, RedirUrl : string;
begin
case WhatAction of
acGet : Action := 'GET';
acPost : Action := 'POST';
end;
with SynHttp do
begin
Headers.Clear;
Document.Clear;
KeepAlive := True;
Protocol := '1.1';
if InsertHeader = True then
begin
Headers.Insert(0, Referer_C + FRefererUrl);
end;
MimeType := Default_MimeType;
UserAgent := Opera_UserAgent;
Document.Write(PChar(FStrData)^, Length(FStrData));
if HTTPMethod(Action, FUrl) = True then
begin
while (ResultCode = 301) or (ResultCode = 302) do
begin
for I := 0 to Headers.Count - 1 do
begin
RedirPos := Pos(Redir_C, Headers[I]);
if RedirPos > 0 then
begin
RedirUrl := Copy(Headers[I], RedirPos + Length(Redir_C), MaxInt);
if Pos('http://', RedirUrl) <> 1 then
begin
RedirUrl := Base_Url + RedirUrl;
end;
Headers.Clear;
if HTTPMethod(Action, RedirUrl) = False then
begin
Exit;
end;
Break;
end;
end;
end;
SetLength(FPage, Document.Size);
Document.Read(PChar(FPage)^, Document.Size);
if Encode = True then
begin
FPage := UTF8ToAnsi(FPage);
end;
end;
end;
end;
//...
function TMainForm.LogonToNK(Login, Password : string) : boolean;
const
ErrorText1 = 'Nieprawidłowa nazwa użytkownika lub hasło.';
begin
Result := False;
Screen.Cursor := crHourGlass;
SynHttp.Cookies.Clear;
FUrl := Base_Url + 'login';
FStrData := 'login=' + Login + '&password=' + Password + '&manual=1';
HttpAction(acPost, True, False);
if Pos(ErrorText1, FPage) > 0 then
begin
AlreadyLogged := Result;
SetFocusToEditFields;
MessageBox(Application.Handle, PChar(ErrorText1),
PChar(Application.Title), MB_ICONERROR + MB_OK);
Exit;
end;
if SynHttp.ResultCode = 503 then
begin
AlreadyLogged := Result;
SetFocusToEditFields;
MessageBox(Application.Handle, PChar('Serwer niedostępny! ' +
'Spróbuj odwiedzić stronę: ' + Copy(Base_Url, 1, Length(Base_Url) - 1) +
',' + #13#10 + 'w celu sprawdzenia, jaka jest przyczyna wystąpenia błędu.'),
PChar(Application.Title), MB_ICONERROR + MB_OK);
Exit;
end;
FOwnID := SimpleParse('"watched_uid":', ',"', FPage);
FAuthID := SimpleParse('basic_auth=', #13#10, SynHttp.Cookies.Text);
Screen.Cursor := crDefault;
Result := True;
end;
//...