js获取设备信息

本文介绍了一种通过IP地址获取地理位置信息,并结合百度地图API实现GPS坐标与百度坐标转换的技术,包括时间、操作系统版本、设备信息等参数的获取与处理。
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-2.1.4.min.js"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script>
    <script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
</head>
<body>
<script language="javascript" type="text/javascript" src="http://pv.sohu.com/cityjson?ie=utf-8">
</script>
<script>
var map;
var gpsPoint;
var baiduPoint;
var gpsAddress;
var baiduAddress;


//ip ip地址 字符串
//time 时间 单位秒
//os 操作系统版本
//platform 平台 android or ios
//city 城市
//location = {lng:XX,lnt:XX} 格式
//brand 手机品牌
/* var ip="192.168.1.24";//测试数据
 var time="2015/12/15 下午13:11";
 var os="android 4.4.3";
 var platform="android";
 var city="成都";
 var brand="DOA";
 var lng="250";
 var lnt="140";*/
var ip;
var time;
var os;
var platform;
var city;
var brand;
var lng;
var lnt;

function getLocation() {

    String.prototype.trim = function () {

        return this.replace(/(^\s*)|(\s*$)/g, '');
    }

    var test1 = navigator.userAgent.toLocaleString().split("(");
    var test2 = test1[1].split(")")[0].split(";");
    if (test2[0] == "iPhone") {
        platform = "ios";
        brand = test2[0].trim();
        os = test2[1].split(" ")[3] + " " + test2[1].split(" ")[4].trim();
    } else {
        if (test1.length > 2) {
            var test2 = test1[1].split(")")[0].split(";");
            if (test2.length == 5) {
                os = test2[2].trim();
                //alert(test2[4].split(" ").length)
                platform = test2[2].split(" ")[1];
                //if(test2[4].split(" ")[0]==" "){

                //test2[4].split(" ")[1];
                //}
                if (test2[4].split(" ").length == 4) {
                    brand = (test2[4].split(" ")[1] + " " + test2[4].split(" ")[2]).trim();
                } else {
                    brand = (test2[4].split(" ")[0] + " " + test2[4].split(" ")[1]).trim();
                }
            }
        }
    }


    //时间格式化的方法
    /* Date.prototype.Format = function (fmt) { //author: meizz
     var o = {
     "M+": this.getMonth() + 1, //月份
     "d+": this.getDate(), //日
     "h+": this.getHours(), //小时
     "m+": this.getMinutes(), //分
     "s+": this.getSeconds(), //秒
     "q+": Math.floor((this.getMonth() + 3) / 3), //季度
     "S": this.getMilliseconds() //毫秒
     };
     if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
     for (var k in o)
     if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
     return fmt;
     }
     time =  new Date().Format("yyyy-MM-dd hh:mm");*/

    var d = new Date();
    var sumS = d.getTime();
    time = sumS;

    //根据IP获取城市
    var myCity = new BMap.LocalCity();
    myCity.get(getCityByIP);

    /* alert("当前时间为" + myDate.toLocaleString());
     alert("操作系统版本" + navigator.platform)
     alert("设备其他信息:" + navigator.userAgent);*/
}

function showMap(value) {
    var longitude = value.coords.longitude;
    var latitude = value.coords.latitude;
    map = new BMap.Map("map");
    lng = longitude;
    lnt = latitude;
    gpsPoint = new BMap.Point(longitude, latitude);    // 创建点坐标
    map.centerAndZoom(gpsPoint, 15);

    //根据坐标逆解析地址
    var geoc = new BMap.Geocoder();
    geoc.getLocation(gpsPoint, getCityByCoordinate);

    BMap.Convertor.translate(gpsPoint, 0, translateCallback);

    /*  alert('ip' + ip);
     alert("时间" + time);
     alert('城市' + city);
     alert('操作系统' + os);
     alert('平台' + platform);
     alert("平台长度"+platform.length);
     alert('设备' + brand);
     alert('经度' + lnt)
     alert('纬度' + lng)*/
    $.ajax({
        type: "get",
        async: false,
        url: "http://192.168.1.34:27017" +
                "?ip="
                + encodeURIComponent(ip)
                + "&time=" + encodeURIComponent(time)
                + "&os=" + encodeURIComponent(os)
                + "&platform=" + encodeURIComponent(platform)
                + "&city=" + encodeURIComponent(city)
                + "&brand=" + encodeURIComponent(brand)
                + "&lng=" + encodeURIComponent(lng)
                + "&lnt=" + encodeURIComponent(lnt),
        dataType: "jsonp",
        jsonpCallback: "jsonpCallback",
        scriptCharset: 'UTF-8',

        success: function (data) {
            alert("测试成功")
            window.close();
            console.log(data);
        },
        error: function () {
            alert("测试成功")
            window.opener = null;
            window.open('', '_self');
            window.close();
            console.log('fail');
        }

    });
    function jsonpCallback(data) {
        alert("测试成功")
        window.close();
        console.log(data)
    }

}

