You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Delphi的TIdHTTP向Finviz传递认证信息?

解决FinViz登录后仍未认证的问题

1. 完整复刻浏览器的请求链路

浏览器登录FinViz的流程远不止提交账号密码,你需要用Fiddler抓全从打开登录页到登录成功的所有请求:

  • 先访问https://finviz.com/login.ashx或https://elite.finviz.com的GET请求,这一步会获取初始Cookie和页面内的隐藏验证字段
  • 仔细对比登录POST请求的全部参数,除了email、password、remember,大概率还有__RequestVerificationToken这类CSRF令牌,这类字段是登录必需的,缺失直接导致认证失败
  • 查看登录成功后跳转请求的Cookie传递情况,确认认证Cookie的名称和有效期

2. 严格匹配POST请求的参数与格式

  • 确保POST参数格式和浏览器一致:浏览器通常用application/x-www-form-urlencoded格式,你需要用TStringList传递参数,并设置请求头的Content-Type为对应值,不要直接拼接字符串。示例代码:
var
  PostParams: TStringList;
begin
  PostParams := TStringList.Create;
  try
    PostParams.Add('email=your_email@xxx.com');
    PostParams.Add('password=your_password');
    PostParams.Add('remember=on');
    // 加上从登录页提取的隐藏字段,比如__RequestVerificationToken=xxx
    PostParams.Add('__RequestVerificationToken=xxxxxxxxx');
    
    FHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    FHTTP.Post('https://finviz.com/login.ashx', PostParams);
  finally
    PostParams.Free;
  end;
end;
  • 同步浏览器的请求头:必须设置User-Agent为浏览器的真实UA,同时添加Referer头指向登录页URL,否则服务器会判定为异常请求

3. 验证Cookie管理的正确性

  • 确认TIdCookieManager已绑定到TIdHTTP的CookieManager属性,而不是仅仅创建对象:
FHTTP.CookieManager := TIdCookieManager.Create(FHTTP);
  • 登录POST完成后,检查CookieManager.Cookies集合,确认是否收到含auth、session关键词的认证Cookie。如果是HttpOnly类型的Cookie,TIdHTTP会自动处理,不要手动过滤
  • 后续所有请求必须复用同一个TIdHTTP实例,否则Cookie不会被携带

4. 处理HTTPS与重定向逻辑

  • 确保TIdHTTP使用正确的SSL处理器,比如TIdSSLIOHandlerSocketOpenSSL,并设置SSL版本为TLS 1.2或1.3(和浏览器一致)
  • 开启重定向处理:FHTTP.HandleRedirects := True,登录成功后的3xx跳转需要自动跟随,否则会丢失认证状态

5. 遵循浏览器的请求顺序

不要直接发送登录POST,严格按照以下步骤执行:

  1. 发送GET请求到登录页,获取初始Cookie和页面中的隐藏验证字段
  2. 用HTML解析器或正则表达式提取页面内所有<input type="hidden">的name和value
  3. 将隐藏字段和账号密码参数合并后发送POST请求
  4. 后续访问精英版筛选器的GET请求,直接用同一个TIdHTTP实例发送即可

内容的提问来源于stack exchange,提问作者Gabrielle Goldberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:05:15