UNPKG

@ezuikit/utils-collect

Version:

collect utils

483 lines (480 loc) 24.2 kB
!function(global, factory) { "object" == typeof exports && "undefined" != typeof module ? module.exports = factory() : "function" == typeof define && define.amd ? define(factory) : (global = "undefined" != typeof globalThis ? globalThis : global || self).Collect = factory(); }(this, function() { "use strict"; var _window, VariableLibrary, MethodLibrary, LogicLibrary, DeviceInfo = (_window = "undefined" != typeof self ? self : window, VariableLibrary = { navigator: void 0 !== _window.navigator ? _window.navigator : { userAgent: "" }, infoMap: { engine: [ "WebKit", "Trident", "Gecko", "Presto" ], browser: [ "Safari", "Chrome", "Edge", "IE", "Firefox", "Firefox Focus", "Chromium", "Opera", "Vivaldi", "Yandex", "Arora", "Lunascape", "QupZilla", "Coc Coc", "Kindle", "Iceweasel", "Konqueror", "Iceape", "SeaMonkey", "Epiphany", "360", "360SE", "360EE", "UC", "QQBrowser", "QQ", "Baidu", "Maxthon", "Sogou", "LBBROWSER", "2345Explorer", "TheWorld", "XiaoMi", "Quark", "Qiyu", "Wechat", "Taobao", "Alipay", "Weibo", "Douban", "Suning", "iQiYi" ], os: [ "Windows", "Linux", "Mac OS", "Android", "Ubuntu", "FreeBSD", "Debian", "iOS", "Windows Phone", "BlackBerry", "MeeGo", "Symbian", "Chrome OS", "WebOS" ], device: [ "Mobile", "Tablet", "iPad" ] } }, MethodLibrary = { getMatchMap: function(u) { return { Trident: u.includes("Trident") || u.includes("NET CLR"), Presto: u.includes("Presto"), WebKit: u.includes("AppleWebKit"), Gecko: u.includes("Gecko/"), Safari: u.includes("Safari"), Chrome: u.includes("Chrome") || u.includes("CriOS"), IE: u.includes("MSIE") || u.includes("Trident"), Edge: u.includes("Edge"), Firefox: u.includes("Firefox") || u.includes("FxiOS"), "Firefox Focus": u.includes("Focus"), Chromium: u.includes("Chromium"), Opera: u.includes("Opera") || u.includes("OPR"), Vivaldi: u.includes("Vivaldi"), Yandex: u.includes("YaBrowser"), Arora: u.includes("Arora"), Lunascape: u.includes("Lunascape"), QupZilla: u.includes("QupZilla"), "Coc Coc": u.includes("coc_coc_browser"), Kindle: u.includes("Kindle") || u.includes("Silk/"), Iceweasel: u.includes("Iceweasel"), Konqueror: u.includes("Konqueror"), Iceape: u.includes("Iceape"), SeaMonkey: u.includes("SeaMonkey"), Epiphany: u.includes("Epiphany"), 360: u.includes("QihooBrowser") || u.includes("QHBrowser"), "360EE": u.includes("360EE"), "360SE": u.includes("360SE"), UC: u.includes("UC") || u.includes(" UBrowser"), QQBrowser: u.includes("QQBrowser"), QQ: u.includes("QQ/"), Baidu: u.includes("Baidu") || u.includes("BIDUBrowser"), Maxthon: u.includes("Maxthon"), Sogou: u.includes("MetaSr") || u.includes("Sogou"), LBBROWSER: u.includes("LBBROWSER"), "2345Explorer": u.includes("2345Explorer"), TheWorld: u.includes("TheWorld"), XiaoMi: u.includes("MiuiBrowser"), Quark: u.includes("Quark"), Qiyu: u.includes("Qiyu"), Wechat: u.includes("MicroMessenger"), Taobao: u.includes("AliApp(TB"), Alipay: u.includes("AliApp(AP"), Weibo: u.includes("Weibo"), Douban: u.includes("com.douban.frodo"), Suning: u.includes("SNEBUY-APP"), iQiYi: u.includes("IqiyiApp"), Windows: u.includes("Windows"), Linux: u.includes("Linux") || u.includes("X11"), "Mac OS": u.includes("Macintosh"), Android: u.includes("Android") || u.includes("Adr"), Ubuntu: u.includes("Ubuntu"), FreeBSD: u.includes("FreeBSD"), Debian: u.includes("Debian"), "Windows Phone": u.includes("IEMobile") || u.includes("Windows Phone"), BlackBerry: u.includes("BlackBerry") || u.includes("RIM"), MeeGo: u.includes("MeeGo"), Symbian: u.includes("Symbian"), iOS: u.includes("like Mac OS X"), "Chrome OS": u.includes("CrOS"), WebOS: u.includes("hpwOS"), Mobile: u.includes("Mobi") || u.includes("iPh") || u.includes("480"), Tablet: u.includes("Tablet") || u.includes("Nexus 7"), iPad: u.includes("iPad") }; }, matchInfoMap: function(_this) { var _VariableLibrary_navigator, u = (null == (_VariableLibrary_navigator = VariableLibrary.navigator) ? void 0 : _VariableLibrary_navigator.userAgent) || "", match = MethodLibrary.getMatchMap(u); for (var s in VariableLibrary.infoMap) for (var i = 0; i < VariableLibrary.infoMap[s].length; i++) { var value = VariableLibrary.infoMap[s][i]; match[value] && (_this[s] = value); } }, getOS: function() { return MethodLibrary.matchInfoMap(this), null == this ? void 0 : this.os; }, getOSVersion: function() { var u = VariableLibrary.navigator.userAgent || ""; this.osVersion = ""; var osVersion = { Windows: function() { var v = u.replace(/^.*Windows NT ([\d.]+);.*$/, "$1"); return { 6.4: "10", 6.3: "8.1", 6.2: "8", 6.1: "7", "6.0": "Vista", 5.2: "XP", 5.1: "XP", "5.0": "2000" }[v] || v; }, Android: function() { return u.replace(/^.*Android ([\d.]+);.*$/, "$1"); }, iOS: function() { return u.replace(/^.*OS ([\d_]+) like.*$/, "$1").replace(/_/g, "."); }, Debian: function() { return u.replace(/^.*Debian\/([\d.]+).*$/, "$1"); }, "Windows Phone": function() { return u.replace(/^.*Windows Phone( OS)? ([\d.]+);.*$/, "$2"); }, "Mac OS": function() { return u.replace(/^.*Mac OS X ([\d_]+).*$/, "$1").replace(/_/g, "."); }, WebOS: function() { return u.replace(/^.*hpwOS\/([\d.]+);.*$/, "$1"); } }; return "function" == typeof osVersion[this.os] && (this.osVersion = osVersion[this.os](), this.osVersion == u && (this.osVersion = "")), this.osVersion; }, getOrientationStatu: function() { return window.matchMedia("(orientation: portrait)").matches ? "vertical" : "horizontal"; }, getDeviceType: function() { return this.device = "PC", MethodLibrary.matchInfoMap(this), this.device; }, getNetwork: function() { var _this, _navigator, _navigator1, _navigator2; return null == (_this = (null == (_navigator = navigator) ? void 0 : _navigator.connection) || (null == (_navigator1 = navigator) ? void 0 : _navigator1.mozConnection) || (null == (_navigator2 = navigator) ? void 0 : _navigator2.webkitConnection)) ? void 0 : _this.effectiveType; }, getLanguage: function() { var _VariableLibrary_navigator, _VariableLibrary_navigator1, arr; return this.language = ((arr = ((null == (_VariableLibrary_navigator = VariableLibrary.navigator) ? void 0 : _VariableLibrary_navigator.browserLanguage) || (null == (_VariableLibrary_navigator1 = VariableLibrary.navigator) ? void 0 : _VariableLibrary_navigator1.language)).split("-"))[1] && (arr[1] = arr[1].toUpperCase()), arr.join("_")), this.language; }, createFingerprint: function(domain) { var canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"), txt = domain || window.location.host; ctx.textBaseline = "top", ctx.font = "14px 'Arial'", ctx.fillStyle = "#f60", ctx.fillRect(125, 1, 62, 20), ctx.fillStyle = "#069", 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,", ""); return function(s) { var i, l, n, o = ""; for (i = 0, l = (s += "").length; i < l; i++) o += (n = s.charCodeAt(i).toString(16)).length < 2 ? "0" + n : n; return o; }(atob(b64).slice(-16, -12)); }, getBrowserInfo: function() { MethodLibrary.matchInfoMap(this); var u = VariableLibrary.navigator.userAgent || "", _mime = function(option, value) { var mimeTypes = VariableLibrary.navigator.mimeTypes; for (var key in mimeTypes) if (mimeTypes[key][option] == value) return !0; return !1; }, match = MethodLibrary.getMatchMap(u), is360 = !1; if (_window.chrome) { var chrome_vision = u.replace(/^.*Chrome\/([\d]+).*$/, "$1"); +chrome_vision > 36 && _window.showModalDialog ? is360 = !0 : +chrome_vision > 45 && (is360 = _mime("type", "application/vnd.chromium.remoting-viewer")); } if (match.Baidu && match.Opera && (match.Baidu = !1), match.Mobile && (match.Mobile = !u.includes("iPad")), is360 && (_mime("type", "application/gameplugin") || VariableLibrary.navigator && void 0 === VariableLibrary.navigator.connection.saveData ? match["360SE"] = !0 : match["360EE"] = !0), match.IE || match.Edge) switch (window.screenTop - window.screenY) { case 71: case 74: case 99: case 75: case 105: break; case 102: match["360EE"] = !0; break; case 104: match["360SE"] = !0; } var browerVersionMap = { Safari: function() { return u.replace(/^.*Version\/([\d.]+).*$/, "$1"); }, Chrome: function() { return u.replace(/^.*Chrome\/([\d.]+).*$/, "$1").replace(/^.*CriOS\/([\d.]+).*$/, "$1"); }, IE: function() { return u.replace(/^.*MSIE ([\d.]+).*$/, "$1").replace(/^.*rv:([\d.]+).*$/, "$1"); }, Edge: function() { return u.replace(/^.*Edge\/([\d.]+).*$/, "$1"); }, Firefox: function() { return u.replace(/^.*Firefox\/([\d.]+).*$/, "$1").replace(/^.*FxiOS\/([\d.]+).*$/, "$1"); }, "Firefox Focus": function() { return u.replace(/^.*Focus\/([\d.]+).*$/, "$1"); }, Chromium: function() { return u.replace(/^.*Chromium\/([\d.]+).*$/, "$1"); }, Opera: function() { return u.replace(/^.*Opera\/([\d.]+).*$/, "$1").replace(/^.*OPR\/([\d.]+).*$/, "$1"); }, Vivaldi: function() { return u.replace(/^.*Vivaldi\/([\d.]+).*$/, "$1"); }, Yandex: function() { return u.replace(/^.*YaBrowser\/([\d.]+).*$/, "$1"); }, Arora: function() { return u.replace(/^.*Arora\/([\d.]+).*$/, "$1"); }, Lunascape: function() { return u.replace(/^.*Lunascape[\/\s]([\d.]+).*$/, "$1"); }, QupZilla: function() { return u.replace(/^.*QupZilla[\/\s]([\d.]+).*$/, "$1"); }, "Coc Coc": function() { return u.replace(/^.*coc_coc_browser\/([\d.]+).*$/, "$1"); }, Kindle: function() { return u.replace(/^.*Version\/([\d.]+).*$/, "$1"); }, Iceweasel: function() { return u.replace(/^.*Iceweasel\/([\d.]+).*$/, "$1"); }, Konqueror: function() { return u.replace(/^.*Konqueror\/([\d.]+).*$/, "$1"); }, Iceape: function() { return u.replace(/^.*Iceape\/([\d.]+).*$/, "$1"); }, SeaMonkey: function() { return u.replace(/^.*SeaMonkey\/([\d.]+).*$/, "$1"); }, Epiphany: function() { return u.replace(/^.*Epiphany\/([\d.]+).*$/, "$1"); }, 360: function() { return u.replace(/^.*QihooBrowser\/([\d.]+).*$/, "$1"); }, "360SE": function() { return { 63: "10.0", 55: "9.1", 45: "8.1", 42: "8.0", 31: "7.0", 21: "6.3" }[+u.replace(/^.*Chrome\/([\d]+).*$/, "$1")] || ""; }, "360EE": function() { return { 69: "11.0", 63: "9.5", 55: "9.0", 50: "8.7", 30: "7.5" }[+u.replace(/^.*Chrome\/([\d]+).*$/, "$1")] || ""; }, Maxthon: function() { return u.replace(/^.*Maxthon\/([\d.]+).*$/, "$1"); }, QQBrowser: function() { return u.replace(/^.*QQBrowser\/([\d.]+).*$/, "$1"); }, QQ: function() { return u.replace(/^.*QQ\/([\d.]+).*$/, "$1"); }, Baidu: function() { return u.replace(/^.*BIDUBrowser[\s\/]([\d.]+).*$/, "$1"); }, UC: function() { return u.replace(/^.*UC?Browser\/([\d.]+).*$/, "$1"); }, Sogou: function() { return u.replace(/^.*SE ([\d.X]+).*$/, "$1").replace(/^.*SogouMobileBrowser\/([\d.]+).*$/, "$1"); }, LBBROWSER: function() { return { 57: "6.5", 49: "6.0", 46: "5.9", 42: "5.3", 39: "5.2", 34: "5.0", 29: "4.5", 21: "4.0" }[+navigator.userAgent.replace(/^.*Chrome\/([\d]+).*$/, "$1")] || ""; }, "2345Explorer": function() { return u.replace(/^.*2345Explorer\/([\d.]+).*$/, "$1"); }, TheWorld: function() { return u.replace(/^.*TheWorld ([\d.]+).*$/, "$1"); }, XiaoMi: function() { return u.replace(/^.*MiuiBrowser\/([\d.]+).*$/, "$1"); }, Quark: function() { return u.replace(/^.*Quark\/([\d.]+).*$/, "$1"); }, Qiyu: function() { return u.replace(/^.*Qiyu\/([\d.]+).*$/, "$1"); }, Wechat: function() { return u.replace(/^.*MicroMessenger\/([\d.]+).*$/, "$1"); }, Taobao: function() { return u.replace(/^.*AliApp\(TB\/([\d.]+).*$/, "$1"); }, Alipay: function() { return u.replace(/^.*AliApp\(AP\/([\d.]+).*$/, "$1"); }, Weibo: function() { return u.replace(/^.*weibo__([\d.]+).*$/, "$1"); }, Douban: function() { return u.replace(/^.*com.douban.frodo\/([\d.]+).*$/, "$1"); }, Suning: function() { return u.replace(/^.*SNEBUY-APP([\d.]+).*$/, "$1"); }, iQiYi: function() { return u.replace(/^.*IqiyiVersion\/([\d.]+).*$/, "$1"); } }; return this.browserVersion = "", browerVersionMap[this.browser] && (this.browserVersion = browerVersionMap[this.browser](), this.browserVersion == u && (this.browserVersion = "")), "Edge" == this.browser && (this.engine = "EdgeHTML"), "Chrome" == this.browser && parseInt(this.browserVersion) > 27 && (this.engine = "Blink"), "Opera" == this.browser && parseInt(this.browserVersion) > 12 && (this.engine = "Blink"), "Yandex" == this.browser && (this.engine = "Blink"), this.browser + " (version: " + this.browserVersion + "; kernel: " + this.engine + ")"; } }, LogicLibrary = { DeviceInfoObj: function(params) { var _VariableLibrary_navigator, _loop = function(i) { var _params_info; null == (_params_info = params.info) || _params_info.forEach(function(item) { item.toLowerCase() === i.toLowerCase() && (infoTemp[i] = info[i]); }); }; params = params || { domain: "" }; var info = { deviceType: MethodLibrary.getDeviceType(), OS: MethodLibrary.getOS(), OSVersion: MethodLibrary.getOSVersion(), sh: _window.screen.height, sw: _window.screen.width, lang: MethodLibrary.getLanguage(), netWork: MethodLibrary.getNetwork(), orientation: MethodLibrary.getOrientationStatu(), browserInfo: MethodLibrary.getBrowserInfo(), fingerprint: MethodLibrary.createFingerprint(params.domain), userAgent: null == (_VariableLibrary_navigator = VariableLibrary.navigator) ? void 0 : _VariableLibrary_navigator.userAgent }; if (!params.info || 0 === params.info.length) return info; var infoTemp = {}; for (var i in info) _loop(i); return infoTemp; } }, { getDeviceInfo: function(params) { return LogicLibrary.DeviceInfoObj(params); } }), TaskQueue = function() { function TaskQueue() {} return TaskQueue.add = function(url, data) { TaskQueue.queues.push({ url: url, data: data }); }, TaskQueue.fire = function() { if (TaskQueue.queues && 0 !== TaskQueue.queues.length) { TaskQueue.isStop = !1; var item = TaskQueue.queues[0]; item.url && TaskQueue.api.report(item.data), TaskQueue.queues.splice(0, 1), TaskQueue.fire(); } else TaskQueue.isStop = !0; }, TaskQueue; }(); TaskQueue.isStop = !0, TaskQueue.queues = []; var API = function() { function API(url) { this.url = url; } var _proto = API.prototype; return _proto.report = function(data) { this.checkUrl(this.url) && this.sendInfo(data); }, _proto.sendInfo = function(data) { var _navigator; "function" == typeof (null == (_navigator = navigator) ? void 0 : _navigator.sendBeacon) ? this.sendBeacon(this.url, data) : this.sendImage(this.url, data); }, _proto.sendImage = function(url, data) { var paramsStr = this.changeJSON2Query(data), img = new Image; img.onload = img.onerror = function() { img = null; }, img.src = url + "?" + paramsStr + "&random=" + Math.random(); }, _proto.sendBeacon = function(url, data) { try { navigator.sendBeacon(url, this.formatParamsByURLSearchParams(data)); } catch (error) {} }, _proto.formatParamsByURLSearchParams = function(data) { var form = new URLSearchParams; for (var name in data) "object" == typeof data[name] && (data[name] = JSON.stringify(data[name])), form.append(name, data[name]); return form; }, _proto.changeJSON2Query = function(data) { var args = ""; for (var i in data) { "" != args && (args += "&"); var item = data[i]; args += i + "=" + encodeURIComponent("object" == typeof item ? JSON.stringify(item) : item); } return args; }, _proto.checkUrl = function(url) { return !!url && /^[hH][tT][tT][pP]([sS]?):\/\//.test(url); }, API; }(); function _extends() { return _extends = Object.assign || function(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); } return target; }, _extends.apply(this, arguments); } return function() { function Collect(options) { this.options = options, this.extendsInfo = options.extendsInfo || {}, this.clientInfo = this._getDeviceInfo(), TaskQueue.api = new API(options.url), this.changeUrl = this.changeUrl.bind(this); } var _proto = Collect.prototype; return _proto.changeUrl = function(url) { TaskQueue.api = new API(url); }, _proto.send = function(params) { return this.options.forbidden || "object" != typeof params || (this._handleRecordError(params), TaskQueue.isStop && TaskQueue.fire()), this; }, _proto.setForbidden = function(forbidden) { this.options.forbidden = forbidden; }, _proto.updateExtendsInfo = function(params) { void 0 === params && (params = {}), this.extendsInfo = _extends({}, this.extendsInfo || {}, params); }, _proto._handleRecordError = function(params) { try { var errorInfo = this._handleErrorInfo(params); TaskQueue.add(this.options.url, errorInfo); } catch (error) {} }, _proto._handleErrorInfo = function(params) { var extendsInfo = this._getExtendsInfo(), recordInfo = _extends({ st: (new Date).getTime() }, extendsInfo, params); return recordInfo.clientInfo = this.clientInfo, recordInfo; }, _proto._getExtendsInfo = function() { try { var dynamicParams, ret = {}, extendsInfo = this.extendsInfo || {}; for (var key in "function" == typeof extendsInfo.getDynamic && (dynamicParams = extendsInfo.getDynamic()), "[object Object]" === Object.prototype.toString.call(dynamicParams) && (extendsInfo = _extends({}, extendsInfo, dynamicParams)), extendsInfo) "function" != typeof extendsInfo[key] && (ret[key] = extendsInfo[key]); return ret; } catch (error) { return {}; } }, _proto._getDeviceInfo = function() { try { var deviceInfo = DeviceInfo.getDeviceInfo(); return JSON.stringify(deviceInfo); } catch (error) { return ""; } }, Collect; }(); });