2012-06-09 3 views
2

URL 링크가있는 여러 마케팅 이메일을 사이트에서 사이트로 리디렉션합니다. Delphi와 Indy를 사용하여 각 URL 리디렉션을 추적하는 프로그램을 작성하고 싶습니다. 각 URL을 트래버스하고 전체 QueryString 및 프로세스 중에 설정되었을 수있는 쿠키를 기록하고 싶습니다.Delphi 및 Indy를 사용하여 URL 리디렉션을 추적하는 방법은 무엇입니까?

D2010과 함께 제공되는 Indy 구성 요소를 사용하여 어떻게 수행합니까?

+0

TIdHTTP가 이에 대한 적절한 이벤트를 노출하지 않는 경우 자동으로 리디렉션을 처리하지 않아야합니다. 즉, "리디렉션"응답 코드에 직접 응답하고 지정된 URL에 대해 새 get을 발행해야합니다. 죄송합니다. 아직 코드를 작성하지 않았습니다. –

+0

'TIdHTTP'는 HTTP 레벨 리다이렉션을 발견 할 때마다 트리거되는'OnRedirect' 이벤트를 가지고 있습니다 (클라이언트 측 스크립팅을 사용하여 리다이렉트 할 수 있는데,'TIdHTTP'는 그것을 추적 할 수 없습니다). –

답변

4

먼저 인디에서 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으로 전화 한 결과를 확인한 다음 해당 리디렉션을 검색해야합니다.

+1

HTTP 프로토콜에는 리디렉션 응답이 리디렉션 시간에 쿠키를 설정하지 못하게하는 내용이 없습니다. 모든 HTTP 응답은 쿠키를 설정할 수 있습니다. –

+1

@ Remy Lebeau : 물론 맞습니다. 이것이 바로 코드가하는 것입니다 : HTTP 응답의 유형에 관계없이 쿠키를 기록합니다. 도메인 x.com으로 요청을 보내면 도메인 y.com으로 리디렉션되고 y.com 도메인의 쿠키는 도메인 y.com 요청에 대한 응답으로 설정됩니다 (리디렉션이 아님). 전에). – Chris

+1

@Chris -이 기능을 사용할 수 없습니다. TIdCookie (선언되지 않은 식별자)를 사용할 수 없어 대신 TIdCookieRFC2109를 사용하고 컴파일이 잘됩니다. 이제 traverseURL을 호출 할 때 "AV at address"오류가 발생합니다. –

관련 문제