Javascript 奇怪的浏览器描述PyQt

Javascript 奇怪的浏览器描述PyQt,javascript,python,qt,pyqt,qtwebkit,Javascript,Python,Qt,Pyqt,Qtwebkit,我试图使用JavaScript获取浏览器描述,结果很奇怪: productSub: 20100101 # When I open it with my Mozila FF browser productSub: 20030107 # when I open it with PyQt4 vendorSub: # nothing in here with my Mozila FF vendorSub: Apple Computer, Inc. # with PyQt4 ( even though

我试图使用JavaScript获取浏览器描述,结果很奇怪:

productSub: 20100101 # When I open it with my Mozila FF browser
productSub: 20030107 # when I open it with PyQt4

vendorSub: # nothing in here with my Mozila FF
vendorSub: Apple Computer, Inc. # with PyQt4 ( even though I don't have anything to do with Apple)
这是HTML/JS:

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<p id="myp">Hi</p>

<script>
    body = document.getElementsByTagName('body')[0];
    var nav_div = document.createElement('div');
    nav_div.id = 'nav_div';
    for (para in navigator) {
        var para_p = document.createElement('p');
        var context = document.createTextNode(para + ': ' + navigator[para]);
        para_p.appendChild(context);
        para_p.id = para;
        nav_div.appendChild(para_p);
    }
    body.appendChild(nav_div);
</script>
</body>
</html>
如您所见,我已在我的计算机中定义了与之相同的用户代理:

userAgent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0
以下是PyQt4的结果: 下面是我的原生浏览器Mozila Fire Fox的结果: 因此,问题是:

为什么productSub看起来不同,即使我在userAgentForUrl中定义了它 为什么当我用PyQt4打开此页面时,vendorSub是Apple Computer,Inc。
谁说navigator对象中的信息完全基于UserAgent头?该标头仅用于在检索URL时发送到服务器。是的,navigator对象上的一些值是从当前标题中获取的,但是,正如您所发现的,并非所有的值都是,也不是所有的值都是从当前标题中获取的

事实上,只有appVersion和userAgent字符串来自该头,其他所有内容都反映了本机浏览器

Qt浏览器基于,这是一个Apple项目,因此是供应商字符串。在Safari中运行导航器反射代码时,您可以看到:

geolocation: [object Geolocation]
cookieEnabled: true
language: en-us
productSub: 20030107
product: Gecko
appCodeName: Mozilla
mimeTypes: [object MimeTypeArray]
vendorSub:
vendor: Apple Computer, Inc.
platform: MacIntel
appName: Netscape
appVersion: 5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
plugins: [object PluginArray]
onLine: true
javaEnabled: function javaEnabled() { [native code] }
getStorageUpdates: function getStorageUpdates() { [native code] }
Safari让我也从开发者菜单切换UserAgent头。切换它也只会更改appVersion和userAgent字符串。例如,切换到Firefox 11.0-Mac,只会将这两个变量更改为:

appVersion: 5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
另一个基于WebKit的浏览器是Chrome,它的导航信息非常类似:

geolocation: [object Geolocation]
onLine: true
cookieEnabled: true
vendorSub:
vendor: Google Inc.
productSub: 20030107
product: Gecko
mimeTypes: [object MimeTypeArray]
plugins: [object PluginArray]
platform: MacIntel
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11
language: en-US
appVersion: 5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11
appName: Netscape
appCodeName: Mozilla
doNotTrack: null
javaEnabled: function javaEnabled() { [native code] }
getStorageUpdates: function getStorageUpdates() { [native code] }
webkitStartActivity: function webkitStartActivity() { [native code] }

谁说navigator对象中的信息完全基于UserAgent头?该标头仅用于在检索URL时发送到服务器。是的,navigator对象上的一些值是从当前标题中获取的,但是,正如您所发现的,并非所有的值都是,也不是所有的值都是从当前标题中获取的

事实上,只有appVersion和userAgent字符串来自该头,其他所有内容都反映了本机浏览器

Qt浏览器基于,这是一个Apple项目,因此是供应商字符串。在Safari中运行导航器反射代码时,您可以看到:

geolocation: [object Geolocation]
cookieEnabled: true
language: en-us
productSub: 20030107
product: Gecko
appCodeName: Mozilla
mimeTypes: [object MimeTypeArray]
vendorSub:
vendor: Apple Computer, Inc.
platform: MacIntel
appName: Netscape
appVersion: 5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
plugins: [object PluginArray]
onLine: true
javaEnabled: function javaEnabled() { [native code] }
getStorageUpdates: function getStorageUpdates() { [native code] }
Safari让我也从开发者菜单切换UserAgent头。切换它也只会更改appVersion和userAgent字符串。例如,切换到Firefox 11.0-Mac,只会将这两个变量更改为:

appVersion: 5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
另一个基于WebKit的浏览器是Chrome,它的导航信息非常类似:

geolocation: [object Geolocation]
onLine: true
cookieEnabled: true
vendorSub:
vendor: Google Inc.
productSub: 20030107
product: Gecko
mimeTypes: [object MimeTypeArray]
plugins: [object PluginArray]
platform: MacIntel
userAgent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11
language: en-US
appVersion: 5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11
appName: Netscape
appCodeName: Mozilla
doNotTrack: null
javaEnabled: function javaEnabled() { [native code] }
getStorageUpdates: function getStorageUpdates() { [native code] }
webkitStartActivity: function webkitStartActivity() { [native code] }

一种可能的解决方法是重新定义navigator对象。首先,将页面主框架的信号连接到插槽:

connect(myPage->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
  this, SLOT(tweakNavigatorObject()));
在您的插槽中,执行一些可以完全重新定义对象的脚本,例如

window.navigator = {
  appCodeName: 'Mozilla',
  appName: 'Netscape',
  vendor: 'My Company'
}

仅供参考,这是我在PhantomJS中使用的技巧,它提供了在执行页面脚本之前操纵全局对象的能力,例如对行为和检测非常有用。

一个可能的解决方法是重新定义navigator对象。首先,将页面主框架的信号连接到插槽:

connect(myPage->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
  this, SLOT(tweakNavigatorObject()));
在您的插槽中,执行一些可以完全重新定义对象的脚本,例如

window.navigator = {
  appCodeName: 'Mozilla',
  appName: 'Netscape',
  vendor: 'My Company'
}

仅供参考,这是我在PhantomJS中使用的技巧,它提供了在执行页面脚本之前操纵全局对象的能力,对行为和检测非常有用。

谢谢您的回答。那么,在使用PyQt时,是否有任何方法可以更改供应商、供应商Sub和productSub?比方说,我希望获得与本机浏览器完全相同的输出,是否可以使用PyQt?不需要更改WebKit的源代码,不可以。谢谢您的回答。那么,在使用PyQt时,有没有任何方法可以更改供应商、供应商Sub和productSub?比方说,我想拥有与我的本机浏览器完全相同的输出,可以使用PyQt吗?不需要更改WebKit的源代码,不。非常感谢,这正是我要找的。非常感谢,这正是我要找的