zxdsb666. 发表于 2021-6-7 15:27

如何使用javascript获取浏览器访问信息?

# 如何使用javascript获取浏览器访问信息?

# 前言

​        我们都知道我们进行web请求的时候,使用浏览器是可以获取到当前机器的访问信息的,目前市面上也有不少的工具或者API可以方便快速的获取用户的浏览器动态信息。整个过程比较简单,这里作为一次笔记进行简单记录。

# 需求

​        使用前端的工具或者插件,获取起前端的浏览器信息,在登录的时候,将前端的信息发送到后台数据库进行存储。



# 组件地址:

​        这里主要依赖的组件为fingerprintjs,能获取的内容算是比较详细的,用法也十分简单。

+ fingerprintjs:https://github.com/fingerprintjs/fingerprintjs

> demo地址:https://tczmh.gitee.io/fingerprint2demo/



# 表设计

​        下面根据具体需求构建一张对应的表:

| 字段名                  | 字段说明               | 字段类型 | 字段长度 | 是否为空 | 备注                                                         |
| ------------------------- | ------------------------ | -------- | -------- | -------- | ------------------------------------------------------------ |
| uuid                      | 主键                     | varchar| 255      | 否       | 主键                                                         |
| fingerprint               | 指纹ID                   | varchar| 255      | 是       | 指纹是每次请求的唯一id                                       |
| clientTime                | 请求耗时               | int      | 0      | 是       | 请求耗时                                                   |
| userAgent               | 用户代{过}{滤}理               | varchar| 500      | 是       |                                                            |
| webdriver               | 网络驱动               | varchar| 50       | 是       |                                                            |
| language                  | 语言                     | varchar| 50       | 是       |                                                            |
| colorDepth                | 颜色深度               | varchar| 50       | 是       |                                                            |
| deviceMemory            | 设备内存               | varchar| 50       | 是       |                                                            |
| pixelRatio                | 像素比例               | varchar| 50       | 是       |                                                            |
| hardwareConcurrency       | 硬件并发               | varchar| 50       | 是       | 16                                                         |
| screenResolution          | 屏幕分辨率               | varchar| 50       | 是       | 长,宽                                                       |
| availableScreenResolution | 可用屏幕分辨率         | varchar| 50       | 是       | 长,宽                                                       |
| timezoneOffset            | 时区偏移               | varchar| 50       | 是       |                                                            |
| timezone                  | 时区                     | varchar| 50       | 是       |                                                            |
| sessionStorage            | 是否开启会话存储         | int      | 0      | 是       | boolean,1为true,0为false                                 |
| localStorage            | 是否开启本地存储         | int      | 0      | 是       | boolean,1为true,0为false                                 |
| indexedDb               | 索引的Db               | int      | 0      | 是       | boolean,1为true,0为false                                 |
| addBehavior               | 是否存在增加行为         | int      | 0      | 是       | boolean,1为true,0为false                                 |
| openDatabase            | 是否开启数据库         | int      | 0      | 是       | boolean,1为true,0为false                                 |
| cpuClass                  | cpu类                  | varchar| 50       | 是       | 无案例数据,不明白具体含义                                 |
| platform                  | 平台                     | varchar| 50       | 是       |                                                            |
| doNotTrack                | 不跟踪                   | varchar| 50       | 是       |                                                            |
| plugins                   | 浏览器插件               | textarea | 0      | 是       | Chrome PDF Plugin;Chrome PDF Viewer;Native Client;         |
| canvas                  | 画布                     | textarea | 0      | 是       |                                                            |
| webgl                     | 网页                     | textarea | 0      | 是       |                                                            |
| webglVendorAndRenderer    | webgl供应商和渲染器      | varchar| 1000   | 是       |                                                            |
| adBlock                   | 分贝锁定               | int      | 0      | 是       | boolean,1为true,0为false                                 |
| hasLiedLanguages          | 是否伪造语言             | int      | 0      | 是       | boolean,1为true,0为false                                 |
| hasLiedResolution         | 是否伪造决议             | int      | 0      | 是       | boolean,1为true,0为false                                 |
| hasLiedOs               | 是否伪造os               | int      | 0      | 是       | boolean,1为true,0为false                                 |
| hasLiedBrowser            | 是否伪造浏览器         | int      | 0      | 是       | boolean,1为true,0为false                                 |
| touchSupport            | 触摸支持               | int      | 0      | 是       | 较特殊,使用逗号分割                                       |
| fonts                     | 字体                     | textarea | 0      | 是       | 支持字体                                                   |
| fontsFlash                | 字体Flash                | varchar| 100      | 是       | swf object not loaded                                        |
| audio                     | 媒体                     | varchar| 100      | 是       | 124.0434753                                                |
| enumerateDevices          | 枚举设备               | textarea | 0      | 是       | d=;gid=5fd3caefe1a38ae1bc997527a026ffad                      |
| mineType                  | 浏览器的MIME类型         | int      | 0      | 是       | 1.2.3.4 RFC-822 Standard for ARPA Internet text messages RFC-2045 MIME Part 1: Format of Internet Message Bodies RFC-2046 MIME Part 2: Media Types RFC-2047 MIME Part 3: Header Extensions for Non-ASCII Text RFC-2048 MIME Part 4: Registration Procedures RFC-2049 MIME Part 5: Conformance Criteria and Examples |
| cookieEnable            | 浏览器的是否启用了cookie | int      | 0      | 是       | boolean,1为true,0为false                                 |
| macAddr                   | MAC地址                  | varchar| 50       | 是       | xxxx                                                         |
| ipAddr                  | IP地址                   | varchar| 50       | 是       | xxxxx                                                      |
| systemTime                | 系统时间               | varchar| 200      | 是       | Fri May 28 2021 11:07:46 GMT+0800 (中国标准时间)             |
| enableMediaPalyer         | 是否有MediaPlayer      | int      | 0      | 是       | boolean,1为true,0为false                                 |
| enableRealPlayer          | 是否有realPlayer         | int      | 0      | 是       | boolean,1为true,0为false                                 |
| enableQuickTime         | 是否有quickTime          | int      | 0      | 是       | boolean,1为true,0为false                                 |

