delphi - 更改来自 Delphi TWebBrowser 的 AJAX 调用的用户代理

标签 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 (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/

相关文章:

delphi - TWebbrowser 大量内存泄漏 : no solution so far

delphi - 在编辑模式下检测 TWebBrowser 中的光标位置

delphi - Turbopower Lockbox3 - 我可以控制 AES-256 加密的初始化向量和填充吗?

mysql - Delphi 7 个人版,MySQL 使用 libmysql.dll + UTF8

delphi - FMX : Fill whole bitmap with a background color

javascript - 如何在谷歌地图的彩色多边形上显示街道编号?

google-maps-api-3 - 单击样式化 map 图标和标签上的事件监听器

javascript - 谷歌地图拖动矩形来选择标记

html - 如何以编程方式从 IE WebBrowser (IHTMLDocument2) 获取已使用的 css 图像列表

delphi - 如何计算一系列编译器的Delphi根目录?