Robię autorespondera do darkwarez.pl
Kod mi ciężko przytoczyć bo teraz ma w sumie ok. 2k linijek, a żebym wydobył tylko to co się odnosi do komunikacji http to bym musiał trochę czasu poświęcić. Zobaczę, czy uda mi się przez to zdarzenie, a jak nie to wezmę się do wydobycia kodu
EDIT. Mam ten kod:
Najpierw się loguję, jednak wysyłając kolejne zapytania z wiresharka wiem, że nie wysyłam otrzymanych cookie, przez co odpowiedzi nie są przyjmowane(Choc w wiresharku w odpowiedzi serwera nie ma o tym informacji, wiec sie tylko domyslam, ale nie bardzo widze, co jeszcze mogloby byc nie tak(Mam vip-a wiec recaptchy nie powinno byc))
Co ważniejsze fragmenty:
Forum : IdHttp
Logowania : Memo
procedure TMainForm.Button1Click(Sender: TObject);
const
UA = 'Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1';
var
Input, OutPut : TStringStream;
ErrCode : ShortString;
PliczekDrkwz : TextFile;
Cookies : String;
nCookies : Integer;
PliczekCookie : TextFile;
PliczekData : TextFile;
Liczba : Integer;
begin
Logowania.Lines.Clear;
Logowania.Lines.Add('Loguję do Darkwarez.pl...');
{ Z Firebuga: usrname=Nick&passwrd=Passy&redirect=&login=Zaloguj }
{ stworzenie strumieni tekstowych }
Input := TStringStream.Create('');
Output := TStringStream.Create('');
try
Button1.Enabled := False; // zablokowanie przycisku
Forum.AllowCookies := TRUE;
Input.WriteString(Format('usrname=%s&passwrd=%s&autologin=on&redirect=&login=Zaloguj', [LoginDrkwz.Text, PassyDrkwz.Text]));
Forum.Request.UserAgent:= UA;
Forum.HandleRedirects:= True;
Forum.CookieManager:= IdCookieManager1;
Forum.Get('http://darkwarez.pl/forum/login.php');
Memo1.Lines.Add('METODA 1 - Cookie Collection:');
for i := 0 to Forum.CookieManager.CookieCollection.Count - 1 do
Memo1.Lines.Add(Forum.CookieManager.CookieCollection.Items[i].CookieText);
Memo1.Lines.Add('METODA 2 - Headers:');
Cookies := '';
Memo1.Clear;
for i:= 0 to Forum.Response.RawHeaders.Count - 1 do
begin
Memo1.Lines.Add(Forum.Response.RawHeaders.Strings[i]);
end;
{
Nagłówki odpowiedzi
HTTP/1.0 302 Moved Temporarily
Set-Cookie: phpbb2dww_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A7%3A%221460688%22%3B%7D; expires=Fri, 26-Oct-2012 13:36:25 GMT; path=/; domain=.darkwarez.pl
phpbb2dww_sid=880324dcbdb1158f83bdf5f17af29f62; path=/; domain=.darkwarez.pl
Location: http://darkwarez.pl/forum/index.php
Content-Type: text/html
Content-Length: 0
Date: Thu, 27 Oct 2011 13:36:25 GMT
Connection: keep-alive
Nagłówki zapytania
POST /forum/login.php HTTP/1.1
Host: darkwarez.pl
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://darkwarez.pl/forum/login.php
}
Try
Forum.Request.Referer := 'http://darkwarez.pl/forum/login.php';
Forum.Post('http://darkwarez.pl/forum/login.php', Input, Output); // wyslanie danych ze strumienia do skryptu
Forum.Request.Referer := 'http://darkwarez.pl/forum/';
except
Logowania.Lines.Add('Wystąpił błąd podczas logowania do Darkwarez');
ShowMessage('Błąd logowania!');
end;
Memo1.Clear;
Memo1.Lines.Add('Po logowaniu: METODA 1 - Cookie Collection:');
for i := 0 to Forum.CookieManager.CookieCollection.Count - 1 do
Memo1.Lines.Add(Forum.CookieManager.CookieCollection.Items[i].CookieText);
Memo1.Lines.Add('METODA 2 - Headers:');
Cookies := '';
for i:= 0 to Forum.Response.RawHeaders.Count - 1 do
begin
Memo1.Lines.Add(Forum.Response.RawHeaders.Strings[i]);
end;
Cookies := Memo1.Text;
If Pos('Set-Cookie:', Cookies) <> 0 then
begin
While Pos('Set-Cookie:', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
While Pos(':', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
Cookies := 'Cookies'+Cookies;
SetCookie1 := '';
While Pos('domain=.darkwarez.pl', Cookies)<> 1 do
begin
SetCookie1 := SetCookie1+Copy(Cookies, 1, 1);
Delete(Cookies, 1, 1);
end;
SetCookie1 := SetCookie1+'domain=.darkwarez.pl';
While Pos('Set-Cookie:', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
While Pos(':', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
Cookies := 'Cookies'+Cookies;
SetCookie2 := '';
While Pos('domain=.darkwarez.pl', Cookies)<> 1 do
begin
SetCookie2 := SetCookie2+Copy(Cookies, 1, 1);
Delete(Cookies, 1, 1);
end;
SetCookie2 := SetCookie2+'domain=.darkwarez.pl';
end;
Cookies := Memo1.Text;
AssignFile(PliczekCookie, 'SID.txt');
AssignFile(PliczekData, 'Data.txt');
nCookies := Pos('phpbb2dww_sid', Cookies);
If nCookies <> 0 then
begin
While Pos('phpbb2dww_data', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
While Pos('=', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
Delete(Cookies, 1, 1);
phpbb2dww_data := '';
While Pos(';', Cookies) <> 1 do
begin
phpbb2dww_data := phpbb2dww_data+Copy(Cookies, 1, 1);
Delete(Cookies, 1, 1);
end;
{ phpbb2dww_data= }
Forum.CookieManager.AddCookie('phpbb2dww_data='+phpbb2dww_data, '.darkwarez.pl');
Logowania.Lines.Add('Cookie phpbb2dww_data= '+phpbb2dww_data);
ReWrite(PliczekData);
Write(PliczekData, phpbb2dww_data);
CloseFile(PliczekData);
While Pos('phpbb2dww_sid', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
While Pos('=', Cookies) <> 1 do
begin
Delete(Cookies, 1, 1);
end;
Delete(Cookies, 1, 1);
SID := '';
While Pos(';', Cookies) <> 1 do
begin
SID := SID+Copy(Cookies, 1, 1);
Delete(Cookies, 1, 1);
end;
Forum.CookieManager.AddCookie('phpbb2dww_sid='+SID, '.darkwarez.pl');
ReWrite(PliczekCookie);
Write(PliczekCookie, SID);
CloseFile(PliczekCookie);
BrakSID := FALSE;
end
else
begin
If not FileExists('SID.txt') then
begin
BrakSid := TRUE
end
else
begin // jesli nie otrzymano cookie SessionID wczytaj ostatnio dostarczone z pliku tekstowego(Choc wg. Wiresharka set cookie dostaje zawsze, to przy wyzej uzytej metodzie "wydobywania" cookie jest ono widoczne tylko po nawiazaniu nowego polaczenia(np. rano podczas pierwszego polaczania z darkwarez.pl) - możliwe, że coś jest nie tak i przez to nie działa(Ale ogólnie inne działające autorespondery do darkwarez widziałem, więc wątpię, żeby mieli jakieś szczególne zabezpieczenia przed botami)
Reset(PliczekCookie);
Readln(PliczekCookie, SID);
CloseFile(PliczekCookie);
BrakSid := FALSE;
Forum.CookieManager.AddCookie('phpbb2dww_sid='+SID, '.darkwarez.pl');
Reset(PliczekData);
Readln(PliczekData, phpbb2dww_data);
CloseFile(PliczekData);
Forum.CookieManager.AddCookie('phpbb2dww_data='+phpbb2dww_data, '.darkwarez.pl');
Memo1.Lines.Add('Wczytywanie z plikow tekstowych. METODA 1 - Cookie Collection:');
for Liczba := 0 to Forum.CookieManager.CookieCollection.Count - 1 do
Memo1.Lines.Add(Forum.CookieManager.CookieCollection.Items[i].CookieText); // Niestety, mimo, iż dodałem te cookie, to cookie ciągle nie są "widoczne", czyli też nie są wysyłane w nagłówkach zapytania
end;
end;
{ Cookie: phpbb2dww_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A32%3A%22843cb134a1811244d442265a5d3c9ace%22%3Bs%3A6%3A%22userid%22%3Bs%3A7%3A%221460688%22%3B%7D; phpbb2dww_sid=ddd3df7ad593b4c143869eb3220217b3 }
// Forum.Request.CustomHeaders.Add('Cookie: phpbb2dww_data='+phpbb2dww_data+'; phpbb2dww_sid='+SID); // Jest to jedyna działająca metoda, dzięki czemu Cookie wychodzą w nagłówkach zapytania(Przeglądarka umieszcza je tam)
If BrakSid then ShowMessage('Brak SID-a. Nie otrzymano Cookies');
Memo1.Lines.Add(Forum.Response.RawHeaders.CommaText);
Memo2.Lines.Add(Forum.Response.RawHeaders.Text);
{ strumien Output przechwytuje odpowiedz serwera, czyli kod HTML jaki wyswietlil skrypt }
if Pos('nieprawidłowe lub nieaktywne dane użytkownika', Output.DataString) <> 0 then // jeżeli wystąpi taka linia
begin
bladlogowaniedrkwz := TRUE;
ErrCode := 'Podałeś nieprawidłowe lub nieaktywne dane użytkownika';
{ teraz pozostaje juz tylko ten komunikat wyswietlic }
Logowania.Lines.Add('Wystąpił błąd podczas logowania do Darkwarez: '+ErrCode);
end;
If bladlogowaniedrkwz = FALSE then
begin
Logowania.Lines.Add('Pomyslnie zalogowano do darkwarez.pl!');
LoggedDrkwz := TRUE;
end
else
begin
LoggedDrkwz := FALSE;
end;
finally
{ zwolnienie zasobow }
Input.Free;
Output.Free;
Button1.Enabled := True;
end;
end; // koniec procedury logowania
{ Fragment autorespondera o odpowiedzi: }
{wysłanie odpowiedzi}
{http://darkwarez.pl/forum/posting.php?mode=reply&t=2384074}
{ subject=...&helpbox=Tekst+podkre%B6lony%3A+%5Bu%5Dtekst%5B%2Fu%5D++%28alt%2Bu%29&message=Tresc Wiadomosci&mode=reply&sid=3fd59ca71ccd6f55d422015e9345cd9e&t=3095446&post=Wyślij }
Input3.WriteString(Format('subject=&helpbox=Tekst podkreślony: [u]tekst[/u] (alt+u)&message=%s&mode=reply&sid=%s&t=%s&post=Wyślij', [TrescOdpowiedzi2, SID, IdTematu]));
{
Nagłówki zapytania wysyłane przez przeglądarkę do odpowiedzi:
POST /forum/posting.php HTTP/1.1
Host: darkwarez.pl
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://darkwarez.pl/forum/posting.php?mode=reply&t=2929422
Cookie: phpbb2dww_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A7%3A%221460688%22%3B%7D; phpbb2dww_sid=9b91b0347ebc2246778f3356ad0c2093; phpbb2dww_t=a%3A1%3A%7Bi%3A2929422%3Bi%3A1319722173%3B%7D
}
Forum.Request.Referer := 'http://darkwarez.pl/forum/posting.php?mode=reply&t='+IdTematu;
Forum.Post('http://darkwarez.pl/forum/posting.php', Input3, Output3);
// Forum.Post('http://darkwarez.pl/forum/posting.php?mode=reply&t='+IdTematu, Input3, Output3); // zastanawiam się, czy to nie powinno być tak, ale firebug uważa, że posting.php?mode=... to referer, a post wysylam do posting.php
StringOutput3 := Output3.DataString;
Forum.Request.Referer := 'http://darkwarez.pl/forum/';
{ phpbb2dww_t=a%3A1%3A%7Bi%3A2814508%3Bi%3A1319479672%3B%7D; path=/; domain=.darkwarez.pl }
If Pos('Set-Cookie: phpbb2dww_t', StringOutput3) <> 0 then
begin
While Pos('Set-Cookie: phpbb2dww_t', StringOutput3) <> 1 do
begin
Delete(StringOutput3, 1, 1);
end;
While Pos(':', StringOutput3) <> 1 do
begin
Delete(StringOutput3, 1, 1);
end;
Delete(StringOutput3, 1, 1);
phpbb2dww_t := '';
While pos(';', StringOutput3) <> 1 do
begin
phpbb2dww_t := phpbb2dww_t+Copy(StringOutput3, 1, 1);
Delete(StringOutput3, 1, 1);
end;
phpbb2dww_t := Trim(phpbb2dww_t);
Forum.CookieManager.AddCookie('phpbb2dww_t='+phpbb2dww_t, '.darkwarez.pl');
end;
Edit2.
Przeinstalowałem delphi, teraz cookie ze zbioru cookie collection są widoczne, jednak nie są wysyłane. Wyślę je manualnie. Możliwe, że w kodzie nie ma błędu, więc biorę się do pracy, ale jakbyście może coś znaleźli to dajcie znać;