赞
踩
这是一个移动端指纹浏览器项目,我们通过收集需要测试的手机型号的配置,使用虚拟化创建模拟器,再通过代码方式注入到模拟器的浏览器运行时环境,从而达到动态修改浏览器运行时环境的功能,让模拟器里的浏览器环境和真机里的环境保持一致。 这种方式相当于是底层修改了手机配置,能通过任何 js 检测,并且动态注入后,配置在浏览器是永久生效。 通过虚拟化的技术还可以实时动态扩容模拟器,从而实现像云计算那种便捷高效的管理浏览器容器。
核心优势:
多版本指纹浏览器。因为随着 web 的发展 w3c 的标准也会随着变化。对此,我们提供了多版本兼容的指纹浏览器方案。
多架构平台 app。我们提供 arm、arm64、x84_64 等平台的浏览器。当然如果您有需求,我们还可以提供更多。
分布式测试。我们拥有完整的分布式测试的解决方案,让您可以快速、高效的进行大批量数据测试。
客户端 SDK。示例中我们实际是拿一个 json 去注入,这样可能会造成参数格式错误。对此,我们完成了注入项的全部 sdk 功能开发,以确保每个参数的合法性。并且我们还会提供每个参数的详细解释,来确保用户的场景准确性。
动态注入前后对比:
案例中使用的是一台雷电模拟器,模拟器的配置是:4核 + 4GB 的三星机型。因为是在 windows 64 操作系统下,所以检测出来的 navigator.platform 是 Linux x86_64位。 通过注入以下参数,我们让模拟器的运行时环境强制改变。
{
"global.setting-version": "0.1",
"global.setting-timestamp": "1345678768",
"global.disable-settings": "0",
"webgl.vendor": "Qualcomm",
"webgl.renderer": "Adreno (TM) 640",
"navigator.user-agent": "Mozilla/5.0 (Linux; Android 11; ASUS_I005DA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36",
"navigator.webdriver-status": "0",
"navigator.platform": "Linux armv8l",
"navigator.max-touch-points": "5",
"navigator.hardware-concurrency": "8",
"navigator.device-memory": "4",
"navigator.language": "zh",
"navigator.languages": "zh,en",
"battery-manager.charging": "0",
"battery-manager.level": "0.76",
"connection.effective-type": "4g",
"connection.type": "wifi",
"fingerprint.canvas-rand-value": "0.001"
注意:请在使用前配置好设备的运行时环境,比如语言、时间等。
待确认:暂未验证。
通过:通过检测(一般是指:通过专业逻辑检测通过)。
通过(自身):通过自身的检测逻辑(如果以后有专业检测逻辑,还需要通过专业检测逻辑进行检测)。
异常:检测未通过。
暂不处理:暂时不需要处理。
我们通过一个实战案例来展示动态注入浏览器属性的流程(只是展示一些常用的属性,完整版有超过 150 项)。接下来,通过修改以下参数,来对比修改前和修改后的区别。
xu
示例操作我们通过一个实战案例来展示动态注入浏览器属性的流程(只是展示一些常用的属性,完整版有超过 150 项)。接下来,通过修改以下参数,来对比修改前和修改后的区别。
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
生成注入参数
UserAgentUA 里包含的了很多重要的设备相关信息在里面。
navigator = Navigator() \ .set_user_agent( "Mozilla/5.0 (Linux; Android 11; ASUS_I005DA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36") Platform平台,如果是 android 一般都是 Linux a 开头,所以虚拟化的设备一定要改掉这个值。 @unique class Platform(str, Enum): LINUX_ARMV8L = "Linux armv8l" LINUX_ARMV7L = "Linux armv7l" LINUX_ARMV6L = "Linux armv6l" LINUX_AARCH64 = "Linux aarch64" LINUX_X86_64 = "Linux x86_64" LINUX_I686 = "Linux i686" MACINTEL = "MacIntel" WIN32 = "Win32" WIN64 = "Win64" WINCE = "WinCE" SUNOS = "SunOS" IPHONE = "iPhone" IPOD = "iPod" IPAD = "iPad" navigator = Navigator() \ .set_platform(Platform.LINUX_ARMV8L) hardwareConcurrencyCPU 的处理器数量,一般策略会检测是否是常规数值,如果是很大的数值则可能是异常。 navigator = Navigator() \ .set_hardware_concurrency(8) deviceMemory内存大小,一般策略会检测是否是常规数值,如果是很大的数值则可能是异常。 navigator = Navigator() \ .set_device_memory(4) language首选项语言,一般默认是中文 navigator = Navigator() \ .set_language("zh") languages支持的语言 navigator = Navigator() \ .set_languages("zh,en") webdriver是否是自动化测试,这是一个很危险的属性。 该属性的正常值一般分为 2 种,第一种是 false,表示没有启用自动化;一种是 undefined,表示没有该属性。chrome 的 88.0.4324.93 后就有该值了,所以可以强制设置为 false 就行了。当然如果想设置为 undefined 的话,在完整版里有注入 js 这个选项,可以把这个属性给强制删除就行了。还有一种办法就是单独编译一个版本强制把这个属性给删除。 navigator = Navigator() \ .set_webdriver_status(False) maxTouchPoints多点触控点数,移动端一般是 5,电脑端是 1。
@unique class MaxTouchPoint(int, Enum): MOBILE = 5 PC = 1 navigator = Navigator() \ .set_max_touch_points(MaxTouchPoint.MOBILE) charging是否充电中,如果一直插着数据线充电的话,这个值一直是 true。 battery = Battery() \ .set_charging(False) level电量。有效范围 1- 100 battery = Battery() \ .set_level(76) type网络有效类型,一般获取到的是 wifi 和 cellular。 @unique class WebConnectionType(str, Enum): CELLULAR = 'cellular' BLUETOOTH = 'bluetooth' ETHERNET = 'ethernet' WIFI = 'wifi' WIMAX = 'wimax' OTHER = 'other' NONE = 'none' UNKNOWN = 'unknown' network = Network() \ .set_type(WebConnectionType.WIFI) effectiveType网络类型,一般获取到的是 4g。
class WebEffectiveConnectionType(str, Enum): kTypeUnknown = '4g' kTypeOffline = '4g' kTypeSlow2G = 'slow-2g' kType2G = '2g' kType3G = '3g' kType4G = '4g' network = Network() \ .set_effective_type(WebEffectiveConnectionType.kType4G) Canvascanvas 指纹。这个是很多检测项都会去获取的值,这个可以理解成设备的标识符。所以一般都是随机化,在 SDK 里我们已经做好了自动随机化的,只需要调用 auto_canvas_offset 就可以实现自动随机。
fingerprint_offset = FingerprintOffset() \ .set_canvas_offset(0.001) WebGL Vendor显卡供应商 basic = Basic() \ .set_webgl_vendor('Qualcomm') WebGL Renderer显卡型号 basic = Basic() \ .set_webgl_renderer('Adreno (TM) 640') 注入配置最终我们通过以上代码注入的配置如下: { "global.setting-version": "0.1", "global.setting-timestamp": "1345678768", "global.disable-settings": "0", "webgl.vendor": "Qualcomm", "webgl.renderer": "Adreno (TM) 640", "navigator.user-agent": "Mozilla/5.0 (Linux; Android 11; ASUS_I005DA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Mobile Safari/537.36", "navigator.webdriver-status": "0", "navigator.platform": "Linux armv8l", "navigator.max-touch-points": "5", "navigator.hardware-concurrency": "8", "navigator.device-memory": "4", "navigator.language": "zh", "navigator.languages": "zh,en", "battery-manager.charging": "0", "battery-manager.level": "0.76", "connection.effective-type": "4g", "connection.type": "wifi", "fingerprint.canvas-rand-value": "0.001", } |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。