下面是对应的**sql-server**的建表sql:

```sql
-- ----------------------------
-- Table structure for browser_frontend_info
-- ----------------------------
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'.') AND type IN ('U'))
        DROP TABLE .
GO

CREATE TABLE . (
varchar(255) COLLATE Chinese_PRC_CI_ASNOT NULL,
varchar(100) COLLATE Chinese_PRC_CI_ASNULL,
intNULL,
text COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
intNULL,
intNULL,
intNULL,
intNULL,
intNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL,
text COLLATE Chinese_PRC_CI_ASNULL,
text COLLATE Chinese_PRC_CI_ASNULL,
text COLLATE Chinese_PRC_CI_ASNULL,
text COLLATE Chinese_PRC_CI_ASNULL,
intNULL,
intNULL,
intNULL,
intNULL,
intNULL,
intNULL,
text COLLATE Chinese_PRC_CI_ASNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL,
text COLLATE Chinese_PRC_CI_ASNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL,
intNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(50) COLLATE Chinese_PRC_CI_ASNULL,
varchar(200) COLLATE Chinese_PRC_CI_ASNULL,
int DEFAULT '' NULL,
intNULL,
intNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL,
varchar(255) COLLATE Chinese_PRC_CI_ASNULL
)
GO

ALTER TABLE . SET (LOCK_ESCALATION = TABLE)
GO

EXEC sp_addextendedproperty
'MS_Description', N'主键',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'uuid'
GO

EXEC sp_addextendedproperty
'MS_Description', N'指纹ID。指纹是每次请求的唯一id',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'fingerprint'
GO

EXEC sp_addextendedproperty
'MS_Description', N'请求耗时',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'clientTime'
GO

EXEC sp_addextendedproperty
'MS_Description', N'用户代{过}{滤}理',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'userAgent'
GO

EXEC sp_addextendedproperty
'MS_Description', N'网络驱动',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'webdriver'
GO

EXEC sp_addextendedproperty
'MS_Description', N'语言',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'language'
GO

EXEC sp_addextendedproperty
'MS_Description', N'颜色深度',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'colorDepth'
GO

EXEC sp_addextendedproperty
'MS_Description', N'设备内存',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'deviceMemory'
GO

EXEC sp_addextendedproperty
'MS_Description', N'像素比例',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'pixelRatio'
GO

EXEC sp_addextendedproperty
'MS_Description', N'硬件并发',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'hardwareConcurrency'
GO

EXEC sp_addextendedproperty
'MS_Description', N'屏幕分辨率',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'screenResolution'
GO

EXEC sp_addextendedproperty
'MS_Description', N'可用屏幕分辨率',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'availableScreenResolution'
GO

EXEC sp_addextendedproperty
'MS_Description', N'时区偏移',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'timezoneOffset'
GO

EXEC sp_addextendedproperty
'MS_Description', N'时区',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'timezone'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否开启会话存储',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'sessionStorage'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否开启本地存储',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'localStorage'
GO

EXEC sp_addextendedproperty
'MS_Description', N'索引的Db',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'indexedDb'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否存在增加行为',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'addBehavior'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否伪造浏览器',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'openDatabase'
GO

EXEC sp_addextendedproperty
'MS_Description', N'cpu类',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'cpuClass'
GO

EXEC sp_addextendedproperty
'MS_Description', N'平台',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'platform'
GO

EXEC sp_addextendedproperty
'MS_Description', N'不跟踪',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'doNotTrack'
GO

EXEC sp_addextendedproperty
'MS_Description', N'浏览器插件',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'plugins'
GO

EXEC sp_addextendedproperty
'MS_Description', N'画布',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'canvas'
GO

EXEC sp_addextendedproperty
'MS_Description', N'网页',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'webgl'
GO

EXEC sp_addextendedproperty
'MS_Description', N'webgl供应商和渲染器',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'webglVendorAndRenderer'
GO

EXEC sp_addextendedproperty
'MS_Description', N'分贝锁定',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'adBlock'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否伪造语言',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'hasLiedLanguages'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否伪造决议',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'hasLiedResolution'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否伪造os',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'hasLiedOs'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否伪造浏览器',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'hasLiedBrowser'
GO

EXEC sp_addextendedproperty
'MS_Description', N'触摸支持',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'touchSupport'
GO

EXEC sp_addextendedproperty
'MS_Description', N'字体',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'fonts'
GO

EXEC sp_addextendedproperty
'MS_Description', N'字体Flash',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'fontsFlash'
GO

EXEC sp_addextendedproperty
'MS_Description', N'媒体',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'audio'
GO

EXEC sp_addextendedproperty
'MS_Description', N'枚举设备',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'enumerateDevices'
GO

EXEC sp_addextendedproperty
'MS_Description', N'浏览器的MIME类型',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'mineType'
GO

EXEC sp_addextendedproperty
'MS_Description', N'浏览器的是否启用了cookie',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'cookieEnable'
GO

EXEC sp_addextendedproperty
'MS_Description', N'MAC地址',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'macAddr'
GO

EXEC sp_addextendedproperty
'MS_Description', N'IP地址',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'ipAddr'
GO

EXEC sp_addextendedproperty
'MS_Description', N'系统时间',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'systemTime'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否有MediaPlayer',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'enableMediaPalyer'
GO

EXEC sp_addextendedproperty
'MS_Description', N'是否有realPlayer',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'enableRealPlayer'
GO

EXEC sp_addextendedproperty
'MS_Description', N'登录类型(1.商户,2.机构)',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'loginType'
GO

EXEC sp_addextendedproperty
'MS_Description', N'商户号',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'merchNo'
GO

EXEC sp_addextendedproperty
'MS_Description', N'用户名',
'SCHEMA', N'dbo',
'TABLE', N'browser_frontend_info',
'COLUMN', N'userName'
GO


-- ----------------------------
-- Primary Key structure for table browser_frontend_info
-- ----------------------------
ALTER TABLE . ADD CONSTRAINT PRIMARY KEY CLUSTERED ()
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON
GO




# 接入案例代码:

​        如果需要正常运行,需要引入对应的三方代码或者ip获取网址,这里用了搜狐的IP信息捕获:

```java
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script type="text/javascript" th:src="@{/js/front/fingerprint2.min.js}"></script>
```

​        下面是针对API使用的简单接入,组装报文JSON:

```javascript
function fingerDefaultConfig(){
    let excludes = {};
    excludes.userAgent = false;
    excludes.audio = false;
    excludes.enumerateDevices = false;
    excludes.fonts = false;
    excludes.fontsFlash = false;
    excludes.webgl = false;
    excludes.canvas = false;
    return excludes;
}

