Delphi TWebBrowser JavaScript错误和Cookies

问题描述

我已经坚持了两周,这是SO问题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的执行。我回到第一原理,将TWebbrowser放到窗体(VCL)上,并确保足够的浏览器显示javascript错误“ Expected Identifier”。

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

URL为https://shop.coles.com.au/a/national/home

我使用的是Delphi Community Edition 10.3.3 Rio。

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

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

我们将不胜感激。

谢谢

约翰。

解决方法

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

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

但是,您无法使用所获得的东西进行操作(与Internet浏览器相反,Internet浏览器会自动解析HTML,查看JS资源并执行它们)。 TWebbrowser并非最有可能由于安全性设置而被认为是理所当然的(尝试在其中获得一个错误控制台,最好再次进入F12)。您需要执行以下操作:解析JS URI的HTML资源,请求它们并执行所获得的内容,同时仍然提供相同的cookie环境。

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

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

TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);