ctc-track-plugin
Version:
uniapp 小程序埋点劫持
1 lines • 21.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/bury.ts","../src/common/router.ts","../src/common/device.ts"],"sourcesContent":["/**\r\n * 埋点工具模块,提供页面埋点、批量处理埋点数据以及自动埋点功能。\r\n * 包含以下功能:\r\n * - 获取页面标题的工具函数。\r\n * - 批量处理埋点数据的类,支持定时或按批次大小自动发送埋点数据。\r\n * - Vue插件,用于拦截页面跳转并发送埋点数据。\r\n * - 发送埋点数据的工具函数。\r\n */\r\n\r\nimport type { App, Plugin } from 'vue';\r\nimport { getCurrentPageInfo } from '@/common/device';\r\n// import pagesJson from '@/pages.json';\r\nimport type { PageMetaDatum, SubPageMetaDatum, PagesConfig } from '@uni-helper/vite-plugin-uni-pages';\r\nimport { Md5 } from 'ts-md5';\r\n\r\nconst trackCountObj = {\r\n trackCount: 1,\r\n};\r\n\r\n/**\r\n * timestamp 格式化为 2021-10-09 10:20:50 形式。\r\n * @returns 返回格式化的时间戳 \r\n */\r\nconst formatTime = () => {\r\n const now = new Date();\r\n\r\n // 获取时间\r\n const year = now.getFullYear();\r\n const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始需+1\r\n const day = String(now.getDate()).padStart(2, '0');\r\n const hours = String(now.getHours()).padStart(2, '0');\r\n const minutes = String(now.getMinutes()).padStart(2, '0');\r\n const seconds = String(now.getSeconds()).padStart(2, '0');\r\n\r\n // 组合成目标格式\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取当前用户唯一traceId\r\n * @returns\r\n */\r\nconst getTraceId = () =>\r\n uni.getSystemInfoSync().deviceId +\r\n new Date().getTime() +\r\n Math.floor(Math.random() * 9000) +\r\n 1000;\r\n\r\n/**\r\n * 获取ID\r\n * @param type 事件类型\r\n * @param millis 毫秒值\r\n * @returns\r\n */\r\nconst getReportId = (type: string, millis: number) => {\r\n const traceId = getTraceId();\r\n return Md5.hashStr(`${type}${traceId}${millis}`);\r\n};\r\n\r\n/**\r\n * 获取会话ID\r\n * @returns\r\n */\r\nconst getSessionId = () => getTraceId() + trackCountObj.trackCount;\r\n\r\n/**\r\n * 获取页面标题的工具函数。\r\n * @param pagePath - 页面路径。\r\n * @returns 返回匹配的页面配置信息。\r\n */\r\nconst matchPathReg = /[^/]+$/;\r\nconst matchLastPathName = (path: string) => path.match(matchPathReg)?.[0];\r\nconst getPageTitle = (pagePath: string, pagesJson: PagesConfig) => {\r\n // const page = (pagesJson.pages as unknown as PageMetaDatum[]).find((item) => item.path === pagePath);\r\n const page = (pagesJson.pages as unknown as PageMetaDatum[]).find((item) => item.path === pagePath || matchLastPathName(item.path) === matchLastPathName(pagePath));\r\n if (page) return page;\r\n\r\n for (const key in pagesJson) {\r\n // eslint-disable-next-line no-continue\r\n if (key === 'easycom' || key === 'globalStyle' || key === 'tabBar' || key === 'pages') continue;\r\n const subPages = pagesJson[key as keyof typeof pagesJson] as SubPageMetaDatum[];\r\n for (const item of subPages) {\r\n const foundPage = item.pages.find((pageItem: PageMetaDatum) => `${item.root}/${pageItem.path}` === pagePath || matchLastPathName(pageItem.path) === matchLastPathName(pagePath));\r\n // const foundPage = item.pages.find((pageItem: PageMetaDatum) => `${item.root}/${pageItem.path}` === pagePath);\r\n if (foundPage) return foundPage;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst getEnvBaseUrl = () => {\r\n // #ifdef MP-WEIXIN\r\n const {\r\n miniProgram: { envVersion },\r\n } = uni.getAccountInfoSync();\r\n\r\n switch (envVersion) {\r\n case 'develop':\r\n case 'trial':\r\n return 'https://test.chetuoche.net/';\r\n case 'release':\r\n return 'https://api.chetuoche.net/';\r\n default:\r\n return 'https://api.chetuoche.net/';\r\n }\r\n // #endif\r\n};\r\n\r\nconst getH5EnvBaseUrl = () => {\r\n // #ifdef H5\r\n const H5EnvVersion = process.env.NODE_ENV;\r\n switch (H5EnvVersion) {\r\n case 'development':\r\n return 'https://test.chetuoche.net/';\r\n case 'production':\r\n return 'https://api.chetuoche.net/';\r\n default:\r\n return 'https://api.chetuoche.net/';\r\n }\r\n // #endif\r\n};\r\n\r\n/**\r\n * 发送埋点数据的工具函数。\r\n * @param data - 埋点数据。\r\n */\r\nconst send = (data: any) => {\r\n uni.request({\r\n method: 'POST',\r\n url:\r\n // #ifdef H5\r\n `${getH5EnvBaseUrl()}event/event/dataReport` ||\r\n // #endif\r\n // #ifdef MP-WEIXIN\r\n `${getEnvBaseUrl()}event/event/dataReport`,\r\n // #endif\r\n data,\r\n success: (res) => {\r\n console.log(res, 'res');\r\n if (res.statusCode === 404 || res.statusCode === 502) {\r\n console.log('埋点事件提交失败');\r\n return;\r\n }\r\n console.log('埋点事件提交成功');\r\n },\r\n fail: () => {\r\n console.log('埋点事件提交失败');\r\n },\r\n });\r\n};\r\n\r\n/**\r\n * 批量处理埋点数据的类。\r\n * 支持定时或按批次大小自动发送埋点数据。\r\n */\r\nclass BatchProcessor {\r\n private batch: any[] = [];\r\n\r\n private timer: NodeJS.Timeout | null = null;\r\n\r\n private readonly batchSize = 50;\r\n\r\n private readonly interval = 10000; // 10秒\r\n\r\n /**\r\n * 获取当前设备的网络类型。\r\n * @returns {Promise<string>} 返回一个Promise,解析为当前网络类型(如\"wifi\"、\"4g\"等)。\r\n * @throws {Error} 如果获取网络类型失败,则抛出错误。\r\n */\r\n private handleNetworkType = () => new Promise((resolve, reject) => {\r\n uni.getNetworkType({\r\n success({ networkType }) {\r\n resolve(networkType);\r\n },\r\n fail: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n\r\n private handleCommonMessage = async (options?: Record<string, any>) => {\r\n const pageInfo = getCurrentPageInfo();\r\n const network_type = await this.handleNetworkType();\r\n const user = uni.getStorageSync('user');\r\n let userid; let\r\n userType;\r\n if (user) {\r\n ({\r\n userid,\r\n userType,\r\n } = JSON.parse(user)?.userInfo ?? { userid: null, userType: null });\r\n } else {\r\n console.log('未获取到user值');\r\n }\r\n const {\r\n deviceId,\r\n uniPlatform,\r\n osName,\r\n osVersion,\r\n deviceModel,\r\n deviceBrand,\r\n ua,\r\n } = uni.getSystemInfoSync();\r\n return {\r\n event_timestamp: formatTime(),\r\n page_url: pageInfo?.route,\r\n extra_params: {},\r\n user_id: userid,\r\n user_type: userType,\r\n device_id: deviceId,\r\n platform: uniPlatform,\r\n os: osName,\r\n osVersion,\r\n model: deviceModel,\r\n brand: deviceBrand,\r\n network_type,\r\n ua,\r\n terminal_type: uniPlatform,\r\n session_id: getSessionId(),\r\n ...options,\r\n };\r\n };\r\n\r\n /**\r\n * 添加埋点数据到批次中。\r\n * @param buryContent - 埋点内容。\r\n * @param options - 可选配置项。\r\n */\r\n private async sendBatch() {\r\n if (this.batch.length === 0) return;\r\n let retries = 2;\r\n let success = false;\r\n\r\n while (retries > 0 && !success) {\r\n try {\r\n // 模拟发送逻辑\r\n console.log(`Sending batch of ${this.batch.length} items`);\r\n console.log(this.batch, 'batch');\r\n send({\r\n data: this.batch,\r\n });\r\n success = true;\r\n this.batch = [];\r\n } catch (error) {\r\n retries--;\r\n if (retries === 0) {\r\n console.error('Failed to send batch after retries:', error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 发送当前批次中的埋点数据。\r\n */\r\n public async addToBatch(buryContent: Record<string, any>, options?: Record<string, any>) {\r\n const commonPointMessage = {\r\n is_element: !buryContent,\r\n ...await this.handleCommonMessage(options),\r\n };\r\n const pageInfo = getCurrentPageInfo();\r\n const isAutomaticPointMessage = buryContent.content\r\n ? {\r\n is_element: false,\r\n }\r\n : {\r\n is_element: !buryContent.content,\r\n element_id: null,\r\n element_type: buryContent.tag,\r\n element_name: `${pageInfo?.route}_${buryContent.text}`,\r\n };\r\n const filterExtra = (content: object) => Object.fromEntries(\r\n Object.entries(content).filter(([key]) => key !== 'event_id'),\r\n );\r\n const handleBuryContent = (content: object | string) => {\r\n if (Object.prototype.toString.call(content) === '[object Object]' && typeof content === 'object') {\r\n return {\r\n event_id: (content as unknown as any).event_id,\r\n extra_params: {\r\n ...filterExtra(content),\r\n },\r\n };\r\n }\r\n return {\r\n event_id: content,\r\n };\r\n };\r\n const initiativePointMessage = buryContent.content ? handleBuryContent(buryContent.content) : {};\r\n this.batch.push({\r\n ...commonPointMessage,\r\n ...isAutomaticPointMessage,\r\n ...initiativePointMessage,\r\n });\r\n if (this.batch.length >= this.batchSize) {\r\n this.sendBatch();\r\n } else if (!this.timer) {\r\n this.timer = setTimeout(() => {\r\n this.sendBatch();\r\n this.timer = null;\r\n }, this.interval);\r\n }\r\n }\r\n}\r\n\r\nconst batchProcessor = new BatchProcessor();\r\n\r\n/**\r\n * Vue插件,用于自动埋点功能。\r\n * 拦截页面跳转并发送埋点数据。\r\n */\r\nconst TrackAutomaticPlugin: Plugin = {\r\n install(app: App, options: Record<string, any>, pagesJson?: PagesConfig) {\r\n const sendMd = (buryContent: Record<string, any>) => {\r\n console.log(buryContent, 'buryContent~~');\r\n trackCountObj.trackCount++;\r\n // 埋点批处理逻辑\r\n batchProcessor.addToBatch(buryContent, {\r\n ...options,\r\n event_type: 'click',\r\n id: getReportId('click', new Date().getTime()),\r\n });\r\n };\r\n const sendPageMd = (url: string) => {\r\n // 页面埋点逻辑\r\n const stackPages = getCurrentPages();\r\n const prevPage = stackPages[stackPages.length - 1].route as any;\r\n const prevPageInfo = getPageTitle(prevPage, pagesJson);\r\n const currentPageInfo = getPageTitle(url.slice(1), pagesJson);\r\n trackCountObj.trackCount++;\r\n batchProcessor.addToBatch({\r\n content: {\r\n event_id: currentPageInfo?.style?.navigationBarTitleText,\r\n },\r\n }, {\r\n page_id: currentPageInfo?.style?.navigationBarTitleText,\r\n refer_page_id: prevPageInfo?.style?.navigationBarTitleText,\r\n refer_page_url: prevPage,\r\n ...options,\r\n page_url: url,\r\n event_type: 'page_view',\r\n id: getReportId('page_view', new Date().getTime()),\r\n });\r\n }\r\n app.config.globalProperties.sendMd = sendMd;\r\n app.config.globalProperties.sendPageMd = sendPageMd;\r\n uni.addInterceptor('navigateTo', {\r\n invoke(args) {\r\n console.log(args, 'args');\r\n },\r\n success(args) {\r\n const stackPages = getCurrentPages();\r\n const currentPage = getCurrentPageInfo();\r\n const currentPageInfo = getPageTitle(currentPage?.route as string, pagesJson);\r\n const prevPage = stackPages[stackPages.length - 2].route as any;\r\n const prevPageInfo = getPageTitle(prevPage, pagesJson);\r\n trackCountObj.trackCount++;\r\n batchProcessor.addToBatch({\r\n content: {\r\n event_id: currentPageInfo?.style?.navigationBarTitleText,\r\n },\r\n }, {\r\n page_id: currentPageInfo?.style?.navigationBarTitleText,\r\n refer_page_id: prevPageInfo?.style?.navigationBarTitleText,\r\n refer_page_url: prevPage,\r\n ...options,\r\n event_type: 'page_view',\r\n id: getReportId('page_view', new Date().getTime()),\r\n });\r\n console.log('拦截页面跳转成功', args);\r\n },\r\n });\r\n },\r\n};\r\n\r\nexport default TrackAutomaticPlugin;\r\n\r\n","// import Security from './security'\n\n/**\n * 路由跳转封装\n */\nexport default class Router {\n /**\n * 生成需要跳转的页面路径,路径后可带参数,形如 path?key=value&key2=value2\n * @param {*} path\n * @param {*} query\n */\n static genUrl(path, query) {\n if (query && typeof query === 'object') {\n const pairs = [];\n const holdCharList = [',']; // 无需转义的字符\n\n for (const key in query) {\n if (Object.prototype.hasOwnProperty.call(query, key)) {\n const value = query[key];\n\n // 避免 undefined / false 被处理成字符串\n let pair = `${key}=${encodeURIComponent(value || '')}`;\n\n // 无需转义的字符\n if (value && typeof value === 'string') {\n for (const char of holdCharList) {\n if (value.includes(char)) {\n const reg = new RegExp(`${encodeURIComponent(char)}`, 'g');\n\n pair = pair.replace(reg, char);\n }\n }\n }\n\n // ios抖音在参数包含三个‘i’的时候会屏蔽参数,所以加密后规避此规则\n // if (key === 'hm' && path === '/pages/order/haoma') {\n // pair = `${key}=${encodeURIComponent(Security.encrypt(value || ''))}`\n // }\n\n pairs.push(pair);\n }\n }\n if (pairs.length > 0) {\n path = path + '?' + pairs.join('&');\n }\n }\n return path;\n }\n}\n","import Router from './router';\n\nexport function getCurrentPageInfo() {\n const stackPages = getCurrentPages();\n\n let result;\n\n if (stackPages && stackPages.length > 0) {\n const currentPage = stackPages[stackPages.length - 1];\n\n result = {\n fullPath: Router.genUrl(currentPage.route, (currentPage as unknown as any).options),\n route: currentPage.route,\n options: (currentPage as unknown as any).options,\n };\n }\n return result;\n}\n"],"mappings":"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","names":["bury_exports","__export","bury_default","__toCommonJS","Router","path","query","pairs","holdCharList","key","value","pair","char","reg","getCurrentPageInfo","stackPages","result","currentPage","Router","import_ts_md5","trackCountObj","formatTime","now","year","month","day","hours","minutes","seconds","getTraceId","getReportId","type","millis","traceId","getSessionId","matchPathReg","matchLastPathName","path","_a","getPageTitle","pagePath","pagesJson","page","item","key","subPages","foundPage","pageItem","getEnvBaseUrl","envVersion","getH5EnvBaseUrl","send","data","res","BatchProcessor","resolve","reject","networkType","error","options","pageInfo","getCurrentPageInfo","network_type","user","userid","userType","deviceId","uniPlatform","osName","osVersion","deviceModel","deviceBrand","ua","retries","success","buryContent","commonPointMessage","isAutomaticPointMessage","filterExtra","content","handleBuryContent","initiativePointMessage","batchProcessor","TrackAutomaticPlugin","app","sendMd","sendPageMd","url","_b","_c","stackPages","prevPage","prevPageInfo","currentPageInfo","args","currentPage","bury_default"]}