/**
* 获取浏览器信息
*/
function getFingerInfo(){
    const start = new Date().getTime();
    let excludes = fingerDefaultConfig();
    let options = {excludes: excludes};
    var requestParam = {};
    Fingerprint2.get(options, function (components) {
      // 参数
      const values = components.map(function (component) {
            return component.value
      });
      // 指纹
      requestParam['murmur'] = Fingerprint2.x64hash128(values.join(''), 31);
      // 请求耗时
      requestParam['time'] = (new Date().getTime() - start);
      for (const c of components) {
            requestParam] = c['value'];
      }
      // 获取其他模组的参数
      requestParam = otherRequestParam(requestParam);
      requestParam = intenetInfo(requestParam);
      requestParam = timeRequestParam(requestParam);
      requestParam = userRequestParam(requestParam);
      wrapParamAndStart(requestParam);
    });

}

function timeRequestParam(requestParam){
    requestParam['systemTime'] = new Date();
    return requestParam;
}

/**
* 用户信息
*/
function userRequestParam(requestParam){
    var loginType = $("#loginType").find('option:selected').val();
    requestParam['loginType'] = loginType!=null && loginType!=undefined ? parseInt(loginType):1;
    requestParam['merchNo'] = $("#InputMerNo").val()||'';
    requestParam['userName'] = $("#InputUsername").val()||'';
    return requestParam;

}

function otherRequestParam(requestParam){
    var mimeType = navigator.mimeTypes; // 浏览器支持的所有MIME类型的数组
    var cookieEnabled = navigator.cookieEnabled; // 返回用户浏览器是否启用了cookie
    requestParam['mimeType'] = mimeType;
    requestParam['cookieEnabled'] = cookieEnabled;
    requestParam['enableMediaPalyer'] = checkePlugs("MediaPlayer");
    requestParam['enableRealPlayer'] = checkePlugs("RealPlayer");
    requestParam['enableQuickTime'] = checkePlugs("QuickTime");
    return requestParam;
}

/**
* 网络信息获取
* @Param requestParam
*/
function intenetInfo(requestParam){
    requestParam['macAddr'] = returnCitySN["cname"];
    requestParam['ipAddr'] = returnCitySN["cip"];
    return requestParam;
}

//检查是否安装了某插件,如果安装了返回版本号
function checkePlugs(pluginname) {
    var f = "-"
    var plugins = navigator.plugins;
    if (plugins.length > 0) {
      for (i = 0; i < navigator.plugins.length; i++) {
            if (navigator.plugins.name.indexOf(pluginname) >= 0) {
                f = navigator.plugins.description.split(pluginname);
                return f;
                break;
            }
      }
    }
    return false;
}

function wrapParamAndStart(requestParam) {
    start(JSON.stringify(requestParam));
}

/**
* 前端抓取开启,根据使用的模块进行重写或者替换
*/
function start(info) {
    $.ajax({
      url : ROOT+"/front/record",
      type : 'POST',
      // async: false,
      dataType : 'json',
      data : info,
      contentType:'application/json',
      success : function(data) {

      },
      error : function(e) {

      }
    });

}


