从Delphi TWebBrowser更改AJAX调用的User-Agent

时间:2017-08-10 00:05:53

标签: delphi google-maps-api-3 twebbrowser

我有一个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(兼容; 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似乎正在检查浏览器的用户代理并显示错误消息:&#34;您正在使用不受支持的浏览器&#34;。这不是3.28或更低的问题。支持浏览器(它使用的是IE 11),它只是发送了错误的用户代理字符串。

在JavaScript端,如何在不完全禁用警告的情况下覆盖用户代理检查?在Delphi端,有没有办法改变AJAX调用的用户代理?

修改:覆盖TWebBrowser.Invoke()可让我更改所有HTTP请求的用户代理,但看起来navigator.userAgent未被更改。

2 个答案:

答案 0 :(得分:1)

您似乎在使用VCL&#39; TWebBrowser。根据{{​​1}},您可以从Sub Main AddHandler AppDomain.CurrentDomain.ProcessExit, AddressOf OnClose End Sub Sub OnClose(sender as object, e as EventArgs) 'codeon close End Sub 派生一个新类,以覆盖其TWebBrowser方法,以在请求Invoke()属性时返回所需的UserAgent字符串。然后在浏览器中查询其DISPID_AMBIENT_USERAGENT接口,并调用其IOleControl方法向浏览器发出OnAmbientPropertyChange()属性值已更改的信号。这篇文章有完整的代码。

为了更好地衡量,在FMX的Changing the UA (User Agent) of a TWebBrowser component中,根据TWebBrowser,在Android上,您可以使用辅助类和RTTI技巧来访问浏览器的内部Java {{3对象并调用其Change User Agent for FireMonkey TWebBrowser方法。不确定Windows,但在iOS上,您不能通过Web浏览器本身自定义用户代理(除非您破解FMX框架以自定义它发送的请求),您必须创建一个包含名为{{的项目的字典1}}并使用其WebView方法将其注册到全局WebSettings.setUserAgentString()字典。你是如何在德尔福那样做的,我不知道。

答案 1 :(得分:0)

您的Google地图网页未在TWebBrowser组件中正常加载的问题是因为它在兼容模式下工作。这也是提到用户代理字符串的原因。

为什么会发生这种情况呢。那么TWebBrowser只是Internet Explorer浏览器API的包装器。根据Microsoft的决定,任何使用此类API的应用程序默认情况下都会在兼容模式下显示网页。

您可以使用以下说明禁用此功能: https://stackoverflow.com/a/25843958/3636228