【问题标题】:Change User-Agent for AJAX calls from Delphi TWebBrowser从 Delphi TWebBrowser 更改 AJAX 调用的用户代理
【发布时间】:2017-08-10 00:05:52
【问题描述】:

我有一个 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() 将使用我为主页提供的用户代理字符串,但它使用它来加载脚本:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您似乎正在使用 VCL 的 TWebBrowser。根据Changing the UA (User Agent) of a TWebBrowser component,您可以从TWebBrowser 派生一个新类以覆盖其Invoke() 方法,以便在请求DISPID_AMBIENT_USERAGENT 属性时返回所需的UserAgent 字符串。然后向浏览器查询其IOleControl 接口并调用其OnAmbientPropertyChange() 方法向浏览器发出DISPID_AMBIENT_USERAGENT 属性值已更改的信号。文章有完整代码。

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

    【讨论】:

    • 我刚刚测试过了。看起来覆盖 TWebBrowser 可以更改 HTTP 标头中的用户代理,但 JavaScript navigator.userAgent 仍然获得旧值。
    • 我接受了这个答案,因为它解决了我原来的问题。我已经提交了another question 关于navigator.userAgent 问题。
    【解决方案2】:

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

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

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

    【讨论】:

    • 网页加载正常。 HTML 的第一行&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&gt; 禁用了文档的兼容模式——问题在于用户代理。
    • HTML 的第一行只是告诉浏览器针对哪个浏览器进行了网页优化。但最终由浏览器决定它将在哪种兼容模式下加载网页及其活动内容。所以不幸的是,这条线还不够。
    • 再次,网页加载正常并以 IE 11 模式呈现。唯一的问题是navigator.userAgent 设置为错误的值。
    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多