```

## 运行效果:

![](https://gitee.com/lazyTimes/imageReposity/raw/master/img/20210607151659.png)



# 补充资料:

## 获取前端用户访问信息

​        需要用户手动的开启权限,才可以进行正常的使用或者访问,同时这个对象主要为ie使用。

​        实现方式:

​        `var locator = new ActiveXObject("WbemScripting.SWbemLocator");`

​        参考博客: (http://www.blogjava.net/redhatlinux/archive/2009/02/11/254254.html)



## 获取摄像头信息

摄像头需要用户开启权限方可使用。

+ webcamjs:https://pixlcore.com/demos/webcamjs/demos/basic.html

+ [在网页当中进行拍照](https://crazyhuiliang.gitbooks.io/javascript/content/WebcamJS.html)



WebcamJS 已经在下面的浏览器/系统中进行了测试:

| OS       | Browser   | Notes                                  |
| -------- | ----------- | -------------------------------------- |
| Mac OS X | Chrome 30+| Works -- **Chrome 47+ requires HTTPS** |
| Mac OS X | Firefox 20+ | Works                                  |
| Mac OS X | Safari 6+   | **Requires Adobe Flash Player**      |
| Windows| Chrome 30+| Works -- **Chrome 47+ requires HTTPS** |
| Windows| Firefox 20+ | Works                                  |
| Windows| IE 9      | **Requires Adobe Flash Player**      |
| Windows| IE 10       | **Requires Adobe Flash Player**      |
| Windows| IE 11       | **Requires Adobe Flash Player**      |



## 录音

录音和摄像头信息一样,需要用户的授权。

+ https://github.com/xiangyuecn/Recorder



## 前端信息捕获html:

```html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

    <head>
      <title> New Document </title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">
      <meta name="Generator" content="EditPlus">
      <meta name="Author" content="">
      <meta name="Keywords" content="">
      <meta charset="utf-8" />
      <meta name="Description" content="">
                <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>



      <script id=clientEventHandlersJS language=javascript>
               
               
            /******************************************下为浏览器信息************************************************/
            //获取浏览器相关信息
            function allinfo() {
                var appName = navigator.appName; //浏览器的正式名称
                var appVersion = navigator.appVersion; //浏览器的版本号
                var cookieEnabled = navigator.cookieEnabled; // 返回用户浏览器是否启用了cookie
                var cpuClass = navigator.cpuClass; //返回用户计算机的cpu的型号,通常intel芯片返回"x86"(火狐没有)

                var mimeType = navigator.mimeTypes; // 浏览器支持的所有MIME类型的数组
                var platform = navigator.platform; // 浏览器正在运行的操作系统平台,包括Win16(windows3.x)
                //   Win32(windows98,Me,NT,2000,xp),Mac68K(Macintosh 680x0)
                //   和MacPPC(Macintosh PowerPC)
                var plugins = navigator.plugins; //安装在浏览器上的所有插件的数组
                var userLanguage = navigator.userLanguage; // 用户在自己的操作系统上设置的语言(火狐没有)
                var userAgent = navigator.userAgent; //包含以下属性中所有或一部分的字符串:appCodeName,appName,appVersion,language,platform
                var systemLanguage = navigator.systemLanguage; // 用户操作系统支持的默认语言(火狐没有)

                var info = "<table border=1>";
                var type = "";
                if (isIe()) {
                  type = "IE浏览器";
                } else if (isFireFox()) {
                  type = "火狐浏览器";
                }
                info += "<tr><td>浏览器类型:</td><td>" + type + "</td></tr>";

                info += "<tr><td>浏览器属性信息:</td><td>" + userAgent + "</td></tr>";
                info += "<tr><td>浏览器的正式名称:</td><td>" + appName + "</td></tr>";
                info += "<tr><td>浏览器的版本号:</td><td>" + appVersion + "</td></tr>";
                info += "<tr><td>浏览器的是否启用了cookie:</td><td>" + cookieEnabled + "</td></tr>";
                info += "<tr><td>cpu等级:</td><td>" + cpuClass + "</td></tr>";
                info += "<tr><td>浏览器的MIME类型:</td><td>" + mimeType.length + "</td></tr>";
                info += "<tr><td>系统平台:</td><td>" + platform + "</td></tr>";
                info += "<tr><td>安装的插件:</td><td>" + plugins + "</td></tr>";
                info += "<tr><td>插件的数量:</td><td>" + plugins.length + "</td></tr>";
                info += "<tr><td>插件的名称:</td><td>" + getPluginName() + "</td></tr>";
                info += "<tr><td>用户设置的操作系统语言:</td><td>" + userLanguage + "</td></tr>";
                info += "<tr><td>操作系统支持的默认语言:</td><td>" + systemLanguage + "</td></tr>";
                info += "<tr><td>Director:</td><td>" + checkePlugs("Director") + "</td></tr>";
                info += "<tr><td>javaEnabled:</td><td>" + navigator.javaEnabled() + "</td></tr>";
                info += "<tr><td>是否有quickTime:</td><td>" + checkePlugs("QuickTime") + "</td></tr>";
                info += "<tr><td>flash插件情况:</td><td>" + checkePlugs('Shockwave Flash') + "</td></tr>";
                info += "<tr><td>是否有MediaPlayer:</td><td>" + checkePlugs("MediaPlayer") + "</td></tr>";
                info += "<tr><td>是否有realPlayer:</td><td>" + checkePlugs("RealPlayer") + "</td></tr>";
                info += "<tr><td>屏幕分辨率高度:</td><td>" + window.screen.height + "</td></tr>";
                info += "<tr><td>屏幕分辨率宽度:</td><td>" + window.screen.width + "</td></tr>";
                info += "<tr><td>颜色质量:</td><td>" + window.screen.colorDepth + "位</td></tr>";
                info += "<tr><td>像素:</td><td>" + window.screen.deviceXDPI + "像素/英寸</td></tr>";
                info += "<tr><td>字体是否平滑:</td><td>" + window.screen.fontSmoothingEnabled + "</td></tr>";
                //info += "<tr><td>规定浏览器是否启用数据污点:</td><td>" + navigator.taintEnabled() + "</td></tr>";
                info += "</table>";
                document.getElementById("elInfo").innerHTML = info;
                return info;

                //director

                var appCodeName = navigator.appCodeName; //与浏览器相关的内部代码名
                var appMinorVersion = navigator.appMinorVersion; //辅版本号(通常应用于浏览器的补丁或服务包)

                var language = navigator.language; //浏览器支持的语言 (IE没有)

                var onLine = navigator.onLine; //返回浏览器是否处于在线模式(IE4以上版本)

                var opsProfile = navigator.opsProfile; // 未定义   (IE、火狐没有)

                var oscpu = navigator.oscpu; //浏览器正在运行的操作系统,其中可能有CPU的信息(IE没有)

                var product = navigator.product; // 浏览器的产品名(IE没有)

                var productSub = navigator.productSub; //关于浏览器更多信息(IE没有)

                var securityPolicy = navigator.securityPolicy; // 浏览器支持的加密类型(IE没有)

                var userProfile = navigator.userProfile; //返回一个UserProfile对象,它存储用户的个人信息(火狐没有)

                var vender = navigator.vender; // 浏览器厂商名称(IE、火狐没有)

                var vendorSub = navigator.vendorSub; // 关于浏览器厂商更多的信息

            }
            //获取插件所有的名称
            function getPluginName() {
                var info = "";
                var plugins = navigator.plugins;
                if (plugins.length > 0) {
                  for (i = 0; i < navigator.plugins.length; i++) {
                        info += navigator.plugins.name + ";";
                  }
                }
                return info;
            }
            //检查是否安装了某插件,如果安装了返回版本号
            function checkePlugs(pluginname) {
                var f = "-"
                var plugins = navigator.plugins;
                if (plugins.length > 0) {
                  for (i = 0; i < navigator.plugins.length; i++) {
                        if (navigator.plugins.name.indexOf(pluginname) >= 0) {
                            f = navigator.plugins.description.split(pluginname);
                            return f;
                            break;
                        }
                  }
                }
                return false;
            }
            //判断是否IE
            function isIe() {
                var i = navigator.userAgent.toLowerCase().indexOf("msie");
                return i >= 0;
            }
            //判断是否firefox
            function isFireFox() {
                var i = navigator.userAgent.toLowerCase().indexOf("firefox");
                return i >= 0;
            }





            /******************************************以上为浏览器信息,以下为pc信息************************************************/
            var locator = new ActiveXObject("WbemScripting.SWbemLocator");
            var service = locator.ConnectServer(".");

            function cpuInfo() { //CPU 信息
                var properties = service.ExecQuery("SELECT * FROM Win32_Processor");
                var e = new Enumerator(properties);
                var info = "<table border=1>";
                info += "<trbgcolor='#CDEDED' style='font-weight: bold;' ><td width='450' >CPU 信息</td></tr>";
                for (; !e.atEnd(); e.moveNext()) {
                  var p = e.item();
                  info += "<tr style='color: red'><td >CPU序列号:" + p.ProcessorID + "</td></tr>";
                  info += "<tr><td >" + p.Caption + "</td></tr>";
                  info += "<tr><td >CPU编号:" + p.DeviceID + "</td></tr>";
                  info += "<tr><td >CPU型号:" + p.Name + "</td></tr>";
                  info += "<tr><td >CPU状态:" + p.CpuStatus + "</td></tr>";
                  info += "<tr><td >CPU可用性:" + p.Availability + "</td></tr>";
                  info += "<tr><td >CUP Level:" + p.Level + "</td></tr>";
                  info += "<tr><td >主机名称:" + p.SystemName + "</td></tr>";
                  info += "<tr><td >Processor Type:" + p.ProcessorType + "</td></tr>";
                }
                info += "</table>";
                return info;
            }

            function softDisk() { //软盘信息
                var properties = service.ExecQuery("SELECT * FROM Win32_FloppyDrive");
                var e = new Enumerator(properties);
                var info = "<table border=1>";
                info += "<trbgcolor='#CDEDED' style='font-weight: bold;' ><td width='450'>软盘信息</td></tr>";
                for (; !e.atEnd(); e.moveNext()) {
                  var p = e.item();
                  info += "<tr><td >" + p.Description + "</td></tr>";
                  info += "<tr><td >" + p.DeviceID + "</td></tr>";
                  info += "<tr><td >" + p.Status + "</td></tr>";
                  info += "<tr><td >" + p.Manufacuturer + "</td></tr>";
                }
                info += "</table>";
                return info;
            }

            function RomInfo() { //CD-ROM 信息
                var properties = service.ExecQuery("SELECT * FROM Win32_CDROMDrive");
                var e = new Enumerator(properties);
                var info = "<table border=1>";
                info += "<tr bgcolor='#CDEDED' style='font-weight: bold;'><td width='450' >CD-ROM 信息 </td></tr>";
                for (; !e.atEnd(); e.moveNext()) {
                  var p = e.item();
                  info += "<tr><td >驱动器名称:" + p.Caption + "</td></tr>";
                  info += "<tr><td >描述:" + p.Description + "</td></tr>";
                  info += "<tr><td >盘符:" + p.Drive + "</td></tr>";
                  info += "<tr><td >驱动器状态:" + p.Status + "</td></tr>";
                  info += "<tr><td >是否在使用:" + p.MediaLoaded + "</td></tr>";
                }
                info += "</table>";
                return info;
            }

            function keyBoardInfo() { //键盘信息
                var properties = service.ExecQuery("SELECT * FROM Win32_Keyboard");
                var e = new Enumerator(properties);
                var info = "<table border=1>";
                info += "<trbgcolor='#CDEDED' style='font-weight: bold;'><td width='450'>键盘信息 </td></tr>";
                for (; !e.atEnd(); e.moveNext()) {
                  var p = e.item();
                  info += "<tr><td >键盘描述:" + p.Description + "</td></tr>";
                  info += "<tr><td >键盘名称:" + p.Name + "</td></tr>";
                  info += "<tr><td >键盘状态:" + p.Status + "</td></tr>";
                }
                info += "</table>";
                return info;
            }

            function mainBoard() { //主板信息
                var properties = service.ExecQuery("SELECT * FROM Win32_BaseBoard");
                var e = new Enumerator(properties);
                var info = "<table border=1>";
                info += "<tr bgcolor='#CDEDED' style='font-weight: bold;'><td width='450'>主板信息 </td></tr>";
                for (; !e.atEnd(); e.moveNext()) {
                  var p = e.item();
                  info += "<tr style='color: red'><td >主板ID:" + p.SerialNumber + "</td></tr>";
                  info += "<tr><td >" + p.HostingBoard + "</td></tr>";
                  info += "<tr><td >制造商:" + p.Manufacturer + "</td></tr>";
                  info += "<tr><td >是否开启:" + p.PoweredOn + "</td></tr>";
                  info += "<tr><td >型号:" + p.Product + "</td></tr>";
                  info += "<tr><td >版本:" + p.Version + "</td></tr>";
                }
                info += "</table>";
                return info;
            }

            function disk() { //硬盘序列号 信息
                var properties = service.ExecQuery("SELECT * FROM Win32_DiskDrive");
                var e = new Enumerator(properties);
                var info = "<table border=1>";
                info += "<tr bgcolor='#CDEDED' style='font-weight: bold;' ><td width='450'>硬盘信息 </td></tr>";
                for (; !e.atEnd(); e.moveNext()) {
                  var p = e.item();
                  info += "<tr style='color: red'><td >硬盘序列号:" + p.signature + "</td></tr>";
                }
                info += "</table>";
                return info;
            }
            //获取Ram信息
            function raminfo() {
                var system = new Enumerator(service.ExecQuery("SELECT * FROM Win32_ComputerSystem")).item();

                var physicMenCap = Math.ceil(system.TotalPhysicalMemory / 1024 / 1024);
                //内存信息
                var memory = new Enumerator(service.ExecQuery("SELECT * FROM Win32_PhysicalMemory"));
                for (var mem = [], i = 0; !memory.atEnd(); memory.moveNext()) {
                  mem = {
                        cap: memory.item().Capacity / 1024 / 1024,
                        speed: memory.item().Speed
                  };
                }

                var info = "<table border=1>";
                info += "<tr bgcolor='#CDEDED' style='font-weight: bold;' ><td width='450'>内存信息 </td></tr>";
                info += "<tr style='color: red'><td >内存总量:" + (mem.cap + mem.cap) + "M</td></tr>";
                info += "<tr style='color: red'><td >可用物理内存:" + physicMenCap + "M</td></tr>";
                info += "</table>";
                return info;
            }

            //获取网络连接信息
            function ipinfo() {

                var properties = service.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE");
                var e = new Enumerator(properties);
                var info = "<table border=1>";
                info += "<tr bgcolor='#CDEDED' style='font-weight: bold;' ><td width='450'>网络连接信息:</td></tr>";
                var i = 1;
                for (; !e.atEnd(); e.moveNext()) {
                  var p = e.item();
                  info += "<tr style='color: red'><td >MAC地址" + i + ":" + p.MACAddress + "</td></tr>";
                  info += "<tr style='color: red'><td >IP地址" + i + ":" + p.IPAddress(0) + "</td></tr>";
                  i++;
                }
                info += "</table>";
                return info;
            }
                       
                       
                       
            //获取网络连接信息
            function ipinfo2() {

                var info = "<table border=1>";
                info += "<tr bgcolor='#CDEDED' style='font-weight: bold;' ><td width='450'>网络连接信息:</td></tr>";
               
                  info += "<tr style='color: red'><td >MAC地址"+ ":" + returnCitySN["cname"] + "</td></tr>";
                  info += "<tr style='color: red'><td >IP地址"+ ":" + returnCitySN["cip"] + "</td></tr>";
                  
               
                info += "</table>";
                return info;
            }
                       
                       
            //获取当前时间
            function getDate() {
                                var dt = new Date();
                var info = "<table border=1>";
                info += "<tr bgcolor='#CDEDED' style='font-weight: bold;' ><td width='450'>时间:</td></tr>";
               
                  info += "<tr style='color: red'><td >系统时间"+ ":" + dt + "</td></tr>";
                  
                  
               
                info += "</table>";
                return info;
            }
                       

            function pcInfo() { //所有信息
                               
                var info = ipinfo2();
                               
                                try {
                                                        info += getDate();
                                                        info += cpuinfo();
                                                        info += disk();
                                                        info += raminfo();
                                                        info += mainBoard();
                                                        info += ipinfo();
                                                        info += keyBoardInfo();
                                                        info += RomInfo();
                                                        info += softDisk();
                                }
                                catch(err){
                                       console.log(err) // 可执行
                                }

               

                document.getElementById('elInfo').innerHTML = info;
                return info;
            }



            /******************************************以上为pc信息************************************************/
                       
                       
                       
                       
               
      </script>
               
                <script>
               
               
                       
                       
                       
                       
                       
                       
                       
                       
                       
