鱼C论坛

 找回密码
 立即注册
查看: 65|回复: 8

Fmx里获取Webbrowser完整Cookie的方法

[复制链接]
发表于 2024-6-13 02:04:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大侠相助,windows,安卓,ios下面都需要,如果用js回调似乎取不到httponly的cookie,请问如何获取所有cookie,求代码,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-13 02:05:17 | 显示全部楼层
哈哈,来解决这个问题!在Delphi中获取 `TWebBrowser` 控件的完整 Cookie,确实有点麻烦,但我们可以使用一些技巧来实现。首先,我们需要通过 `IHTMLDocument2` 接口来访问 `TWebBrowser` 控件的文档对象,然后从中获取 Cookie。不过,要注意的是,因为安全性考虑,无法直接获取 `httponly` 的 Cookie。让我来给你提供一段 Delphi 代码,帮你解决这个问题:
uses
  SHDocVw, MSHTML;

function GetWebBrowserCookies(WebBrowser: TWebBrowser): TStringList;
var
  HTMLDoc: IHTMLDocument2;
  CookieStr: string;
  Cookies: TStringList;
  i: Integer;
begin
  Cookies := TStringList.Create;
  try
    if not Assigned(WebBrowser.Document) then
      Exit;

    HTMLDoc := WebBrowser.Document as IHTMLDocument2;
    CookieStr := HTMLDoc.cookie;
    
    // 解析 Cookie 字符串
    while Pos(';', CookieStr) > 0 do
    begin
      Cookies.Add(Copy(CookieStr, 1, Pos(';', CookieStr) - 1));
      Delete(CookieStr, 1, Pos(';', CookieStr));
    end;
    
    // 添加剩余的最后一个 Cookie
    if CookieStr <> '' then
      Cookies.Add(CookieStr);
      
    Result := Cookies;
  except
    Cookies.Free;
    Result := nil;
  end;
end;

这段代码将返回一个 `TStringList`,其中包含 `TWebBrowser` 控件当前加载的网页的所有 Cookie。不过记住,无法直接获取 `httponly` 的 Cookie,因为这是出于安全性考虑的。希望这能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-13 02:06:32 | 显示全部楼层
需要获取httponly的Cookie
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-13 02:09:24 | 显示全部楼层
mp654k 发表于 2024-06-13 02:06
需要获取httponly的Cookie


获取 `httponly` 的 Cookie 在安全性考虑下通常是不可行的,因为浏览器设计时就考虑了这一点,防止通过脚本等方式获取到这些敏感信息。所以即使使用 Delphi 或其他语言,也无法直接获取到 `httponly` 的 Cookie。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-13 02:27:18 | 显示全部楼层
请人工回答一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-13 02:28:39 | 显示全部楼层
mp654k 发表于 2024-06-13 02:27
请人工回答一下


哈哈,这个问题可真是有点儿头疼呢!虽然我不是大侠,但我可以尽力帮你解决这个问题。获取 `httponly` 的 Cookie 在安全性上是受限制的,就像你说的,通过脚本或其他方式通常是无法获取的。所以无论是在 Windows、安卓还是 iOS 下,都很难直接获取所有 Cookie,尤其是 `httponly` 的。这就好比你想要去银行取钱,但你不是银行职员,只是个顾客,银行自然是不会把所有的钱都给你看的。

如果你非要获取 `httponly` 的 Cookie,那只能通过一些间接的方法,比如服务器端记录日志,或者使用浏览器开发者工具进行检查。不过,如果你有其他需要,我还是可以帮你尽力寻找解决方案的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-13 12:06:27 | 显示全部楼层
那为啥c#的webbrowser用InternetGetCookieEx就可以获取到httponly的cookie,delphi却不行.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-13 12:06:46 | 显示全部楼层
mp654k 发表于 2024-06-13 12:06
那为啥c#的webbrowser用InternetGetCookieEx就可以获 ...


非常抱歉,之前的回答有些不准确。确实可以通过一些方法在 Delphi 中获取 `httponly` 的 Cookie,就像在 C# 中使用 `InternetGetCookieEx` 一样。

在 Delphi 中,可以使用 `InternetGetCookieEx` 函数从 `TWebBrowser` 控件中获取完整的 Cookie,包括 `httponly` 的。要使用这个函数,你需要添加 `WinInet` 单元,并使用下面的代码:
uses
  ..., WinInet;

function GetWebBrowserCookies(WebBrowser: TWebBrowser): string;
var
  Size: DWORD;
begin
  Size := 0;
  Result := '';
  
  // 获取需要的缓冲区大小
  InternetGetCookieEx(PChar(WebBrowser.LocationURL), nil, nil, Size, INTERNET_COOKIE_HTTPONLY or INTERNET_COOKIE_THIRD_PARTY);
  if Size = 0 then
    Exit;

  SetLength(Result, Size);
  
  // 获取完整的 Cookie
  if not InternetGetCookieEx(PChar(WebBrowser.LocationURL), nil, PChar(Result), Size, INTERNET_COOKIE_HTTPONLY or INTERNET_COOKIE_THIRD_PARTY) then
    Result := '';
end;

该函数将返回一个字符串,其中包含 `TWebBrowser` 控件当前加载的网页的所有 Cookie,包括 `httponly` 的。请注意,为了成功使用 `InternetGetCookieEx` 函数,你需要确保在程序运行时具备足够的权限。

希望这次能满足您的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-13 22:58:32 | 显示全部楼层
AI的没有用 请高手解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-23 09:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表