跳转到主要内容

使用多个后端进行移动浏览器功能检测

项目描述

简介

mobile.sniffer是Python框架,用于抽象移动浏览器检测和功能数据库访问。

当为手机渲染网页时,必须处理各种手机特性:不同的屏幕尺寸和形状、不同的支持的文件格式、不同的Web浏览器特性集。此外,知道用户正在手机上浏览对于构建成功的移动网络用户体验至关重要。

mobile.sniffer提供两阶段手机检测(又称嗅探)

  • 移动检测 - 这只是简单地检测浏览器是否基于移动电话。这是在 mobile/sniffer/detect.py 模块中完成的。如果访客使用移动电话访问您的网站,这可以用于将访客从网站重定向到移动网站。

  • 移动电话功能提取 - 在手机数据库中查找与移动网络浏览器用户代理匹配项。由于用户代理字符串中可能存在版本更改、本地品种等,因此应用了启发式算法进行字符串匹配。如果找到数据库条目,并且匹配准确度一定,那么它的记录(如设备屏幕宽度和高度)将提供给网络服务器,以便它可以调整HTML、图像和视频输出,使其适合特定的移动电话。

移动检测可以通过快速的正则表达式匹配来完成。移动电话功能提取始终需要某种类型的移动电话条目数据库,而 mobile.sniffer 框架提供了对这些数据库的抽象。

特性

  • 轻松将移动重定向插件插入到基于Python的网站中

  • 能够从多个嗅探后端源数据,从而实现更好的手机覆盖

  • 自动下载、解析和缓存基于复杂RDF的WAP配置文件

  • 由专业人士设计的非常方便的Python API

  • 开源

  • 单元测试覆盖率

代码与Django、WSGI和Zope/Plone兼容。

支持的嗅探后端

  • Wurfl

  • ApexVertex。可在mFabrik购买。

  • DeviceAtlas。商业可用。

  • WAP配置文件。用户代理发布到他们的WAP配置文件数据链接,这是一个XML文件,由手机制造商维护。(注意:由于WAP协议已弃用,这些在较新的智能手机上不受支持)

安装

mobile.sniffer 作为Python egg在PyPi仓库中分发。

您可以使用标准的Python egg安装方法进行安装

  • easy_install

  • pip

  • buildout

依赖关系

根据您使用的手机数据库,您可能需要安装额外的库

  • Wurfl: pywurlf库python-Levenshtein

  • WAP配置文件: Django(用于数据库抽象)和rdflib

  • Apex Vertex: Django(用于数据库抽象)

使用示例

查询从手机数据库获取的属性没有统一的命名标准。出于历史原因,我们使用DeviceAtlas数据库列名(键)并将它们映射到数据库相关的键。

重定向示例

detect_mobile_browser(user_agent) 将返回 True 或 False,表示是否由移动电话发起HTTP请求。

示例

from mobile.sniffer.detect import  detect_mobile_browser
from mobile.sniffer.utilities import get_user_agent

# Get HTTP_USER_AGENT from HTTP request object
ua = get_user_agent(self.request)
if ua:
    # Apply reg
    if detect_mobile_browser(ua):
        # Redirect the visitor from a web site to a mobile site
        pass
    else:
        # A regular web site visitor
        pass
else:
    # User agent header is missing from HTTP request
    return False

功能提取示例

此示例将使用包含的pywurlf数据库直接运行。

示例

try:
    from mobile.sniffer.wurlf.sniffer import WurlfSniffer

    # Wrapper sniffer instance
    # All start-up delay goes on this line
    sniffer = WurlfSniffer()
except ImportError, e:
    import traceback
    traceback.print_exc()
    logger.exception(e)
    logger.error("Could not import Wurlf sniffer... add pywurfl and python-Lehvenstein to buildout.cfg eggs section")
    sniffer = None