var info={
    ip:null,
    inner_ip:null,
    intranet: [],
   
    agent:null,
    geo:{
      support:null,
      error_code:null,
      lat:null,
      lon:null,
      address:null,
    },
    cookie:null,
    time:null,
    canvas_id:null,
    selfie:null,
    platform:null,
    device:null,
    window_screen:null,
    blob:null,
    download_speed:null,
};

info.cookie=document.cookie;
info.time=(new Date()).toString();
info.agent=navigator.userAgent;

function ajax(url,foo){
    var xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=function(){
      if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            foo(xmlhttp.responseText);
      };
    };
    xmlhttp.open('GET',url,true);
    xmlhttp.send();
}

function bin2hex(bin){
    var i=0, l=bin.length,chr,hex='';
    for (i; i < l; ++i){
      chr=bin.charCodeAt(i).toString(16);
      hex+=chr.length<2 ? '0'+chr : chr;
    }
    return hex;
}

function detectOS(){
    var sUserAgent=navigator.userAgent;
    var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");

    var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") || (navigator.platform == "Macintosh") || (navigator.platform == "MacIntel");
    if (isMac) return "Mac";

    var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
    if (bIsIpad) return "iPad";
   
    var isUnix = (navigator.platform == "X11") && !isWin && !isMac;
    if (isUnix) return "Unix";
   
    var isLinux = (String(navigator.platform).indexOf("Linux") > -1);
    var bIsAndroid = sUserAgent.toLowerCase().match(/android/i) == "android";
    if (isLinux) {
      if(bIsAndroid) return "Android";
      else return "Linux";
    }

    var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
    if (bIsCE) return "WinCE";

    var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
    if (bIsWM) return "WinMobile";

    if (isWin) {
      var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
      if (isWin2K) return "Win2000";

      var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
      if (isWinXP) return "WinXP";

      var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
      if (isWin2003) return "Win2003";

      var isWinVista= sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
      if (isWinVista) return "WinVista";

      var isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1 || sUserAgent.indexOf("Windows 7") > -1;
      if (isWin7) return "Win7";

      var isWin8 = sUserAgent.indexOf("Windows NT 6.2") > -1 || sUserAgent.indexOf("Windows 8") > -1;
      if (isWin8) return "Win8";
    }

    return "Unknow";
}

