我已经在这个问题上坚持了几个星期了,这是SO weeks Delphi REST Debugger Returns Error 429 Too Many Requests but Browser Returns JSON as Expected的后续文章
我想使用TNetHTTPRequest和TNetHTTPClient组件获取url响应的内容。我不断收到429个错误“请求太多”。当使用Firefox Inspect元素查看网络和存储时,我发现我需要接收cookie,然后将这些cookie与我的请求一起发送。不幸的是,对网站内容至关重要的cookie之一似乎(我认为)依赖于javascript的执行。我回到了first principles,在表单(VCL)上放了一个TWebbrowser,果然浏览器显示了一个javascript错误“期望的标识符”。
当我在FMX中使用TWebbrowser时,它没有抛出错误,它只是根本不返回网站内容,而是保持空白。我需要FMX,因为我将在一个跨平台的移动环境中。
网址为https://shop.coles.com.au/a/national/home
我使用的是Delphi Community Edition 10.3.3 Rio。
这个网址在火狐、Safari、Chrome甚至CEF4Delphi等商业浏览器中都能完美返回。不幸的是,我不能使用CEF,因为我需要跨平台。
我想知道如何在没有脚本错误的情况下将网站内容返回给浏览器(或者更好的NetHTTPClient),以及如何访问浏览器的最新cookie。
任何帮助都将不胜感激。
谢谢,
约翰。
发布于 2020-09-28 17:44:52
URL在商业浏览器中完全返回...没有脚本错误以及如何访问浏览器的最新cookie
如果你检查网络流量(F12 >网络,然后请求你的网址)或者使用uMatrix (默认情况下阻止所有不属于域的东西),你会看到JS至少做了一次到amazonaws.com的XHR。你单独的超文本传输协议(如TNetHTTP*所做的)可以很好的工作,并且你可以得到与每个互联网浏览器相同的资源。
但是,您不能使用所获得的内容进行操作(与internet浏览器不同,internet浏览器也会自动解析HTML,查看JS资源并执行它们)。TWebbrowser并不是您认为理所当然的,这很可能是由于安全设置(尝试在其中获取错误控制台,最好是再次使用F12 )。您需要执行相同的操作:解析HTML资源中的JS,请求这些URI并执行您得到的内容,同时仍然提供相同的cookie环境。
要执行JS,您可以使用Chakra、mORMot或BESEN。互联网浏览器是一个非常复杂的软件,而不仅仅是一个下载器,这是有原因的。
根据this,强制IE11怪癖模式可能已经在使用TWebBrowser时解决了您的问题
TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);https://stackoverflow.com/questions/64095536
复制相似问题