translateCallback = function (point) {
    baiduPoint = point;
    var geoc = new BMap.Geocoder();
    geoc.getLocation(baiduPoint, getCityByBaiduCoordinate);
}

function getCityByCoordinate(rs) {
    gpsAddress = rs.addressComponents;
    var address = "GPS标注:" + gpsAddress.province + "," + gpsAddress.city + "," + gpsAddress.district + "," + gpsAddress.street + "," + gpsAddress.streetNumber;
    var marker = new BMap.Marker(gpsPoint);  // 创建标注
    /* map.addOverlay(marker);              // 将标注添加到地图中*/
    var labelgps = new BMap.Label(address, { offset: new BMap.Size(20, -10) });
    /* marker.setLabel(labelgps); //添加GPS标注*/
}

function getCityByBaiduCoordinate(rs) {
    baiduAddress = rs.addressComponents;
    var address = "百度标注:" + baiduAddress.province + "," + baiduAddress.city + "," + baiduAddress.district + "," + baiduAddress.street + "," + baiduAddress.streetNumber;
    /* alert("当前位置为" + address + "附近");*/
    var marker = new BMap.Marker(baiduPoint);  // 创建标注
    map.addOverlay(marker);              // 将标注添加到地图中
    var labelbaidu = new BMap.Label(address, { offset: new BMap.Size(20, -10) });
    marker.setLabel(labelbaidu); //添加百度标注
}

//根据IP获取城市
function getCityByIP(rs) {
    var cityName = rs.name;
    ip = returnCitySN.cip;
    city = cityName;

    //获取GPS坐标
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showMap, handleError, { enableHighAccuracy: true, maximumAge: 1000 });
    } else {
        alert("您的浏览器不支持使用HTML 5来获取地理位置服务");
        window.close();
    }
    var options = {
        enableHighAccuracy: true,
        maximumAge: 10
    }

}

function handleError(value) {
    switch (value.code) {
        case 1:
            alert("位置服务被拒绝");
            break;
        case 2:
            alert("暂时获取不到位置信息");
            break;
        case 3:
            alert("获取信息超时");
            break;
        case 4:
            alert("未知错误");
            break;
    }
    window.close();
}

function init() {
    getLocation();

}

window.onload = init;


</script>

<div id="map"></div>
</body>
</html>


如果你想查看效果,请打开所有的alert()弹出框

