browser, 使用 ruby 进行浏览器检测 包含ActionController集成

分享于 

14分钟阅读

GitHub

  繁體 雙語
Do some browser detection with Ruby. Includes ActionController integration.
  • 源代码名称:browser
  • 源代码网址:http://www.github.com/fnando/browser
  • browser源代码文档
  • browser源代码下载
  • Git URL:
    git://www.github.com/fnando/browser.git
    Git Clone代码到本地:
    git clone http://www.github.com/fnando/browser
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/fnando/browser
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    浏览器

    使用 ruby 进行浏览器检测。 包含ActionController集成。

    安装

    gem install browser

    用法

    require"browser"browser =Browser.new("Some User Agent", accept_language:"en-us")# General infobrowser.bot?
    browser.chrome?
    browser.core_media?
    browser.edge? # Newest MS browserbrowser.electron? # Electron Frameworkbrowser.firefox?
    browser.full_version
    browser.ie?
    browser.ie?(6) # detect specific IE versionbrowser.ie?([">8", "<10"]) # detect specific IE (IE9).browser.known? # has the browser been successfully detected?browser.meta # an array with several attributesbrowser.modern? # Webkit, Firefox 17+, IE 9+ and Opera 12+browser.name # readable browser namebrowser.nokia?
    browser.opera?
    browser.opera_mini?
    browser.phantom_js?
    browser.quicktime?
    browser.safari?
    browser.safari_webapp_mode?
    browser.to_s # the meta info joined by spacebrowser.uc_browser?
    browser.version # major version numberbrowser.webkit?
    browser.webkit_full_version
    browser.yandex?
    browser.wechat? # detect the MicroMessenger(WeChat)browser.weibo? # detect Weibo embedded browser (Sina Weibo)# Get bot infobrowser.bot.name
    browser.bot.search_engine?
    browser.bot?# Get device infobrowser.device
    browser.device.id
    browser.device.name
    browser.device.blackberry_playbook?
    browser.device.console?
    browser.device.ipad?
    browser.device.iphone?
    browser.device.ipod_touch?
    browser.device.kindle?
    browser.device.kindle_fire?
    browser.device.mobile?
    browser.device.nintendo?
    browser.device.playstation?
    browser.device.ps3?
    browser.device.ps4?
    browser.device.psp?
    browser.device.silk?
    browser.device.surface?
    browser.device.tablet?
    browser.device.tv?
    browser.device.vita?
    browser.device.wii?
    browser.device.wiiu?
    browser.device.xbox?
    browser.device.xbox_360?
    browser.device.xbox_one?# Get platform infobrowser.platform
    browser.platform.id
    browser.platform.name
    browser.platform.version # e.g. 9 (for iOS9)browser.platform.adobe_air?
    browser.platform.android?
    browser.platform.android?(4.2) # detect Android Jelly Bean 4.2browser.platform.android_app? # detect webview in an Android appbrowser.platform.android_webview? # alias for android_app?browser.platform.blackberry?
    browser.platform.blackberry?(10) # detect specific BlackBerry versionbrowser.platform.chrome_os?
    browser.platform.firefox_os?
    browser.platform.ios? # detect iOSbrowser.platform.ios?(9) # detect specific iOS versionbrowser.platform.ios_app? # detect webview in an iOS appbrowser.platform.ios_webview? # alias for ios_app?browser.platform.linux?
    browser.platform.mac?
    browser.platform.other?
    browser.platform.windows10?
    browser.platform.windows7?
    browser.platform.windows8?
    browser.platform.windows8_1?
    browser.platform.windows?
    browser.platform.windows_mobile?
    browser.platform.windows_phone?
    browser.platform.windows_rt?
    browser.platform.windows_touchscreen_desktop?
    browser.platform.windows_vista?
    browser.platform.windows_wow64?
    browser.platform.windows_x64?
    browser.platform.windows_x64_inclusive?
    browser.platform.windows_xp?

    别名

    要向基本对象( 比如 browser.mobile? ) 添加 mobile?tablet? 等别名,需要使用 browser/aliases 文件,并扩展 Browser::Base 对象,如下所示:

    require"browser/aliases"Browser::Base.include(Browser::Aliases)
    browser =Browser.new("Some user agent")
    browser.mobile? #=> false

    检测到什么?

    定义现代浏览器的内容?

    定义现代浏览器的当前规则相当松散:

    • Webkit
    • IE9 +
    • 微软边缘
    • Firefox 17 +
    • Firefox 平板 14 +
    • Opera 12 +

    你可以定义自己的规则。 规则必须是过程/lambda或者任何实现方法===的对象,并接受浏览器对象。 要重新定义所有规则,请在添加自己的规则之前清除现有规则。

    # Only Chrome Canary is considered modern.Browser.modern_rules.clearBrowser.modern_rules <<-> b { b.chrome? && b.version.to_i >=37 }

    Rails 集成

    只需将它添加到。

    gem"browser"

    这将添加一个名为 browser的helper 方法,用于检查当前的User Agent。

    <%if browser.ie?(6) %> <pclass="disclaimer">You're running an older IE version. Please update it!</p><%end%>

    如果你想在 Rails 应用程序上使用浏览器,但不想污染控制器,请使用以下行:

    gem"browser", require:"browser/browser"

    接受语言

    从HTTP请求解析接受语言头,并生成按质量排序的语言对象的array。

    browser =Browser.new("Some User Agent", accept_language:"en-us")
    browser.accept_language.class#=> Arraylanguage = browser.accept_language.first
    language.code#=>"en"language.region#=>"US"language.full#=>"en-US"language.quality#=> 1.0language.name#=>"English/United States"

    结果始终按质量顺序从最高-> 最低级别排序。 按照HTTP规范:

    • 忽略质量值意味着 1.0.
    • 质量值等于零表示客户端不接受。

    IE

    IE 具有兼容视图模式,允许较新版本的( IE8+ ) 作为旧版本运行。 浏览器将始终返回导航器版本,忽略defined的兼容性视图版本。 如果需要获取引擎版本,则必须使用 Browser#msie_versionBrowser#msie_full_version

    因此,假设用户在IE11浏览器中激活兼容性视图。 这就是你将得到的:

    browser.version#=> 11browser.full_version#=> 11.0browser.msie_version#=> 7browser.msie_full_version#=> 7.0browser.compatibility_view?#=> truebrowser.modern?#=> false

    v1.0.0 中这种行为改变了;以前没有获得真正的浏览器版本的方法。

    Safari

    iOS webviews和web应用程序已经不再检测为 Safari,所以请注意如果这是你的情况。 你可以使用平台和 webkit 检测的组合来完成任何你想要的。

    # iPad's Safari running as web app mode.browser =Browser.new("Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405")
    browser.safari?#=> falsebrowser.webkit?#=> truebrowser.platform.ios?#=> true

    机器人

    用于检测空用户代理的浏览器,但这种行为已经改变。 如果要将这里检测返回,则可以通过以下调用激活该检测:

    Browser::Bot.detect_empty_ua!

    中间件

    你可以使用 Browser::Middleware 重定向用户代理。

    use Browser::Middlewaredo redirect_to "/upgrade"unless browser.modern?end

    如果使用 Rails,则可以使用路由 helper 方法。 只需将以下内容添加到初始值设定项文件( config/initializers/browser.rb )。

    Rails.configuration.middleware.use Browser::Middlewaredo redirect_to upgrade_path unless browser.modern?end

    注意,你可以有多个条件。

    Rails.configuration.middleware.use Browser::Middlewaredonextif browser.bot.search_engine?
     redirect_to upgrade_path(browser:"oldie") if browser.ie? &&!browser.modern?
     redirect_to upgrade_path(browser:"oldfx") if browser.firefox? &&!browser.modern?end

    如果需要访问 Rack::Request 对象( 比如。 要排除路径),可以使用 request 进行。

    Rails.configuration.middleware.use Browser::Middlewaredo redirect_to upgrade_path unless browser.modern? || request.env["PATH_INFO"] =="/exclude_me"end

    迁移到 v2

    故障排除TypeError: no implicit conversion of Hash into String

    类构造函数现在具有不同的签名。 将实例化从 Browser.new(options) 更改为 Browser.new(ua, options),其中:

    • ua: 必须是表示 User Agent的字符串。
    • options: 必须是哈希( 现在它只接受 accept_language 选项)。
    NoMethodError: undefined method 'user_agent'

    .ua 现在可以用来检索完整的User Agent 字符串。

    插件开发

    版本控制

    这里库遵循 http://semver.org

    编写代码

    一旦你做出了伟大的提交( 请包括测试。):

    • fork 浏览器
    • 创建主题分支- git checkout -b my_branch
    • 推到你的分支- git push origin my_branch
    • 创建请求请求
    • 就是这样!

    请遵守缩进规则和代码样式。 使用 2空格,而不是制表符。 不要碰这个版本。

    配置环境

    要配置环境,必须安装 ruby 和 bundler。 然后运行 bundle install 以安装所有依赖项。

    若要运行测试,请执行 ./bin/rake

    添加新功能

    在使用你的时间编码新特性之前,请打开一个票据询问是否有意义,如果它在这个范围内。

    不要忘记向 CHANGELOG.md 添加新条目。

    添加新的bot
    • 将 User Agent 添加到 test/ua_bots.yml
    • 将可以读的NAME 添加到 bots.yml。 关键字必须是 MATCHES 中的User Agent,在无线文本中。
    • 运行测试。

    不要忘记向 CHANGELOG.md 添加新条目。

    添加新的搜索引擎
    • 将 User Agent 添加到 test/ua_search_engines.yml
    • 将相同的User Agent 添加到 test/ua_bots.yml
    • 将可以读的NAME 添加到 search_engines.yml。 关键字必须是 MATCHES 中的User Agent,在无线文本中。
    • 运行测试。

    不要忘记向 CHANGELOG.md 添加新条目。

    错误的browser/platform/device 检测

    如果你知道如何修复它,请按照上面的"编写代码"。 打开问题,请确保你填写了所有需要的信息的问题模板。

    维护者

    贡献者

    许可证

    ( MIT许可证)

    若要在取得该软件副本时免费授予任何人,如有下列条件的软件,请免费授予该软件的副本,并与相关的文档文件('软件') 进行许可,包括不受限制的权利,包括以下条件:

    上述版权声明和本许可声明须包括在所有的副本或实质性部分的软件。

    软件是'是',没有任何保证,表示或者隐含,包括但不限于销售,适合特定用途和 NONINFRINGEMENT。 作者或者版权持有人在合同。侵权或者它的他与软件或者它的他用户交易的行为。


    INT  bro  浏览  act  整合  Detect  
    相关文章