我要给出的答案不是关于开源项目,但它确实提供了信息,任何正在研究如何解析 HTTP user-agent 字符串以获取device intelligence 的人都会想知道。
WURFL 是一个历史悠久的工具,用于进行用户代理(以及更普遍的 HTTP 请求)分析并获取易于使用的设备/浏览器信息。这是广告技术行业事实上的标准,可以从 HTTP 请求中挤出最后一滴信息,这要归功于专有数据库。在实践中,代码如下所示:
from pywurfl.wurfl import Wurfl
# Create a WURFL Engine. Please note that the installed wurfl.zip path may change.
# for example, on OS X systems, it will be in `/usr/local/share/wurfl/wurfl.zip`
# on Linux systems, it will be in `/usr/share/wurfl/wurfl.zip`.
wurfl = Wurfl('/usr/share/wurfl/wurfl.zip')
# Lookup an HTTP request
http_request = {
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.9",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp",
"user-agent": " Mozilla/5.0 (Linux; Android 10; SM-G981U1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
}
dev = wurfl.parse_headers(http_request)
# You can also lookup a device with just the user-agent string
# dev = wurfl.parse_useragent(user_agent)
# retrieve some properties and capabilities values
# WURFL device ID:
print("device id =", dev.id)
# Some static capabilities:
static_capabilities = ["model_name", "brand_name", "device_os"]
# Retrieve the value of a single static capability:
print("get_capability('model_name') =",
dev.get_capability(static_capabilities[0]))
# Retrieve the value of many static capabilities at once:
print("get_capabilities(static_capabilities) =",
dev.get_capabilities(static_capabilities))
# Some virtual capabilities:
virtual_capabilities = ["complete_device_name", "form_factor"]
# Retrieve the value of a single virtual capability:
print("get_virtual_capability('complete_device_name') =",
dev.get_virtual_capability(virtual_capabilities[0]))
# Retrieve the value of many virtual capabilities at once:
print("get_virtual_capabilities(virtual_capabilities) =",
dev.get_virtual_capabilities(virtual_capabilities))
# Make sure you release the device when you are finished
dev.release()
上面的代码会返回:
device id = samsung_sm_g981u_ver1_subuau1
get_capability('model_name') = SM-G981U1
get_capabilities(static_capabilities) = {'model_name': 'SM-G981U1', 'brand_name': 'Samsung', 'device_os': 'Android'}
get_virtual_capability('complete_device_name') = Samsung SM-G981U1 (Galaxy S20 5G)
get_virtual_capabilities(virtual_capabilities) = {'complete_device_name': 'Samsung SM-G981U1 (Galaxy S20 5G)', 'form_factor': 'Smartphone'}
更多信息可以在here找到。
对于那些想在没有从 ScientiaMobile 获得试用许可证的情况下尝试 WURFL(特别是 PyWURFL)的人,我公司最近发布了一个版本的 WURFL(称为 WURFL 微服务),可以从 AWS 的主要市场获得、Azure 和 GCP(当然除了 ScientiaMobile 本身)。此外,该产品也完全支持 Pythion,尽管语法略有不同,因为该产品依赖于云中的服务器端组件进行更新:
from wmclient import *
try:
client = WmClient.create("http", "localhost", 8080, "")
:
ua = "Mozilla/5.0 (Linux; Android 7.1.1; ONEPLUS A5000 Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) " \
"Chrome/56.0.2924.87 Mobile Safari/537.36 "
client.set_requested_static_capabilities(["brand_name", "model_name"])
client.set_requested_virtual_capabilities(["is_smartphone", "form_factor"])
print()
print("Detecting device for user-agent: " + ua);
# Perform a device detection calling WM server API
device = client.lookup_useragent(ua)
:
# Let's get the device capabilities and print some of them
capabilities = device.capabilities
print("Detected device WURFL ID: " + capabilities["wurfl_id"])
print("Device brand & model: " + capabilities["brand_name"] + " " + capabilities["model_name"])
print("Detected device form factor: " + capabilities["form_factor"])
if capabilities["is_smartphone"] == "true":
完整的示例和对 GitHub 客户端代码的参考可以在 here 找到。
披露:我为提供此处描述的库的公司工作。