function send_info(){
    var jsonText=JSON.stringify(info);
    console.log(jsonText);
}

// 获取屏幕分辨率的宽高,并判断操作系统,设备型号
function device_platform(){
    info.platform=detectOS();
    info.window_screen=String(window.screen.width)+'x'+String(window.screen.height);
}

// 拍照
// Need to request permission
function selfie(){
    window.URL = window.URL || window.webkitURL;
    navigator.getUserMedia=navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

    // 创建video元素
    var video=document.createElement('video'),
    videoObj={'video':true},
    errBack=function(error){
      console.log('Video capture error: ',error.name);
      info.selfie=error.name;
    };

    // 获取媒体
    if(navigator.getUserMedia){
      navigator.getUserMedia(videoObj,function(stream){
            video.src=window.URL.createObjectURL(stream);
            video.play();

            video.onloadedmetadata = function(e) {
                setTimeout(function(){
                  if(info.selfie==null){
                        // 截取图片
                        var canvas=document.createElement('canvas'),
                        ctx=canvas.getContext('2d');
                        canvas.width=640;
                        canvas.height=480;
                        ctx.drawImage(video,0,0,640,480);
                        var image=canvas.toDataURL('image/png');
                        info.selfie=image;
                        console.log('Take selfie successful!');

                        // 关闭摄像头
                        stream.stop();
                        video.src='';
                  };
                },3000);
            };
      },errBack);
    }
}

