问题描述
我已经坚持了两周,这是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至少一个XHR至amazonaws.com
。单独进行HTTP传输(由TNetHTTP*
完成)就可以正常工作,并且您获得与每个Internet浏览器相同的资源。
但是,您无法使用所获得的东西进行操作(与Internet浏览器相反,Internet浏览器也会自动解析HTML,查看JS资源并执行它们)。 TWebbrowser
并非最有可能由于安全性设置而被认为是理所当然的(尝试在其中获得一个错误控制台,最好再次进入F12)。您需要执行以下操作:解析JS URI的HTML资源,请求它们并执行所获得的内容,同时仍然提供相同的cookie环境。
要执行JS,您可以使用Chakra或mORMot或BESEN。起初这是一个挑战,但是您对HTTP(包括cookie)和JS引擎的了解越多,您就会越明白为什么“情况”在一种情况下而不是在另一种情况下起作用。互联网浏览器是一种非常复杂的软件,而不仅仅是下载器,这是有原因的。
根据this,强制使用IE11 Quirks模式可以在使用TWebBrowser
时解决您的问题:
TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);