def sniff_request(request):
    """
    @param request: Request can be Django, WSGI or Zope HTTPRequest object
    """

    if not sniffer:
        # We failed to initialize Wurfl
        return None

    user_agent = sniffer.sniff(request)

    if user_agent == None:
        # No match in the handset database,
        return None
    else:
        return user_agent # mobile.sniffer.wurlf.sniffer.UserAgent object


def web_or_mobile(request)
        ua = sniff_request(request)

        # How certain we must be about UA
        # match to make decisions
        # float 0...1, the actual value is UA search algorithm specific
        # We use JaroWinkler as the default algorithm
        certainty_threshold = 0.7

        if ua.get("is_wireless_device") and ua.getCertainty() > certainty_threshold:
                # Mobile code
                pass
        else:
                # Webby code
                pass

Wurfl的匹配过程

由于Wurfl是默认后端,因此对查找UA记录的过程进行了更详细的解释

  • Wurlf数据库通常在启动时加载(慢操作) - 可以将其改为使用延迟初始化模式

  • 搜索算法使用一定的匹配阈值初始化 - 所有低于此阈值的匹配都将被忽略。默认搜索算法是来自Levenshtein Python包的JaroWinkler。

  • 当搜索用户代理时

    • 获取HTTP请求的User-Agent头

    • 遍历数据库中的所有条目

    • 使用搜索算法将此条目与传入的User-Agent进行匹配

      • 第一次搜索使用的是精确字符串匹配(不涉及算法)。在这种情况下,暴露的确定性为1.1。

      • 如果第一次没有匹配,则使用搜索算法进行第二次搜索

    • 如果找到匹配且超过阈值,则返回此用户代理记录

      • 用户代理记录将添加有关匹配准确性的信息(ua.getCertainty()方法公开此信息)

链式示例

使用所有可用的手机信息来源,准确获取设备数据。匹配是在属性级别进行的 - 如果一个数据源缺少属性信息,则尝试下一个数据源。最后,如果手机未知,但发布WAP配置文件信息,则下载并分析该配置文件,以保存供后续请求使用。

示例

from mobile.sniffer.chain import ChainedSniffer
from mobile.sniffer.apexvertex.sniffer import ApexVertexSniffer
from mobile.sniffer.wapprofile.sniffer import WAPProfileSniffer
from mobile.sniffer.deviceatlas.sniffer import DeviceAtlasSniffer

# Create all supported sniffers
da = DeviceAtlasSniffer(da_api_file)
apex = ApexVertexSniffer()
wap = WAPProfileSniffer()

# Preferred order of sniffers
sniffer = ChainedSniffer([apex, da, wap])

ua = sniffer.sniff(request) # Sniff HTTP_USER_AGENT, HTTP_PROFILE and many other fields
property = ua.get("usableDisplayWidth") # This will look up data from all the databases in the chain

自动数据库安装程序

专有手机数据库不会公开其API或数据。mobile.sniffer通过自动安装包装器来解决此问题。此外,这些手机数据库API与开源不兼容,这使得在开源项目中使用它们变得更加困难。您无需每次在新的服务器上部署代码时手动下载和设置大量文件,只需调用一个神奇的Python函数,它将为您处理所有这些。

源代码和问题跟踪

该项目托管在Google Code项目仓库

商业支持和开发

本软件包遵循开源GPL 2许可证。

Web and Mobiel网站提供商业CMS和移动开发支持选项

我们的顶级Python开发者随时准备帮助您解决任何软件开发需求。

作者

mFabrik Research Oy - 招聘Python和Plone专业人士。

变更日志

1.0.0

  • 更新的Wurfl数据库 [miohtama]

0.9.3

  • 拼写成LeveNshtein - 为什么这个人不叫John Doe [miohtama]

0.9.2

  • 拼写成Leveshtein [miohtama]

0.9.1

  • 依赖Levehstein [miohtama]

0.9

  • 主要产品重构 [miohtama]

0.1.1

  • 更新README以描述检测和重定向 [miohtama]

0.1

  • 初始发布

项目详情


下载文件

下载适合您平台的自定义文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

mobile.sniffer-1.0.0.zip (848.5 kB 查看散列值)

上传时间

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面