// 录音
// Need to request permission
function voice_record(){
    window.URL=window.URL || window.webkitURL;
    navigator.getUserMedia=navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
    window.AudioContext=window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;

    var HZRecorder=function(stream,config){
      config=config || {};
      // 采样数8位
      config.sampleBits=config.sampleBits || 8;
      // 采样率(1/6 44100)
      config.sampleRate=config.sampleRate || (44100/6);

      var context=new window.AudioContext();
      var audioInput=context.createMediaStreamSource(stream);
      var recorder=context.createScriptProcessor(4096,1,1);

      var audioData={
            size:0, // 录音文件长度
            buffer:[], // 录音缓存
            inputSampleRate:context.sampleRate, // 输入采样率
            inputSampleBits:16, // 输入采样数位 16
            outputSampleRate:config.sampleRate, // 输出采样率
            oututSampleBits:config.sampleBits, // 输出采样数位 8
            input:function(data){
                this.buffer.push(new Float32Array(data));
                this.size+=data.length;
            },
            //合并压缩
            compress:function(){
                //合并
                var data=new Float32Array(this.size);
                var offset=0;
                for (var i=0; i<this.buffer.length; i++){
                  data.set(this.buffer,offset);
                  offset+=this.buffer.length;
                }
                //压缩
                var compression=parseInt(this.inputSampleRate / this.outputSampleRate);
                var length=data.length / compression;
                var result=new Float32Array(length);
                var index=0,j=0;
                while (index<length){
                  result=data;
                  j+=compression;
                  index++;
                }
                return result;
            },
            encodeWAV:function(){
                var sampleRate=Math.min(this.inputSampleRate, this.outputSampleRate);
                var sampleBits=Math.min(this.inputSampleBits, this.oututSampleBits);
                var bytes=this.compress();
                var dataLength=bytes.length*(sampleBits/8);
                var buffer=new ArrayBuffer(44+dataLength);
                var data=new DataView(buffer);

                // 单声道
                var channelCount=1;
                var offset=0;

                var writeString=function(str){
                  for (var i=0; i<str.length; i++){
                        data.setUint8(offset+i, str.charCodeAt(i));
                  }
                };
               
                // 资源交换文件标识符
                writeString('RIFF'); offset+=4;
                // 下个地址开始到文件尾总字节数,即文件大小-8
                data.setUint32(offset, 36+dataLength, true); offset += 4;
                // WAV文件标志
                writeString('WAVE'); offset+=4;
                // 波形格式标志
                writeString('fmt '); offset+=4;
                // 过滤字节,一般为 0x10 = 16
                data.setUint32(offset, 16, true); offset+=4;
                // 格式类别 (PCM形式采样数据)
                data.setUint16(offset, 1, true); offset+=2;
                // 通道数
                data.setUint16(offset, channelCount, true); offset+=2;
                // 采样率,每秒样本数,表示每个通道的播放速度
                data.setUint32(offset, sampleRate, true); offset+=4;
                // 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8
                data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4;
                // 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8
                data.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;
                // 每样本数据位数
                data.setUint16(offset, sampleBits, true); offset+=2;
                // 数据标识符
                writeString('data'); offset+=4;
                // 采样数据总数,即数据总大小-44
                data.setUint32(offset, dataLength, true); offset+=4;
                // 写入采样数据
                if(sampleBits===8){
                  for (var i=0; i<bytes.length; i++,offset++) {
                        var s=Math.max(-1, Math.min(1, bytes));
                        var val=s<0 ? s*0x8000 : s*0x7FFF;
                        val=parseInt(255 / (65535 / (val+32768)));
                        data.setInt8(offset,val,true);
                  }
                }
                else{
                  for (var i=0; i<bytes.length; i++,offset+=2) {
                        var s=Math.max(-1, Math.min(1, bytes));
                        data.setInt16(offset, s<0 ? s*0x8000 : s*0x7FFF, true);
                  }
                }
                return new Blob(, {type:'audio/wav'});
            }
      };

      // 音频采集
      recorder.onaudioprocess=function(e){
            audioData.input(e.inputBuffer.getChannelData(0));
      }

      // 开始录音
      this.start=function(){
            audioInput.connect(recorder);
            recorder.connect(context.destination);
      }

      // 停止录音
      this.stop=function(){
            stream.stop();
            recorder.disconnect();
      }

      // 获取音频文件
      this.getBlob=function(){
            this.stop();
            return audioData.encodeWAV();
      }
    };

    // 抛出异常
    HZRecorder.throwError=function(message){
      console.log(message);
      throw new function () { this.toString = function () { return message; } }
    }

    // 是否支持录音
    HZRecorder.canRecording=(navigator.getUserMedia != null);

    // 获取录音机
    HZRecorder.get=function (callback,config){
      if (callback){
            if (navigator.getUserMedia){
                navigator.getUserMedia(
                  {audio:true},
                  function (stream){
                        var rec = new HZRecorder(stream, config);
                        callback(rec);
                  },
                  function (error){
                        switch (error.code || error.name) {
                            case 'PERMISSION_DENIED':
                            case 'PermissionDeniedError':
                              HZRecorder.throwError('用户拒绝提供信息');
                              break;
                            case 'NOT_SUPPORTED_ERROR':
                            case 'NotSupportedError':
                              HZRecorder.throwError('浏览器不支持硬件设备');
                              break;
                            case 'MANDATORY_UNSATISFIED_ERROR':
                            case 'MandatoryUnsatisfiedError':
                              HZRecorder.throwError('无法发现指定的硬件设备');
                              break;
                            default:
                              HZRecorder.throwError('无法打开麦克风。异常信息:' + (error.code || error.name));
                              break;
                        }
                  });
            }
            else{
                HZRecorder.throwErr('当前浏览器不支持录音功能。');
                return;
            }
      }
    };

    window.HZRecorder=HZRecorder;

    var recorder;
    HZRecorder.get(function (rec) {
      recorder=rec;
      recorder.start();
    });

    // 录音10s
    setTimeout(function(){
      var blob=recorder.getBlob();
      info.blob=blob;
      console.log('voice record finished.');
    },10000);
}

