[delphi] Logowanie na grono.net

0

Próbuję się zalogować na grono.net przy pomocy komponentu TidHTTP, ale cuś mi nie wychodzi:

procedure TForm1.Button1Click(Sender: TObject);
var
Input: TStringStream;
begin
Input := TStringStream.Create('');
Input.Create('csrftoken=None&login=***&password=***&dest=%2Fusers%2F');
HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
HTTP.Request.Host := 'grono.net';
HTTP.Request.Referer := 'http://grono.net/?autologin=0';
HTTP.Post('http://grono.net/index.php',Input); // prbowalem tez logform.php ale też dupa
Memo2.Lines.Text := HTTP.Get('http://grono.net/users/123/detail/'); // pobieram strone informacji o jakims uzytkowniku
WebBrowser1.OleObject.Document.body.innerHTML := Memo2.Lines.Text; // podpatruje w webbrowserze
end;

No i wychodzi na to że zalogownay nie jestem, a dostaje odpowiedz "HTTP/1.0 302 Found" (taka jak w Firefoxie).Sniffowałem firefoxa, i tam jest tak:

POST./.HTTP/1.1..Host:.grono.net..User-Agent:.Mozilla/5.0.(Windows;.U;.Windows.NT.5.1;.pl;.rv:1. 8.1.3).Gecko/200
itd (info o przeglądarce)

Content-Type:.application/x-www-form-urlencoded

Content-Length:.71 // tutaj mam -1 ale probowalem tez z 71

csrftoken=None&login=&password=&dest=%2Fusers%2F
Potrzebne mi to do wyszukiwania w opisach użytkowników jakiś ciągów znaków (ta wyszukiwarka na gronie badziewnie działa)

0
procedure TForm1.Button1Click(Sender: TObject);
var
Input: TStringStream;
begin
Input:=TStringStream.Create('csrftoken=None&login=***&password=***&dest=%2Fusers%2F');
HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
HTTP.Request.Host := 'grono.net';
HTTP.Request.Referer := 'http://grono.net/?autologin=0';
HTTP.Post('http://grono.net/index.php',Input); // prbowalem tez logform.php ale też dupa
Memo2.Lines.Text := HTTP.Get('http://grono.net/users/123/detail/'); // pobieram strone informacji o jakims uzytkowniku
WebBrowser1.OleObject.Document.body.innerHTML := Memo2.Lines.Text; // podpatruje w webbrowserze
end;
0

Tak jak ja zrobiłem też może być. Problem leży chyba w tym że nie zapisują się żadne cookies (HTTP.CookieManager.CookieCollection.Count zwraca 0), AllowCookies mam na true...

0

A może taki adres: http://grono.net/

0

Nie, to nie to (bez różnicy). Adres jest poprawny, bo jak wpiszę złe hasło to mnie przekierowuje do strony "złe hasło lub login". Na pewno chodzi o cookies.

0

Nie rozumiem jeszcze jednej rzeczy, dlaczego mam w IdHTTP ustawioną wersję 1.1 protokołu, a w opdowiedzi dostaję HTTP/1.0? Przerobiłem wszystko na dokładnie takie samo jak w FF (z wyjątkiem cookies)

Input := TStringStream.Create('csrftoken=None&login=***&password=***&remember=on&dest=%2Fusers%2F');
HTTP.ProtocolVersion := pv1_1;
HTTP.Request.Host := 'grono.net';
HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3';
HTTP.Request.Accept := 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
HTTP.Request.AcceptLanguage := 'pl,en-us;q=0.7,en;q=0.3';
HTTP.Request.AcceptEncoding := 'gzip,deflate';
HTTP.Request.AcceptCharSet := 'ISO-8859-2,utf-8;q=0.7,*;q=0.7';
HTTP.Request.CustomHeaders.Add('Keep-Alive: 300');
HTTP.Request.Connection := 'keep-alive';
HTTP.Request.Referer := 'http://grono.net/?autologin=0';
HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
Memo2.Lines.Text := HTTP.Post('http://grono.net',Input);
Memo1.Lines.Add(HTTP.Response.ResponseText);
Memo1.Lines.Add('cookies: ' + IntToStr(HTTP.CookieManager.CookieCollection.Count));
HTTP.Request.ContentEncoding := HTTP.Response.ContentEncoding;
HTTP.Request.ContentType := HTTP.Response.ContentType;
HTTP.Request.Expires := 0;
HTTP.Request.Pragma := HTTP.Response.Pragma;
HTTP.Request.CacheControl := HTTP.Response.CacheControl;
HTTP.Request.Date := HTTP.Response.Date;
Memo2.Lines.Text := HTTP.Get(HTTP.Response.Location);
Memo1.Lines.Add(HTTP.Response.ResponseText);
Memo1.Lines.Add('cookies: ' + IntToStr(HTTP.CookieManager.CookieCollection.Count));

I dostaję w memo:

HTTP/1.0 302 Found
cookies: 0
HTTP/1.1 200 OK
cookies: 0

0

Ewidentnie coś skopane z ciastkami. Utworzyłeś menadżera ciastek, skoro się do niego odwołujesz?

  IdCookieManager:= TIdCookieManager.Create(nil);
  IdHTTP.AllowCookies:= True;
  IdHTTP.CookieManager:= IdCookieManager; 
0

Oczywiście, mam go na formie.

0

Błąd może leżeć jeszcze gdzie indziej. Zrobiłem coś takiego:

Memo1.Lines.Text := IdHTTP1.Post('http://www.google.pl',input); // input = ''

I dostaję info:

HTTP/1.0 505 Not Implemented
Oczywiście mam ustawioną wersję protokołu na 1.1. Wygląda to tak jakby TIdHTTP nie spełniał standardów. Komuś się udało przy pomocy tego komponentu zalogować na cokolwiek z ciasteczkami?

0
pan m napisał(a)

HTTP/1.0 505 Not Implemented
Oczywiście mam ustawioną wersję protokołu na 1.1

no to ustaw na 1.0 :/

pan m napisał(a)

Wygląda to tak jakby TIdHTTP nie spełniał standardów

aha

pan m napisał(a)

Komuś się udało przy pomocy tego komponentu zalogować na cokolwiek z ciasteczkami?

nie :| pospiesz się to będziesz pierwszy

0

ale 302 to nie jest błąd! to jest kod przekierowania do innego adresu (moved permanently bodajże). sprawdź czy indy obsługuje coś takiego jak follow redirections.
przekierowanie to jest standardowy myk stosowany po wysłaniu danych z formularza, aby odświeżenie strony nie spowodowało ponownego ich wysłania.

0

Co znaczy 302 to ja wiem, przekierowania mam włączone (HandleRedirects na true). Problem jest taki że zamiast (przy POST) przedstawiać się jako HTTP/1.1, idHttp przedstawia się jako HTTP/1.0 (obojętnie od serwera i ustawionej w komponencie wersji) i przez to nie mogę zrobić identycznego requesta jak w FF.

0

No i jak? Udało się? Bo mam podobny problem...

1 użytkowników online, w tym zalogowanych: 0, gości: 1