首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的浏览器描述PyQt

奇怪的浏览器描述PyQt
EN

Stack Overflow用户
提问于 2012-12-29 22:10:54
回答 2查看 708关注 0票数 2

我试图使用JavaScript获取浏览器描述,得到了奇怪的结果:

代码语言: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:

代码语言:javascript
复制
<!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>

下面是Python/PyQt4 4代码:

代码语言:javascript
复制
#! /usr/bin/env python2.7

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
import sys, signal


class MySettings(QWebPage):
    def userAgentForUrl(self, url):
        return 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0'

class Opener(QWebView):
    def __init__(self):
        QWebView.__init__(self)
        url = QUrl('/home/john-the-ripper/JavaScript/w.html')
        self.setPage(MySettings())
        self.load(url)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    opener = Opener()
    # press Ctrl + C for exit
    if signal.signal(signal.SIGINT, signal.SIG_DFL):
        sys.exit(app.exec_())
    app.exec_()

如您所见,我已经定义了与机器中的用户代理相同的用户代理:

代码语言:javascript
复制
userAgent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0

这里是PyQt4:的结果

,这里是我的原生浏览器Mozila:的结果

所以问题是:

  1. 为什么productSub应用程序是不同的,即使我已经在userAgentForUrl()中定义了它
  2. 为什么当我用PyQt4打开这个页面时,vendorSubApple Computer, Inc.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-30 17:05:47

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

代码语言:javascript
复制
connect(myPage->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
  this, SLOT(tweakNavigatorObject()));

在你的插槽中,执行一些脚本(QWebFrame::),它可以完全重新定义对象。

代码语言:javascript
复制
window.navigator = {
  appCodeName: 'Mozilla',
  appName: 'Netscape',
  vendor: 'My Company'
}

JFYI,这是我在PhantomJS中使用的技巧,它提供了在执行页面脚本之前操纵全局对象的能力,例如,对于操纵Math.random行为和检测用户代理嗅探非常有用。

票数 3
EN

Stack Overflow用户

发布于 2012-12-29 22:27:29

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

实际上,只有appVersionuserAgent字符串是从该头中提取的,其他所有内容都反映了本机浏览器。

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

代码语言:javascript
复制
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头,从Developer菜单。切换它只会改变appVersionuserAgent字符串。例如,切换到Firefox 11.0 — Mac时,只将这两个变量更改为:

代码语言:javascript
复制
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,它的navigator信息非常相似:

代码语言:javascript
复制
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] }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14086376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档