// DDos攻击
function DDos(site){
    // CSRF
    setInterval(ajax(site,function(){
      console.log('DDos ',site);
    }),50);
}

// 获取IP地址,第一个是内网ip,第二个是外网ip
function getIPs(callback){
    var ip_dups = {};
    var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    var mediaConstraints = {
      optional: [{RtpDataChannel: true}]
    };
    var servers = undefined;
    var i = 0;
    if(window.webkitRTCPeerConnection) servers = {iceServers: [{urls:"stun:stun.services.mozilla.com"}]};
    var pc = new RTCPeerConnection(servers, mediaConstraints);
    pc.onicecandidate = function(ice){
      if(ice.candidate){
            var ip_regex = /({1,3}(\.{1,3}){3})/
            var ip_addr = ip_regex.exec(ice.candidate.candidate);
            if (ip_dups === undefined) callback(ip_addr, i++);
            ip_dups = true;
      }
    };
    pc.createDataChannel("");
    pc.createOffer(function(result){
      pc.setLocalDescription(result, function(){});
    }, function(){});
}

function get_ip_addr(){
    getIPs(function(ip, i){
      if(i == 0) info.inner_ip = ip;
      else if(i == 1) info.ip = ip;
    });
}

// 内网扫描
function intranet_scan(){
    // 常见端口
    var ports = ;
    var body = document.getElementsByTagName("body");

    getIPs(function(ip, id){
      if (id == 0) {
            ip = ip.split(".");
            ip.pop();
            ip = ip.join(".");
            for (var i = 1; i < 255; i++) {
                for (var p of ports) {
                  var script = document.createElement("script");
                  var host = ip + "." + i + ":" + p;
                  script.src = "http://" + host;
                  script.onload = "info.intranet.push('"+host+"')";
                  body.appendChild(script);
                }
            }
      }
    });
}

// 利用canvas定位唯一标识
function canvas_id(){
    var canvas=document.createElement('canvas');
    var ctx=canvas.getContext('2d');
    var txt='http://eular.github.io';
    ctx.textBaseline='top';
    ctx.font="14px 'Arial'";
    ctx.fillStyle='#0ff';
    ctx.fillRect(0,0,140,50);
    ctx.fillStyle='#00f';
    ctx.fillText(txt,2,15);
    ctx.fillStyle='rgba(102,204,0,0.7)';
    ctx.fillText(txt,4,17);

    var b64=canvas.toDataURL().replace('data:image/png;base64,','');
    var bin=atob(b64);
    var crc=bin2hex(bin.slice(-16,-12));
    console.log('Canvas id: '+crc);
    info.canvas_id=crc;
}


// 网络测速
function network_speed(){
    // 图片测速
    var image=new Image();
    // 图片大小: 1232.7kb
    size=1232.7;
    image.src='https://raw.githubusercontent.com/Urinx/browspy/master/screenshot/test.jpg';
    startTime=new Date().getTime();
   
    // 图片加载完毕
    image.onload=function(){
      endTime=new Date().getTime();
      // kb/s
      speed=size/((endTime-startTime)/1000);
      // 保留一位小数
      speed=parseInt(speed*10)/10;
      info.download_speed=speed+'kb/s';
      console.log('Download speed testing finished!');
    }

    /*
    // 音频测速
    var audio=new Audio();
    // 大小: 1.3M
    size=1235.87;
    audio.src='https://raw.githubusercontent.com/Urinx/browspy/master/screenshot/ValderFields.mp3';
    audio.volume=0;
    audio.play();

    startTime=new Date().getTime();

    var timer;
    timer=setInterval(function(){
      if (audio.networkState==1) {
            endTime=new Date().getTime();
            speed=size/((endTime-startTime)/1000);
            speed=parseInt(speed*10)/10;
            info.download_speed=speed+'kb/s';

            console.log('Download speed testing finished!');
            audio.stop();
            clearInterval(timer);
      };
    },100);
    */
}

window.onload=function(){
    device_platform();
    get_ip_addr();
    intranet_scan();
    canvas_id();
    selfie();

    network_speed();
    voice_record();
    //DDos('http://baidu.com');
       
       
        send_info();
};
                </script>

    </head>

    <body>

      <INPUT id="Button1" type="button" value="浏览器所有信息" name="Button1" language=javascript onclick="allinfo()">

      <INPUT id="Button1" type="button" value="客户端pc信息" name="Button1" language=javascript onclick="pcInfo()">

      <div id="elInfo">

      </div>
    </body>

</html>
```

helian147 发表于 2021-6-9 16:36

拿来补环境 hhh

nappywu 发表于 2021-6-22 17:26

学习了,这个我们也研究过
页: [1]
查看完整版本: 如何使用javascript获取浏览器访问信息?