Delphi TWebBrowser JavaScript 错误和 Cookie

Posted

技术标签:

【中文标题】Delphi TWebBrowser JavaScript 错误和 Cookie【英文标题】:Delphi TWebBrowser JavaScript Errors and Cookies 【发布时间】:2021-01-13 15:27:21 【问题描述】:

我已经坚持了几个星期了,这是 SO question Delphi REST Debugger Returns Error 429 Too Many Requests but Browser Returns JSON as Expected

的后续内容

我想使用 TNetHTTPRequest 和 TNetHTTPClient 组件获取 url 响应的内容。我不断收到 429 个错误“请求太多”。当使用 Firefox Inspect Element 查看网络和存储时,我发现我需要接收 cookie,然后将这些 cookie 与我的请求一起发送。不幸的是,网站内容必不可少的 cookie 之一似乎依赖于(我认为)javascript 的执行。我回到第一原则,在表单 (VCL) 上放置了一个 TWebbrowser,果然浏览器显示了一个 javascript 错误“预期标识符”。

当我在 FMX 中使用 TWebbrowser 时,它不会抛出错误,只是根本不返回网站内容并保持空白。我需要 FMX,因为我将处于跨平台移动环境中。

网址是https://shop.coles.com.au/a/national/home

我使用 Delphi Community Edition 10.3.3 Rio。

该 URL 在商业浏览器 Firefox、Safari、Chrome 甚至 CEF4Delphi 中完美返回。不幸的是,我无法使用 CEF,因为我需要跨平台。

我想知道如何在没有脚本错误的情况下将网站内容返回到浏览器(甚至更好的 NetHTTPClient),以及如何访问浏览器当前的 cookie。

任何帮助将不胜感激。

谢谢,

约翰。

【问题讨论】:

由于缺乏技术细节,很难提供帮助。 @fpiette 你想要什么?我真的很需要帮助,但我不知道你想要什么。你想让我在表单上放置一个浏览器组件和一个按钮,然后以某种方式在此处发布表单供你编译吗?如果没有我,这样做可能会花费更少的时间?你想从我这里得到什么? 为什么还需要加载该页面?您应该访问 Web 服务,而不是 html 页面。 @Olivier 我不确定我是否理解这个问题的性质。访问该页面的原因是允许用户在我的应用程序中与网站无缝交互。至于 HTML ......我也想知道正在与之交互的页面上的内容。如果 HTML 是不可能的,那很好,但我确实需要将网页加载到我的应用程序的浏览器组件中。 应用通常会查询网络服务。该网站是您的合作伙伴吗?他们是否知道您正在开发一个与他们互动的应用程序? 【参考方案1】:

URL 在商业浏览器中完美返回...没有脚本错误以及如何访问浏览器当前的 cookie

如果您检查网络流量(F12 > 网络,然后请求您的 URL)或使用 uMatrix(默认阻止不属于该域的所有内容)您会看到 JS 至少可以一个XHR 到amazonaws.com。单独的 HTTP 传输(由 TNetHTTP* 完成)工作正常,并且您获得的资源与每个 Internet 浏览器获得的资源相同。

然而,你并没有用你得到的东西进行操作(与互联网浏览器相反,它会自动解析 HTML、查看 JS 资源并执行它们)。 TWebbrowser 不是您认为理所当然的事情,很可能是由于安全设置(尝试在其中获取错误控制台,最好再次 F12)。你需要做同样的事情:解析 JS URI 的 HTML 资源,请求这些并执行你得到的,同时仍然提供相同的 cookie 环境。

要执行 JS,您可以使用 Chakra 或 mORMot 或 BESEN。一开始很有挑战性,但是你对 HTTP(包括 cookie)和 JS 引擎了解得越多,你就会越明白为什么“事情在一种情况下工作”而不是在另一种情况下。互联网浏览器是一个非常复杂的软件,而不仅仅是一个下载器,这是有原因的。

根据this,在使用TWebBrowser 时,强制IE11 Quirks 模式可能已经解决了您的问题:

TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);

【讨论】:

非常感谢您提供如此详细的答案。我非常感激。我会看看你提出的所有建议。干杯。

以上是关于Delphi TWebBrowser JavaScript 错误和 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

使用delphi在Android下的TWebbrowser中全屏观看youtube或其他视频时出现问题

从 Delphi 10.3 中的 TWebBrowser OnNavigateError 中提取 StatusCode

Delphi 中TWebBrowser的扩展控件TExWebBrowser

Delphi TWebBrowser JavaScript 错误和 Cookie

如何在 Delphi 10.3.3 中访问 TWebBrowser.Document 时克服内存泄漏

Delphi TWebBrowser[6] 获取网页所有链接(元素)