我有一个 Delphi 应用程序,可以在嵌入式 Web 浏览器中加载 Google Maps JavaScript API。它加载的页面如下所示:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style>
#map {
height: 400px;
width: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script>
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {});
}
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?v=3.29&key=~APIKEY~&callback=initMap">
</script>
</body>
</html>
我在 TWebBrowser
中显示如下页面:
str := StringReplace(htmlBase, '~APIKEY~', cMapsAPIKey, []);
if not Assigned(WebBrowser.Document) then
WebBrowser.Navigate('about:blank', '1', '', '', 'User-Agent: Mozilla/5.0');
doc := WebBrowser.Document;
doc.Clear;
doc.Write(str);
doc.Close;
TWebBrowser.Navigate()
将使用我为主页提供的用户代理字符串,但它使用它来加载脚本:
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3)
从 3.29 开始,Google Maps JavaScript API 似乎会检查浏览器的用户代理并显示错误消息:“您正在使用不受支持的浏览器”。对于 3.28 或更低版本,这不是问题。支持浏览器(使用 IE 11),只是发送了错误的用户代理字符串。
在 JavaScript 端,如何在不完全禁用警告的情况下覆盖用户代理检查?在 Delphi 端,有没有办法更改 AJAX 调用的用户代理?
编辑:重写TWebBrowser.Invoke()
让我可以更改所有HTTP请求的用户代理,但它看起来像navigator.userAgent
没有被改变。
最佳答案
您似乎正在使用 VCL 的 TWebBrowser
。每Changing the UA (User Agent) of a TWebBrowser component ,您可以从 TWebBrowser
派生一个新类来重写其 Invoke()
方法,以便在请求 DISPID_AMBIENT_USERAGENT
属性时返回所需的 UserAgent 字符串。然后向浏览器查询其 IOleControl
接口(interface),并调用其 OnAmbientPropertyChange()
方法,向浏览器发出信号,告知 DISPID_AMBIENT_USERAGENT
属性值已更改。文章有完整代码。
为了更好地衡量,在 FMX 的 TWebBrowser
中,每 Change User Agent for FireMonkey TWebBrowser ,在 Android 上,您可以使用辅助类和 RTTI 技巧来访问浏览器的内部 Java WebView
对象并调用其 WebSettings.setUserAgentString()
方法。不确定 Windows,但在 iOS 上,您不能通过 Web 浏览器本身自定义用户代理(除非您破解 FMX 框架来自定义它发送的请求),您必须创建一个包含名为 UserAgent 的项目的字典
并将其注册到全局 standardUserDefaults
字典使用其 registerDefaults()
方法。我不知道你在 Delphi 中是如何做到这一点的。
关于delphi - 更改来自 Delphi TWebBrowser 的 AJAX 调用的用户代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45602445/