![]()  | 
	
 
  | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Здравствуйте, хочу научиться для себя парсить сайты с помощью Synapse. В качестве примера взял сайт pikabu. Снифером внимательно отследил данные, отправил их методом POST, залогинелся, но вот как уже под своим логином перейти на другую страницу этого ресурса и выгрузить html код страницы? 
		
	
		
		
		
		
		
	
		
		
	
	
	Попробовал реализовать следующим образом: Код: 
	unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, httpsend, ssl_openssl, StdCtrls;
type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    edt1: TEdit;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
function FoundLocationStrNum(Headers: TStringlist): integer;
var
  FoundStrPos, i: integer;
begin
  Result := -1;
  for i := 0 to Headers.Count do
  begin
    FoundStrPos := Pos('Location: ', Headers.Strings[i]);
    if FoundStrPos > 0 then
    begin
      Result := i;
      exit;
    end;
  end;
end;
function GetHTTPStr(http: THTTPSend): string;
var
  BodyStream: TStringStream;
  BodyS: TStringList;
begin
  try
    BodyS := TStringList.Create;
    BodyStream := TStringStream.Create(result);
    begin
      BodyS.LoadFromStream(http.Document);
      result := BodyS.Text;
    end;
  finally
    BodyStream.Free;
    BodyS.Free;
  end;
  http.Document.Seek(0, soFromBeginning);
end;
procedure TForm1.btn1Click(Sender: TObject);
var
      httpsend: THTTPSend;
      stream: TStringStream;
      n: integer;
      NewURL, result: string;
      Res: boolean;
begin
httpsend:= THTTPSend.Create;
stream := TStringStream.Create('');
stream.WriteString('mode=login&username=***&password=***&remember=1');
Application.ProcessMessages;
httpsend.MimeType := 'application/x-www-form-urlencoded';
httpsend.Document.LoadFromStream(stream);
Res := httpsend.HTTPMethod('post', 'http://pikabu.ru/ajax/ajax_login.php');
Application.ProcessMessages;
    case httpsend.ResultCode of
      301, 302, 307:
        begin
          n := FoundLocationStrNum(httpsend.Headers);
          if (n >= 0) and (n <= httpsend.Headers.count) then
          begin
            httpsend.Clear;
            httpsend.HTTPMethod('GET', edt1.Text);
            Application.ProcessMessages;
            mmo1.Lines.Text := GetHTTPStr(httpsend);
            Application.ProcessMessages;
          end;
        end;
    end;
httpsend.HTTPMethod('GET', edt1.Text);
Application.ProcessMessages;
mmo1.Text:=Utf8ToAnsi(GetHTTPStr(httpsend));
end;
end.Цитата: 
	
  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Т.е. смотри свойство THTTPSend.Cookies  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Сделал как было предложено, в итоге и в методе POST и в методе GET используются одни и те же куки Код: 
	unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, httpsend, ssl_openssl, StdCtrls;
type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    edt1: TEdit;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
function FoundLocationStrNum(Headers: TStringlist): integer;
var
  FoundStrPos, i: integer;
begin
  Result := -1;
  for i := 0 to Headers.Count do
  begin
    FoundStrPos := Pos('Location: ', Headers.Strings[i]);
    if FoundStrPos > 0 then
    begin
      Result := i;
      exit;
    end;
  end;
end;
function GetHTTPStr(http: THTTPSend): string;
var
  BodyStream: TStringStream;
  BodyS: TStringList;
begin
  try
    BodyS := TStringList.Create;
    BodyStream := TStringStream.Create(result);
    begin
      BodyS.LoadFromStream(http.Document);
      result := BodyS.Text;
    end;
  finally
    BodyStream.Free;
    BodyS.Free;
  end;
  http.Document.Seek(0, soFromBeginning);
end;
procedure TForm1.btn1Click(Sender: TObject);
var
      httpsend: THTTPSend;
      stream: TStringStream;
      str: TstringList;
      n: integer;
      NewURL, result: string;
      Res: boolean;
begin
str:=TstringList.Create;
httpsend:= THTTPSend.Create;
stream := TStringStream.Create('');
stream.WriteString('mode=login&username=***&password=***&remember=1');
Application.ProcessMessages;
httpsend.MimeType := 'application/x-www-form-urlencoded';
httpsend.Document.LoadFromStream(stream);
Res := httpsend.HTTPMethod('post', 'http://pikabu.ru/ajax/ajax_login.php');
str.Text:=httpsend.Cookies.Text;
httpsend.Clear;
httpsend.Cookies.Text:=str.Text;
httpsend.HTTPMethod('GET', edt1.Text);
Application.ProcessMessages;
mmo1.Text:=Utf8ToAnsi(GetHTTPStr(httpsend));
end;
end.Цитата: 
	
 В чем может быть проблема? Может из-за того, что я Гет в начале перед логином не делаю? Это вообще критично?  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Все сделал, но все равно грузит какой-то странный исходный код страницы… креплю к посту исходник, посмотрите пожалуйста 
		
	
		
		
			 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 часто бывает, что после отправки Post, в ответе идет редирект, который и возвращает нужную страницу. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Вот так у меня через Mozilla Firefox: ![]() А вот так через Internet Explorer: ![]()  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 IdHTTP тоже с JavaScript не дружит? 
		
	
		
		
		
		
		
	
		
		
	
	
	Меня сейчас озадачило два момента… Первый: Код: 
	//===POST 2===
httpsend:=THTTPSend.Create;
httpsend.MimeType:='application/x-www-form-urlencoded';
httpsend.UserAgent:=('Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.61');
stream := TStringStream.Create('');
stream.WriteString('i=1770882&type=+');
httpsend.Document.LoadFromStream(stream);
httpsend.Cookies.Text:=str.Text;
httpsend.HTTPMethod('post','http://pikabu.ru/ajax/dig.php' );
httpsend.Free;![]() Даже когда передаешь ASCII-код символа + как #043 его всеравно нет. Второй: Неясность с куками. Я использую для кук следующий код Код: 
	str.Text:=httpsend.Cookies.Text; и перед каждым запросом вставляю строку Код: 
	httpsend.Cookies.Text:=str.Text; ![]() А два разных POST при этом имеет два разных кука... что-то работает не так как должно ![]() ![]()  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Код: 
	stream.WriteString('i=1770882&type=a%2Bb'); // Получим два параметра: "i=1770882" и "type=a+b" Цитата: 
	
 Цитата: 
	
 Код: 
	httpsend.Cookies.Text := 'primer=55';  | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код: 
	httpsend.Cookies.Text := 'primer=55'; ![]() Делаю вот так Код: 
	httpsend:=THTTPSend.Create;
httpsend.HTTPMethod('get','http://pikabu.ru' );
str.Text:=httpsend.Cookies.Text;
ShowMessage(httpsend.Cookies.Text); | 
| 
		 
			 
			#13  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 UPD. На работе у меня интернет через прокси, поэтому этот пример я проверить не имел возможности. Дома проверил - как я и ожидал - сервер по этому запросу никаких кук не присылает, так что вполне закономерно, что ShowMessage выводит пустоту. Последний раз редактировалось poli-smen, 13.12.2013 в 01:13.  |