delphi - 如何使用 Delphi 和 Indy 跟踪 URL 重定向?

标签 delphi url redirect query-string indy10

我收到几封营销电子邮件,其中包含从一个网站重定向到另一个网站的 URL 链接。我想编写一个程序来使用 Delphi 和 Indy 跟踪每个 URL 重定向。我想遍历每个 URL,记录完整的 QueryString 以及在此过程中可能设置的任何 Cookie。

如何使用 D2010 附带的 Indy 组件执行此操作?

最佳答案

首先你需要一个HTTP客户端,即TIdHTTP在印地。

现在您需要一个数据结构来保存您的结果:

  TRedirection = record
    queryString: String;
    cookies: TStrings;
  end;

  TRedirectionArray = array of TRedirection;

创建一个执行该工作的类(需要一个类,因为事件函数定义为 procedure of object ):

  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涉及查询字符串和 cookie。

然后实现OnRedirect事件:

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;

这将在数组中添加一个条目,并存储重定向的查询字符串。由于此重定向本身不包含 cookie(cookie 是在请求​​重定向页面时设置的),因此您还不能在此处添加任何 cookie。

这就是为什么您需要 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到数据集。该字段包含 cookie 的“摘要” - 它是请求页面时发送的实际字符串数据。

最后,通过实现 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> 完成的重定向。标签或 JavaScript。 要添加该功能,您必须检查 Get 的调用结果,并解析它以搜索此类重定向。

关于delphi - 如何使用 Delphi 和 Indy 跟踪 URL 重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961831/

相关文章:

javascript - 提交表单而不重定向

javascript - 将 HTML 转换为数据 :text/html link using JavaScript

http - 在地址栏中留下缩短的 URL 的 URL 缩短

.net - JclDotNet,以及一些使用汇编程序的奇怪调用模式

delphi - Delphi 的语言补充

c++ - C++程序调用Delphi DLL函数时崩溃

java - 如何使用 JNI 在 Delphi 中设置日期

java.net.ConnectException : Connection timed out while connecting through a proxy 异常

php - 将相对 URL 转换为绝对

java - 如何在 JUnit 测试中保存 Log4j 发送到 STDOUT 的输出?