URL 링크가있는 여러 마케팅 이메일을 사이트에서 사이트로 리디렉션합니다. Delphi와 Indy를 사용하여 각 URL 리디렉션을 추적하는 프로그램을 작성하고 싶습니다. 각 URL을 트래버스하고 전체 QueryString 및 프로세스 중에 설정되었을 수있는 쿠키를 기록하고 싶습니다.Delphi 및 Indy를 사용하여 URL 리디렉션을 추적하는 방법은 무엇입니까?
D2010과 함께 제공되는 Indy 구성 요소를 사용하여 어떻게 수행합니까?
URL 링크가있는 여러 마케팅 이메일을 사이트에서 사이트로 리디렉션합니다. Delphi와 Indy를 사용하여 각 URL 리디렉션을 추적하는 프로그램을 작성하고 싶습니다. 각 URL을 트래버스하고 전체 QueryString 및 프로세스 중에 설정되었을 수있는 쿠키를 기록하고 싶습니다.Delphi 및 Indy를 사용하여 URL 리디렉션을 추적하는 방법은 무엇입니까?
D2010과 함께 제공되는 Indy 구성 요소를 사용하여 어떻게 수행합니까?
먼저 인디에서 TIdHTTP
인 HTTP 클라이언트가 필요합니다. (이벤트 기능이 procedure of object
로 정의되어 있기 때문에, 클래스가 필요합니다)
TRedirection = record
queryString: String;
cookies: TStrings;
end;
TRedirectionArray = array of TRedirection;
작업을 수행하는 클래스를 만들기는 :
지금 당신은 당신의 결과를 보유 할 데이터 구조가 필요합니다
TRedirectionTester = class
private
FRedirData: TRedirectionArray;
procedure redirectEvent(Sender: TObject; var dest: string;
var NumRedirect: Integer; var Handled: boolean; var VMethod: TIdHTTPMethod);
procedure newCookie(ASender: TObject; ACookie: TIdCookie; var VAccept: Boolean);
public
function traverseURL(url: String): TRedirectionArray;
property RedirData: TRedirectionArray read FRedirData;
end;
기본 기능을 제공합니다. traverseURL
을 URL과 함께 호출 할 수 있으며, 쿼리 문자열과 쿠키가 포함 된 TRedirectionArray
을 반환합니다.
procedure TRedirectionTester.redirectEvent(Sender: TObject; var dest: string;
var NumRedirect: Integer; var Handled: boolean; var VMethod: TIdHTTPMethod);
var
redirDataLength: Integer;
begin
Handled := True;
redirDataLength := Length(FRedirData);
SetLength(FRedirData, redirDataLength + 1);
FRedirData[redirDataLength].queryString := dest;
FRedirData[redirDataLength].cookies := TStringList.Create;
end;
이 배열에 항목을 추가하고, 리디렉션의 쿼리 문자열을 저장합니다 :
그런 다음OnRedirect
이벤트를 구현합니다. 리디렉션 자체에는 쿠키가 포함되어 있지 않으므로 (리디렉션 된 페이지를 요청할 때 쿠키가 설정 됨) 아직 여기에 쿠키를 추가 할 수 없습니다.
그건 당신이 OnNewCookie
핸들러가 필요합니다 이유는 다음과 같습니다
procedure TRedirectionTester.newCookie(ASender: TObject; ACookie: TIdCookie; var VAccept: Boolean);
var
redirDataLength: Integer;
begin
VAccept := True;
redirDataLength := High(FRedirData);
if (Assigned(FRedirData[redirDataLength].cookies)) then
FRedirData[redirDataLength].cookies.Add(ACookie.CookieText);
end;
이 데이터 세트에 CookieText
를 추가 아무것도하지 않습니다. 이 필드는 쿠키의 '요약'을 포함합니다. 이는 페이지를 요청할 때 보내지는 실제 문자열 데이터입니다.
traverseURL
기능을 구현하여 함께 넣어 :
function TRedirectionTester.traverseURL(url: String): TRedirectionArray;
var
traverser: TIdHTTP;
begin
traverser := TIdHTTP.Create();
traverser.HandleRedirects := True;
traverser.OnRedirect := redirectEvent;
traverser.CookieManager := TIdCookieManager.Create();
traverser.CookieManager.OnNewCookie := newCookie;
SetLength(FRedirData, 1);
FRedirData[0].queryString := url;
FRedirData[0].cookies := TStringList.Create;
traverser.Get(url);
Result := FRedirData;
end;
그것은 많은 일을하지 않습니다 : 그것은 필요한 객체를 생성하고, 이벤트 핸들러를 할당합니다. 그런 다음 첫 번째 리디렉션으로 첫 번째 URL을 추가합니다 (실제 리디렉션이 아니더라도 완벽을 위해 추가했습니다). Get
을 호출하면 요청이 전송됩니다. 최종 페이지가 위치하고 웹 서버에 의해 반환 된 후에 반환됩니다.
http://bit.ly/Lb2Vho으로 테스트했습니다.
그러나 이것은 HTTP 상태 코드 301 또는 302로 인한 리디렉션 만 처리합니다. 내가 알기 엔 <meta>
태그 또는 자바 스크립트를 통해 수행되는 리디렉션을 처리하지 못합니다. 해당 기능을 추가하려면 Get
으로 전화 한 결과를 확인한 다음 해당 리디렉션을 검색해야합니다.
HTTP 프로토콜에는 리디렉션 응답이 리디렉션 시간에 쿠키를 설정하지 못하게하는 내용이 없습니다. 모든 HTTP 응답은 쿠키를 설정할 수 있습니다. –
@ Remy Lebeau : 물론 맞습니다. 이것이 바로 코드가하는 것입니다 : HTTP 응답의 유형에 관계없이 쿠키를 기록합니다. 도메인 x.com으로 요청을 보내면 도메인 y.com으로 리디렉션되고 y.com 도메인의 쿠키는 도메인 y.com 요청에 대한 응답으로 설정됩니다 (리디렉션이 아님). 전에). – Chris
@Chris -이 기능을 사용할 수 없습니다. TIdCookie (선언되지 않은 식별자)를 사용할 수 없어 대신 TIdCookieRFC2109를 사용하고 컴파일이 잘됩니다. 이제 traverseURL을 호출 할 때 "AV at address"오류가 발생합니다. –
TIdHTTP가 이에 대한 적절한 이벤트를 노출하지 않는 경우 자동으로 리디렉션을 처리하지 않아야합니다. 즉, "리디렉션"응답 코드에 직접 응답하고 지정된 URL에 대해 새 get을 발행해야합니다. 죄송합니다. 아직 코드를 작성하지 않았습니다. –
'TIdHTTP'는 HTTP 레벨 리다이렉션을 발견 할 때마다 트리거되는'OnRedirect' 이벤트를 가지고 있습니다 (클라이언트 측 스크립팅을 사용하여 리다이렉트 할 수 있는데,'TIdHTTP'는 그것을 추적 할 수 없습니다). –