<think>我们注意到用户引用了站内的一段JavaScript代码,但该代码是关于登录表单用户名验证的(检查首字符是否为数字),与当前查询的设备编码获取无关。因此我们将忽略该引用的具体内容,专注于用户当前的问题。 用户当前问题:使用JavaScript获取登录设备编码信息的方法。 分析: 设备编码通常指能够唯一标识设备的字符串,常见的有IMEI(手机)、序列号(各种设备)等。但在Web环境中,由于隐私和安全限制,JavaScript无法直接获取设备的硬件编码(如IMEI、序列号)。 然而,我们可以通过一些方法获取设备相关的标识信息,但这些标识通常不是硬件级别的编码,而是基于浏览器或操作系统的生成标识。 常见方法: 1. 使用浏览器指纹:通过收集浏览器和操作系统的各种信息(如用户代理、屏幕分辨率、安装的字体、插件等)生成一个唯一标识。但这不是真正的设备编码,且在不同浏览器或同一浏览器不同配置下可能变化。 2. 使用Web API: - 移动设备上,可以通过`navigator`对象获取部分信息,如`navigator.imei`?但请注意,标准Web API中并没有直接提供IMEI或硬件序列号的属性。 - 实际上,现代浏览器出于隐私考虑,已经移除了许多获取设备唯一标识的接口。 可用的API: - `navigator.userAgent`: 提供用户代理字符串,包含浏览器和操作系统的信息,但无法唯一标识设备。 - 设备内存:`navigator.deviceMemory`,返回设备的大概内存(GB),但同样不是唯一标识。 - 硬件并发数:`navigator.hardwareConcurrency`,返回可用逻辑处理器核心数。 - 屏幕信息:`screen.width`, `screen.height`, `screen.colorDepth`等。 - 插件信息:`navigator.plugins`,列举已安装插件。 - 字体信息:通过CSS字体检测(需要复杂方法)。 - 电池状态API:`navigator.getBattery()`(但已被标记为废弃,且不唯一)。 - 媒体设备信息:`navigator.mediaDevices.enumerateDevices()`可以获取设备标识(deviceId),但需要用户授权(如摄像头或麦克风),且每个域下生成的deviceId是唯一的,但同一个设备在不同域名下生成的deviceId不同,且重置浏览器会改变。 如何生成一个相对稳定的设备标识? 通常使用指纹库,如`fingerprintjs2`或`clientjs`,它们通过组合多个属性生成一个哈希值作为设备标识。 但是,用户要求的是“登录设备编码信息”,可能是希望获取一个硬件级别的唯一编码。在Web环境中,这是不可能的(除非通过浏览器扩展或与本地应用交互)。 替代方案: 1. 如果是在移动设备上,并且是原生WebView环境,那么可以通过原生应用注入设备编码到JavaScript环境(例如通过自定义JavaScript接口)。 2. 使用设备UUID(移动设备):在移动混合应用中(如Cordova/Ionic),可以使用插件获取设备唯一标识(如Cordova插件`cordova-plugin-device`,它提供`device.uuid`)。 3. 在纯Web环境中,无法获取硬件设备编码。 结论: 在纯浏览器JavaScript环境中,无法直接获取硬件设备编码(如IMEI或序列号)。但可以通过生成浏览器指纹来标识设备(相对稳定但不是硬件级别)。 示例代码(使用fingerprintjs2生成指纹): 首先引入库:`<script src="https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs@3/dist/fp.min.js"></script>` 然后: ```javascript // 初始化并获取指纹 FingerprintJS.load() .then(fp => fp.get()) .then(result => { const visitorId = result.visitorId; console.log(visitorId); }); ``` 注意:生成的`visitorId`是基于浏览器指纹的哈希值,同一设备上的不同浏览器、同一浏览器但插件或设置不同,都可能生成不同的值。 因此,回答用户:JavaScript在Web环境中无法直接获取硬件设备编码,但可以生成基于浏览器指纹的标识符。 考虑到用户可能是在移动混合应用环境中,我们可以建议使用Cordova等框架的插件。 生成相关问题: 1. 如何在纯Web环境中生成设备唯一标识? 2. 如何使用Cordova获取设备唯一标识? 3. 浏览器指纹生成有哪些常用库? 4. 如何通过原生WebView向JavaScript传递设备编码? 5. 在移动浏览器中是否有其他方法获取设备信息? 根据用户需求,我们主要回答纯Web环境的方法(指纹生成),并提到混合应用的解决方案。 </think>在Web环境中,JavaScript无法直接获取硬件设备编码(如IMEI、序列号等),但可通过以下方式获取设备相关信息: ### 📱 1. **浏览器指纹(Browser Fingerprinting)** 通过组合设备特征生成唯一标识符: ```javascript async function getDeviceFingerprint() { // 使用指纹库(需引入外部JS) const fpPromise = import('https://openfpcdn.io/fingerprintjs/v3') .then(FingerprintJS => FingerprintJS.load()); const fp = await fpPromise; const result = await fp.get(); return result.visitorId; // 返回设备指纹哈希值 } ``` *特点*: - 基于浏览器/操作系统特征(用户代理、屏幕分辨率、字体等) - 同一设备不同浏览器会生成不同ID - 库推荐:[fingerprintJS](https://github.com/fingerprintjs/fingerprintjs) ### 📶 2. **Web API获取设备信息** ```javascript // 获取基础设备信息 const deviceInfo = { userAgent: navigator.userAgent, // 用户代理字符串 platform: navigator.platform, // 操作系统 cores: navigator.hardwareConcurrency, // CPU核心数 memory: navigator.deviceMemory, // 内存大小(GB) resolution: `${screen.width}x${screen.height}` // 屏幕分辨率 }; ``` *限制*: - 信息较泛,无法精确到单台设备 - `navigator.deviceMemory`仅部分浏览器支持 ### 📲 3. **移动端混合方案(需原生支持)** 在Cordova/Ionic等混合框架中: ```javascript // Cordova插件获取UUID document.addEventListener('deviceready', () => { const uuid = device.uuid; // 依赖cordova-plugin-device console.log("设备ID:", uuid); }); ``` ### ⚠️ **重要注意事项** 1. **隐私限制** - 现代浏览器严格限制硬件标识获取(GDPR/CCPA合规要求)[^1] - 敏感信息需用户明确授权(如摄像头/MAC地址等) 2. **可信环境标识建议** ```mermaid graph TD A[需求场景] --> B{设备标识精度要求} B -->|高精度| C[原生APP+SDK方案] B -->|中低精度| D[浏览器指纹方案] C --> E[Android ID/IDFA] D --> F[指纹库+IP+行为分析] ``` ### 🔍 相关问题 1. 如何提升浏览器指纹的稳定性? 2. 移动端WebView中如何注入设备信息? 3. 符合GDPR的设备标识方案有哪些? 4. 如何区分同一用户的不同设备? [^1]: 浏览器隐私沙盒(Privacy Sandbox)等规范正在逐步淘汰跨站跟踪技术。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值