├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── demo ├── kbone │ ├── README.md │ ├── index.html │ ├── package.json │ └── tsconfig.json ├── mpvue │ ├── README.md │ ├── index.html │ ├── package.json │ └── project.config.json ├── remax │ ├── README.md │ ├── app.json │ ├── package.json │ ├── project.config.json │ └── remax.config.js └── taro │ ├── README.md │ ├── babel.config.js │ ├── package.json │ ├── project.config.json │ └── project.tt.json ├── dist ├── v2 │ ├── sensorsdata.cjs.js │ └── sensorsdata.esm.js └── wechat │ ├── plugin │ ├── abtesting-sdk-miniprogram │ │ ├── README.md │ │ ├── alipay │ │ │ ├── abtest.cmd.min.js │ │ │ └── abtest.esm.min.js │ │ ├── quickapp │ │ │ └── abtest.esm.min.js │ │ └── wechat │ │ │ ├── abtest.cmd.min.js │ │ │ └── abtest.esm.min.js │ ├── ad-channel-h5-linker │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── ad-channel │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── disable-sdk │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── duplicate-data │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── encryption │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── exposure │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── general-encryption │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── get-location │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── gzip │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── h5-linker │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── old-openid │ │ ├── index.cmd.js │ │ └── index.esm.js │ ├── once-send │ │ ├── index.cmd.js │ │ └── index.esm.js │ ├── plugin.md │ ├── readme.md │ ├── register-properties │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── session-event │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── set-referrer-path │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── sf-instant-event │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── sf-sdk-miniprogram │ │ ├── README.md │ │ ├── popup-component │ │ │ ├── popup-component.js │ │ │ ├── popup-component.json │ │ │ ├── popup-component.wxml │ │ │ └── popup-component.wxss │ │ ├── popup.cmd.min.js │ │ └── popup.esm.min.js │ └── sm-encryption │ │ ├── index.cmd.js │ │ ├── index.esm.js │ │ └── readme.md │ ├── sensorsdata.cjs.js │ └── sensorsdata.esm.js ├── package.json ├── sensorsdata.es6.min.js ├── sensorsdata.min.d.ts └── sensorsdata.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | git.properties 3 | 4 | ### Intellij ### 5 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm 6 | 7 | *.iml 8 | 9 | ## Directory-based project format: 10 | .idea/ 11 | 12 | ## File-based project format: 13 | *.ipr 14 | *.iws 15 | 16 | ## Plugin-specific files: 17 | 18 | # IntelliJ 19 | /out/ 20 | 21 | # mpeltonen/sbt-idea plugin 22 | .idea_modules/ 23 | 24 | # JIRA plugin 25 | atlassian-ide-plugin.xml 26 | 27 | # Python 28 | __pycache__ 29 | *.pyc 30 | 31 | # Crashlytics plugin (for Android Studio and IntelliJ) 32 | com_crashlytics_export_strings.xml 33 | crashlytics.properties 34 | crashlytics-build.properties 35 | 36 | # java build files 37 | target 38 | ui/node_modules 39 | ui/build 40 | 41 | # debug scripts. 42 | deploy.sh 43 | ftpsync.settings 44 | 45 | *.swp 46 | .DS_Store 47 | 48 | # Xcode 49 | build/* 50 | *.pbxuser 51 | !default.pbxuser 52 | *.mode1v3 53 | !default.mode1v3 54 | *.mode2v3 55 | !default.mode2v3 56 | *.perspectivev3 57 | !default.perspectivev3 58 | *.xcworkspace 59 | !default.xcworkspace 60 | xcuserdata 61 | profile 62 | *.moved-aside 63 | *.cer 64 | *.p12 65 | *.mobileprovision 66 | 67 | # AppCode 68 | .idea 69 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.22.3 (2025-9-28) 2 | 1. 优化 3 | - 把 SF 即时事件的 get 请求改成 post 请求。 4 | 2. 修复 5 | - v1.22.2 版本中 SF 即时事件插件在 readme 的描述中是配置 instant_events 来筛选事件,实际不生效,现在已修复。 6 | 7 | ## 1.22.2 (2025-9-18) 8 | 1. 新增 9 | - 新增插件,支持神策 SF 的即时事件。 10 | 11 | ## 1.22.1 (2025-8-14) 12 | 1. 新增 13 | - 新增插件,支持 gzip。 14 | 15 | ## 1.21.10 (2025-7-25) 16 | 1. 新增 17 | - 1.21.8 中 ad-channel 插件支持热启动归因,本次把 ad-channel-h5-linker 也增加进来,且文档中备注了,必须使用 use 替换 usePlugin。 18 | 19 | ## 1.21.9 (2025-7-23) 20 | 1. 新增 21 | - 新增插件 duplicate-data,用来去除 time 完全一致数据。 22 | 23 | ## 1.21.8 (2025-6-30) 24 | 1. 新增 25 | - 配置 appShow:true 后,可以开启热启动也支持 SAT 渠道归因。 26 | 27 | ## 1.21.7 (2025-5-26) 28 | 1. 优化 29 | - 优化在某些安全工具下扫描出的 extend 方法的原型链污染的安全问题。 30 | 2. 新增 31 | - 支持分享的时候使用 async 的语法,但是不能开启 JS 转 ES5,否则还是不支持。 32 | 33 | ## 1.21.6 (2025-3-31) 34 | 1. 优化 35 | - 增加异常判断,曝光插件中删除元素导致的报错。 36 | 37 | ## 1.21.5 (2025-3-18) 38 | 1. 优化 39 | - 考虑到 SAT 参数可能比较长,所以优化最大字符串长度从 500 到 5000。 40 | - 开源协议、demo 等相关修改。 41 | 42 | ## 1.21.4 (2025-3-5) 43 | 1. 优化 44 | - 优化 SAT channel 插件,新增 $ad_landing_page_url (没有 decode 的 $url)。 45 | 46 | ## 1.21.3 (2024-11-29) 47 | 1. 修复 48 | - 1.21 提供的 v2 目录里的文件没有更新,重新打包了。 49 | 50 | ## 1.21.1 (2024-11-8 废弃) 51 | 1. 新增 52 | - 新增打包 v2 目录,这个目录下打包的 SDK 去除了 setOpenid、initWithOpenid 等过期 API,且只能用批量发送。后续还会提供更多 v3、v4 等打包目录,去除一些过期或者不用的 API。 53 | 54 | ## 1.20.6 (2024-11-5) 55 | 1. 修复 56 | - 小程序 disable sdk 后还会发送 profile 的问题。 57 | 2. 新增 58 | - 弹窗支持下发可弹的时间段。 59 | 60 | ## 1.20.5 (2024-7-26) 61 | 1. 修复 62 | - 小程序弹窗点击 image 时候没有 $sf_msg_element_type。 63 | 64 | ## 1.20.4 (2024-4-19) 65 | 1. 新增 66 | - 支持在部分场景下,使用多 SDK。 67 | 68 | ## 1.20.3 (2024-3-26) 69 | 1. 优化 70 | - ID3 内外层匿名 ID 保持一致,不建议使用 loginWithKey, identify 默认是带 true 的结果。 71 | 72 | ## 1.20.2 (2023-11-17) 73 | 1. 新增 74 | - `sensors.resetAnonymousIdentity` 重置匿名 ID 的接口。 75 | - `sensors.kit.setData` 来设置内部 titile 变量,从而解决动态设置 titile 的问题。 76 | 77 | ## 1.20.1(2023-11-15) 78 | 1. 修复 79 | - 连续调用 track 和 bind,track 数据里有可能会包含 bind 信息的问题。 80 | 81 | ## 1.19.12(2023-10-30) 82 | 1. 修复 83 | - 自动全埋点和手动全埋点共存的时候,手动全埋点 pageShow 的 referrer 不准确。 84 | 85 | ## 1.19.11(2023-10-23) 86 | 1. 新增 87 | - 数据发送国密加密插件。 88 | 89 | ## 1.19.10(2023-10-9) 90 | 1. 修复 91 | - 曝光插件偶尔会报 Cannot read property 'area rate' of undefined 的问题。 92 | 93 | ## 1.19.9(2023-9-19) 94 | 1. 修复 95 | - 在开启 sampshare 且未定义 path 时,自动生成的 path 不带 query。 96 | 97 | ## 1.19.8(2023-8-30) 98 | 1. 修复 99 | - 曝光插件,监听元素过多(预计 200 个以上)时候导致内存溢出。 100 | 101 | ## 1.19.7(2023-8-8) 102 | 1. 新增 103 | - 弹窗支持复杂数据权限。 104 | 105 | ## 1.19.6(2023-7-25) 106 | 1. 修复 107 | - 修复 `PC` 端微信小程序上报失败的问题。 108 | 109 | ## 1.19.5(2023-6-20) 110 | 1. 新增 111 | - 曝光插件支持过程回调。 112 | 113 | ## 1.19.4(2023-6-9) 114 | 1. 新增 115 | - 新增 `registerPropertyPlugin` 接口,支持属性的删除和修改。 116 | 117 | ## 1.19.3(2023-6-1) 118 | 1. 修复 119 | - 修复 `enableDataCollect` 接口报错问题 120 | 121 | ## 1.19.2(2023-5-4) 122 | 1. 新增 123 | - `A/B Testing` 插件埋点逻辑配置化 124 | - 弹窗蒙层点击优化 125 | - 新增弹窗点击回调 126 | 127 | ## 1.19.1(2023-4-10) 128 | 1. 新增 129 | - 插件优化二期 130 | 2. 修复 131 | - 修复 `ad-channel-h5-linker` 插件在延迟初始化情况下 `log` 方法报错的问题。 132 | - 修复插件不兼容导致的属性缺失问题 133 | 134 | ## 1.18.5(2023-3-31) 135 | 1. 新增 136 | - 支持曝光事件采集 137 | 138 | ## 1.18.4(2022-12-7) 139 | 1. 新增 140 | - 支持 `List` 列表元素非字符串类型 141 | 142 | ## 1.18.3(2022-12-2) 143 | 1. 修复 144 | - `ID-Mapping 3.0` 用户关联协议优化 145 | - 修复特殊场景下首次启动不生效的问题 146 | 147 | ## 1.18.2(2022-11-18) 148 | 1. 新增 149 | - 新增支持非对称加密框架插件 150 | - 支持关闭数据采集 151 | 152 | ## 1.18.1(2022-10-26) 153 | 1. 新增 154 | - 插件化重构 155 | - 新增支持 `webview` 渠道信息回传插件 156 | 157 | ## 1.17.13(2022-9-16) 158 | 1. 修复 159 | - 修复无法解绑 `$identity_mp_unionid` 的问题 160 | 161 | ## 1.17.12(2022-8-12) 162 | 1. 新增 163 | - 分享事件支持异步采集分享者信息 164 | 165 | ## 1.17.11(2022-7-22) 166 | 1. 新增 167 | - 新增 `referrer_path` 插件 168 | 2. 优化 169 | - 优化自定义属性插件,可以覆盖预置属性 170 | 171 | ## 1.17.10(2022-6-16) 172 | 1. 新增 173 | - 新增 `getLocation` 插件 174 | 175 | ## 1.17.9(2022-5-31) 176 | 1. 新增 177 | - 新增 `SessionEvent` 插件 178 | 179 | ## 1.17.8(2022-5-26) 180 | 1. 新增 181 | - 新增广告渠道插件 182 | 183 | ## 1.17.7(2022-4-29) 184 | 1. 修复 185 | - 删除获取经纬度的功能,修复微信小程序发布代码审核不通过的问题 186 | 187 | ## 1.17.6(2022-4-15) 188 | 1. 新增 189 | - 新增登录接口 `loginWithKey`,去除 `LOGIN_ID_KEY` 配置 190 | 191 | ## 1.17.5(2022-3-21) 192 | 1. 修复 193 | - 修复 `login` 传入匿名 `ID` 触发 `$SignUp` 事件的问题 194 | 195 | ## 1.17.4(2022-3-11) 196 | 1. 新增 197 | - 支持动态配置制定页面的 `$MPPageLeave` 采集规则 198 | 199 | 200 | ## 1.17.3(2022-1-13) 201 | 1. 新增 202 | - 支持自定义属性配置插件 203 | 204 | ## 1.17.2(2022-1-13) 205 | 1. 修复 206 | - 页面浏览时长出现负值的问题 207 | - 属性值为 `null` 和 `undefined` 日志提示不准确的问题 208 | 209 | ## 1.17.1(2021-12-31) 210 | 1. 新增 211 | - 支持合规功能,延迟初始化 212 | 213 | ## 1.16.3(2021-12-27) 214 | 1. 修复 215 | - 修复 `setOpenid` 接口上报 `$BindID` 事件导致后端埋点报错的问题 216 | 217 | ## 1.16.2(2021-12-22) 218 | 1. 新增 219 | - 支持 `ID-Mapping 3.0` 用户关联协议 220 | - 获取预置属性接口返回新增是否首次属性 `$is_first_time` 221 | 2. 修复 222 | - 修复 `Component` 传空对象,不采集页面浏览事件的问题 223 | - 修复批量发送的 `time` 和 `_flush_time` 相同的问题 224 | - 修复部分场景下 `$url_path` 取值不准确的问题 225 | 226 | ## 1.15.1(2021-12-2) 227 | 1. 新增 228 | - 新增支持数据传输加密 229 | 230 | ## 1.14.29(2021-11-29) 231 | 1. 新增 232 | - 新增所有事件采集 `$url`、`$title`、`$mp_client_basic_library_version`、`$mp_client_app_version` 和 `$app_version` 属性 233 | 234 | 235 | ## 1.14.28(2021-11-24) 236 | 1. 优化 237 | - 优化 `$referrer` 取值为 `url` 完整路径带 `query` 参数 238 | 239 | ## 1.14.27(2021-11-23) 240 | 1. 新增 241 | - 数据发送模块重构 242 | 243 | ## 1.14.26(2021-11-11) 244 | 1. 修复 245 | - 修复返回操作触发页面浏览事件时 `$referrer` 值不准确的问题 246 | - 修复不设置页面标题会出现错误日志的问题 247 | - 修复属性值传空数组会被删除不上报的问题 248 | 249 | ## 1.14.25(2021-10-28) 250 | 1. 修复 251 | - 修复 `setWebviewUrl` 方法可能会导致客户参数无法解析的问题 252 | 253 | ## 1.14.24(2021-10-11) 254 | 1. 修复 255 | - 修复 `sendPageLeave` 方法可能导致的报错问题 256 | - 修复 `Fortify` 扫描的安全漏洞问题 257 | 258 | ## 1.14.23(2021-09-28) 259 | 1. 修复 260 | - 修复 `setWebviewUrl` 方法可能会导致客户 `url` 中参数丢失的问题 261 | - 修复参数 `launched` 暴露修改方法可能会导致 `$MPLaunch` 无法采集的问题 262 | - 修复浏览插件页面退出小程序采集 `$MPHide` 事件时,控制台会捕获到异常的问题 263 | 264 | ## 1.14.22(2021-09-15) 265 | 1. 优化 266 | - 修改初始化配置参数 `show_log` 默认值为 `fasle` 267 | - 修改初始化配置参数 `max_string_length` 默认值为 `500` 268 | 2. 修复 269 | - 修复 `ES6` 语法报错问题 270 | 271 | ## 1.14.21(2021-08-27) 272 | 1. 优化 273 | - `$SignUp` 事件去除 `$is_first_day` 属性 274 | 275 | ## 1.14.20(2021-08-20) 276 | 1. 新增 277 | - 新增采集页面浏览时长事件 `$MPPageLeave` 278 | 279 | ## 1.14.19(2021-08-9) 280 | 1. 修复 281 | - 修复特定情况下分享字段解析报错问题 282 | 283 | ## 1.14.18(2021-08-6) 284 | 1. 优化 285 | - `fortify` 安全扫描问题优化 286 | 287 | ## 1.14.17(2021-08-5) 288 | 1. 新增 289 | - 新增公共预置属性 `$referrer_title` 290 | 1. 修复 291 | - 修复特定情况下 `$referrer` 取值异常的问题 292 | 293 | ## 1.14.16(2021-07-31) 294 | 1. 修复 295 | - 修复开发者工具企业微信小程序模式获取 `title` 报错问题 296 | 297 | ## 1.14.15(2021-07-29) 298 | 1. 优化 299 | - 优化批量发送 300 条限制逻辑 300 | 301 | ## 1.14.14(2021-07-19) 302 | 1. 修复 303 | - 修复自定义属性被预置属性覆盖问题 304 | - 修复 `Taro 3.1` 及以上框架,小程序内嵌元素自定义属性无法采集的问题 305 | 306 | ## 1.14.13(2021-07-9) 307 | 1. 新增 308 | - `$url_path` 设置为所有事件都有的预置属性 309 | 2. 修复 310 | - 修复页面浏览事件自定义属性值 `$title` 被覆盖问题 311 | 3. 优化 312 | - 可配置特定控件不采集全埋点点击事件逻辑优化 313 | 314 | ## 1.14.12(2021-06-26) 315 | 1. 新增 316 | - 支持在微信小程序中跟内嵌 `H5` 打通 317 | - 支持对特定控件不采集全埋点点击事件 318 | - 支持分享到朋友圈单页模式下页面的数据采集 319 | 320 | ## 1.14.11(2021-06-10) 321 | 1. 新增 322 | - 新增 `tabBar` 点击事件自动采集 323 | - 新增 `getServerUrl` 接口 324 | - 默认开启批量发送 325 | 2. 修复 326 | - 修复 `ES6` 语法报错问题 327 | 328 | ## 1.14.10(2021-05-21) 329 | 1. 新增 330 | - 新增预置属性 `$brand` 和 `$geo_coordinate_system`,统一 `$network_type` 属性值为大写 331 | 2. 修复 332 | - 修复自定义全埋点 `$MPViewScreen` 缺少 `$title` 预置属性 333 | 334 | ## 1.14.9(2021-04-22) 335 | 1. 新增 336 | - 新增本地 `storage` 加密 337 | 338 | ## 1.14.8(2021-04-20) 339 | 1. 修复 340 | - 修复页面参数含有 `scene` 时 `$url_query` 为空问题; 341 | 2. 新增 342 | - `TS` 文件新增对 `setOpenid` 方法的声明 343 | 344 | ## 1.14.7(2021-03-19) 345 | 1. 优化 346 | - 优化定时器,减少 `setTimeout` 方法使用; 347 | - 优化点击事件优先级处理; 348 | 2. 修复 349 | - 修复延迟初始化时,注册事件属性不一致问题; 350 | 351 | ## 1.14.6(2021-03-13) 352 | 1. 新增 353 | - 增加 `_flush_time` 和 `_track_id` 属性; 354 | - 新增 `ts` 声明文件 355 | 356 | ## 1.14.5(2020-12-25) 357 | 1. 新增 358 | - 页面浏览事件新增采集 `$title`; 359 | 2. 优化 360 | - 优化场景值映射,SA 需升级到 `2.1.5107` 及以上版本,SDG 需升级到 `0.7.5159` 及以上版本; 361 | - 优化打印日志方法; 362 | 363 | ## 1.14.4(2020-12-18) 364 | 1. 修复 365 | - 修复点击事件埋点 bug; 366 | 367 | ## 1.14.2(2020-12-4) 368 | 1. 新增 369 | - 页面浏览采集可配置; 370 | - 所有事件可配置采集 $url_path; 371 | 372 | ## 1.14.1(2020-11-10) 373 | 1. 优化 374 | - 全埋点优化,支持所有框架采集; 375 | - ID 修改逻辑优化,增加 ID 规则校验; 376 | 377 | ## 1.13.32(2020-11-07) 378 | 1. 新增 379 | - 新增 SF 渠道属性采集 380 | 381 | ## 1.13.31(2020-10-30) 382 | 1. 新增 383 | - 新增经纬度采集; 384 | 385 | ## 1.13.30(2020-10-23) 386 | 1. 优化 387 | - 获取场景值功能优化; 388 | 389 | ## 1.13.29(2020-09-16) 390 | 1. 新增 391 | - 新增获取匿名 ID 接口; 392 | 393 | ## 1.13.28(2020-09-10) 394 | 1. 优化 395 | - 获取预置属性接口新增是否首日属性; 396 | 397 | ## 1.13.27(2020-09-08) 398 | 1. 新增 399 | - 新增收藏预置事件,分享事件区分转发朋友圈和分享消息卡片; 400 | - 支持注册动态公共属性; 401 | 402 | ## 1.13.26(2020-07-30) 403 | 1. 修复 404 | - 小程序 sa_utm 解析 bug 修复; 405 | - 微信小程序 $MPViewScreen 事件 utm 信息解码; 406 | 407 | ## 1.13.25(2020-07-17) 408 | 1. 新增 409 | - 新增事件监听功能 410 | 411 | ## 1.13.24(2020-06-19) 412 | 1. 新增 413 | - 新增所有事件都有的预置属性 `$app_id`、`$timezone_offset` 414 | 415 | ## 1.13.23(2020-04-26) 416 | 1. 修复 417 | - 修复 `WePY` 框架运行` npm run build` 时语法不兼容问题; 418 | 419 | ## 1.13.22(2020-04-13) 420 | 1. 优化 421 | - 优化点击预置事件中 `$url_path` 预置属性的采集逻辑; 422 | 423 | ## 1.13.21(2020-04-07) 424 | 1. 优化 425 | - 优化预置事件 `$MPLaunch`、 `$MPShow` 中 `$share_depth` 的计算逻辑; 426 | 2. 新增 427 | - 新增所有事件都有的预置属性 `$latest_share_depth`、 `$latest_share_distinct_id`、 `$lastest_share_url_path`,神策分析系统需升级到 `1.14.745` `1.16.1414` `1.15.1413` `1.13.5875` 及以上版本; 428 | 429 | ## 1.13.20(2020-03-19) 430 | 1. 修复 431 | - 修复点击处理函数参数为 `null` 时,点击预置事件报错问题; 432 | 433 | ## 1.13.19(2020-03-11) 434 | 1. 新增 435 | - 新增预置点击事件 `$MPClick` 可通过配置确定是否采集功能; 436 | - 插件版 `SDK` 支持 `Component` 构造器构造的页面的预置事件采集功能; 437 | 2. 优化 438 | - 优化批量发送方式下请求取消时长配置; 439 | 440 | ## 1.13.18(2020-03-05) 441 | 1. 新增 442 | - 新增预置点击事件 $MPClick 采集功能; 443 | - 新增 logout() 接口; 444 | 445 | ## 1.13.17(2020-02-17) 446 | 1. 优化 447 | - 优化 `identify()` 接口逻辑; 448 | - 批量发送方式下,默认请求取消时长修改为 `10s`; 449 | 450 | ## 1.13.16(2019-12-25) 451 | 1. 更新 452 | - 更新场景值描述 453 | 454 | ## 1.13.15(2019-12-24) 455 | 1. 修复 456 | - 修复使用批量发送方式发送数据时,网络从无网切换到有网时,数据无法发送的问题 457 | 2. 优化 458 | - `onLaunch` `onShow` 生命周期函数中,参数对象中获取不到 `scene` 值时的处理逻辑 459 | 460 | ## 1.13.14(2019-12-02) 461 | 1. 修复 462 | - 修复参数中同时带有 `scene` 与渠道信息时,无法解析渠道信息 463 | - 修复多场景下扫描普通二维码时 `q` 参数的渠道解析逻辑 464 | 2. 新增 465 | - 新增渠道参数映射功能 466 | 3. 优化 467 | - 优化最近一次渠道参数解析规则 468 | 469 | 470 | ## 1.13.13(2019-11-9) 471 | 1. 优化 472 | - 优化扫描普通网页二维码的兼容性处理 473 | - 没有 `init` 前的队列做了清空 474 | - 为了兼容 `page` 在 `onshow` 时候,加自定义参数,去除了代码中 `$MPViewScreen` 的自定义方法 475 | 476 | ## 1.13.12(2019-10-31) 477 | * 优化:server_url为空时候,不发数据。 478 | 479 | ## 1.13.11 480 | * 新增:所有事件增加 anonymous_id 属性,如果调用了 login 方法,就增加 login_id 属性。 481 | * 例行更新:场景值的描述 482 | 483 | ## 1.13.10 (2019-09-18) 484 | * 优化:默认decode了option.query的值。分享时候自动拼接的的query还是保持不变。 485 | 486 | ## 1.13.9 (2019-09-16) 487 | * 新增:增加配置 is_persistent_save ,支持将最近一次站外渠道信息永久保存到 Storage 中 488 | * 优化:给未定义 Component 时候一个默认值 489 | 490 | ## 1.13.8 (2019-08-30) 491 | * 新增:支持自定义 utm 参数。通过配置 source_channel:['...','...'] 492 | * 优化:storage 数据写入失败的话,会打印出失败的原因 493 | * 优化:$os的取值增加devtools,优化了$os和$os_version算法 494 | * 优化:$url_query在$MPViewScreen中没有值时候,从未知改成空 495 | 496 | ## 1.13.7 (2019-08-22) 497 | 498 | * 新增:$MPViewScreen 增加了 UTM 相关属性的解析 499 | * 例行更新:场景值的描述 500 | 501 | ## 1.13.6 (2019-08-09) 502 | 503 | * 新增:支持非插件模式下用Component作为页面构造器时候的,页面浏览自动采集功能,包括以下两种情况 504 | 1.原生小程序直接使用Component作为页面构造器 2.框架使用Component作为页面构造器,包括 Taro,Uniapp,wepy2 505 | 506 | ## 1.13.5 (2019-07-05) 507 | 508 | * 增加了获取匿名ID的方法 sensors.quick('getAnonymousID') 509 | 510 | ## 1.13.4 (2019-06-17) 511 | 512 | * 同步小程序场景值描述 513 | * server_url 默认地址为空 514 | * 存储读取异常时候会重试 515 | 516 | ## 1.13.3 (Unknown) 517 | 518 | * 获取预置属性方法可获取到 latest 相关属性 519 | * 增加 appendProfile 与 incrementProfile 缓存 520 | 521 | ## 1.13.2 (2019-05-16) 522 | 523 | * 增加两个 profile的操作 sa.appendProfile({catrgory: ['玉米']}) 喜爱的蔬菜增加玉米 和 sa.incrementProfile({'navClick': 1}) 导航点击次数 +1次 524 | 525 | ## 1.13.1 (2019-05-10) 526 | 527 | * **重大更新**,去除了sensorsdata_conf.js,配置改成在 App.js中,通过 sensors.setPara({})或者在sensors.init({})中加入 528 | * 分成三个文件,sensorsdata.min.js全埋点的非插件版,sensorsdata.plugin.min.js全埋点的插件版,sensorsdata.custom.min.js手动埋点版本支持插件和非插件。具体各个版本的用法参考文档。另外增加es6格式的对应版本 529 | 530 | ## 1.12.11 (2019-04-22) 531 | 532 | * 修复12.10的bug,如果更新1.12.10的用户,必须更新到1.12.11 533 | 534 | ## 1.12.10 (2019-04-04) 535 | 536 | * 修复$url_query在返回时候取值的错误,修复当没有onShareAppMessage没有return值,且使用allow_amend_share_path时候,自动补全的url只有path没有query的问题 537 | * 去除了page在show的时候,解析utm参数和scene的功能,统一在app里解析 538 | 539 | ## 1.12.9 (2019-03-11) 540 | 541 | * 增加自动采集$first_visit_time 首次访问时间 542 | * 增加 datasend_timeout 配置请求最大链接多久取消 543 | 544 | ## 1.12.8 (2019-01-23) 545 | 546 | * getPresetProperties去掉registerApp的属性 547 | * 修复自动获取openid的url在某些特殊条件下的bug 548 | * 增加批量发送最大数据量,batch_send:{send_timeout:6000,max_length:6} 549 | 550 | ## 1.12.7 (2019-01-11) 551 | 552 | * registerApp 方法不做缓存 553 | 554 | ## 1.12.6 (2019-01-04) 555 | 556 | * 增加 batch_send 批量发数据的配置,设置为空对象或者true,表示开启这个功能,必须更新神策分析到最新版,否则去重功能无效 557 | * 增加 autoTrackIsFirst的配置,不设置默认是先执行onLaunch等事件中的代码,(如果使用动态修改预置属性的功能会有影响!!!),后发送appLaunch的统计数据,可以单独给各个预置事件单独设置先后发送顺序 558 | * 增加sa.quick('appLaunch',arguments,prop) 等单独发预置事件和属性的功能 559 | 560 | ## 1.12.5 (2018-11-24) 561 | 562 | * 修复 autoTrack.pageShow 设置 false 仍然发送 $MPViewScreen 的问题 563 | 564 | ## 1.12.4 (2018-11-09) 565 | 566 | * 增加init的多次使用的判断,去掉$MPLaunch,$MPShow中获取到的path带/的异常判断 567 | 568 | ## 1.12.3 (Unkown) 569 | 570 | * 小程序identify和login如果传入的是非字符串时候,自动转化字符串类型 571 | * 增加对onShareAppMessage返回空对象的判断 572 | 573 | ## 1.12.2 (2018-10-26) 574 | 575 | * 修复在开启自动采集分享,且定义空的onShareAppMessage时候,控制台报错的问题 576 | 577 | ## 1.12.1 (2018-10-16) 578 | 579 | * 更新支持插件的小程序 SDK 具体用法参考 https://sensorsdata.cn/manual/mp_sdk_plugin.html 580 | 581 | ## 1.11.1 (2018-09-28) 582 | 583 | * 更新 $manufacturer 设备制造商(brand),修正 $screen_width的 取值(windowWidth) 584 | 585 | ## 1.10.5 (2018-09-19) 586 | 587 | * 增加 $url_query 588 | * 增加 sa.initWithOpenid(options,callback) callback(openid) 589 | * 增加sa.status.referrer sa.status.laster_referrer 590 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 软件名称:神策分析 SDK 2 | 版本号:所有版本 3 | 许可协议版本:1.0 4 | 5 | 1. 商业许可协议(用于商业用途需购买许可) 6 | 任何商业用途必须获得商业许可。 7 | 8 | 商业许可协议条款: 9 | 10 | - 商业用途:任何直接或间接产生收入的用途都需要购买商业许可。 11 | - 付款条款:在使用本软件用于商业用途之前,您必须支付全额许可费用。具体的付款方式将在双方联系后提供。 12 | - 商业支持:购买商业许可后,您将获得一年的技术支持和软件更新服务。 13 | - 禁止再许可:商业用户不得再许可、转售或转让本软件。每份商业许可仅适用于单一实体或公司。 14 | - 源代码访问:购买商业许可的用户将获得本软件的代码访问权限,并可根据业务需求进行内部修改。但不得公开发布或再分发修改后的版本。 15 | - 使用范围限制:商业许可仅限于购买者的内部使用,不得与第三方共享或用于为第三方提供服务。任何超出许可范围的使用行为均需额外授权,并可能产生额外费用。 16 | - 联系信息:如需购买商业许可,请联系 dv@sensorsdata.com。 17 | - 知识产权声明:本软件的版权归神策网络科技(北京)有限公司所有。购买商业许可仅授予您使用权,所有权仍归属本公司。 18 | - 终止条款: 如果您未支付相关费用或违反本协议的任何条款,商业许可将自动终止。您必须立即停止所有商业用途,并销毁或删除所有软件副本。 19 | 20 | 2. 附加授权规则条款 21 | 授权规则条款: 22 | 23 | - 功能限制:未经本软件作者的明确书面许可,您不得移除、绕过或规避本软件中的任何功能限制或试用限制。 24 | - 商标使用:未经授权,您不得在宣传、市场推广或销售产品时使用本软件的名称、商标或品牌标识。任何商标使用必须得到明确的书面许可。 25 | - 修改条款:本协议的条款可能会不时更新,用户有责任定期检查最新版本。任何重大更改将通过项目主页或电子邮件通知用户。 26 | 27 | 3. 联系方式 28 | 如需更多信息或申请商业许可,请联系 dv@sensorsdata.com。 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![神策数据](https://opensource.sensorsdata.cn/wp-content/uploads/logo.png "神策数据")](https://www.sensorsdata.cn/) 2 |

3 | 4 | [![License](https://img.shields.io/github/license/sensorsdata/sa-sdk-miniprogram.svg)](https://github.com/sensorsdata/sa-sdk-miniprogram/blob/master/LICENSE) 5 | [![GitHub release](https://img.shields.io/github/release/sensorsdata/sa-sdk-miniprogram.svg)](https://github.com/sensorsdata/sa-sdk-miniprogram/releases) 6 | 7 | # sa-sdk-miniprogram 8 | ## 神策简介 9 | 10 | [**神策数据**](https://www.sensorsdata.cn/) 11 | (Sensors Data),隶属于神策网络科技(北京)有限公司,是一家专业的大数据分析服务公司,大数据分析行业开拓者,为客户提供深度用户行为分析平台、以及专业的咨询服务和行业解决方案,致力于帮助客户实现数据驱动。神策数据立足大数据及用户行为分析的技术与实践前沿,业务现已覆盖以互联网、金融、零售快消、高科技、制造等为代表的十多个主要行业、并可支持企业多个职能部门。公司总部在北京,并在上海、深圳、合肥、武汉等地拥有本地化的服务团队,覆盖东区及南区市场;公司拥有专业的服务团队,为客户提供一对一的客户服务。公司在大数据领域积累的核心关键技术,包括在海量数据采集、存储、清洗、分析挖掘、可视化、智能应用、安全与隐私保护等领域。 [**More**](https://www.sensorsdata.cn/about/aboutus.html) 12 | 13 | ## 神策埋点 SDK 官网 14 | 如需了解神策埋点 SDK 的更多商业授权信息,请访问[神策埋点 SDK 官网](https://jssdk.debugbox.sensorsdata.cn/)获取更多详细信息。 15 | 16 | ## 联系我们 17 | 若您有商业合作或产品集成需求,请通过下面的渠道联系我们获取专业服务与支持。 18 | 19 | | 加微信号:skycode008,或扫码添加联系人 | 扫码关注「神策埋点 SDK」公众号 ![gzh](https://github.com/sensorsdata/sa-sdk-android/blob/master/gzh.jpeg) | 20 | | ------ | ------ | 21 | 22 | ## 使用方法 23 | 24 | 使用方法请参考文档 https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_mp_wx-1573892.html 25 | 26 | 注意 SDK 可能不完全向前兼容,请查看版本更新说明 [CHANGELOG.md](CHANGELOG.md)。如果有说明不兼容的话,需要升级神策分析对应的版本。 27 | 请根据需要前往 [Releases](https://github.com/sensorsdata/sa-sdk-miniprogram/releases) 里下载对应的文件 28 | 29 | ## 版本更新记录 30 | 31 | 请参见 [CHANGELOG.md](CHANGELOG.md) 32 | 33 | 34 | ## License 35 | 36 | [License 协议](LICENSE) 37 | -------------------------------------------------------------------------------- /demo/kbone/README.md: -------------------------------------------------------------------------------- 1 | # vue-kbone 2 | 3 | 基于 [kbone Vue 项目模板](https://developers.weixin.qq.com/miniprogram/kbone/docs/guide/quickstart.html#%E4%BD%BF%E7%94%A8%E6%A8%A1%E6%9D%BF%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91) 展示如何在 kbone 项目里使用神策微信小程序 SDK。 4 | 5 | 参考官网[自定义 app.js](https://developers.weixin.qq.com/miniprogram/kbone/docs/guide/advanced.html#%E8%87%AA%E5%AE%9A%E4%B9%89-app-js-%E5%92%8C-app-wxss) 修改 webpack 配置文件,补上 app.js 构建入口 6 | 7 | SDK 相关代码详见 `src/app.js` 、`src/home/Index.vue` 8 | 9 | 10 | ``` 11 | npm run mp 12 | ``` 13 | * 小程序端:使用开发者工具打开 dist/mp 目录即可。 -------------------------------------------------------------------------------- /demo/kbone/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | vue-kbone 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/kbone/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-kbone", 3 | "version": "0.0.1", 4 | "description": "", 5 | "author": "wechat-miniprogram", 6 | "keywords": [ 7 | "vue", 8 | "kbone", 9 | "mp" 10 | ], 11 | "scripts": { 12 | "start": "npm run mp", 13 | "web": "cross-env NODE_ENV=development webpack-dev-server --inline --progress --config build/webpack.dev.config.js", 14 | "mp": "rimraf dist/mp/common && cross-env NODE_ENV=development webpack --config build/webpack.mp.config.js --progress --hide-modules", 15 | "lint": "eslint --ext .js,.vue src --fix", 16 | "build": "rimraf dist/web && cross-env NODE_ENV=production webpack --config build/webpack.prod.config.js --progress --hide-modules", 17 | "build:mp": "rimraf dist/mp/common && cross-env NODE_ENV=production webpack --config build/webpack.mp.config.js --progress --hide-modules" 18 | }, 19 | "dependencies": { 20 | "sa-sdk-miniprogram": "^1.14.10", 21 | "vue": "^2.6.11", 22 | "vue-router": "^3.3.2", 23 | "vuex": "^3.4.0" 24 | }, 25 | "devDependencies": { 26 | "autoprefixer": "^7.1.2", 27 | "babel-core": "^6.22.1", 28 | "babel-eslint": "^8.2.1", 29 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 30 | "babel-loader": "^7.1.1", 31 | "babel-plugin-dynamic-import-node": "^1.2.0", 32 | "babel-plugin-syntax-jsx": "^6.18.0", 33 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", 34 | "babel-plugin-transform-runtime": "^6.22.0", 35 | "babel-plugin-transform-vue-jsx": "^3.5.0", 36 | "babel-preset-env": "^1.3.2", 37 | "babel-preset-stage-2": "^6.22.0", 38 | "cross-env": "^6.0.3", 39 | "css-loader": "^3.4.0", 40 | "cssnano": "^4.1.10", 41 | "eslint": "^4.15.0", 42 | "eslint-config-airbnb-base": "^11.3.0", 43 | "eslint-friendly-formatter": "^3.0.0", 44 | "eslint-import-resolver-webpack": "^0.8.3", 45 | "eslint-loader": "^3.0.3", 46 | "eslint-plugin-import": "^2.19.1", 47 | "eslint-plugin-vue": "^4.0.0", 48 | "file-loader": "^1.1.4", 49 | "friendly-errors-webpack-plugin": "^1.6.1", 50 | "html-webpack-plugin": "^3.2.0", 51 | "less": "^3.10.3", 52 | "less-loader": "^5.0.0", 53 | "mini-css-extract-plugin": "^0.5.0", 54 | "mp-webpack-plugin": "latest", 55 | "node-notifier": "^5.1.2", 56 | "optimize-css-assets-webpack-plugin": "^5.0.3", 57 | "portfinder": "^1.0.25", 58 | "postcss-loader": "^2.0.8", 59 | "reduce-loader": "^0.3.1", 60 | "rimraf": "^2.7.1", 61 | "terser-webpack-plugin": "^2.3.0", 62 | "thread-loader": "^2.1.3", 63 | "ts-loader": "^6.2.1", 64 | "typescript": "^3.7.3", 65 | "url-loader": "^0.5.8", 66 | "vue-improve-loader": "^0.3.5", 67 | "vue-loader": "^15.7.2", 68 | "vue-style-loader": "^4.1.2", 69 | "vue-template-compiler": "^2.6.10", 70 | "webpack": "^4.41.2", 71 | "webpack-cli": "^3.3.10", 72 | "webpack-dev-server": "^3.9.0", 73 | "webpack-merge": "^4.1.0" 74 | }, 75 | "engines": { 76 | "node": ">= 6.0.0", 77 | "npm": ">= 3.0.0" 78 | }, 79 | "browserslist": [ 80 | "> 1%", 81 | "last 2 versions", 82 | "not ie <= 8" 83 | ] 84 | } 85 | -------------------------------------------------------------------------------- /demo/kbone/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "esnext", 4 | "target": "es2015", 5 | "lib": ["es2015", "es2017", "dom"], 6 | "noImplicitAny": false, 7 | "moduleResolution": "node", 8 | "sourceMap": true, 9 | "baseUrl": ".", 10 | "allowSyntheticDefaultImports": true, 11 | "experimentalDecorators": true, 12 | "emitDecoratorMetadata":true, 13 | "esModuleInterop": true, 14 | "resolveJsonModule": true, 15 | "paths": { 16 | "*": [ 17 | "node_modules/*", 18 | "src/**/@types/*" 19 | ], 20 | } 21 | }, 22 | "include": [ 23 | "src/**/*" 24 | ], 25 | "exclude": [ 26 | "./node_modules/*" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /demo/mpvue/README.md: -------------------------------------------------------------------------------- 1 | # mpvue 2 | 3 | 这个目录展示了如何在 mpvue 项目里使用神策微信小程序 SDK 4 | 相关代码详见 `src/main.js` 、`src/pages/index/index.vue` 5 | 6 | ``` 7 | npm install 8 | npm run dev:wx 9 | ``` 10 | -------------------------------------------------------------------------------- /demo/mpvue/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mp-demo 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /demo/mpvue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mp-demo", 3 | "version": "1.0.0", 4 | "mpvueTemplateProjectVersion": "0.1.0", 5 | "description": "A Mpvue project", 6 | "author": "aliusheng <18256008502@163.com>", 7 | "private": true, 8 | "scripts": { 9 | "dev:wx": "node build/dev-server.js wx", 10 | "start:wx": "npm run dev:wx", 11 | "build:wx": "node build/build.js wx", 12 | "dev:swan": "node build/dev-server.js swan", 13 | "start:swan": "npm run dev:swan", 14 | "build:swan": "node build/build.js swan", 15 | "dev:tt": "node build/dev-server.js tt", 16 | "start:tt": "npm run dev:tt", 17 | "build:tt": "node build/build.js tt", 18 | "dev:my": "node build/dev-server.js my", 19 | "start:my": "npm run dev:my", 20 | "build:my": "node build/build.js my", 21 | "dev": "node build/dev-server.js wx", 22 | "start": "npm run dev", 23 | "build": "node build/build.js wx" 24 | }, 25 | "dependencies": { 26 | "mpvue": "^2.0.0", 27 | "sa-sdk-miniprogram": "^1.14.11" 28 | }, 29 | "devDependencies": { 30 | "babel-core": "^6.22.1", 31 | "babel-loader": "^7.1.1", 32 | "babel-plugin-transform-runtime": "^6.22.0", 33 | "babel-preset-env": "^1.3.2", 34 | "babel-preset-stage-2": "^6.22.0", 35 | "babel-register": "^6.22.0", 36 | "chalk": "^2.4.0", 37 | "connect-history-api-fallback": "^1.3.0", 38 | "copy-webpack-plugin": "^4.5.1", 39 | "css-loader": "^0.28.11", 40 | "cssnano": "^3.10.0", 41 | "eventsource-polyfill": "^0.9.6", 42 | "express": "^4.16.3", 43 | "extract-text-webpack-plugin": "^3.0.2", 44 | "file-loader": "^1.1.11", 45 | "friendly-errors-webpack-plugin": "^1.7.0", 46 | "glob": "^7.1.2", 47 | "html-webpack-plugin": "^3.2.0", 48 | "http-proxy-middleware": "^0.18.0", 49 | "optimize-css-assets-webpack-plugin": "^3.2.0", 50 | "ora": "^2.0.0", 51 | "portfinder": "^1.0.13", 52 | "postcss-loader": "^2.1.4", 53 | "postcss-mpvue-wxss": "^1.0.0", 54 | "prettier": "~1.12.1", 55 | "px2rpx-loader": "^0.1.10", 56 | "relative": "^3.0.2", 57 | "rimraf": "^2.6.0", 58 | "semver": "^5.3.0", 59 | "shelljs": "^0.8.1", 60 | "uglifyjs-webpack-plugin": "^1.2.5", 61 | "url-loader": "^1.0.1", 62 | "vue-style-loader": "^4.1.0", 63 | "mkdirp": "^0.5.1", 64 | "mpvue-loader": "^2.0.0", 65 | "mpvue-template-compiler": "^2.0.0", 66 | "mpvue-webpack-target": "^1.0.3", 67 | "webpack-mpvue-vendor-plugin": "^2.0.0", 68 | "webpack-mpvue-asset-plugin": "^2.0.0", 69 | "webpack-bundle-analyzer": "^2.2.1", 70 | "webpack-dev-middleware-hard-disk": "^1.12.0", 71 | "webpack-merge": "^4.1.0", 72 | "webpack": "^3.11.0" 73 | }, 74 | "engines": { 75 | "node": ">= 4.0.0", 76 | "npm": ">= 3.0.0" 77 | }, 78 | "browserslist": [ 79 | "> 1%", 80 | "last 2 versions", 81 | "not ie <= 8" 82 | ] 83 | } 84 | -------------------------------------------------------------------------------- /demo/mpvue/project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "项目配置文件。", 3 | "setting": { 4 | "urlCheck": true, 5 | "es6": false, 6 | "postcss": true, 7 | "minified": true, 8 | "newFeature": true 9 | }, 10 | "miniprogramRoot": "dist/wx/", 11 | "compileType": "miniprogram", 12 | "appid": "touristappid", 13 | "projectname": "mp-demo", 14 | "condition": { 15 | "search": { 16 | "current": -1, 17 | "list": [] 18 | }, 19 | "conversation": { 20 | "current": -1, 21 | "list": [] 22 | }, 23 | "game": { 24 | "currentL": -1, 25 | "list": [] 26 | }, 27 | "miniprogram": { 28 | "current": -1, 29 | "list": [] 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /demo/remax/README.md: -------------------------------------------------------------------------------- 1 | # Remax Wechat 2 | 3 | 这个目录展示了如何在 Remax 项目里使用神策微信小程序 SDK 4 | 相关代码详见 `src/app.js` 、`src/pages/index.js` 5 | 6 | ```bash 7 | npm install 8 | npm run dev 9 | ``` 10 | 使用小程序开发者工具打开项目下的 `dist` 目录 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/remax/app.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /demo/remax/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-app", 3 | "private": true, 4 | "version": "1.0.0", 5 | "description": "Remax Project", 6 | "main": "index.js", 7 | "keywords": [], 8 | "author": "liusheng", 9 | "license": "MIT", 10 | "scripts": { 11 | "dev": "remax build -t wechat -w", 12 | "build": "cross-env NODE_ENV=production remax build -t wechat" 13 | }, 14 | "dependencies": { 15 | "react": "^16.14.0", 16 | "remax": "^2.9.1" 17 | }, 18 | "devDependencies": { 19 | "cross-env": "^7.0.2" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /demo/remax/project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "miniprogramRoot": "dist/", 3 | "setting": { 4 | "urlCheck": false, 5 | "es6": false, 6 | "postcss": true, 7 | "minified": true, 8 | "newFeature": true, 9 | "coverView": true, 10 | "autoAudits": false, 11 | "uglifyFileName": false, 12 | "checkInvalidKey": true, 13 | "checkSiteMap": true, 14 | "uploadWithSourceMap": true, 15 | "babelSetting": { 16 | "ignore": [], 17 | "disablePlugins": [], 18 | "outputPath": "" 19 | }, 20 | "bundle": false 21 | }, 22 | "compileType": "miniprogram", 23 | "simulatorType": "wechat", 24 | "simulatorPluginLibVersion": {}, 25 | "condition": {} 26 | } 27 | -------------------------------------------------------------------------------- /demo/remax/remax.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | }; 4 | -------------------------------------------------------------------------------- /demo/taro/README.md: -------------------------------------------------------------------------------- 1 | # taro 2 | 3 | 这个目录展示了如何在 taro 项目里使用神策微信小程序 SDK 4 | 相关代码详见 `src/app.js` 、`src/pages/index.jsx` 5 | 6 | ``` 7 | npm install 8 | npm run dev:weapp 9 | ``` 10 | 11 | -------------------------------------------------------------------------------- /demo/taro/babel.config.js: -------------------------------------------------------------------------------- 1 | // babel-preset-taro 更多选项和默认值: 2 | // https://github.com/NervJS/taro/blob/next/packages/babel-preset-taro/README.md 3 | module.exports = { 4 | presets: [ 5 | ['taro', { 6 | framework: 'react', 7 | ts: false 8 | }] 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /demo/taro/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "taro_sdk_5", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "sdk", 6 | "templateInfo": { 7 | "name": "default", 8 | "typescript": false, 9 | "css": "none" 10 | }, 11 | "scripts": { 12 | "build:weapp": "taro build --type weapp", 13 | "build:swan": "taro build --type swan", 14 | "build:alipay": "taro build --type alipay", 15 | "build:tt": "taro build --type tt", 16 | "build:h5": "taro build --type h5", 17 | "build:rn": "taro build --type rn", 18 | "build:qq": "taro build --type qq", 19 | "build:jd": "taro build --type jd", 20 | "build:quickapp": "taro build --type quickapp", 21 | "dev:weapp": "npm run build:weapp -- --watch", 22 | "dev:swan": "npm run build:swan -- --watch", 23 | "dev:alipay": "npm run build:alipay -- --watch", 24 | "dev:tt": "npm run build:tt -- --watch", 25 | "dev:h5": "npm run build:h5 -- --watch", 26 | "dev:rn": "npm run build:rn -- --watch", 27 | "dev:qq": "npm run build:qq -- --watch", 28 | "dev:jd": "npm run build:jd -- --watch", 29 | "dev:quickapp": "npm run build:quickapp -- --watch" 30 | }, 31 | "browserslist": [ 32 | "last 3 versions", 33 | "Android >= 4.1", 34 | "ios >= 8" 35 | ], 36 | "author": "", 37 | "dependencies": { 38 | "@babel/runtime": "^7.7.7", 39 | "@tarojs/components": "3.2.8", 40 | "@tarojs/react": "3.2.8", 41 | "@tarojs/runtime": "3.2.8", 42 | "@tarojs/taro": "3.2.8", 43 | "react": "^17.0.0", 44 | "react-dom": "^17.0.0", 45 | "sa-sdk-miniprogram": "^1.14.11" 46 | }, 47 | "devDependencies": { 48 | "@types/webpack-env": "^1.13.6", 49 | "@types/react": "^17.0.2", 50 | "@tarojs/mini-runner": "3.2.8", 51 | "@babel/core": "^7.8.0", 52 | "@tarojs/webpack-runner": "3.2.8", 53 | "babel-preset-taro": "3.2.8", 54 | "eslint-config-taro": "3.2.8", 55 | "eslint": "^6.8.0", 56 | "eslint-plugin-react": "^7.8.2", 57 | "eslint-plugin-import": "^2.12.0", 58 | "eslint-plugin-react-hooks": "^4.2.0", 59 | "stylelint": "9.3.0" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /demo/taro/project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "miniprogramRoot": "./dist", 3 | "projectname": "taro_sdk_5", 4 | "description": "sdk", 5 | "appid": "touristappid", 6 | "setting": { 7 | "urlCheck": true, 8 | "es6": false, 9 | "postcss": false, 10 | "minified": false 11 | }, 12 | "compileType": "miniprogram" 13 | } 14 | -------------------------------------------------------------------------------- /demo/taro/project.tt.json: -------------------------------------------------------------------------------- 1 | { 2 | "miniprogramRoot": "./", 3 | "projectname": "taro_sdk_5", 4 | "appid": "touristappid", 5 | "setting": { 6 | "es6": false, 7 | "minified": false 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /dist/wechat/plugin/abtesting-sdk-miniprogram/README.md: -------------------------------------------------------------------------------- 1 | # A/B测试-小程序 2 | 3 | ## 功能 4 | 本功能需要配合神策A/B测试使用。 5 | * 微信小程序详细集成方式参考: [微信小程序A/B集成](https://manual.sensorsdata.cn/abtesting/latest/a-b-testing-105447613.html) 6 | 7 | * 快应用详细集成方式参考: [快应用A/B集成](https://manual.sensorsdata.cn/abtesting/latest/sdk-a-b-testing-50987203.html) 8 | -------------------------------------------------------------------------------- /dist/wechat/plugin/abtesting-sdk-miniprogram/alipay/abtest.cmd.min.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sensorsdata/sa-sdk-miniprogram/cb79b96ebefaefb70a617df1b0c2ec78d7e8f589/dist/wechat/plugin/abtesting-sdk-miniprogram/alipay/abtest.cmd.min.js -------------------------------------------------------------------------------- /dist/wechat/plugin/abtesting-sdk-miniprogram/alipay/abtest.esm.min.js: -------------------------------------------------------------------------------- 1 | var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var r in t)void 0!==t[r]&&(e[r]=t[r])}),e}function each(e,t,r){var a=Array.prototype.forEach,i={};if(null==e)return!1;if(a&&e.forEach===a)e.forEach(t,r);else if(e.length===+e.length){for(var n=0,s=e.length;n-1?t.system.split(" ")[1]:t.system}catch(e){log("get system fails")}}function getAppId(){var e;if(my.getAccountInfoSync&&(e=my.getAppIdSync()),isObject(e))return e.appId||""}_.getSystemInfo=getSystemInfo,_.getAppId=getAppId;var para={url:"",project_key:"",retry_times:3,timeout_milliseconds:3e3,update_interval:6e5},info={scene:"",lib_version:"1.22.3",plugin_version:"1.22.3",platform:"AlipayMini",storage_key:"sensorsdata2015_ABTest",lib_plugin_name:"alipaymini_abtesting",platform_obj:my},props={$manufacturer:"",$model:"",$os:"",$os_version:""},state={inited:!1,fetchInterval:null,test_list:{},trigger_list:[]};function mixinConfig(e){e.para=para,e.info=info,e.state=state,e.props=props,e.plugin_name="ABTestingAlipay"}function mixinStore(e){var t=e.info.platform_obj;if(!t||isEmptyObject(t))return!1;e.store={getStorage:function(e){var r="";try{a=r=t.getStorageSync({key:e}),r=isString(a)?(-1!==a.indexOf("data:enc;")&&(a=rot13defs(a=a.substring("data:enc;".length))),a):a}catch(e){log("\u83b7\u53d6 storage \u5931\u8d25\uff01")}var a;return isJSONString(r)&&(r=JSON.parse(r)),r},setStorage:function(r,a){var i;try{n=i=JSON.stringify(a),s=!1,e&&e._sa&&e._sa.para&&(s=e._sa.para.encrypt_storage),s&&(isObject(n)&&(n=JSON.stringify(n)),n="data:enc;"+rot13obfs(n)),i=n}catch(e){log("\u5e8f\u5217\u5316\u7f13\u5b58\u5bf9\u8c61\u5931\u8d25\uff01")}var n,s;try{t.setStorageSync({key:r,data:i})}catch(e){log("set Storage fail again --",e)}}}}function mixinRequest(e){var t,r=e.info.platform_obj;isObject(r)&&(t=function(e){var t=e.url,a="GET",i=null;e.method&&(a=e.method),e.data&&(i=e.data),r.request({url:t,method:a,data:i,timeout:e.timeout,success:function(t){e.suc(t.data)},fail:function(t){e.fail(t)}})}),e.request=t}function mixinFetch(e){e.fetchTest=function(){var t=0,r=!1,a=e.creatRequestData();function i(t){_.log("\u8bf7\u6c42\u6570\u636e\u7ed3\u679c\u6210\u529f: ",t),r=!0,e.updateData(t),e.state.fetchInterval&&clearTimeout(e.state.fetchInterval),e.state.fetchInterval=setTimeout(function(){e.request({url:e.para.url,method:"POST",data:JSON.stringify(a),timeout:e.para.timeout_milliseconds,suc:i,fail:n})},e.para.update_interval)}function n(s){return _.log("\u8bf7\u6c42\u6570\u636e\u7ed3\u679c\u5931\u8d25: ",s),t++,!r&&t0||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cparam_name\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e\uff01param_name:",t.param_name),a=!1);break;case"value_type":_.isString(t.value_type)&&-1!==_.indexOf(VALUE_TYPE_LIST,t.value_type)||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cvalue_type\u914d\u7f6e\u9519\u8bef",t.value_type),a=!1);break;case"default_value":void 0===t.default_value?(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cdefault_value\u53c2\u6570\u672a\u914d\u7f6e"),a=!1):verifyStore.valueType(t.default_value,t.value_type)||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cdefault_value\u7c7b\u578b\u5fc5\u987b\u4e0evalue_type\u4e00\u81f4\uff01",t.default_value,t.value_type),a=!1);break;case"callback":_.isFunction(t.callback)||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0ccallback\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e"),a=!1)}}),a},resolveCustomProperties:function(e){var t={verify_success:!0,para:null},r=e.custom_properties;if(!_.isObject(r)||_.isEmptyObject(r))return delete e.custom_properties,t.para=e,t;if(_.each(r,function(e,r){if((!_.isString(r)||!regName.test(r)||r.length>100)&&(_.log(" property name [ "+r+" ] is not invalid "),t.verify_success=!1),(_.isString(e)||_.isNumber(e)||_.isBoolean(e)||_.isArray(e)||_.isDate(e))&&!(_.isString(e)&&e.length>500)||(_.log("property [ "+r+" ] of value [ "+JSON.stringify(e)+" ] is not invalid"),t.verify_success=!1),_.isArray(e)){var a=!0;_.each(e,function(e){!1!==a&&(_.isString(e)||(a=!1))}),a||(_.log("property value type can be array, but only allow string item. property [ "+r+" ] of value "+JSON.stringify(e)+" is not invalid"),t.verify_success=!1)}}),!0===t.verify_success){var a={};_.each(r,function(e,t){_.isDate(e)?a[t]=_.formatDate(e):_.isString(e)?a[t]=e:a[t]=JSON.stringify(e)}),e.custom_properties=a}return t.para=e,t}};function defineApi(e,t){for(var r of t)e[r]="fetchCacheABTest"===r?function(e){if(_.log("\u8c03\u7528\u5206\u6d41 API --- A/B Testing \u63d2\u4ef6\u5c1a\u672a\u521d\u59cb\u5316\uff01"),Object.prototype.hasOwnProperty.call(e,"default_value"))return e.default_value}:function(e){_.log("\u8c03\u7528\u5206\u6d41 API --- A/B Testing \u63d2\u4ef6\u5c1a\u672a\u521d\u59cb\u5316\uff01"),e&&_.isFunction(e.callback)&&Object.prototype.hasOwnProperty.call(e,"default_value")&&e.callback(e.default_value)}}function initAPI(e){e.setPara=function(t){if(!_.isString(t.url)||"http"!==t.url.slice(0,4))return _.log("A/B Testing SDK \u521d\u59cb\u5316\u5931\u8d25\uff0c\u8bf7\u4f7f\u7528\u6b63\u786e\u7684 URL\uff01"),!1;e.para.url=t.url;var r=_.getQueryParam(t.url,"project-key");return r?(e.para.project_key=r,_.isNumber(t.timeout_milliseconds)&&(t.timeout_milliseconds<200?e.para.timeout_milliseconds=200:e.para.timeout_milliseconds=t.timeout_milliseconds),_.isNumber(t.update_interval)&&(e.para.update_interval=t.update_interval),!0):(_.log("A/B Testing SDK \u521d\u59cb\u5316\u5931\u8d25\uff0c\u8bf7\u4f7f\u7528\u6b63\u786e\u7684 URL\uff08\u5fc5\u987b\u5305\u542b project-key\uff09\uff01"),!1)},e.asyncFetchABTest=function(t){if(!_.isObject(t))return _.log("asyncFetchABTest\u8c03\u7528\u5931\u8d25\uff0c\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e"),!1;if(!verifyStore.para("asyncFetchABTest",t,["param_name","value_type","default_value","callback"]))return!1;var r=verifyStore.resolveCustomProperties(t);r.verify_success?(t=r.para,_.validTimeout(t),e.asyncFetch(t)):t.callback(t.default_value)},e.fastFetchABTest=function(t){if(!_.isObject(t))return _.log("fastFetchABTest \u8c03\u7528\u5931\u8d25\uff0c\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e"),!1;if(!verifyStore.para("fastFetchABTest",t,["param_name","value_type","default_value","callback"]))return!1;var r=verifyStore.resolveCustomProperties(t);if(r.verify_success){t=r.para,_.validTimeout(t);var a=e.searchLocalExp(t.param_name);if(_.isObject(a)){var i=e.getExpResult(t,a);t.callback(i)}else _.log("fastFetchABTest \u7f13\u5b58\u4e2d\u672a\u8bfb\u53d6\u5230\u6570\u636e\uff0c\u53d1\u8d77\u8bf7\u6c42"),e.asyncFetch(t)}else t.callback(t.default_value)},e.fetchCacheABTest=function(t){if(_.isObject(t))return!!verifyStore.para("fetchCacheABTest",t,["param_name","value_type","default_value"])&&e.getExpResult(t);_.log("fetchCacheABTest\u8c03\u7528\u5931\u8d25\uff0c\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e")},e.asyncFetch=function(t){e.getResultFromServer({para:t,suc:function(r){if(_.isObject(r)&&"SUCCESS"===r.status){_.log("\u83b7\u53d6\u5230\u670d\u52a1\u7aef\u8bd5\u9a8c\u7ed3\u679c\u6570\u636e: ",r),e.updateData(r);var a=e.getExpResult(t);t.callback(a)}else t.callback(t.default_value)},fail:function(e){_.log("\u83b7\u53d6\u670d\u52a1\u7aef\u6570\u636e\u5931\u8d25: ",e),t.callback(t.default_value)}})},e.searchLocalExp=function(t){return!!e.state.test_list[t]&&e.state.test_list[t]},e.getExpResult=function(t,r){var a=t.default_value,i=r||e.searchLocalExp(t.param_name);return _.isObject(i)?_.isObject(i.config)&&(i.config.type===t.value_type?(a=i.config.value,e.trackTestTrigger(i)):_.log("\u8bd5\u9a8c\u7ed3\u679c\u7c7b\u578b\u4e0e\u671f\u671b\u7c7b\u578b\u4e0d\u4e00\u81f4\uff0cparam_name\uff1a"+t.param_name+"\uff0c\u5f53\u524d\u8fd4\u56de\u7c7b\u578b\u4e3a\uff1a"+i.config.type+"\uff0c\u671f\u671b\u7c7b\u578b\u4e3a\uff1a"+t.value_type)):_.log("\u672c\u5730\u672a\u67e5\u8be2\u5230\u8bd5\u9a8c\u6570\u636e\uff0c\u8bd5\u9a8c\u53c2\u6570\u540d\u79f0\uff1a"+t.param_name),a},e.getResultFromServer=function(t){var r=(t=_.isObject(t)?t:{}).para||{},a=t.suc,i=t.fail,n=e.creatRequestData(r);e.request({url:e.para.url,method:"POST",data:JSON.stringify(n),contentType:"application/json",timeout:r.timeout_milliseconds||e.para.timeout_milliseconds,suc:a,fail:i}),_.log("\u5411\u670d\u52a1\u7aef\u53d1\u8d77\u8bd5\u9a8c\u8bf7\u6c42")}}var getDistinctId=function(e){var t="";return e._sa&&e._sa.store&&(t=e._sa.store.getDistinctId()),t};function mixinTrack(e){e.trackTestTrigger=function(t){var r=!1,a=!0;if(t.is_white_list)return!1;var i=t.abtest_experiment_group_id,n=getDistinctId(e),s=t.abtest_experiment_id,o=e.store.getStorage("sensorsdata_abtest_trigger")||{};function c(){a=!1,o[n][s]=i,e.store.setStorage("sensorsdata_abtest_trigger",o)}if(o[n]&&(r=!0),o&&o[n]){var l=o[n];l[s]?l[s]!==i&&(delete l[s],c()):c()}else o[n]={},c();if(!a){var u={$abtest_experiment_id:s,$abtest_experiment_group_id:i};if(!r){var _=e.info.lib_plugin_name+":"+e.info.lib_version;u.$lib_plugin_version=[_]}e._sa.track("$ABTestTrigger",u)}}}var ABTest={};mixinConfig(ABTest),mixinFetch(ABTest),mixinTrack(ABTest),mixinRequest(ABTest),mixinStore(ABTest),ABTest.init=function(e,t){if(_.log("\u521d\u59cb\u5316 ABTest \u63d2\u4ef6"),this.state.inited)return!1;if(initAPI(ABTest),!this.setPara(t))return!1;this.state.inited=!0,this._sa=e,this.subId=new e.eventSub(this.handleIdChange);var r=ABTest.store.getStorage(this.info.storage_key);_.isObject(r)?this.state.test_list=r:this.state.test_list={},_.getSystemInfo(this),this.subId.isReady(),this.listenAppLaunch()},ABTest.handleIdChange=function(e){"changeDistinctId"===e&&(ABTest.state.test_list={},ABTest.state.trigger_list=[],ABTest.store.setStorage(ABTest.info.storage_key,ABTest.state.test_list),ABTest.fetchTest())},ABTest.listenAppLaunch=function(){var e=my.getLaunchOptionsSync();e&&e.scene&&(this.info.scene="ali-"+e.scene),this.fetchTest()},defineApi(ABTest,["asyncFetchABTest","fastFetchABTest","fetchCacheABTest"]);export default ABTest; -------------------------------------------------------------------------------- /dist/wechat/plugin/abtesting-sdk-miniprogram/quickapp/abtest.esm.min.js: -------------------------------------------------------------------------------- 1 | import device from"@system.device";import storage from"@system.storage";import fetch from"@system.fetch";var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var r in t)void 0!==t[r]&&(e[r]=t[r])}),e}function each(e,t,r){var a=Array.prototype.forEach,i={};if(null==e)return!1;if(a&&e.forEach===a)e.forEach(t,r);else if(e.length===+e.length){for(var s=0,n=e.length;s0||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cparam_name\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e\uff01param_name:",t.param_name),a=!1);break;case"value_type":_.isString(t.value_type)&&-1!==_.indexOf(VALUE_TYPE_LIST,t.value_type)||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cvalue_type\u914d\u7f6e\u9519\u8bef",t.value_type),a=!1);break;case"default_value":void 0===t.default_value?(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cdefault_value\u53c2\u6570\u672a\u914d\u7f6e"),a=!1):verifyStore.valueType(t.default_value,t.value_type)||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0cdefault_value\u7c7b\u578b\u5fc5\u987b\u4e0evalue_type\u4e00\u81f4\uff01",t.default_value,t.value_type),a=!1);break;case"callback":_.isFunction(t.callback)||(_.log(e+"\u65b9\u6cd5\u8c03\u7528\u5931\u8d25\uff0ccallback\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e"),a=!1)}}),a},resolveCustomProperties:function(e){var t={verify_success:!0,para:null},r=e.custom_properties;if(!_.isObject(r)||_.isEmptyObject(r))return delete e.custom_properties,t.para=e,t;if(_.each(r,function(e,r){if((!_.isString(r)||!regName.test(r)||r.length>100)&&(_.log(" property name [ "+r+" ] is not invalid "),t.verify_success=!1),(_.isString(e)||_.isNumber(e)||_.isBoolean(e)||_.isArray(e)||_.isDate(e))&&!(_.isString(e)&&e.length>500)||(_.log("property [ "+r+" ] of value [ "+JSON.stringify(e)+" ] is not invalid"),t.verify_success=!1),_.isArray(e)){var a=!0;_.each(e,function(e){!1!==a&&(_.isString(e)||(a=!1))}),a||(_.log("property value type can be array, but only allow string item. property [ "+r+" ] of value "+JSON.stringify(e)+" is not invalid"),t.verify_success=!1)}}),!0===t.verify_success){var a={};_.each(r,function(e,t){_.isDate(e)?a[t]=_.formatDate(e):_.isString(e)?a[t]=e:a[t]=JSON.stringify(e)}),e.custom_properties=a}return t.para=e,t}};function defineApi(e,t){for(var r of t)e[r]="fetchCacheABTest"===r?function(e){if(_.log("\u8c03\u7528\u5206\u6d41 API --- A/B Testing \u63d2\u4ef6\u5c1a\u672a\u521d\u59cb\u5316\uff01"),Object.prototype.hasOwnProperty.call(e,"default_value"))return e.default_value}:function(e){_.log("\u8c03\u7528\u5206\u6d41 API --- A/B Testing \u63d2\u4ef6\u5c1a\u672a\u521d\u59cb\u5316\uff01"),e&&_.isFunction(e.callback)&&Object.prototype.hasOwnProperty.call(e,"default_value")&&e.callback(e.default_value)}}function initAPI(e){e.setPara=function(t){if(!_.isString(t.url)||"http"!==t.url.slice(0,4))return _.log("A/B Testing SDK \u521d\u59cb\u5316\u5931\u8d25\uff0c\u8bf7\u4f7f\u7528\u6b63\u786e\u7684 URL\uff01"),!1;e.para.url=t.url;var r=_.getQueryParam(t.url,"project-key");return r?(e.para.project_key=r,_.isNumber(t.timeout_milliseconds)&&(t.timeout_milliseconds<200?e.para.timeout_milliseconds=200:e.para.timeout_milliseconds=t.timeout_milliseconds),_.isNumber(t.update_interval)&&(e.para.update_interval=t.update_interval),!0):(_.log("A/B Testing SDK \u521d\u59cb\u5316\u5931\u8d25\uff0c\u8bf7\u4f7f\u7528\u6b63\u786e\u7684 URL\uff08\u5fc5\u987b\u5305\u542b project-key\uff09\uff01"),!1)},e.asyncFetchABTest=function(t){if(!_.isObject(t))return _.log("asyncFetchABTest\u8c03\u7528\u5931\u8d25\uff0c\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e"),!1;if(!verifyStore.para("asyncFetchABTest",t,["param_name","value_type","default_value","callback"]))return!1;var r=verifyStore.resolveCustomProperties(t);r.verify_success?(t=r.para,_.validTimeout(t),e.asyncFetch(t)):t.callback(t.default_value)},e.fastFetchABTest=function(t){if(!_.isObject(t))return _.log("fastFetchABTest \u8c03\u7528\u5931\u8d25\uff0c\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e"),!1;if(!verifyStore.para("fastFetchABTest",t,["param_name","value_type","default_value","callback"]))return!1;var r=verifyStore.resolveCustomProperties(t);if(r.verify_success){t=r.para,_.validTimeout(t);var a=e.searchLocalExp(t.param_name);if(_.isObject(a)){var i=e.getExpResult(t,a);t.callback(i)}else _.log("fastFetchABTest \u7f13\u5b58\u4e2d\u672a\u8bfb\u53d6\u5230\u6570\u636e\uff0c\u53d1\u8d77\u8bf7\u6c42"),e.asyncFetch(t)}else t.callback(t.default_value)},e.fetchCacheABTest=function(t){if(_.isObject(t))return!!verifyStore.para("fetchCacheABTest",t,["param_name","value_type","default_value"])&&e.getExpResult(t);_.log("fetchCacheABTest\u8c03\u7528\u5931\u8d25\uff0c\u53c2\u6570\u672a\u6b63\u786e\u914d\u7f6e")},e.asyncFetch=function(t){e.getResultFromServer({para:t,suc:function(r){if(_.isObject(r)&&"SUCCESS"===r.status){_.log("\u83b7\u53d6\u5230\u670d\u52a1\u7aef\u8bd5\u9a8c\u7ed3\u679c\u6570\u636e: ",r),e.updateData(r);var a=e.getExpResult(t);t.callback(a)}else t.callback(t.default_value)},fail:function(e){_.log("\u83b7\u53d6\u670d\u52a1\u7aef\u6570\u636e\u5931\u8d25: ",e),t.callback(t.default_value)}})},e.searchLocalExp=function(t){return!!e.state.test_list[t]&&e.state.test_list[t]},e.getExpResult=function(t,r){var a=t.default_value,i=r||e.searchLocalExp(t.param_name);return _.isObject(i)?_.isObject(i.config)&&(i.config.type===t.value_type?(a=i.config.value,e.trackTestTrigger(i)):_.log("\u8bd5\u9a8c\u7ed3\u679c\u7c7b\u578b\u4e0e\u671f\u671b\u7c7b\u578b\u4e0d\u4e00\u81f4\uff0cparam_name\uff1a"+t.param_name+"\uff0c\u5f53\u524d\u8fd4\u56de\u7c7b\u578b\u4e3a\uff1a"+i.config.type+"\uff0c\u671f\u671b\u7c7b\u578b\u4e3a\uff1a"+t.value_type)):_.log("\u672c\u5730\u672a\u67e5\u8be2\u5230\u8bd5\u9a8c\u6570\u636e\uff0c\u8bd5\u9a8c\u53c2\u6570\u540d\u79f0\uff1a"+t.param_name),a},e.getResultFromServer=function(t){var r=(t=_.isObject(t)?t:{}).para||{},a=t.suc,i=t.fail,s=e.creatRequestData(r);e.request({url:e.para.url,method:"POST",data:JSON.stringify(s),contentType:"application/json",timeout:r.timeout_milliseconds||e.para.timeout_milliseconds,suc:a,fail:i}),_.log("\u5411\u670d\u52a1\u7aef\u53d1\u8d77\u8bd5\u9a8c\u8bf7\u6c42")}}var para={url:"",project_key:"",retry_times:3,timeout_milliseconds:3e3,update_interval:6e5},info={lib_version:"1.22.3",plugin_version:"1.22.3",platform:"QuickApp",storage_key:"sensorsdata2015_ABTest",lib_plugin_name:"quickapp_abtesting"},props={$manufacturer:"",$model:"",$brand:"",$os:"",$os_version:""},state={inited:!1,fetchInterval:null,test_list:{},trigger_list:[],store_inited:!1,fetch_queue:[]};function mixinConfig(e){e.para=para,e.info=info,e.state=state,e.props=props,e.plugin_name="ABTestingQuickApp"}var getDistinctId=function(e){var t="";return e._sa&&e._sa.store&&(t=e._sa.store.getDistinctId()),t};function mixinTrack(e){e.trackTestTrigger=function(t){var r=!1,a=!0;if(t.is_white_list)return!1;var i=t.abtest_experiment_group_id,s=getDistinctId(e),n=t.abtest_experiment_id,o=e.store.getStorage("sensorsdata_abtest_trigger")||{};function c(){a=!1,o[s][n]=i,e.store.setStorage("sensorsdata_abtest_trigger",o)}if(o[s]&&(r=!0),o&&o[s]){var u=o[s];u[n]?u[n]!==i&&(delete u[n],c()):c()}else o[s]={},c();if(!a){var l={$abtest_experiment_id:n,$abtest_experiment_group_id:i};if(!r){var _=e.info.lib_plugin_name+":"+e.info.lib_version;l.$lib_plugin_version=[_]}e._sa.track("$ABTestTrigger",l)}}}var request=function(e){var t=e.url,r="GET",a=null;e.method&&(r=e.method),e.data&&(a=e.data),fetch.fetch({data:a,responseType:"Object",method:r,url:t,success:function(t){var r={};if(t.data)try{r=JSON.parse(t.data)}catch(e){r={}}e.suc(r)},fail:e.fail})};function mixinRequest(e){e.request=request}var ABTest={};mixinConfig(ABTest),mixinFetch(ABTest),mixinTrack(ABTest),mixinRequest(ABTest),mixinStore(ABTest),ABTest.init=function(e,t){return _.isObject(t.app)?t.app.sensorsABTest=ABTest:_.log("\u8bf7\u4f20\u5165\u6b63\u786e\u7684 App \u5bf9\u8c61\uff01"),_.log("\u521d\u59cb\u5316 ABTest \u63d2\u4ef6"),!this.state.inited&&(initAPI(ABTest),!!this.setPara(t)&&(this.state.inited=!0,this._sa=e,this.subId=new e.eventSub(this.handleEvents),this.subId.isReady(),void getStorage(ABTest.info.storage_key,ABTest.getTestList)))},ABTest.handleEvents=function(e){if("changeDistinctId"===e&&(ABTest.state.test_list={},ABTest.state.trigger_list=[],setStorage(ABTest.info.storage_key,ABTest.state.test_list),ABTest.fetchTest()),"initStore"===e){if(ABTest.state.store_inited)return!1;ABTest.state.store_inited=!0,_.getSystemInfo(ABTest,ABTest.fetchTest),ABTest.state.fetch_queue.length>0&&_.each(ABTest.state.fetch_queue,function(e){ABTest[e.event].apply(ABTest,e.arg)})}},ABTest.getTestList=function(e){_.isObject(e)?ABTest.state.test_list=e:ABTest.state.test_list={}},_.each(["fetchTest","asyncFetch"],function(e){var t=ABTest[e];ABTest[e]=function(){ABTest.state.store_inited?t.apply(ABTest,arguments):ABTest.state.fetch_queue.push({event:e,arg:arguments})}}),defineApi(ABTest,["asyncFetchABTest","fastFetchABTest","fetchCacheABTest"]);export default ABTest; -------------------------------------------------------------------------------- /dist/wechat/plugin/ad-channel-h5-linker/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var h5Linker={is_ready:!1},log=console&&console.log||function(){};h5Linker.getSasdkValue=function(){var e=this.store.getDistinctId()||"",t=this.store.getFirstId()||"";return this._.urlSafeBase64&&this._.urlSafeBase64.encode?e=e?this._.urlSafeBase64.trim(this._.urlSafeBase64.encode(this._.base64Encode(e))):"":this._.rot13obfs&&(e=e?this._.rot13obfs(e):""),encodeURIComponent(t?"f"+e:"d"+e)},h5Linker.rewriteUrl=function(e,t){if(!this.is_ready)return this.log("h5Linker plugin not initialized"),e;var n=this,i=/([^?#]+)(\?[^#]*)?(#.*)?/.exec(e),s="";if(!i)return e;var r,a=i[1]||"",o=i[2]||"",l=i[3]||"",c="_sasdk="+this.getSasdkValue(),u=function(e){var t=e.split("&"),i=[];return n._.each(t,function(e){e.indexOf("_sasdk=")>-1?i.push(c):i.push(e)}),i.join("&")};(t=!!this._.isBoolean(t)&&t)?(r=l.indexOf("_sasdk"),s=l.indexOf("?")>-1?r>-1?a+o+"#"+l.substring(1,r)+u(l.substring(r,l.length)):a+o+l+"&"+c:a+o+"#"+l.substring(1)+"?"+c):(r=o.indexOf("_sasdk"),s=/^\?(\w)+/.test(o)?r>-1?a+"?"+u(o.substring(1))+l:a+o+"&"+c+l:a+"?"+c+l);return s},h5Linker.init=function(e){e?(this._=e._,this.store=e.store,this.log=e._.logger.info||log,this.is_ready=!0):log("H5Linker plugin initialization failed")},h5Linker.plugin_name="H5Linker";var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var t=Object.prototype.toString.call(e);return"[object Function]"==t||"[object AsyncFunction]"==t}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log$1(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var n in t)void 0!==t[n]&&(e[n]=t[n])}),e}function each(e,t,n){var i=Array.prototype.forEach,s={};if(null==e)return!1;if(i&&e.forEach===i)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,a=e.length;r0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var sa,registerProperties=createPlugin(RegisterProperties),customEventList=[],maxSaveTime=2592e6,latestEventInitialTime=null;function decodeURI(e){var t="";try{t=decodeURIComponent(e)}catch(n){t=e}return t}function getQueryString(e,t){if(e[t])return decodeURI(e[t]);var n=e.scene||"";if(n){var i=decodeURI(n),s=new RegExp("(^|&)"+t+"=([^&]*)(&|$)","i"),r=i.match(s);if(null!==r)return decodeURI(r[2])}return null}function isSatCfLegal(e){return""!==e&&"''"!==e&&'""'!==e}var AdChannel={plugin_name:"ADChannel",init:function(e,t){if(!(sa=e))return console.log("当前主sdk 初始化失败,请传入正确的 sensors 对象!"),!1;var n=sa.usePlugin(registerProperties);this.eventList.init(),sa._.isObject(t)&&!0===t.appShow?this.listenAppShow():this.listenAppLaunch(),this.addIsChannelCallbackEvent(n)},getChannelQuery:function(e){var t=sa._.deepCopy(e).query;if(sa._.isObject(t)){var n=getQueryString(t,"sat_cf"),i=isSatCfLegal(n);if(n&&i){var s={};e.scene?s.$scene=sa._.getMPScene(e.scene):s.$scene="未取到值";var r=t.scene||"",a="";r&&(a=decodeURI(r),delete t.scene);var o=sa._.setQuery(t),l=sa._.setQuery(t,!0);if(a&&(o+=(o?"&":"")+a,l+=(l?"&":"")+a),e.path){s.$url_path=sa._.getPath(e.path),s.$title=sa._.getPageTitle(e.path);var c=o?"?"+o:"",u=l?"?"+l:"";s.$url=s.$url_path+c,s.$ad_landing_page_url=s.$url_path+u}t._sfs&&(s.$sf_source=t._sfs,s.$latest_sf_source=s.$sf_source);var h=sa._.setUtm(e,s);sa._.setLatestChannel(h.pre2),s.$latest_scene=s.$scene,s.$url_query=o,this.trackChannel(s)}}},trackChannel:function(e){sa.track("$ChannelLinkReaching",e),this.setEventQueue()},setEventQueue:function(){var e,t=[];try{for(var n=0;n0&&sa.initialState.queue.splice(e,0,t)}catch(e){sa._.logger.info("渠道插件事件发送排序: "+e)}},addIsChannelCallbackEvent:function(e){var t=this,n=["$MPLaunch","$ABTestTrigger","$PlanPopupDisplay","$PlanPopupClick","$ChannelLinkReaching","$MPShow","$MPHide","$MPViewScreen","$MPClick","$MPShare","$MPAddFavorites","$MPPageLeave","$SignUp","$UnbindID","$BindID"];e.hookRegister(function(e){var i={};if(e&&e.event){var s=e.event,r=!0;n.indexOf(s)<0&&(t.eventList.hasEvent(s)?r=!1:t.eventList.add(s),i.$is_channel_callback_event=r)}return i})},eventList:{init:function(){var e=sa._.getStorageSync("saminiprogramchannel"),t=(new Date).getTime();if(e&&sa._.isNumber(e.latest_event_initial_time)&&sa._.isArray(e.event_list)){var n=t-e.latest_event_initial_time;n>0&&n-1?r>-1?a+o+"#"+l.substring(1,r)+u(l.substring(r,l.length)):a+o+l+"&"+c:a+o+"#"+l.substring(1)+"?"+c):(r=o.indexOf("_sasdk"),s=/^\?(\w)+/.test(o)?r>-1?a+"?"+u(o.substring(1))+l:a+o+"&"+c+l:a+"?"+c+l);return s},h5Linker.init=function(e){e?(this._=e._,this.store=e.store,this.log=e._.logger.info||log,this.is_ready=!0):log("H5Linker plugin initialization failed")},h5Linker.plugin_name="H5Linker";var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var t=Object.prototype.toString.call(e);return"[object Function]"==t||"[object AsyncFunction]"==t}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log$1(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var n in t)void 0!==t[n]&&(e[n]=t[n])}),e}function each(e,t,n){var i=Array.prototype.forEach,s={};if(null==e)return!1;if(i&&e.forEach===i)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,a=e.length;r0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var sa,registerProperties=createPlugin(RegisterProperties),customEventList=[],maxSaveTime=2592e6,latestEventInitialTime=null;function decodeURI(e){var t="";try{t=decodeURIComponent(e)}catch(n){t=e}return t}function getQueryString(e,t){if(e[t])return decodeURI(e[t]);var n=e.scene||"";if(n){var i=decodeURI(n),s=new RegExp("(^|&)"+t+"=([^&]*)(&|$)","i"),r=i.match(s);if(null!==r)return decodeURI(r[2])}return null}function isSatCfLegal(e){return""!==e&&"''"!==e&&'""'!==e}var AdChannel={plugin_name:"ADChannel",init:function(e,t){if(!(sa=e))return console.log("当前主sdk 初始化失败,请传入正确的 sensors 对象!"),!1;var n=sa.usePlugin(registerProperties);this.eventList.init(),sa._.isObject(t)&&!0===t.appShow?this.listenAppShow():this.listenAppLaunch(),this.addIsChannelCallbackEvent(n)},getChannelQuery:function(e){var t=sa._.deepCopy(e).query;if(sa._.isObject(t)){var n=getQueryString(t,"sat_cf"),i=isSatCfLegal(n);if(n&&i){var s={};e.scene?s.$scene=sa._.getMPScene(e.scene):s.$scene="未取到值";var r=t.scene||"",a="";r&&(a=decodeURI(r),delete t.scene);var o=sa._.setQuery(t),l=sa._.setQuery(t,!0);if(a&&(o+=(o?"&":"")+a,l+=(l?"&":"")+a),e.path){s.$url_path=sa._.getPath(e.path),s.$title=sa._.getPageTitle(e.path);var c=o?"?"+o:"",u=l?"?"+l:"";s.$url=s.$url_path+c,s.$ad_landing_page_url=s.$url_path+u}t._sfs&&(s.$sf_source=t._sfs,s.$latest_sf_source=s.$sf_source);var h=sa._.setUtm(e,s);sa._.setLatestChannel(h.pre2),s.$latest_scene=s.$scene,s.$url_query=o,this.trackChannel(s)}}},trackChannel:function(e){sa.track("$ChannelLinkReaching",e),this.setEventQueue()},setEventQueue:function(){var e,t=[];try{for(var n=0;n0&&sa.initialState.queue.splice(e,0,t)}catch(e){sa._.logger.info("渠道插件事件发送排序: "+e)}},addIsChannelCallbackEvent:function(e){var t=this,n=["$MPLaunch","$ABTestTrigger","$PlanPopupDisplay","$PlanPopupClick","$ChannelLinkReaching","$MPShow","$MPHide","$MPViewScreen","$MPClick","$MPShare","$MPAddFavorites","$MPPageLeave","$SignUp","$UnbindID","$BindID"];e.hookRegister(function(e){var i={};if(e&&e.event){var s=e.event,r=!0;n.indexOf(s)<0&&(t.eventList.hasEvent(s)?r=!1:t.eventList.add(s),i.$is_channel_callback_event=r)}return i})},eventList:{init:function(){var e=sa._.getStorageSync("saminiprogramchannel"),t=(new Date).getTime();if(e&&sa._.isNumber(e.latest_event_initial_time)&&sa._.isArray(e.event_list)){var n=t-e.latest_event_initial_time;n>0&&n 必填 15 | * `after_hash`: 新增的参数是否放在在 `url` 的 `hash` 之后。默认:`false`,放在 query 中,hash 前。可选 16 | 17 | ## 相关插件的使用场景差异 18 | | 编号| 场景说明| 需要用到的小程序插件 |需要用到的 Web 配套插件 | 19 | | ------| ------ | ------ | ------ | 20 | |1|推 SAT 小程序,并且小程序内的 webview 网页不需要做渠道和用户的打通,请优先使用该方案。 | ad-channel | 不需要 | 21 | |2|推 SAT 小程序,并且希望支持小程序内的 webview 网页的用户关联和 SAT 渠道打通,使用该方案| ad-channel-h5-linker | wechat-webview-channel | 22 | |3|非 SAT 的渠道场景,只是实现小程序和 webview 网页的用户关联| h5-linker | site-linker | 23 | 24 | ### ⚠ 注意: 25 | * 2 和 1,以及 2 和 3 是互斥的,因为 2 包含了 1 和 3 的部分功能(例如 3 会去解析 webview 的 URL 参数,并做用户关联。2 也会做这些操作,所以同时使用会导致冲突),所以不要同时使用。 26 | * 2 不能完全替代 1,以及 2 也不能完全替代 3 。因为 2 虽然有 1 和 3 的大部分功能,但是 2 会多加的 mp 和 appid ( 在 1 中会增加多余的属性进行上报,在 3 中会新增多余的 URL 参数进行传递,另外有一些逻辑处理也是不一致的 ),这对 1 和 3 的场景没有用处,且强行套用有可能会引发异常。 27 | * 总结:请根据当前的需求先去适配上面表格中的场景,然后使用表格提供的相应方案。 28 | * option 参数的使用参考 ad-channel 插件。注意如果要使用 ad-channel 的热启动归因,这里必须用 sensors.use 替换 sensors.usePlugin。如果是用标准版的冷启动归因,可以继续使用 usePlugin。 29 | 30 | 31 | -------------------------------------------------------------------------------- /dist/wechat/plugin/ad-channel/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var t=Object.prototype.toString.call(e);return"[object Function]"==t||"[object AsyncFunction]"==t}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var n in t)void 0!==t[n]&&(e[n]=t[n])}),e}function each(e,t,n){var i=Array.prototype.forEach,s={};if(null==e)return!1;if(i&&e.forEach===i)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,a=e.length;r0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var sa,registerProperties=createPlugin(RegisterProperties),customEventList=[],maxSaveTime=2592e6,latestEventInitialTime=null;function decodeURI(e){var t="";try{t=decodeURIComponent(e)}catch(n){t=e}return t}function getQueryString(e,t){if(e[t])return decodeURI(e[t]);var n=e.scene||"";if(n){var i=decodeURI(n),s=new RegExp("(^|&)"+t+"=([^&]*)(&|$)","i"),r=i.match(s);if(null!==r)return decodeURI(r[2])}return null}function isSatCfLegal(e){return""!==e&&"''"!==e&&'""'!==e}var AdChannel={plugin_name:"ADChannel",init:function(e,t){if(!(sa=e))return console.log("当前主sdk 初始化失败,请传入正确的 sensors 对象!"),!1;var n=sa.usePlugin(registerProperties);this.eventList.init(),sa._.isObject(t)&&!0===t.appShow?this.listenAppShow():this.listenAppLaunch(),this.addIsChannelCallbackEvent(n)},getChannelQuery:function(e){var t=sa._.deepCopy(e).query;if(sa._.isObject(t)){var n=getQueryString(t,"sat_cf"),i=isSatCfLegal(n);if(n&&i){var s={};e.scene?s.$scene=sa._.getMPScene(e.scene):s.$scene="未取到值";var r=t.scene||"",a="";r&&(a=decodeURI(r),delete t.scene);var o=sa._.setQuery(t),c=sa._.setQuery(t,!0);if(a&&(o+=(o?"&":"")+a,c+=(c?"&":"")+a),e.path){s.$url_path=sa._.getPath(e.path),s.$title=sa._.getPageTitle(e.path);var l=o?"?"+o:"",u=c?"?"+c:"";s.$url=s.$url_path+l,s.$ad_landing_page_url=s.$url_path+u}t._sfs&&(s.$sf_source=t._sfs,s.$latest_sf_source=s.$sf_source);var p=sa._.setUtm(e,s);sa._.setLatestChannel(p.pre2),s.$latest_scene=s.$scene,s.$url_query=o,this.trackChannel(s)}}},trackChannel:function(e){sa.track("$ChannelLinkReaching",e),this.setEventQueue()},setEventQueue:function(){var e,t=[];try{for(var n=0;n0&&sa.initialState.queue.splice(e,0,t)}catch(e){sa._.logger.info("渠道插件事件发送排序: "+e)}},addIsChannelCallbackEvent:function(e){var t=this,n=["$MPLaunch","$ABTestTrigger","$PlanPopupDisplay","$PlanPopupClick","$ChannelLinkReaching","$MPShow","$MPHide","$MPViewScreen","$MPClick","$MPShare","$MPAddFavorites","$MPPageLeave","$SignUp","$UnbindID","$BindID"];e.hookRegister(function(e){var i={};if(e&&e.event){var s=e.event,r=!0;n.indexOf(s)<0&&(t.eventList.hasEvent(s)?r=!1:t.eventList.add(s),i.$is_channel_callback_event=r)}return i})},eventList:{init:function(){var e=sa._.getStorageSync("saminiprogramchannel"),t=(new Date).getTime();if(e&&sa._.isNumber(e.latest_event_initial_time)&&sa._.isArray(e.event_list)){var n=t-e.latest_event_initial_time;n>0&&n0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var sa,registerProperties=createPlugin(RegisterProperties),customEventList=[],maxSaveTime=2592e6,latestEventInitialTime=null;function decodeURI(e){var t="";try{t=decodeURIComponent(e)}catch(n){t=e}return t}function getQueryString(e,t){if(e[t])return decodeURI(e[t]);var n=e.scene||"";if(n){var i=decodeURI(n),r=new RegExp("(^|&)"+t+"=([^&]*)(&|$)","i"),s=i.match(r);if(null!==s)return decodeURI(s[2])}return null}function isSatCfLegal(e){return""!==e&&"''"!==e&&'""'!==e}var AdChannel={plugin_name:"ADChannel",init:function(e,t){if(!(sa=e))return console.log("当前主sdk 初始化失败,请传入正确的 sensors 对象!"),!1;var n=sa.usePlugin(registerProperties);this.eventList.init(),sa._.isObject(t)&&!0===t.appShow?this.listenAppShow():this.listenAppLaunch(),this.addIsChannelCallbackEvent(n)},getChannelQuery:function(e){var t=sa._.deepCopy(e).query;if(sa._.isObject(t)){var n=getQueryString(t,"sat_cf"),i=isSatCfLegal(n);if(n&&i){var r={};e.scene?r.$scene=sa._.getMPScene(e.scene):r.$scene="未取到值";var s=t.scene||"",a="";s&&(a=decodeURI(s),delete t.scene);var o=sa._.setQuery(t),c=sa._.setQuery(t,!0);if(a&&(o+=(o?"&":"")+a,c+=(c?"&":"")+a),e.path){r.$url_path=sa._.getPath(e.path),r.$title=sa._.getPageTitle(e.path);var l=o?"?"+o:"",u=c?"?"+c:"";r.$url=r.$url_path+l,r.$ad_landing_page_url=r.$url_path+u}t._sfs&&(r.$sf_source=t._sfs,r.$latest_sf_source=r.$sf_source);var p=sa._.setUtm(e,r);sa._.setLatestChannel(p.pre2),r.$latest_scene=r.$scene,r.$url_query=o,this.trackChannel(r)}}},trackChannel:function(e){sa.track("$ChannelLinkReaching",e),this.setEventQueue()},setEventQueue:function(){var e,t=[];try{for(var n=0;n0&&sa.initialState.queue.splice(e,0,t)}catch(e){sa._.logger.info("渠道插件事件发送排序: "+e)}},addIsChannelCallbackEvent:function(e){var t=this,n=["$MPLaunch","$ABTestTrigger","$PlanPopupDisplay","$PlanPopupClick","$ChannelLinkReaching","$MPShow","$MPHide","$MPViewScreen","$MPClick","$MPShare","$MPAddFavorites","$MPPageLeave","$SignUp","$UnbindID","$BindID"];e.hookRegister(function(e){var i={};if(e&&e.event){var r=e.event,s=!0;n.indexOf(r)<0&&(t.eventList.hasEvent(r)?s=!1:t.eventList.add(r),i.$is_channel_callback_event=s)}return i})},eventList:{init:function(){var e=sa._.getStorageSync("saminiprogramchannel"),t=(new Date).getTime();if(e&&sa._.isNumber(e.latest_event_initial_time)&&sa._.isArray(e.event_list)){var n=t-e.latest_event_initial_time;n>0&&n⚠️ 此插件已自动集成在 SDK 中,请勿集成! 3 | 4 | ## 功能 5 | 通过调用 `sensors.disableSDK()`,来禁用 API(例如 `track` 、`setProfile` ) 的执行。也可以通用调用 `sensors.enableSDK()` 来恢复 API 的执行,但是之前 `diableSDK` 时的数据不会存储,是完全丢失的。 6 | 原理: 通过给提供的所有 API 设置 flag ,如果是禁用状态,API 就不会执行。 7 | 8 | 9 | ### 新增 3 个 API 10 | * `sensors.disableSDK()`: 禁用所有 API 执行 11 | * `sensors.enableSDK()`: 恢复 API 执行 12 | * `sensors.getDisabled()` 获取当前禁用的状态,`true` 表示禁用 13 | 14 | 15 | ## ⚠ 注意: 16 | * 全埋点需要对 API 进行代理操作,这里的代理操作行为 disableSDK 是无法中止的,只能中止 track 、register 这些 API 17 | * disableSDK 后触发的行为数据,都会丢失。需要 enableSDK 后重新开始。 18 | * 所有的插件提供出来的 API (disableSDK、 enableSDK 等)都需要在 init 后执行,init 前调用会报错 !!! 19 | -------------------------------------------------------------------------------- /dist/wechat/plugin/duplicate-data/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var DuplicateData={init(e){var t=null;function i(i){if(!i||!i.time)return!1;if(null!==t&&!e._.isObject(t))return!1;if(e._.isObject(t)&&(!t.time||!t.data))return!1;var n=e._.deepCopy(i),o=n.time;return n.time&&delete n.time,n._track_id&&delete n._track_id,n._flush_time&&delete n._flush_time,null===t?(t={time:o,data:n},!1):t.time!==o?(t={time:o,data:n},!1):!function(e,t){return JSON.stringify(t)!==JSON.stringify(e)}(t.data,n)||(t={time:o,data:n},!1)}e.kit.isVaildData=function(e){return!i(e)}},plugin_name:"DuplicateData"},index=createPlugin(DuplicateData);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/duplicate-data/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var DuplicateData={init(e){var t=null;function n(n){if(!n||!n.time)return!1;if(null!==t&&!e._.isObject(t))return!1;if(e._.isObject(t)&&(!t.time||!t.data))return!1;var i=e._.deepCopy(n),o=i.time;return i.time&&delete i.time,i._track_id&&delete i._track_id,i._flush_time&&delete i._flush_time,null===t?(t={time:o,data:i},!1):t.time!==o?(t={time:o,data:i},!1):!function(e,t){return JSON.stringify(t)!==JSON.stringify(e)}(t.data,i)||(t={time:o,data:i},!1)}e.kit.isVaildData=function(e){return!n(e)}},plugin_name:"DuplicateData"},index=createPlugin(DuplicateData);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/duplicate-data/readme.md: -------------------------------------------------------------------------------- 1 | # 重复数据 - 去除检测 time 等所有信息完全一致的数据 2 | 3 | ## 功能 4 | 经过本地测试,如果 for 循环连续track 5 条相同数据,大概率有 2 条的 time 是一致的。部分客户的小程序因为卡,会出现连续点击按钮无响应的情况。此时就会类似 for 循环一样,连续触发相同的数据。有些客户会认为是重复数据。 5 | 对此我们做了这个插件。如果认为 time 等信息完全一致的数据是重复数据,可以引入这个插件来做去重。 6 | 7 | ## 集成 8 | ```javascript 9 | import DuplicateData from '/dist/wechat/plugin/duplicate-data/index.esm'; 10 | sensors.usePlugin(DuplicateData); 11 | ``` 12 | 13 | ## ⚠ 注意: 14 | * 保证 SDK 代码放在顶部位置。且立即执行 sensors.usePlugin(DuplicateData) 。 -------------------------------------------------------------------------------- /dist/wechat/plugin/encryption/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var _CryptoJS={};_CryptoJS.CryptoJS=function(t,e){var r;if("undefined"!=typeof window&&window.crypto&&(r=window.crypto),"undefined"!=typeof self&&self.crypto&&(r=self.crypto),"undefined"!=typeof globalThis&&globalThis.crypto&&(r=globalThis.crypto),!r&&"undefined"!=typeof window&&window.msCrypto&&(r=window.msCrypto),!r&&"undefined"!=typeof global&&global.crypto&&(r=global.crypto),!r&&"function"==typeof require)try{r=require("crypto")}catch(t){}var n=function(){if(r){if("function"==typeof r.getRandomValues)try{return r.getRandomValues(new Uint32Array(1))[0]}catch(t){}if("function"==typeof r.randomBytes)try{return r.randomBytes(4).readInt32LE()}catch(t){}}throw new Error("Native crypto module could not be used to get secure random number.")},i=Object.create||function(){function t(){}return function(e){var r;return t.prototype=e,r=new t,t.prototype=null,r}}(),o={},a=o.lib={},c=a.Base={extend:function(t){var e=i(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),e.init.prototype=e,e.$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},s=a.WordArray=c.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||f).stringify(this)},concat:function(t){var e=this.words,r=t.words,n=this.sigBytes,i=t.sigBytes;if(this.clamp(),n%4)for(var o=0;o>>2]>>>24-o%4*8&255;e[n+o>>>2]|=a<<24-(n+o)%4*8}else for(var c=0;c>>2]=r[c>>>2];return this.sigBytes+=i,this},clamp:function(){var e=this.words,r=this.sigBytes;e[r>>>2]&=4294967295<<32-r%4*8,e.length=t.ceil(r/4)},clone:function(){var t=c.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-i%4*8&255;n.push((o>>>4).toString(16)),n.push((15&o).toString(16))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>3]|=parseInt(t.substr(n,2),16)<<24-n%8*4;return new s.init(r,e/2)}},p=u.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,n=[],i=0;i>>2]>>>24-i%4*8&255;n.push(String.fromCharCode(o))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>2]|=(255&t.charCodeAt(n))<<24-n%4*8;return new s.init(r,e)}},h=u.Utf8={stringify:function(t){try{return decodeURIComponent(escape(p.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return p.parse(unescape(encodeURIComponent(t)))}},d=a.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=h.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var r,n=this._data,i=n.words,o=n.sigBytes,a=this.blockSize,c=o/(4*a),u=(c=e?t.ceil(c):t.max((0|c)-this._minBufferSize,0))*a,f=t.min(4*u,o);if(u){for(var p=0;p>>24)|4278255360&(i<<24|i>>>8)}var o=this._hash.words,c=t[e+0],h=t[e+1],d=t[e+2],l=t[e+3],y=t[e+4],_=t[e+5],g=t[e+6],v=t[e+7],S=t[e+8],m=t[e+9],k=t[e+10],C=t[e+11],B=t[e+12],x=t[e+13],D=t[e+14],w=t[e+15],b=o[0],E=o[1],z=o[2],J=o[3];b=s(b,E,z,J,c,7,a[0]),J=s(J,b,E,z,h,12,a[1]),z=s(z,J,b,E,d,17,a[2]),E=s(E,z,J,b,l,22,a[3]),b=s(b,E,z,J,y,7,a[4]),J=s(J,b,E,z,_,12,a[5]),z=s(z,J,b,E,g,17,a[6]),E=s(E,z,J,b,v,22,a[7]),b=s(b,E,z,J,S,7,a[8]),J=s(J,b,E,z,m,12,a[9]),z=s(z,J,b,E,k,17,a[10]),E=s(E,z,J,b,C,22,a[11]),b=s(b,E,z,J,B,7,a[12]),J=s(J,b,E,z,x,12,a[13]),z=s(z,J,b,E,D,17,a[14]),b=u(b,E=s(E,z,J,b,w,22,a[15]),z,J,h,5,a[16]),J=u(J,b,E,z,g,9,a[17]),z=u(z,J,b,E,C,14,a[18]),E=u(E,z,J,b,c,20,a[19]),b=u(b,E,z,J,_,5,a[20]),J=u(J,b,E,z,k,9,a[21]),z=u(z,J,b,E,w,14,a[22]),E=u(E,z,J,b,y,20,a[23]),b=u(b,E,z,J,m,5,a[24]),J=u(J,b,E,z,D,9,a[25]),z=u(z,J,b,E,l,14,a[26]),E=u(E,z,J,b,S,20,a[27]),b=u(b,E,z,J,x,5,a[28]),J=u(J,b,E,z,d,9,a[29]),z=u(z,J,b,E,v,14,a[30]),b=f(b,E=u(E,z,J,b,B,20,a[31]),z,J,_,4,a[32]),J=f(J,b,E,z,S,11,a[33]),z=f(z,J,b,E,C,16,a[34]),E=f(E,z,J,b,D,23,a[35]),b=f(b,E,z,J,h,4,a[36]),J=f(J,b,E,z,y,11,a[37]),z=f(z,J,b,E,v,16,a[38]),E=f(E,z,J,b,k,23,a[39]),b=f(b,E,z,J,x,4,a[40]),J=f(J,b,E,z,c,11,a[41]),z=f(z,J,b,E,l,16,a[42]),E=f(E,z,J,b,g,23,a[43]),b=f(b,E,z,J,m,4,a[44]),J=f(J,b,E,z,B,11,a[45]),z=f(z,J,b,E,w,16,a[46]),b=p(b,E=f(E,z,J,b,d,23,a[47]),z,J,c,6,a[48]),J=p(J,b,E,z,v,10,a[49]),z=p(z,J,b,E,D,15,a[50]),E=p(E,z,J,b,_,21,a[51]),b=p(b,E,z,J,B,6,a[52]),J=p(J,b,E,z,l,10,a[53]),z=p(z,J,b,E,k,15,a[54]),E=p(E,z,J,b,h,21,a[55]),b=p(b,E,z,J,S,6,a[56]),J=p(J,b,E,z,w,10,a[57]),z=p(z,J,b,E,g,15,a[58]),E=p(E,z,J,b,x,21,a[59]),b=p(b,E,z,J,y,6,a[60]),J=p(J,b,E,z,C,10,a[61]),z=p(z,J,b,E,d,15,a[62]),E=p(E,z,J,b,m,21,a[63]),o[0]=o[0]+b|0,o[1]=o[1]+E|0,o[2]=o[2]+z|0,o[3]=o[3]+J|0},_doFinalize:function(){var e=this._data,r=e.words,n=8*this._nDataBytes,i=8*e.sigBytes;r[i>>>5]|=128<<24-i%32;var o=t.floor(n/4294967296),a=n;r[15+(i+64>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),r[14+(i+64>>>9<<4)]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),e.sigBytes=4*(r.length+1),this._process();for(var c=this._hash,s=c.words,u=0;u<4;u++){var f=s[u];s[u]=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8)}return c},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function s(t,e,r,n,i,o,a){var c=t+(e&r|~e&n)+i+a;return(c<>>32-o)+e}function u(t,e,r,n,i,o,a){var c=t+(e&n|r&~n)+i+a;return(c<>>32-o)+e}function f(t,e,r,n,i,o,a){var c=t+(e^r^n)+i+a;return(c<>>32-o)+e}function p(t,e,r,n,i,o,a){var c=t+(r^(e|~n))+i+a;return(c<>>32-o)+e}e.MD5=i._createHelper(c),e.HmacMD5=i._createHmacHelper(c)}(Math),function(){var t=_CryptoJS.CryptoJS,e=t.lib,r=e.Base,n=e.WordArray,i=t.algo,o=i.MD5,a=i.EvpKDF=r.extend({cfg:r.extend({keySize:4,hasher:o,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r,i=this.cfg,o=i.hasher.create(),a=n.create(),c=a.words,s=i.keySize,u=i.iterations;c.length>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c>>6*(3-c)&63));var s=n.charAt(64);if(s)for(;i.length%4;)i.push(s);return i.join("")},parse:function(t){var r=t.length,n=this._map,i=this._reverseMap;if(!i){i=this._reverseMap=[];for(var o=0;o>>6-a%4*2,u=c|s;i[o>>>2]|=u<<24-o%4*8,o++}return e.create(i,o)}(t,r,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),_CryptoJS.CryptoJS.lib.Cipher||function(t){var e=_CryptoJS.CryptoJS,r=e.lib,n=r.Base,i=r.WordArray,o=r.BufferedBlockAlgorithm,a=e.enc,c=(a.Utf8,a.Base64),s=e.algo.EvpKDF,u=r.Cipher=o.extend({cfg:n.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){o.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function t(t){return"string"==typeof t?v:_}return function(e){return{encrypt:function(r,n,i){return t(n).encrypt(e,r,n,i)},decrypt:function(r,n,i){return t(n).decrypt(e,r,n,i)}}}}()}),f=(r.StreamCipher=u.extend({_doFinalize:function(){return this._process(!0)},blockSize:1}),e.mode={}),p=r.BlockCipherMode=n.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),h=f.CBC=function(){var e=p.extend();function r(e,r,n){var i,o=this._iv;o?(i=o,this._iv=t):i=this._prevBlock;for(var a=0;a>>2];t.sigBytes-=e}},l=(r.BlockCipher=u.extend({cfg:u.cfg.extend({mode:h,padding:d}),reset:function(){var t;u.reset.call(this);var e=this.cfg,r=e.iv,n=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=n.createEncryptor:(t=n.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(n,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),r.CipherParams=n.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),y=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;return(r?i.create([1398893684,1701076831]).concat(r).concat(e):e).toString(c)},parse:function(t){var e,r=c.parse(t),n=r.words;return 1398893684==n[0]&&1701076831==n[1]&&(e=i.create(n.slice(2,4)),n.splice(0,4),r.sigBytes-=16),l.create({ciphertext:r,salt:e})}},_=r.SerializableCipher=n.extend({cfg:n.extend({format:y}),encrypt:function(t,e,r,n){n=this.cfg.extend(n);var i=t.createEncryptor(r,n),o=i.finalize(e),a=i.cfg;return l.create({ciphertext:o,key:r,iv:a.iv,algorithm:t,mode:a.mode,padding:a.padding,blockSize:t.blockSize,formatter:n.format})},decrypt:function(t,e,r,n){return n=this.cfg.extend(n),e=this._parse(e,n.format),t.createDecryptor(r,n).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),g=(e.kdf={}).OpenSSL={execute:function(t,e,r,n){n||(n=i.random(8));var o=s.create({keySize:e+r}).compute(t,n),a=i.create(o.words.slice(e),4*r);return o.sigBytes=4*e,l.create({key:o,iv:a,salt:n})}},v=r.PasswordBasedCipher=_.extend({cfg:_.cfg.extend({kdf:g}),encrypt:function(t,e,r,n){var i=(n=this.cfg.extend(n)).kdf.execute(r,t.keySize,t.ivSize);n.iv=i.iv;var o=_.encrypt.call(this,t,e,i.key,n);return o.mixIn(i),o},decrypt:function(t,e,r,n){n=this.cfg.extend(n),e=this._parse(e,n.format);var i=n.kdf.execute(r,t.keySize,t.ivSize,e.salt);return n.iv=i.iv,_.decrypt.call(this,t,e,i.key,n)}})}(),function(){var t=_CryptoJS.CryptoJS,e=t.lib.BlockCipher,r=t.algo,n=[],i=[],o=[],a=[],c=[],s=[],u=[],f=[],p=[],h=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;var r=0,d=0;for(e=0;e<256;e++){var l=d^d<<1^d<<2^d<<3^d<<4;l=l>>>8^255&l^99,n[r]=l,i[l]=r;var y=t[r],_=t[y],g=t[_],v=257*t[l]^16843008*l;o[r]=v<<24|v>>>8,a[r]=v<<16|v>>>16,c[r]=v<<8|v>>>24,s[r]=v;v=16843009*g^65537*_^257*y^16843008*r;u[l]=v<<24|v>>>8,f[l]=v<<16|v>>>16,p[l]=v<<8|v>>>24,h[l]=v,r?(r=y^t[t[t[g^y]]],d^=t[t[d]]):r=d=1}}();var d=[0,1,2,4,8,16,32,64,128,27,54],l=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*((this._nRounds=r+6)+1),o=this._keySchedule=[],a=0;a6&&a%r==4&&(l=n[l>>>24]<<24|n[l>>>16&255]<<16|n[l>>>8&255]<<8|n[255&l]):(l=n[(l=l<<8|l>>>24)>>>24]<<24|n[l>>>16&255]<<16|n[l>>>8&255]<<8|n[255&l],l^=d[a/r|0]<<24),o[a]=o[a-r]^l);for(var c=this._invKeySchedule=[],s=0;s>>24]]^f[n[l>>>16&255]]^p[n[l>>>8&255]]^h[n[255&l]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,o,a,c,s,n)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,u,f,p,h,i);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,n,i,o,a,c){for(var s=this._nRounds,u=t[e]^r[0],f=t[e+1]^r[1],p=t[e+2]^r[2],h=t[e+3]^r[3],d=4,l=1;l>>24]^i[f>>>16&255]^o[p>>>8&255]^a[255&h]^r[d++],_=n[f>>>24]^i[p>>>16&255]^o[h>>>8&255]^a[255&u]^r[d++],g=n[p>>>24]^i[h>>>16&255]^o[u>>>8&255]^a[255&f]^r[d++],v=n[h>>>24]^i[u>>>16&255]^o[f>>>8&255]^a[255&p]^r[d++];u=y,f=_,p=g,h=v}y=(c[u>>>24]<<24|c[f>>>16&255]<<16|c[p>>>8&255]<<8|c[255&h])^r[d++],_=(c[f>>>24]<<24|c[p>>>16&255]<<16|c[h>>>8&255]<<8|c[255&u])^r[d++],g=(c[p>>>24]<<24|c[h>>>16&255]<<16|c[u>>>8&255]<<8|c[255&f])^r[d++],v=(c[h>>>24]<<24|c[u>>>16&255]<<16|c[f>>>8&255]<<8|c[255&p])^r[d++];t[e]=y,t[e+1]=_,t[e+2]=g,t[e+3]=v},keySize:8});t.AES=e._createHelper(l)}();var _iv,_sa,_config,_oldOnceData,CryptoJS=_CryptoJS.CryptoJS,getRandomBasic=function(){var t=(new Date).getTime();return function(e){return Math.ceil((t=(9301*t+49297)%233280)/233280*e)}}();function isObject(t){return null!=t&&"[object Object]"==toString.call(t)}function getRandom(){if("function"==typeof Uint32Array){var t="";if("undefined"!=typeof crypto?t=crypto:"undefined"!=typeof msCrypto&&(t=msCrypto),isObject(t)&&t.getRandomValues){var e=new Uint32Array(1);return t.getRandomValues(e)[0]/Math.pow(2,32)}}return getRandomBasic(1e19)/1e19}function buildAESOption(t){return{mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7,iv:t||generateIVData()}}function encryptData(t,e,r,n){var i=buildAESOption(r),o=t;"string"!=typeof t&&(o=JSON.stringify(t)),n||(e=CryptoJS.enc.Base64.parse(e));var a=CryptoJS.enc.Utf8.parse(o),c=CryptoJS.AES.encrypt(a,e,i).toString();return i.iv.clone().concat(CryptoJS.enc.Base64.parse(c)).toString(CryptoJS.enc.Base64)}function decryptData(t,e,r){var n=CryptoJS.enc.Base64.parse(t).toString(),i=n.substr(0,32),o=CryptoJS.enc.Hex.parse(n.substr(32)).toString(CryptoJS.enc.Base64),a=buildAESOption(CryptoJS.enc.Hex.parse(i));return r||(e=CryptoJS.enc.Base64.parse(e)),CryptoJS.AES.decrypt(o,e,a).toString(CryptoJS.enc.Utf8)}function generateIVData(t){t=t||16;for(var e="";t-- >0;){var r=Math.ceil(127*getRandom()).toString(16);e+=2===r.length?r:"0"+r}return CryptoJS.enc.Hex.parse(e)}var _log=console&&console.log||function(){};function isTruthy(t,e){return!!t||(_log(e+"不能为空。"),!1)}function matchType(t,e,r){return typeof t===r||(_log("参数类型错误,"+e+"必须为"+r),!1)}function aesEncrypt(t){try{return encryptData(t,_config.k,_iv)}catch(e){return _log("数据加密异常:"+e),_sa.para.batch_send?"":_oldOnceData.call(_sa.kit,t)}}function formatData(t){var e={key_id:_config.kid,key_hash:_config.khash,nc:1},r="payload";return _sa.para.batch_send&&(e.flush_time=Date.now(),r="payloads"),e[r]=t,e}function encodeTrackData(t){var e="";_sa.para.batch_send?e=formatData(t):e=formatData(aesEncrypt(t));var r=JSON.stringify(e);return"data="+encodeURIComponent(r)+"&gzip=9"}function isObject$1(t){return null!=t&&"[object Object]"==toString.call(t)}function encryptStoreData(t){var e=t.length;if(e>0){for(var r=0;r>>2]>>>24-o%4*8&255;e[n+o>>>2]|=a<<24-(n+o)%4*8}else for(var c=0;c>>2]=r[c>>>2];return this.sigBytes+=i,this},clamp:function(){var e=this.words,r=this.sigBytes;e[r>>>2]&=4294967295<<32-r%4*8,e.length=t.ceil(r/4)},clone:function(){var t=c.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-i%4*8&255;n.push((o>>>4).toString(16)),n.push((15&o).toString(16))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>3]|=parseInt(t.substr(n,2),16)<<24-n%8*4;return new s.init(r,e/2)}},p=u.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,n=[],i=0;i>>2]>>>24-i%4*8&255;n.push(String.fromCharCode(o))}return n.join("")},parse:function(t){for(var e=t.length,r=[],n=0;n>>2]|=(255&t.charCodeAt(n))<<24-n%4*8;return new s.init(r,e)}},h=u.Utf8={stringify:function(t){try{return decodeURIComponent(escape(p.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return p.parse(unescape(encodeURIComponent(t)))}},d=a.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=h.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var r,n=this._data,i=n.words,o=n.sigBytes,a=this.blockSize,c=o/(4*a),u=(c=e?t.ceil(c):t.max((0|c)-this._minBufferSize,0))*a,f=t.min(4*u,o);if(u){for(var p=0;p>>24)|4278255360&(i<<24|i>>>8)}var o=this._hash.words,c=t[e+0],h=t[e+1],d=t[e+2],l=t[e+3],y=t[e+4],_=t[e+5],g=t[e+6],v=t[e+7],S=t[e+8],m=t[e+9],k=t[e+10],C=t[e+11],B=t[e+12],x=t[e+13],D=t[e+14],w=t[e+15],b=o[0],E=o[1],z=o[2],J=o[3];b=s(b,E,z,J,c,7,a[0]),J=s(J,b,E,z,h,12,a[1]),z=s(z,J,b,E,d,17,a[2]),E=s(E,z,J,b,l,22,a[3]),b=s(b,E,z,J,y,7,a[4]),J=s(J,b,E,z,_,12,a[5]),z=s(z,J,b,E,g,17,a[6]),E=s(E,z,J,b,v,22,a[7]),b=s(b,E,z,J,S,7,a[8]),J=s(J,b,E,z,m,12,a[9]),z=s(z,J,b,E,k,17,a[10]),E=s(E,z,J,b,C,22,a[11]),b=s(b,E,z,J,B,7,a[12]),J=s(J,b,E,z,x,12,a[13]),z=s(z,J,b,E,D,17,a[14]),b=u(b,E=s(E,z,J,b,w,22,a[15]),z,J,h,5,a[16]),J=u(J,b,E,z,g,9,a[17]),z=u(z,J,b,E,C,14,a[18]),E=u(E,z,J,b,c,20,a[19]),b=u(b,E,z,J,_,5,a[20]),J=u(J,b,E,z,k,9,a[21]),z=u(z,J,b,E,w,14,a[22]),E=u(E,z,J,b,y,20,a[23]),b=u(b,E,z,J,m,5,a[24]),J=u(J,b,E,z,D,9,a[25]),z=u(z,J,b,E,l,14,a[26]),E=u(E,z,J,b,S,20,a[27]),b=u(b,E,z,J,x,5,a[28]),J=u(J,b,E,z,d,9,a[29]),z=u(z,J,b,E,v,14,a[30]),b=f(b,E=u(E,z,J,b,B,20,a[31]),z,J,_,4,a[32]),J=f(J,b,E,z,S,11,a[33]),z=f(z,J,b,E,C,16,a[34]),E=f(E,z,J,b,D,23,a[35]),b=f(b,E,z,J,h,4,a[36]),J=f(J,b,E,z,y,11,a[37]),z=f(z,J,b,E,v,16,a[38]),E=f(E,z,J,b,k,23,a[39]),b=f(b,E,z,J,x,4,a[40]),J=f(J,b,E,z,c,11,a[41]),z=f(z,J,b,E,l,16,a[42]),E=f(E,z,J,b,g,23,a[43]),b=f(b,E,z,J,m,4,a[44]),J=f(J,b,E,z,B,11,a[45]),z=f(z,J,b,E,w,16,a[46]),b=p(b,E=f(E,z,J,b,d,23,a[47]),z,J,c,6,a[48]),J=p(J,b,E,z,v,10,a[49]),z=p(z,J,b,E,D,15,a[50]),E=p(E,z,J,b,_,21,a[51]),b=p(b,E,z,J,B,6,a[52]),J=p(J,b,E,z,l,10,a[53]),z=p(z,J,b,E,k,15,a[54]),E=p(E,z,J,b,h,21,a[55]),b=p(b,E,z,J,S,6,a[56]),J=p(J,b,E,z,w,10,a[57]),z=p(z,J,b,E,g,15,a[58]),E=p(E,z,J,b,x,21,a[59]),b=p(b,E,z,J,y,6,a[60]),J=p(J,b,E,z,C,10,a[61]),z=p(z,J,b,E,d,15,a[62]),E=p(E,z,J,b,m,21,a[63]),o[0]=o[0]+b|0,o[1]=o[1]+E|0,o[2]=o[2]+z|0,o[3]=o[3]+J|0},_doFinalize:function(){var e=this._data,r=e.words,n=8*this._nDataBytes,i=8*e.sigBytes;r[i>>>5]|=128<<24-i%32;var o=t.floor(n/4294967296),a=n;r[15+(i+64>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),r[14+(i+64>>>9<<4)]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),e.sigBytes=4*(r.length+1),this._process();for(var c=this._hash,s=c.words,u=0;u<4;u++){var f=s[u];s[u]=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8)}return c},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function s(t,e,r,n,i,o,a){var c=t+(e&r|~e&n)+i+a;return(c<>>32-o)+e}function u(t,e,r,n,i,o,a){var c=t+(e&n|r&~n)+i+a;return(c<>>32-o)+e}function f(t,e,r,n,i,o,a){var c=t+(e^r^n)+i+a;return(c<>>32-o)+e}function p(t,e,r,n,i,o,a){var c=t+(r^(e|~n))+i+a;return(c<>>32-o)+e}e.MD5=i._createHelper(c),e.HmacMD5=i._createHmacHelper(c)}(Math),function(){var t=_CryptoJS.CryptoJS,e=t.lib,r=e.Base,n=e.WordArray,i=t.algo,o=i.MD5,a=i.EvpKDF=r.extend({cfg:r.extend({keySize:4,hasher:o,iterations:1}),init:function(t){this.cfg=this.cfg.extend(t)},compute:function(t,e){for(var r,i=this.cfg,o=i.hasher.create(),a=n.create(),c=a.words,s=i.keySize,u=i.iterations;c.length>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c>>6*(3-c)&63));var s=n.charAt(64);if(s)for(;i.length%4;)i.push(s);return i.join("")},parse:function(t){var r=t.length,n=this._map,i=this._reverseMap;if(!i){i=this._reverseMap=[];for(var o=0;o>>6-a%4*2,u=c|s;i[o>>>2]|=u<<24-o%4*8,o++}return e.create(i,o)}(t,r,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),_CryptoJS.CryptoJS.lib.Cipher||function(t){var e=_CryptoJS.CryptoJS,r=e.lib,n=r.Base,i=r.WordArray,o=r.BufferedBlockAlgorithm,a=e.enc,c=(a.Utf8,a.Base64),s=e.algo.EvpKDF,u=r.Cipher=o.extend({cfg:n.extend(),createEncryptor:function(t,e){return this.create(this._ENC_XFORM_MODE,t,e)},createDecryptor:function(t,e){return this.create(this._DEC_XFORM_MODE,t,e)},init:function(t,e,r){this.cfg=this.cfg.extend(r),this._xformMode=t,this._key=e,this.reset()},reset:function(){o.reset.call(this),this._doReset()},process:function(t){return this._append(t),this._process()},finalize:function(t){return t&&this._append(t),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function t(t){return"string"==typeof t?v:_}return function(e){return{encrypt:function(r,n,i){return t(n).encrypt(e,r,n,i)},decrypt:function(r,n,i){return t(n).decrypt(e,r,n,i)}}}}()}),f=(r.StreamCipher=u.extend({_doFinalize:function(){return this._process(!0)},blockSize:1}),e.mode={}),p=r.BlockCipherMode=n.extend({createEncryptor:function(t,e){return this.Encryptor.create(t,e)},createDecryptor:function(t,e){return this.Decryptor.create(t,e)},init:function(t,e){this._cipher=t,this._iv=e}}),h=f.CBC=function(){var e=p.extend();function r(e,r,n){var i,o=this._iv;o?(i=o,this._iv=t):i=this._prevBlock;for(var a=0;a>>2];t.sigBytes-=e}},l=(r.BlockCipher=u.extend({cfg:u.cfg.extend({mode:h,padding:d}),reset:function(){var t;u.reset.call(this);var e=this.cfg,r=e.iv,n=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=n.createEncryptor:(t=n.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(n,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),r.CipherParams=n.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),y=(e.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,r=t.salt;return(r?i.create([1398893684,1701076831]).concat(r).concat(e):e).toString(c)},parse:function(t){var e,r=c.parse(t),n=r.words;return 1398893684==n[0]&&1701076831==n[1]&&(e=i.create(n.slice(2,4)),n.splice(0,4),r.sigBytes-=16),l.create({ciphertext:r,salt:e})}},_=r.SerializableCipher=n.extend({cfg:n.extend({format:y}),encrypt:function(t,e,r,n){n=this.cfg.extend(n);var i=t.createEncryptor(r,n),o=i.finalize(e),a=i.cfg;return l.create({ciphertext:o,key:r,iv:a.iv,algorithm:t,mode:a.mode,padding:a.padding,blockSize:t.blockSize,formatter:n.format})},decrypt:function(t,e,r,n){return n=this.cfg.extend(n),e=this._parse(e,n.format),t.createDecryptor(r,n).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),g=(e.kdf={}).OpenSSL={execute:function(t,e,r,n){n||(n=i.random(8));var o=s.create({keySize:e+r}).compute(t,n),a=i.create(o.words.slice(e),4*r);return o.sigBytes=4*e,l.create({key:o,iv:a,salt:n})}},v=r.PasswordBasedCipher=_.extend({cfg:_.cfg.extend({kdf:g}),encrypt:function(t,e,r,n){var i=(n=this.cfg.extend(n)).kdf.execute(r,t.keySize,t.ivSize);n.iv=i.iv;var o=_.encrypt.call(this,t,e,i.key,n);return o.mixIn(i),o},decrypt:function(t,e,r,n){n=this.cfg.extend(n),e=this._parse(e,n.format);var i=n.kdf.execute(r,t.keySize,t.ivSize,e.salt);return n.iv=i.iv,_.decrypt.call(this,t,e,i.key,n)}})}(),function(){var t=_CryptoJS.CryptoJS,e=t.lib.BlockCipher,r=t.algo,n=[],i=[],o=[],a=[],c=[],s=[],u=[],f=[],p=[],h=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;var r=0,d=0;for(e=0;e<256;e++){var l=d^d<<1^d<<2^d<<3^d<<4;l=l>>>8^255&l^99,n[r]=l,i[l]=r;var y=t[r],_=t[y],g=t[_],v=257*t[l]^16843008*l;o[r]=v<<24|v>>>8,a[r]=v<<16|v>>>16,c[r]=v<<8|v>>>24,s[r]=v;v=16843009*g^65537*_^257*y^16843008*r;u[l]=v<<24|v>>>8,f[l]=v<<16|v>>>16,p[l]=v<<8|v>>>24,h[l]=v,r?(r=y^t[t[t[g^y]]],d^=t[t[d]]):r=d=1}}();var d=[0,1,2,4,8,16,32,64,128,27,54],l=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*((this._nRounds=r+6)+1),o=this._keySchedule=[],a=0;a6&&a%r==4&&(l=n[l>>>24]<<24|n[l>>>16&255]<<16|n[l>>>8&255]<<8|n[255&l]):(l=n[(l=l<<8|l>>>24)>>>24]<<24|n[l>>>16&255]<<16|n[l>>>8&255]<<8|n[255&l],l^=d[a/r|0]<<24),o[a]=o[a-r]^l);for(var c=this._invKeySchedule=[],s=0;s>>24]]^f[n[l>>>16&255]]^p[n[l>>>8&255]]^h[n[255&l]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,o,a,c,s,n)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,u,f,p,h,i);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,n,i,o,a,c){for(var s=this._nRounds,u=t[e]^r[0],f=t[e+1]^r[1],p=t[e+2]^r[2],h=t[e+3]^r[3],d=4,l=1;l>>24]^i[f>>>16&255]^o[p>>>8&255]^a[255&h]^r[d++],_=n[f>>>24]^i[p>>>16&255]^o[h>>>8&255]^a[255&u]^r[d++],g=n[p>>>24]^i[h>>>16&255]^o[u>>>8&255]^a[255&f]^r[d++],v=n[h>>>24]^i[u>>>16&255]^o[f>>>8&255]^a[255&p]^r[d++];u=y,f=_,p=g,h=v}y=(c[u>>>24]<<24|c[f>>>16&255]<<16|c[p>>>8&255]<<8|c[255&h])^r[d++],_=(c[f>>>24]<<24|c[p>>>16&255]<<16|c[h>>>8&255]<<8|c[255&u])^r[d++],g=(c[p>>>24]<<24|c[h>>>16&255]<<16|c[u>>>8&255]<<8|c[255&f])^r[d++],v=(c[h>>>24]<<24|c[u>>>16&255]<<16|c[f>>>8&255]<<8|c[255&p])^r[d++];t[e]=y,t[e+1]=_,t[e+2]=g,t[e+3]=v},keySize:8});t.AES=e._createHelper(l)}();var _iv,_sa,_config,_oldOnceData,CryptoJS=_CryptoJS.CryptoJS,getRandomBasic=function(){var t=(new Date).getTime();return function(e){return Math.ceil((t=(9301*t+49297)%233280)/233280*e)}}();function isObject(t){return null!=t&&"[object Object]"==toString.call(t)}function getRandom(){if("function"==typeof Uint32Array){var t="";if("undefined"!=typeof crypto?t=crypto:"undefined"!=typeof msCrypto&&(t=msCrypto),isObject(t)&&t.getRandomValues){var e=new Uint32Array(1);return t.getRandomValues(e)[0]/Math.pow(2,32)}}return getRandomBasic(1e19)/1e19}function buildAESOption(t){return{mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7,iv:t||generateIVData()}}function encryptData(t,e,r,n){var i=buildAESOption(r),o=t;"string"!=typeof t&&(o=JSON.stringify(t)),n||(e=CryptoJS.enc.Base64.parse(e));var a=CryptoJS.enc.Utf8.parse(o),c=CryptoJS.AES.encrypt(a,e,i).toString();return i.iv.clone().concat(CryptoJS.enc.Base64.parse(c)).toString(CryptoJS.enc.Base64)}function decryptData(t,e,r){var n=CryptoJS.enc.Base64.parse(t).toString(),i=n.substr(0,32),o=CryptoJS.enc.Hex.parse(n.substr(32)).toString(CryptoJS.enc.Base64),a=buildAESOption(CryptoJS.enc.Hex.parse(i));return r||(e=CryptoJS.enc.Base64.parse(e)),CryptoJS.AES.decrypt(o,e,a).toString(CryptoJS.enc.Utf8)}function generateIVData(t){t=t||16;for(var e="";t-- >0;){var r=Math.ceil(127*getRandom()).toString(16);e+=2===r.length?r:"0"+r}return CryptoJS.enc.Hex.parse(e)}var _log=console&&console.log||function(){};function isTruthy(t,e){return!!t||(_log(e+"不能为空。"),!1)}function matchType(t,e,r){return typeof t===r||(_log("参数类型错误,"+e+"必须为"+r),!1)}function aesEncrypt(t){try{return encryptData(t,_config.k,_iv)}catch(e){return _log("数据加密异常:"+e),_sa.para.batch_send?"":_oldOnceData.call(_sa.kit,t)}}function formatData(t){var e={key_id:_config.kid,key_hash:_config.khash,nc:1},r="payload";return _sa.para.batch_send&&(e.flush_time=Date.now(),r="payloads"),e[r]=t,e}function encodeTrackData(t){var e="";_sa.para.batch_send?e=formatData(t):e=formatData(aesEncrypt(t));var r=JSON.stringify(e);return"data="+encodeURIComponent(r)+"&gzip=9"}function isObject$1(t){return null!=t&&"[object Object]"==toString.call(t)}function encryptStoreData(t){var e=t.length;if(e>0){for(var r=0;r= 1.14.27 版本时 ,只下线加密插件 28 | 主 SDK 版本要回退到 1.14.27 以下版本时,下线加密插件,需要在 setPara 中修改配置storage_prepare_data_key(本地存储 key 值,字符串格式) 29 | * 开启加密后,如果服务端不支持解密,数据无法入库,会丢失,埋点管理中不会有报错 30 | * 版本要求: 31 | 微信小程序 SDK v.14.27 及以上版本 32 | Edge v0.3.0及以上的版本 33 | SDF 2.3及以上的版本 34 | -------------------------------------------------------------------------------- /dist/wechat/plugin/exposure/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var sa=null,_=null,platform_obj=null,isTaroVue3=!1,tagConfigMap={},tagsIntersectionMap={},delayTagViewIdTimerMap={},tagExposedViewIdMap={},tagObserveViewIdMap={},taroViews=[];function createObserver(e,a){var t,r=e.area_rate,o=getCurrentPages(),n=o[o.length-1],i={observeAll:!0,thresholds:[r]};return t=e.component?e.component.createIntersectionObserver(i):platform_obj.createIntersectionObserver(n,i),tagsIntersectionMap[a]||(tagsIntersectionMap[a]=[]),tagsIntersectionMap[a].push(t),t}function getBaseProps(e){var a=e.dataset,t={};return e.id&&(t.$element_id=e.id),a.type&&(t.$element_type=a.type),a.content&&(t.$element_content=a.content),a.name&&(t.$element_name=a.name),t.$url_path=_.getCurrentPath(),t}function getTaro3Dataset(e){var a=_.isEmptyObject(e.dataset)?e.id:e.dataset.sid,t={};return _.each(taroViews,function(e){a===e.uid&&(t=e.dataset)}),t}function getNodesViews(e){var a=[];return _.each(e.childNodes,function(e){a.push({dataset:e.dataset||{},props:e.props||{},uid:e.uid}),e.childNodes&&e.childNodes.length&&(a=a.concat(getNodesViews(e)))}),a}function setTaroViews(){taroViews=[];try{var e=document.body;e&&(taroViews=getNodesViews(e))}catch(e){}}function getProps(e){var a=isTaroVue3?getTaro3Dataset(e):e.dataset,t={},r={},o=null;_.each(a,function(e,a){if("sensorsExposureOption"===a)try{var n=_.isObject(e)?e:JSON.parse(e);o=_.isString(n.event_name)?n.event_name:o,t=_.isObject(n.config)?n.config:t,r=_.isObject(n.properties)?n.properties:r}catch(a){_.log("view attribute data-sensors-exposure-option error. value:",e)}}),_.each(a,function(e,a){if(a.startsWith("sensorsExposureConfig")){var n=a.replace(/^sensorsExposureConfig(.*)/,function(e,a){return a.replace(a[0],a[0].toLocaleLowerCase())});t[n]=e}if(a.startsWith("sensorsExposureProperty")){var i=a.replace(/^sensorsExposureProperty(.*)/,function(e,a){return a.replace(a[0],a[0].toLocaleLowerCase())});r[i]=e}"sensorsExposureEventName"===a&&(o=e)});var n=e.id||_.base64Encode(JSON.stringify({a:r,n:o}));return r=_.extend(getBaseProps({id:e.id,dataset:a}),r),{config:formatConfig(t),props:r,event_name:o,id:n}}function clearDelay(e,a){delayTagViewIdTimerMap[e]&&(a?delayTagViewIdTimerMap[e][a]&&(clearTimeout(delayTagViewIdTimerMap[e][a]),delete delayTagViewIdTimerMap[e][a]):_.each(delayTagViewIdTimerMap[e],function(a,t){clearTimeout(a),delete delayTagViewIdTimerMap[e][t]}))}function observeView(e,a,t){var r=t.area_rate;createObserver(t,e).relativeToViewport().observe("."+e,function(t){var o=t.boundingClientRect,n=t.intersectionRect;if(o.width&&o.height&&(0!==Number(r)||0!==n.bottom||0!==n.top||0!==n.right||0!==n.left)){var i=getProps(t),s=_.isEmptyObject(i.config)?tagConfigMap[e]:mergeConfig(i.config,tagConfigMap[e]),c=i.event_name,p=i.id,g=i.props;if(tagExposedViewIdMap[e]||(tagExposedViewIdMap[e]=[]),!(_.isArray(tagExposedViewIdMap[e])&&tagExposedViewIdMap[e].indexOf(p)>-1&&0==s.repeated||a.indexOf(p)<0))if(c)if(t.intersectionRatio>=r){var u=s.stay_duration;clearDelay(e,p);var d=function(){if(!tagConfigMap||!tagConfigMap[e])return!1;var a=tagConfigMap[e].listener,t=a&&a.shouldExpose,r=a&&a.didExpose,o={event_name:c,properties:g};if(t&&_.isFunction(t))try{if(!1===t(e,o))return}catch(e){}if(sa.track(c,g),r&&_.isFunction(r))try{r(e,o)}catch(e){}tagExposedViewIdMap[e].push(p)};u>0?(delayTagViewIdTimerMap[e]||(delayTagViewIdTimerMap[e]={}),delayTagViewIdTimerMap[e][p]=setTimeout(function(){clearDelay(e,p),d()},1e3*u)):d()}else clearDelay(e,p);else _.log("the view event_name error, exposure failed")}})}function checkView(e,a){(a.component||platform_obj).createSelectorQuery().selectAll("."+e).boundingClientRect(function(t){if(_.isArray(t)&&t.length>0){var r={};_.each(t,function(t){var o=getProps(t),n=(_.isEmptyObject(o.config)?a:mergeConfig(o.config,a)).area_rate,i=!1;tagObserveViewIdMap[e]||(tagObserveViewIdMap[e]=[]),_.each(tagObserveViewIdMap[e],function(e){e===o.id&&(i=!0)}),!1===i&&(r[n]||(r[n]=[]),r[n].push(o.id),tagObserveViewIdMap[e].push(o.id))}),_.each(r,function(t,r){observeView(e,t,{area_rate:r,component:a.component})})}}).exec()}function addPageExposure(){isTaroVue3&&setTaroViews(),_.each(tagConfigMap,function(e,a){checkView(a,e)})}function removePageExposure(){_.each(tagsIntersectionMap,function(e){_.each(e,function(e){e.disconnect()})}),_.each(delayTagViewIdTimerMap,function(e){_.each(e,function(e){clearTimeout(e)})}),tagsIntersectionMap={},delayTagViewIdTimerMap={},tagExposedViewIdMap={},tagObserveViewIdMap={},isTaroVue3&&(taroViews=[])}function formatConfig(e){var a={};return _.each(e,function(t,r){switch(r){case"area_rate":t=Number(t),!isNaN(t)&&t>=0&&t<=1?a.area_rate=t:_.log("parameter config.area_rate error. config:",e);break;case"stay_duration":t=Number(t),!isNaN(t)&&t>=0?a.stay_duration=t:_.log("parameter config.stay_duration error. config:",e);break;case"repeated":"false"===t||!1===t||"true"===t||!0===t?a.repeated="false"!==t&&Boolean(t):_.log("parameter config.repeated error. config:",e)}}),a}function mergeClassTag(e,a){return _.isArray(e)?a.concat(e):a}function mergeConfig(e,a){return a=a||{},e=e||{},{area_rate:_.isNumber(e.area_rate)&&e.area_rate>0&&e.area_rate<=1?e.area_rate:a.area_rate,stay_duration:_.isNumber(e.stay_duration)&&e.stay_duration>0?e.stay_duration:a.stay_duration,repeated:_.isBoolean(e.repeated)?e.repeated:a.repeated}}function initClassTagsConfig(e,a){var t={};return _.each(e,function(e){t[e]={area_rate:a.area_rate,stay_duration:a.stay_duration,repeated:a.repeated}}),t}function isComponent(e){return!!(_.isObject(e)&&_.isFunction(e.createSelectorQuery)&&_.isFunction(e.createIntersectionObserver))}var Exposure={plugin_name:"Exposure",config:{class_tags:["sensors-exposure-track"],area_rate:0,stay_duration:0,repeated:!0},isReady:!1,init:function(e,a){if(!e||sa)return!1;_=(sa=e)._,platform_obj=wx;var t=sa.ee;if(_.isObject(a)){var r=this.config.class_tags;this.config=mergeConfig(a,this.config||{}),this.config.class_tags=mergeClassTag(a.class_tags,r),isTaroVue3=a.framework&&a.framework.taro||!1}tagConfigMap=initClassTagsConfig(this.config.class_tags,this.config),t.page.replay("pageShow",addPageExposure),t.page.replay("pageHide",removePageExposure),this.isReady=!0},addObserverByClassName:function(e,a,t){if(!1!==this.isReady)if(_.isString(e)){var r;_.isObject(a)?(a.component&&!isComponent(a.component)&&(_.log("parameter config.component error. config.component:"+a.component),delete a.component),tagConfigMap[e]=tagConfigMap[e]?mergeConfig(a,tagConfigMap[e]):mergeConfig(a,this.config)):tagConfigMap[e]=this.config,_.isObject(t)?tagConfigMap[e].listener=t:t&&_.log("parameter listener error. listener:"+t),r=a&&a.component?_.extend(tagConfigMap[e],{component:a.component}):tagConfigMap[e],isTaroVue3&&setTaroViews(),checkView(e,r)}else _.log("parameter tag error. tag:"+e)},removeObserverByClassName:function(e){!1!==this.isReady&&(_.isString(e)?(tagsIntersectionMap[e]&&(_.each(tagsIntersectionMap[e],function(e){e.disconnect()}),delete tagsIntersectionMap[e]),clearDelay(e),tagConfigMap[e]&&delete tagConfigMap[e],tagExposedViewIdMap[e]&&delete tagExposedViewIdMap[e],tagObserveViewIdMap[e]&&delete tagObserveViewIdMap[e],isTaroVue3&&(taroViews=[])):_.log("parameter tag error. tag:"+e))}},index=createPlugin(Exposure);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/exposure/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var sa=null,_=null,platform_obj=null,isTaroVue3=!1,tagConfigMap={},tagsIntersectionMap={},delayTagViewIdTimerMap={},tagExposedViewIdMap={},tagObserveViewIdMap={},taroViews=[];function createObserver(e,a){var t,r=e.area_rate,o=getCurrentPages(),n=o[o.length-1],i={observeAll:!0,thresholds:[r]};return t=e.component?e.component.createIntersectionObserver(i):platform_obj.createIntersectionObserver(n,i),tagsIntersectionMap[a]||(tagsIntersectionMap[a]=[]),tagsIntersectionMap[a].push(t),t}function getBaseProps(e){var a=e.dataset,t={};return e.id&&(t.$element_id=e.id),a.type&&(t.$element_type=a.type),a.content&&(t.$element_content=a.content),a.name&&(t.$element_name=a.name),t.$url_path=_.getCurrentPath(),t}function getTaro3Dataset(e){var a=_.isEmptyObject(e.dataset)?e.id:e.dataset.sid,t={};return _.each(taroViews,function(e){a===e.uid&&(t=e.dataset)}),t}function getNodesViews(e){var a=[];return _.each(e.childNodes,function(e){a.push({dataset:e.dataset||{},props:e.props||{},uid:e.uid}),e.childNodes&&e.childNodes.length&&(a=a.concat(getNodesViews(e)))}),a}function setTaroViews(){taroViews=[];try{var e=document.body;e&&(taroViews=getNodesViews(e))}catch(e){}}function getProps(e){var a=isTaroVue3?getTaro3Dataset(e):e.dataset,t={},r={},o=null;_.each(a,function(e,a){if("sensorsExposureOption"===a)try{var n=_.isObject(e)?e:JSON.parse(e);o=_.isString(n.event_name)?n.event_name:o,t=_.isObject(n.config)?n.config:t,r=_.isObject(n.properties)?n.properties:r}catch(a){_.log("view attribute data-sensors-exposure-option error. value:",e)}}),_.each(a,function(e,a){if(a.startsWith("sensorsExposureConfig")){var n=a.replace(/^sensorsExposureConfig(.*)/,function(e,a){return a.replace(a[0],a[0].toLocaleLowerCase())});t[n]=e}if(a.startsWith("sensorsExposureProperty")){var i=a.replace(/^sensorsExposureProperty(.*)/,function(e,a){return a.replace(a[0],a[0].toLocaleLowerCase())});r[i]=e}"sensorsExposureEventName"===a&&(o=e)});var n=e.id||_.base64Encode(JSON.stringify({a:r,n:o}));return r=_.extend(getBaseProps({id:e.id,dataset:a}),r),{config:formatConfig(t),props:r,event_name:o,id:n}}function clearDelay(e,a){delayTagViewIdTimerMap[e]&&(a?delayTagViewIdTimerMap[e][a]&&(clearTimeout(delayTagViewIdTimerMap[e][a]),delete delayTagViewIdTimerMap[e][a]):_.each(delayTagViewIdTimerMap[e],function(a,t){clearTimeout(a),delete delayTagViewIdTimerMap[e][t]}))}function observeView(e,a,t){var r=t.area_rate;createObserver(t,e).relativeToViewport().observe("."+e,function(t){var o=t.boundingClientRect,n=t.intersectionRect;if(o.width&&o.height&&(0!==Number(r)||0!==n.bottom||0!==n.top||0!==n.right||0!==n.left)){var i=getProps(t),s=_.isEmptyObject(i.config)?tagConfigMap[e]:mergeConfig(i.config,tagConfigMap[e]),c=i.event_name,p=i.id,g=i.props;if(tagExposedViewIdMap[e]||(tagExposedViewIdMap[e]=[]),!(_.isArray(tagExposedViewIdMap[e])&&tagExposedViewIdMap[e].indexOf(p)>-1&&0==s.repeated||a.indexOf(p)<0))if(c)if(t.intersectionRatio>=r){var d=s.stay_duration;clearDelay(e,p);var u=function(){if(!tagConfigMap||!tagConfigMap[e])return!1;var a=tagConfigMap[e].listener,t=a&&a.shouldExpose,r=a&&a.didExpose,o={event_name:c,properties:g};if(t&&_.isFunction(t))try{if(!1===t(e,o))return}catch(e){}if(sa.track(c,g),r&&_.isFunction(r))try{r(e,o)}catch(e){}tagExposedViewIdMap[e].push(p)};d>0?(delayTagViewIdTimerMap[e]||(delayTagViewIdTimerMap[e]={}),delayTagViewIdTimerMap[e][p]=setTimeout(function(){clearDelay(e,p),u()},1e3*d)):u()}else clearDelay(e,p);else _.log("the view event_name error, exposure failed")}})}function checkView(e,a){(a.component||platform_obj).createSelectorQuery().selectAll("."+e).boundingClientRect(function(t){if(_.isArray(t)&&t.length>0){var r={};_.each(t,function(t){var o=getProps(t),n=(_.isEmptyObject(o.config)?a:mergeConfig(o.config,a)).area_rate,i=!1;tagObserveViewIdMap[e]||(tagObserveViewIdMap[e]=[]),_.each(tagObserveViewIdMap[e],function(e){e===o.id&&(i=!0)}),!1===i&&(r[n]||(r[n]=[]),r[n].push(o.id),tagObserveViewIdMap[e].push(o.id))}),_.each(r,function(t,r){observeView(e,t,{area_rate:r,component:a.component})})}}).exec()}function addPageExposure(){isTaroVue3&&setTaroViews(),_.each(tagConfigMap,function(e,a){checkView(a,e)})}function removePageExposure(){_.each(tagsIntersectionMap,function(e){_.each(e,function(e){e.disconnect()})}),_.each(delayTagViewIdTimerMap,function(e){_.each(e,function(e){clearTimeout(e)})}),tagsIntersectionMap={},delayTagViewIdTimerMap={},tagExposedViewIdMap={},tagObserveViewIdMap={},isTaroVue3&&(taroViews=[])}function formatConfig(e){var a={};return _.each(e,function(t,r){switch(r){case"area_rate":t=Number(t),!isNaN(t)&&t>=0&&t<=1?a.area_rate=t:_.log("parameter config.area_rate error. config:",e);break;case"stay_duration":t=Number(t),!isNaN(t)&&t>=0?a.stay_duration=t:_.log("parameter config.stay_duration error. config:",e);break;case"repeated":"false"===t||!1===t||"true"===t||!0===t?a.repeated="false"!==t&&Boolean(t):_.log("parameter config.repeated error. config:",e)}}),a}function mergeClassTag(e,a){return _.isArray(e)?a.concat(e):a}function mergeConfig(e,a){return a=a||{},e=e||{},{area_rate:_.isNumber(e.area_rate)&&e.area_rate>0&&e.area_rate<=1?e.area_rate:a.area_rate,stay_duration:_.isNumber(e.stay_duration)&&e.stay_duration>0?e.stay_duration:a.stay_duration,repeated:_.isBoolean(e.repeated)?e.repeated:a.repeated}}function initClassTagsConfig(e,a){var t={};return _.each(e,function(e){t[e]={area_rate:a.area_rate,stay_duration:a.stay_duration,repeated:a.repeated}}),t}function isComponent(e){return!!(_.isObject(e)&&_.isFunction(e.createSelectorQuery)&&_.isFunction(e.createIntersectionObserver))}var Exposure={plugin_name:"Exposure",config:{class_tags:["sensors-exposure-track"],area_rate:0,stay_duration:0,repeated:!0},isReady:!1,init:function(e,a){if(!e||sa)return!1;_=(sa=e)._,platform_obj=wx;var t=sa.ee;if(_.isObject(a)){var r=this.config.class_tags;this.config=mergeConfig(a,this.config||{}),this.config.class_tags=mergeClassTag(a.class_tags,r),isTaroVue3=a.framework&&a.framework.taro||!1}tagConfigMap=initClassTagsConfig(this.config.class_tags,this.config),t.page.replay("pageShow",addPageExposure),t.page.replay("pageHide",removePageExposure),this.isReady=!0},addObserverByClassName:function(e,a,t){if(!1!==this.isReady)if(_.isString(e)){var r;_.isObject(a)?(a.component&&!isComponent(a.component)&&(_.log("parameter config.component error. config.component:"+a.component),delete a.component),tagConfigMap[e]=tagConfigMap[e]?mergeConfig(a,tagConfigMap[e]):mergeConfig(a,this.config)):tagConfigMap[e]=this.config,_.isObject(t)?tagConfigMap[e].listener=t:t&&_.log("parameter listener error. listener:"+t),r=a&&a.component?_.extend(tagConfigMap[e],{component:a.component}):tagConfigMap[e],isTaroVue3&&setTaroViews(),checkView(e,r)}else _.log("parameter tag error. tag:"+e)},removeObserverByClassName:function(e){!1!==this.isReady&&(_.isString(e)?(tagsIntersectionMap[e]&&(_.each(tagsIntersectionMap[e],function(e){e.disconnect()}),delete tagsIntersectionMap[e]),clearDelay(e),tagConfigMap[e]&&delete tagConfigMap[e],tagExposedViewIdMap[e]&&delete tagExposedViewIdMap[e],tagObserveViewIdMap[e]&&delete tagObserveViewIdMap[e],isTaroVue3&&(taroViews=[])):_.log("parameter tag error. tag:"+e))}},index=createPlugin(Exposure);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/exposure/readme.md: -------------------------------------------------------------------------------- 1 | # 元素曝光事件采集 2 | 3 | ## 功能 4 | 某视图元素,由不可见到可见,满足一定的限制条件(可见比例、有效停留时长),该插件上报该视图元素曝光事件。 5 | 6 | 具体使用方法请参考:[曝光采集(微信小程序)](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_mp_wechat_expose-121833460.html) 7 | 8 | ## 变动 9 | - 新增事件:通过 View 自定义曝光事件名。 10 | - 新增属性:通过 View 自定义事件属性。 11 | 12 | ## ⚠️ 注意 13 | - 已注册的曝光元素标记 `class_tag`,再次注册仅更新之前未注册的元素,已注册的元素不会再次注册,已注册的元素不会因调用注册 API 导致发送曝光事件。 14 | - 每个曝光元素 `event-name` (事件名)或 `property`(事件属性) 必须有差异,否则在 `repeated` 为 `false` 时,只会曝光查询到的第一个参数。 15 | - 如未设置元素 `ID`,是通过曝光元素 `event-name` (事件名)与 `property`(事件属性)区分曝光元素。 16 | - 微信小程序 SDK 版本必须大于或等于 1.18.6。 17 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。 18 | -------------------------------------------------------------------------------- /dist/wechat/plugin/general-encryption/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var sd,_,_oldOnceData,_log,option,base={plugin_version:"1.22.3"};function createPlugin(t){if("object"==typeof t&&"string"==typeof t.plugin_name&&""!==t.plugin_name)return t.plugin_version=base.plugin_version,t.log=t.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},t;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}function formatData(t){try{var n=option.encrypt_utils.encryptSymmetricKeyWithPublicKey(option.pub_key),e={pkv:option.pkv,ekey:n};return sd.para.batch_send?e.flush_time=Date.now():t=[t],e.payloads=t,e}catch(n){return t}}function encodeTrackData(t){var n="";sd.para.batch_send?n=formatData(t):n=formatData(smEncrypt(t));var e=JSON.stringify(n);return"data="+encodeURIComponent(e)}function encryptData(t){try{var n=option.encrypt_utils.encryptEvent;if(sd._.isFunction(n)){var e=n(t);return sd._.base64Encode(e)}return t}catch(n){return _log("Encrypted data exception:"+n),t}}function encryptStoreData(t){var n=t.length;if(n>0){for(var e=0;e0){for(var e=0;e-1?o>-1?s+l+"#"+a.substring(1,o)+g(a.substring(o,a.length)):s+l+a+"&"+u:s+l+"#"+a.substring(1)+"?"+u):(o=l.indexOf("_sasdk"),r=/^\?(\w)+/.test(l)?o>-1?s+"?"+g(l.substring(1))+a:s+l+"&"+u+a:s+"?"+u+a);return r},h5Linker.init=function(i){i?(this._=i._,this.store=i.store,this.log=i._.logger.info||log,this.is_ready=!0):log("H5Linker plugin initialization failed")},h5Linker.plugin_name="H5Linker",h5Linker.addDistinctIdToUrl=function(i,e){return this.is_ready?this._.isString(i)&&""!==i&&/^http(s)?:\/\//.test(i)?h5Linker.rewriteUrl(i,e):(this.log("error: URL format error"),i):(this.log("H5Linker plugin not initialized"),i)};var index=createPlugin(h5Linker);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/h5-linker/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(i){if("object"==typeof i&&"string"==typeof i.plugin_name&&""!==i.plugin_name)return i.plugin_version=base.plugin_version,i.log=i.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},i;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var h5Linker={is_ready:!1},log=console&&console.log||function(){};h5Linker.getSasdkValue=function(){var i=this.store.getDistinctId()||"",e=this.store.getFirstId()||"";return this._.urlSafeBase64&&this._.urlSafeBase64.encode?i=i?this._.urlSafeBase64.trim(this._.urlSafeBase64.encode(this._.base64Encode(i))):"":this._.rot13obfs&&(i=i?this._.rot13obfs(i):""),encodeURIComponent(e?"f"+i:"d"+i)},h5Linker.rewriteUrl=function(i,e){if(!this.is_ready)return this.log("h5Linker plugin not initialized"),i;var n=this,t=/([^?#]+)(\?[^#]*)?(#.*)?/.exec(i),r="";if(!t)return i;var o,s=t[1]||"",l=t[2]||"",a=t[3]||"",u="_sasdk="+this.getSasdkValue(),g=function(i){var e=i.split("&"),t=[];return n._.each(e,function(i){i.indexOf("_sasdk=")>-1?t.push(u):t.push(i)}),t.join("&")};(e=!!this._.isBoolean(e)&&e)?(o=a.indexOf("_sasdk"),r=a.indexOf("?")>-1?o>-1?s+l+"#"+a.substring(1,o)+g(a.substring(o,a.length)):s+l+a+"&"+u:s+l+"#"+a.substring(1)+"?"+u):(o=l.indexOf("_sasdk"),r=/^\?(\w)+/.test(l)?o>-1?s+"?"+g(l.substring(1))+a:s+l+"&"+u+a:s+"?"+u+a);return r},h5Linker.init=function(i){i?(this._=i._,this.store=i.store,this.log=i._.logger.info||log,this.is_ready=!0):log("H5Linker plugin initialization failed")},h5Linker.plugin_name="H5Linker",h5Linker.addDistinctIdToUrl=function(i,e){return this.is_ready?this._.isString(i)&&""!==i&&/^http(s)?:\/\//.test(i)?h5Linker.rewriteUrl(i,e):(this.log("error: URL format error"),i):(this.log("H5Linker plugin not initialized"),i)};var index=createPlugin(h5Linker);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/h5-linker/readme.md: -------------------------------------------------------------------------------- 1 | # 微信小程序与 H5 用户关联 2 | 3 | ## 功能 4 | 微信小程序与 WebView 中的 H5 的用户打通。 5 | 原理: 通过插件提供的 `addDistinctIdToUrl` 对 WebView 要使用的 url 增加 `_sasdk` 参数, 参数的值是当前微信小程序数据采集中的 distinct_id。 6 | 7 | ## 集成 8 | ```javascript 9 | import H5Linker from '/dist/wechat/plugin/h5-linker/index.esm'; 10 | sensors.usePlugin(H5Linker); 11 | var new_url = H5Linker.addDistinctIdToUrl(url ,after_hash); 12 | ``` 13 | ### 参数配置 14 | * `url`: webview 需要加载的 url。类型:`String`。必填 15 | * `after_hash`: 添加 `_sasdk` 参数位置是否在 `url` 的 `hash` 之后。默认:`false`。可选 16 | 17 | ## ⚠ 注意 18 | * 该插件用来替换 微信小程序 v1.18.1 之前的版本中不推荐的 `setWebViewUrl` 方法。如果使用此方法的尽快替换成当前插件 19 | * 不能和 ad-channel-h5-linker 插件共同使用 20 | * 需要配合 Web 的 site-linker 插件共同使用,才能达到 H5 的打通 -------------------------------------------------------------------------------- /dist/wechat/plugin/old-openid/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var oldOpenid={init(e){var t={getRequest:function(t){wx.login({success:function(i){i.code&&e.para.appid&&e.para.openid_url?e._.wxrequest({url:e.para.openid_url+"&code="+i.code+"&appid="+e.para.appid,method:"GET",complete:function(i){e._.isObject(i)&&e._.isObject(i.data)&&i.data.openid?t(i.data.openid):t()}}):t()}})},getWXStorage:function(){var t=e.store.getStorage();if(t&&e._.isObject(t))return t.openid},getOpenid:function(t){if(!e.para.appid)return t(),!1;var i=this.getWXStorage();i?t(i):this.getRequest(t)}};e.unsetOpenid=function(t){var i=e._.validId(t);if(!i)return!1;var n=e.store._state.openid;n===i&&e.store.set("openid","");var o=e._.getOpenidNameByAppid();if(Object.prototype.hasOwnProperty.call(e.store._state.identities,o)&&i===e.store._state.identities[o]){delete e.store._state.identities[o];var s=e.store.getFirstId(),r=e.store.getDistinctId(),a=e.store._state&&e.store._state.identities&&e.store._state.identities.$identity_mp_id;s&&s===n&&a&&e.store.change("first_id",a),r&&r===n&&a&&e.store.change("distinct_id",a),e.store.save()}},e.setOpenid=function(t){if(!(t=e._.validId(t)))return!1;if(!e.meta.init_status)return e.store.store_queue.push({method:"setOpenid",params:arguments}),!1;e.store.set("openid",t),e.identify(t);var i=e._.getOpenidNameByAppid();e.store._state.identities[i]=t,e.store.save()},e.initWithOpenid=function(i,n){(i=i||{}).appid&&(e.para.appid=i.appid),t.getOpenid(function(t){t&&e.setOpenid(t,i.isCoverLogin),n&&e._.isFunction(n)&&n(t),e.init(i)})}},plugin_name:"OldOpenid"},index=createPlugin(oldOpenid);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/old-openid/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var oldOpenid={init(e){var t={getRequest:function(t){wx.login({success:function(i){i.code&&e.para.appid&&e.para.openid_url?e._.wxrequest({url:e.para.openid_url+"&code="+i.code+"&appid="+e.para.appid,method:"GET",complete:function(i){e._.isObject(i)&&e._.isObject(i.data)&&i.data.openid?t(i.data.openid):t()}}):t()}})},getWXStorage:function(){var t=e.store.getStorage();if(t&&e._.isObject(t))return t.openid},getOpenid:function(t){if(!e.para.appid)return t(),!1;var i=this.getWXStorage();i?t(i):this.getRequest(t)}};e.unsetOpenid=function(t){var i=e._.validId(t);if(!i)return!1;var n=e.store._state.openid;n===i&&e.store.set("openid","");var o=e._.getOpenidNameByAppid();if(Object.prototype.hasOwnProperty.call(e.store._state.identities,o)&&i===e.store._state.identities[o]){delete e.store._state.identities[o];var r=e.store.getFirstId(),s=e.store.getDistinctId(),a=e.store._state&&e.store._state.identities&&e.store._state.identities.$identity_mp_id;r&&r===n&&a&&e.store.change("first_id",a),s&&s===n&&a&&e.store.change("distinct_id",a),e.store.save()}},e.setOpenid=function(t){if(!(t=e._.validId(t)))return!1;if(!e.meta.init_status)return e.store.store_queue.push({method:"setOpenid",params:arguments}),!1;e.store.set("openid",t),e.identify(t);var i=e._.getOpenidNameByAppid();e.store._state.identities[i]=t,e.store.save()},e.initWithOpenid=function(i,n){(i=i||{}).appid&&(e.para.appid=i.appid),t.getOpenid(function(t){t&&e.setOpenid(t,i.isCoverLogin),n&&e._.isFunction(n)&&n(t),e.init(i)})}},plugin_name:"OldOpenid"},index=createPlugin(oldOpenid);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/once-send/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var onceSend={init(e){e.kit.onceSend=function(n){n._flush_time=Date.now();var o=e.kit.onceTrackData(n),r=e.para.server_url+"?"+o;-1!==e.para.server_url.indexOf("?")&&(r=e.para.server_url+"&"+o),e._.wxrequest({url:r,method:"GET"})}},plugin_name:"OnceSend"},index=createPlugin(onceSend);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/once-send/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var onceSend={init(e){e.kit.onceSend=function(n){n._flush_time=Date.now();var o=e.kit.onceTrackData(n),r=e.para.server_url+"?"+o;-1!==e.para.server_url.indexOf("?")&&(r=e.para.server_url+"&"+o),e._.wxrequest({url:r,method:"GET"})}},plugin_name:"OnceSend"},index=createPlugin(onceSend);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/plugin.md: -------------------------------------------------------------------------------- 1 | # 插件的开发方式 2 | 3 | ## 插件开发注意点 4 | 1. 插件目录是 pluginXX,默认文件名为 `index.esm.js` 5 | 2. 末尾建议是 `export default pluginXX` 6 | 3. pluginXX 必须是 `object` 7 | 4. pluginXX 必须包含 `name` ,`name` 必须是首字母大写的字符串,命名是大驼峰 8 | 5. pluginXX 必须提供 `init` 方法 9 | 10 | ## 示例代码 11 | 下面我们实现一个插件,当小程序进入后台后,自动发送一个 `hide` 事件并包含传入的自定义属性 12 | 13 | ```javascript 14 | // index.js 15 | var TrackHide = { 16 | name: 'TrackHide', 17 | init: function(sensors, config){ 18 | wx.onAppHide(function(){ 19 | sensors.track('hide',config); 20 | }); 21 | } 22 | }; 23 | export default TrackHide; 24 | ``` 25 | 26 | 以上一个插件就编写好了,下面是使用方式 27 | 28 | ```javascript 29 | import sensors from '/dist/wechat/sensorsdata.ems'; 30 | import trackHide from '/dist/wechat/plugin/track-hide/index.esm'; 31 | sensors.setPara({...}); 32 | sensors.use(trackHide,{platform:'wechat'}); 33 | sensors.init(); 34 | ``` 35 | 36 | 这样,当小程序隐藏的时候,会自动发送 `hide` 事件。 -------------------------------------------------------------------------------- /dist/wechat/plugin/readme.md: -------------------------------------------------------------------------------- 1 | # 插件规范 2 | 为了满足多变的需求,提供可无限扩展的能力。神策的 Web/小程序 SDK 将逐步演化为插件式架构。 3 | SDK 会越来越轻量化,在不久的将来 SDK = CORE + 插件。 4 | 一切需求都是插件,业务都是通过插件来实现。 5 | 6 | ## SDK 和插件下载 7 | ``` 8 | dist 9 | ├── web 10 | ├── plugin 11 | │ ├── plugin-xx 12 | │ │ ├── index.esm.js 13 | │ │ ├── index.cmd.js 14 | |── sensorsdata.esm.js 15 | |── sensorsdata.cjs.js 16 | ``` 17 | * SDK 位置: `/dist/wechat/sensorsdata.esm.js` 18 | * 插件位置: `/dist/wechat/plugin/ ` 19 | 20 | 注意: 弹窗、abtesting 也都在 `/dist/wechat/plugin` 目录下 21 | 22 | ## 使用示例 23 | ```javascript 24 | import sensors from '/dist/wechat/sensorsdata.esm.js'; 25 | import pluginXX from '/dist/wechat/plugin/xx/index.esm.js'; 26 | sensors.usePlugin(pluginXX, option); 27 | sensors.setPara(); 28 | sensors.init(); 29 | ``` 30 | 注意:所有插件都是按照这种方式引入,各插件文档中不会再次介绍,如果 `option` 有参数时候,才会单独介绍参数的用法 31 | 32 | ## 插件使用注意 33 | 1. 按顺序引入插件 ! 先 `import` 主 SDK,后 `import plugin`。先调用 `use`,后调用 `init`。 34 | 2. 版本必须一致 ! 如果单独升级了插件,必须同时单独更新主 SDK。建议插件和 SDK 都引用 `/dist/wechat/` 下的目录文件,这样就会一起更新,就不会出现版本不一致! 35 | -------------------------------------------------------------------------------- /dist/wechat/plugin/register-properties/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var t=Object.prototype.toString.call(e);return"[object Function]"==t||"[object AsyncFunction]"==t}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var r in t)void 0!==t[r]&&(e[r]=t[r])}),e}function each(e,t,r){var o=Array.prototype.forEach,n={};if(null==e)return!1;if(o&&e.forEach===o)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var index=createPlugin(RegisterProperties);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/register-properties/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var t=Object.prototype.toString.call(e);return"[object Function]"==t||"[object AsyncFunction]"==t}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var r in t)void 0!==t[r]&&(e[r]=t[r])}),e}function each(e,t,r){var o=Array.prototype.forEach,n={};if(null==e)return!1;if(o&&e.forEach===o)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var index=createPlugin(RegisterProperties);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/register-properties/readme.md: -------------------------------------------------------------------------------- 1 | # 自定义属性 2 | 3 | ## 功能 4 | 针对特定事件,注册特定属性。 5 | 原理:通过在事件发送前 hook 数据,新增/修改数据,达到对指定事件的新增/修改属性 6 | 7 | ## API 8 | ```javascript 9 | import registerProperties from '/dist/wechat/plugin/register-properties/index.esm'; 10 | sensors.usePlugin(registerProperties); 11 | 12 | // 给 '$MPLaunch' 和 '$MPShow' 注册 tel 和 project 属性 13 | registerProperties.register({ 14 | properties: { 15 | tel: '133xxxxxxxx', 16 | project: 'xxx' 17 | }, 18 | events: ['$MPLaunch', '$MPShow'] 19 | }); 20 | 21 | 22 | // 动态注册公共属性 23 | // 对象包括 event<事件名称>、properties<事件属性>、data<包含所有属性的事件对象> 24 | 25 | registerProperties.hookRegister(function ({event, properties, data}) { 26 | // 根据传入的 参数进行处理,返回自定义属性 27 | var prop = {}; 28 | if(event === 'test1') { 29 | prop = {tel: '133xxxxxxxx'}; 30 | } 31 | if(event === 'test2') { 32 | prop = {project: 'pro-xxx'} 33 | } 34 | return prop; 35 | }) 36 | 37 | ``` 38 | 39 | ## ⚠ 注意 40 | * 对指定事件注册属性,可以通过 `register` 41 | * 如果要对所有事件进行注册属性,可以通过 `hookRegister` 42 | * 如果注册的属性需要动态判断,可以通过 `hookRegister` -------------------------------------------------------------------------------- /dist/wechat/plugin/session-event/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var t=Object.prototype.toString.call(e);return"[object Function]"==t||"[object AsyncFunction]"==t}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var s in t)void 0!==t[s]&&(e[s]=t[s])}),e}function each(e,t,s){var r=Array.prototype.forEach,o={};if(null==e)return!1;if(r&&e.forEach===r)e.forEach(t,s);else if(e.length===+e.length){for(var n=0,i=e.length;n0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var registerProperties=createPlugin(RegisterProperties),flag="data:enc;",store={_sa:null,readObjectVal:function(e){try{var t=store._sa._.getStorageSync(e)||"";return store._sa._.isString(t)&&-1!==t.indexOf(flag)&&(t=t.substring(flag.length),t=JSON.parse(store._sa._.rot13defs(t))),t}catch(e){return null}},saveObjectVal:function(e,t){var s="";store._sa._.isObject(t)?s=flag+store._sa._.rot13obfs(JSON.stringify(t)):store._sa._.isString(t)&&-1===t.indexOf(flag)&&(s=flag+store._sa._.rot13obfs(t)),store._sa._.setStorageSync(e,s)}},_sa$1=null,_$1={isObject:function(e){return null!=e&&"[object Object]"==toString.call(e)},log:function(){if("object"==typeof console&&console.log)try{return console.log.apply(console,arguments)}catch(e){console.log("sensors sessionEvent---",arguments[0])}}},STORAGE_NAME="sensorsdata2015_wechat_session",SessionEvent={plugin_name:"SessionEvent",version:"props_sdk_version",storage_name:STORAGE_NAME,init:function(e){if(!e||"object"!=typeof e)return _$1.log("请传入正确的 sensors 对象!"),!1;_sa$1=e,store._sa=e,_$1.log=e._.logger,registerProperties.init(e),registerProperties.hookRegister(SessionEvent.addSessionID)},addSessionID:function(){var e=+new Date,t=store.readObjectVal(SessionEvent.storage_name)||{},s=t.first_session_time,r=t.latest_session_time;!s||!r||s>e||r>e||e-s>432e5||e-r>18e5?t={session_id:_sa$1.store.getUUID().replace(/-/g,""),first_session_time:e,latest_session_time:e}:t.latest_session_time=e;return store.saveObjectVal(SessionEvent.storage_name,t),{$event_session_id:t.session_id}}},index=createPlugin(SessionEvent);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/session-event/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var t=Object.prototype.toString.call(e);return"[object Function]"==t||"[object AsyncFunction]"==t}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(t){for(var s in t)void 0!==t[s]&&(e[s]=t[s])}),e}function each(e,t,s){var r=Array.prototype.forEach,o={};if(null==e)return!1;if(r&&e.forEach===r)e.forEach(t,s);else if(e.length===+e.length){for(var n=0,i=e.length;n0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var registerProperties=createPlugin(RegisterProperties),flag="data:enc;",store={_sa:null,readObjectVal:function(e){try{var t=store._sa._.getStorageSync(e)||"";return store._sa._.isString(t)&&-1!==t.indexOf(flag)&&(t=t.substring(flag.length),t=JSON.parse(store._sa._.rot13defs(t))),t}catch(e){return null}},saveObjectVal:function(e,t){var s="";store._sa._.isObject(t)?s=flag+store._sa._.rot13obfs(JSON.stringify(t)):store._sa._.isString(t)&&-1===t.indexOf(flag)&&(s=flag+store._sa._.rot13obfs(t)),store._sa._.setStorageSync(e,s)}},_sa$1=null,_$1={isObject:function(e){return null!=e&&"[object Object]"==toString.call(e)},log:function(){if("object"==typeof console&&console.log)try{return console.log.apply(console,arguments)}catch(e){console.log("sensors sessionEvent---",arguments[0])}}},STORAGE_NAME="sensorsdata2015_wechat_session",SessionEvent={plugin_name:"SessionEvent",version:"props_sdk_version",storage_name:STORAGE_NAME,init:function(e){if(!e||"object"!=typeof e)return _$1.log("请传入正确的 sensors 对象!"),!1;_sa$1=e,store._sa=e,_$1.log=e._.logger,registerProperties.init(e),registerProperties.hookRegister(SessionEvent.addSessionID)},addSessionID:function(){var e=+new Date,t=store.readObjectVal(SessionEvent.storage_name)||{},s=t.first_session_time,r=t.latest_session_time;!s||!r||s>e||r>e||e-s>432e5||e-r>18e5?t={session_id:_sa$1.store.getUUID().replace(/-/g,""),first_session_time:e,latest_session_time:e}:t.latest_session_time=e;return store.saveObjectVal(SessionEvent.storage_name,t),{$event_session_id:t.session_id}}},index=createPlugin(SessionEvent);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/session-event/readme.md: -------------------------------------------------------------------------------- 1 | # 12h/30m session 切割 2 | 3 | ## 功能 4 | 给所有事件新增 `$event_session_id` 属性,标记当前事件属于哪个 session。 5 | 原理: session 的切割规则满足以下两个条件中的一个: 6 | 1. 两个连续的时间必须小于 30 分钟 7 | 2. 当前时间 - 首次 session 切割时间 小于 12 小时 8 | 在这个规则内的使用的是一个 session_id,否则会新开一个 session。 9 | 10 | ## 集成 11 | ```javascript 12 | import sessionEvent from '/dist/wechat/plugin/session-event/index.esm.js' 13 | sensors.usePlugin(sessionEvent); 14 | 15 | ``` 16 | 17 | ## 变动 18 | 新增 storage key `sensorsdata2015_wechat_session` 19 | 新增 `$event_session_id` 属性 20 | 21 | ## ⚠ 注意 22 | * session 规则很多,当前只是一种实现,并不是一种通用实现,具体需求还需要具体分析 -------------------------------------------------------------------------------- /dist/wechat/plugin/set-referrer-path/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var r=Object.prototype.toString.call(e);return"[object Function]"==r||"[object AsyncFunction]"==r}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(r){for(var t in r)void 0!==r[t]&&(e[t]=r[t])}),e}function each(e,r,t){var n=Array.prototype.forEach,i={};if(null==e)return!1;if(n&&e.forEach===n)e.forEach(r,t);else if(e.length===+e.length){for(var o=0,s=e.length;o0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var sa,registerProperties=createPlugin(RegisterProperties),setReferrerPath={plugin_name:"SetReferrerPath",init:function(e){if(!(sa=e))return console.log("当前主sdk 初始化失败,请传入正确的 sensors 对象!"),!1;this.setRefPath()},setRefPath:function(){registerProperties.init(sa),registerProperties.hookRegister(function(e){var r="",t={};if(e&&e.properties&&(r=e.properties.$referrer||"",sa._.isString(r))){var n=r.indexOf("?");t={referrer_path:n>0?r.substring(0,n):r}}return t})}},index=createPlugin(setReferrerPath);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/set-referrer-path/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var hasOwnProperty=Object.prototype.hasOwnProperty;function isFunction(e){if(!e)return!1;var r=Object.prototype.toString.call(e);return"[object Function]"==r||"[object AsyncFunction]"==r}function isObject(e){return null!=e&&"[object Object]"==Object.prototype.toString.call(e)}function isString(e){return"[object String]"==toString.call(e)}function log(){if("object"==typeof console&&console.log){isString(arguments[0])&&(arguments[0]="sensors registerProperties————"+arguments[0]);try{return console.log.apply(console,arguments)}catch(e){console.log("sensors registerProperties————",arguments[0])}}}function extend(e){return each(Array.prototype.slice.call(arguments,1),function(r){for(var t in r)void 0!==r[t]&&(e[t]=r[t])}),e}function each(e,r,t){var n=Array.prototype.forEach,i={};if(null==e)return!1;if(n&&e.forEach===n)e.forEach(r,t);else if(e.length===+e.length){for(var o=0,s=e.length;o0&®ister_list.push(e):_.log("参数错误!")},RegisterProperties.hookRegister=function(e){_.isFunction(e)&®ister_list.push(e)};var sa,registerProperties=createPlugin(RegisterProperties),setReferrerPath={plugin_name:"SetReferrerPath",init:function(e){if(!(sa=e))return console.log("当前主sdk 初始化失败,请传入正确的 sensors 对象!"),!1;this.setRefPath()},setRefPath:function(){registerProperties.init(sa),registerProperties.hookRegister(function(e){var r="",t={};if(e&&e.properties&&(r=e.properties.$referrer||"",sa._.isString(r))){var n=r.indexOf("?");t={referrer_path:n>0?r.substring(0,n):r}}return t})}},index=createPlugin(setReferrerPath);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/set-referrer-path/readme.md: -------------------------------------------------------------------------------- 1 | ## 新增 referrer_path 公共属性 2 | 3 | ## 功能 4 | 增加 `referrer_path` 属性,相比 `$referrer` ,`referrer_path` 只包含 path。 5 | 6 | ## 集成 7 | ```javascript 8 | import referrerPath from '/dist/wechat/plugin/set-referrer-path/index.esm.js' 9 | sensors.usePlugin(referrerPath); 10 | ``` 11 | 12 | ## 变动 13 | 新增 `referrer_path` 属性 -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-instant-event/index.cmd.js: -------------------------------------------------------------------------------- 1 | "use strict";var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var InstantEvent={init(e,n){e.ee.sdk.on("initPara",function(){e.para.is_sf_instant_event=!0}),(n=e._.isObject(n)?n:{}).instant_events=n.instant_events||[],e.kit.is_sf_instant_event=function(t){return!(!e._.isObject(t)||!e._.isString(t.event))&&n.instant_events.includes(t.event)},e.kit.onceSend=function(n,t){n._flush_time=Date.now();var o=e.kit.onceTrackData(n),r=e.para.server_url;t?e._.wxrequest({header:{"Content-Type":"text/plain"},url:r,method:"POST",dataType:"text",data:o+"&instant_event=true"}):(r=e.para.server_url+"?"+o,-1!==e.para.server_url.indexOf("?")&&(r=e.para.server_url+"&"+o),e._.wxrequest({url:r,method:"GET"}))}},plugin_name:"SFInstantEvent"},index=createPlugin(InstantEvent);module.exports=index; -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-instant-event/index.esm.js: -------------------------------------------------------------------------------- 1 | var base={plugin_version:"1.22.3"};function createPlugin(e){if("object"==typeof e&&"string"==typeof e.plugin_name&&""!==e.plugin_name)return e.plugin_version=base.plugin_version,e.log=e.log||function(){"object"==typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)},e;"object"==typeof console&&"function"==typeof console.error&&console.error('plugin must contain proprerty "plugin_name"')}var InstantEvent={init(e,n){e.ee.sdk.on("initPara",function(){e.para.is_sf_instant_event=!0}),(n=e._.isObject(n)?n:{}).instant_events=n.instant_events||[],e.kit.is_sf_instant_event=function(t){return!(!e._.isObject(t)||!e._.isString(t.event))&&n.instant_events.includes(t.event)},e.kit.onceSend=function(n,t){n._flush_time=Date.now();var o=e.kit.onceTrackData(n),r=e.para.server_url;t?e._.wxrequest({header:{"Content-Type":"text/plain"},url:r,method:"POST",dataType:"text",data:o+"&instant_event=true"}):(r=e.para.server_url+"?"+o,-1!==e.para.server_url.indexOf("?")&&(r=e.para.server_url+"&"+o),e._.wxrequest({url:r,method:"GET"}))}},plugin_name:"SFInstantEvent"},index=createPlugin(InstantEvent);export default index; -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-instant-event/readme.md: -------------------------------------------------------------------------------- 1 | ## SF - 即时事件上报 2 | 3 | ## 功能 4 | 根据即时事件配置 `instant_events` 配置的事件名称列表,将符合的事件增加 `instant_event` 标记。用以智能运营优先处理该条数据。 5 | 6 | ## 集成 7 | ### ES Module 方式 8 | ```js 9 | import sfInstantEvent from '/dist/wechat/plugin/sf-instant-event/index.esm.js'; 10 | sensors.use(sfInstantEvent,{ 11 | instant_events:['$pageview','test1'] // 配置即时上报事件名称 12 | }); 13 | ``` 14 | 15 | ## ⚠️ 注意 16 | - 需 SF v4.4 以上版本支持。 17 | - 请联系技术顾问确认是否使用该插件! 该插件非 SDK 通用功能,仅限在 SF 特定环境下使用。 -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-sdk-miniprogram/README.md: -------------------------------------------------------------------------------- 1 | # SF - 微信小程序弹窗 2 | 3 | ## 功能 4 | 本功能需要配合神策智能运营使用。 5 | 详细集成方式参考: [微信小程序弹窗集成](https://manual.sensorsdata.cn/sf/latest/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%B9%E7%AA%97%E9%9B%86%E6%88%90-103022809.html) 6 | -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-sdk-miniprogram/popup-component/popup-component.js: -------------------------------------------------------------------------------- 1 | var sensors=getApp().sensors;Component({options:{multipleSlots:!0},lifetimes:{attached:function(){sensors&&sensors.popupEmitter&&sensors.popupEmitter.attached&&"[object Function]"===Object.prototype.toString.call(sensors.popupEmitter.attached)&&sensors.popupEmitter.attached()}},properties:{},data:{flag:!0,isShow:!1,template:{},image_list:[],plan_obj:{}},methods:{loadImage:function(t){if(t&&t.length>0){var e=[].concat(this.image_list,t);this.setData({image_list:e})}},handle:function(t){return!!this.data.flag&&(t.popupTree||t.popupTree.properties?(this.setData({plan_obj:t}),this.setData({template:t.popupTree}),void(this.data.flag&&(this.setData({isShow:!0}),this.showPopup()))):(this.popupFail(1001),!1))},popupFail(t){var e={$sf_succeed:!1};e.fail_code=t,e.$sf_fail_reason={1000:"图片加载失败",1001:"预览信息解析失败,请检查计划配置",2000:"对照组"}[t];var s=this.data.plan_obj;s.props=e,2e3!==t&&sensors.events.emit("popup_load_fail",s),sensors.events.emit("popup_end",this.data.plan_obj)},clickMask:function(){var t=this.data.template.properties,e={};e.$sf_msg_action_id=t.maskActionId,e.$sf_close_type="POPUP_CLOSE_MASK",e.$sf_msg_element_type="mask",e.$sf_msg_element_action="close";var s=this.data.plan_obj;if(s.props=e,t&&t.maskAction){var a=t.maskAction.MINIPROGRAM,o=sensors._.isArray(a)&&a[0];if(sensors._.isObject(o))switch(e.$sf_msg_action_id=o.id||"",e.$sf_close_type=o.$sf_close_type||"",e.$sf_msg_element_action=o.type||"",o.type){case"copy":sensors.events.emit("popup_click",s);break;case"customize":case"openlink":sensors.events.emit("popup_click",s),o.closeable&&this.hidePopup();break;case"close":o.closeable&&(sensors.events.emit("popup_click",s),this.hidePopup())}}else t&&t.maskCloseEnabled&&(sensors.events.emit("popup_click",s),this.hidePopup())},hidePopup:function(){this.setData({flag:!0}),this.setData({isShow:!1}),sensors.events.emit("popup_end",this.data.plan_obj)},showPopup(){this.setData({flag:!1});var t=this.data.plan_obj;sensors.events.emit("popup_display",t)},tapContent(){console.log("点击了弹窗窗体")},topCloseButton(){var t=this.data.template.image_button;t.$sf_close_type||(t.$sf_close_type="POPUP_CLOSE_TOPRIGHT"),this.popupCLick(t)},buttomCloseButton(){var t=this.data.template.image_button;t.$sf_close_type||(t.$sf_close_type="POPUP_CLOSE_BOTTOM"),this.popupCLick(t)},clickImage(){var t=this.data.template.img;t.$sf_close_type||(t.$sf_close_type="POPUP_CLOSE_BUTTON"),this.popupCLick(t)},buttonFirst(){var t=this.data.template.button[0];"close"!==t.action_type||t.$sf_close_type||(t.$sf_close_type="POPUP_CLOSE_BUTTON"),this.popupCLick(t)},buttonSecond(){var t=this.data.template.button[1];"close"!==t.action_type||t.$sf_close_type||(t.$sf_close_type="POPUP_CLOSE_BUTTON"),this.popupCLick(t)},popupCLick(t){var e={};switch(e.$sf_msg_element_type=t.type,e.$sf_msg_element_content=t.innerText,e.$sf_msg_action_id=t.id,e.action_value=t.value,e.$sf_msg_element_action=t.action_type,e.$sf_close_type=t.$sf_close_type,t.action_type){case"copy":wx.setClipboardData({data:t.value,success(t){console.log("复制文本成功")}});break;case"navigateTo":var s={path:t.path};e.action_value=t.path,this.navigatePage(s);break;case"navigateToMiniProgram":s={path:t.path,appid:t.appid};this.navigateMini(s)}var a=this.data.plan_obj;a.props=e,sensors.events.emit("popup_click",a),t.closeable&&this.hidePopup()},navigatePage(t){wx.navigateTo({url:t.path,success:function(){console.log("navigate success")},fail:function(t){console.log("navigate fail: ",t)}})},navigateMini(t){wx.navigateToMiniProgram({appId:t.appid,path:t.path,success(){console.log("navigate success")},fail(t){console.log("navigate fail: ",t)}})}}}); -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-sdk-miniprogram/popup-component/popup-component.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-sdk-miniprogram/popup-component/popup-component.wxml: -------------------------------------------------------------------------------- 1 | 104 | -------------------------------------------------------------------------------- /dist/wechat/plugin/sf-sdk-miniprogram/popup-component/popup-component.wxss: -------------------------------------------------------------------------------- 1 | /* popup-component.wxss */ 2 | .wx-popup { 3 | position: fixed; 4 | left: 0; 5 | top: 0; 6 | width: 100%; 7 | height: 100%; 8 | z-index: 10000; 9 | } 10 | .close_btn { 11 | width: 50rpx; 12 | height: 50rpx; 13 | } 14 | .popup-container { 15 | position: fixed; 16 | left: 50%; 17 | top: 46%; 18 | transform: translate(-50%, -50%); 19 | } 20 | 21 | .popup-content { 22 | margin-top: 20rpx; 23 | box-sizing: border-box; 24 | overflow: hidden; 25 | } 26 | 27 | .content-image { 28 | width: 620rpx; 29 | height: 440rpx; 30 | } 31 | 32 | .content-title { 33 | display: block; 34 | margin: 0 auto; 35 | text-align: center; 36 | font-size: 48rpx; 37 | line-height: 150%; 38 | color: rgba(0, 0, 0, 1); 39 | word-break: break-all; 40 | overflow: auto; 41 | } 42 | 43 | .content-content { 44 | display: block; 45 | width: 580rpx; 46 | margin: 0 auto; 47 | padding: 0; 48 | font-size: 28rpx; 49 | line-height: 150%; 50 | text-align: center; 51 | color: rgba(74, 74, 74, 1); 52 | word-break: break-all; 53 | overflow: auto; 54 | } 55 | 56 | .popup-btn { 57 | display: flex; 58 | width: 580rpx; 59 | align-items: center; 60 | margin: 32rpx auto 0; 61 | flex-direction: column; 62 | text-overflow: clip; 63 | white-space: nowrap; 64 | overflow: hidden; 65 | } 66 | 67 | .popup-btn_column { 68 | display: flex; 69 | width: 590rpx; 70 | margin: 26rpx auto 0; 71 | justify-content: center; 72 | align-items: center; 73 | flex-direction: column; 74 | overflow: hidden; 75 | } 76 | 77 | .popup-btn_row { 78 | display: flex; 79 | justify-content: center; 80 | width: 580rpx; 81 | margin: 26rpx auto 0; 82 | align-items: center; 83 | flex-direction: row; 84 | text-overflow: clip; 85 | letter-spacing: 2rpx; 86 | overflow: hidden; 87 | } 88 | 89 | .popup-btn-second_column { 90 | margin-top: 20rpx; 91 | } 92 | 93 | .popup-btn-second_row { 94 | margin-left: 20rpx; 95 | } 96 | 97 | .popup-btn-button_row { 98 | width: 280rpx; 99 | height: 80rpx; 100 | line-height: 80rpx; 101 | text-align: center; 102 | font-size: 36rpx; 103 | border-width: 2rpx; 104 | color: rgba(255, 255, 255, 1); 105 | border-radius: 40rpx; 106 | border-color: rgba(2, 203, 148, 1); 107 | flex-grow: 1; 108 | overflow: hidden; 109 | } 110 | 111 | .popup-btn-button_column { 112 | width: 590rpx; 113 | height: 80rpx; 114 | line-height: 80rpx; 115 | text-align: center; 116 | font-size: 36rpx; 117 | border-width: 2rpx; 118 | color: rgba(255, 255, 255, 1); 119 | border-radius: 40rpx; 120 | border-color: rgba(2, 203, 148, 1); 121 | overflow: hidden; 122 | } 123 | 124 | .popup-btn-img_row { 125 | width: 280rpx; 126 | height: 80rpx; 127 | } 128 | 129 | .popup-btn-img_column { 130 | width: 580rpx; 131 | height: 80rpx; 132 | } 133 | 134 | .popup-btn-linker_row { 135 | display: block; 136 | width: 280rpx; 137 | height: 80rpx; 138 | line-height: 80rpx; 139 | text-align: center; 140 | color: rgba(74, 144, 226, 1); 141 | text-decoration: underline; 142 | letter-spacing: 2rpx; 143 | overflow: hidden; 144 | } 145 | 146 | .popup-btn-linker_column { 147 | width: 580rpx; 148 | height: 80rpx; 149 | line-height: 80rpx; 150 | text-align: center; 151 | color: rgba(74, 144, 226, 1); 152 | text-decoration: underline; 153 | letter-spacing: 2rpx; 154 | overflow: hidden; 155 | } 156 | 157 | .close_btn-right { 158 | display: flex; 159 | justify-content: flex-end; 160 | } 161 | .close_btn-center { 162 | margin-top: 20rpx; 163 | display: flex; 164 | justify-content: center; 165 | } 166 | -------------------------------------------------------------------------------- /dist/wechat/plugin/sm-encryption/readme.md: -------------------------------------------------------------------------------- 1 | # 埋点数据国密加密 2 | 3 | ## 功能 4 | 为了加强埋点数据的安全性,神策分析支持对埋点数据进行加密并以密文的形式对数据进行发送。
5 | 国密加密插件在数据上报前通过国密 SM2 和 SM4 算法将数据进行加密发送。 6 | 7 | ## 集成 8 | ### ES Module 方式 9 | ```javascript 10 | import SMEncryption from '/dist/wechat/plugin/sm-encryption/index.esm'; 11 | sensors.usePlugin(SMEncryption,{ 12 | pkv:'加密密钥版本号', 13 | pub_key: 'SM2 公钥' 14 | }); 15 | ``` 16 | 17 | ### 参数说明: 18 | - `pkv`: 加密密钥版本号,类型:number。 19 | - `pub_key`: SM2 加密公钥,类型:string。 20 | 21 | 以上参数信息可以通过神策后台【数据管理】-【数据接入引导】-【客户端埋点】-【密钥管理】页面进行获取或通过该页面进行新建。 22 | 23 | ## 变动 24 | 加密后的数据在上报时,通过抓包或开发者调试工具网络请求栏查看数据消息体中可以看到 pkv、ekey、payloads 等参数,payloads 参数的值为加密后的密文。 25 | 26 | ## 本地存储兼容性 27 | 国密插件只能处理历史未加密数据和历史国密加密数据,其他加密算法存储的本地数据将被忽略。 28 | 29 | 30 | | 场景 | 表现 | 31 | | ------------------------------ | -------------------------------------------- | 32 | | 不开启加密 -> 国密加密 | 历史未加密数据经过国密加密发送 | 33 | | 其他加密(如 AES) -> 国密加密 | 忽略并清空历史非国密加密数据 | 34 | | 国密加密 -> 不开启加密 | 忽略历史国密加密数据,不清空历史国密加密数据 | 35 | 36 | ## ⚠️ 注意 37 | - 国密加密插件必须在 SDK init 方法调用前进行初始化。 38 | - 开启加密后,如果服务端无法解密,数据无法入库,会丢失,埋点管理中不会有报错。务必确保初始化参数配置正确! 39 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sa-sdk-miniprogram", 3 | "version": "1.22.3", 4 | "description": "sensorsdata miniprogram sdk", 5 | "main": "dist/wechat/sensorsdata.cjs.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/sensorsdata/sa-sdk-miniprogram.git" 12 | }, 13 | "keywords": [ 14 | "sensorsdata", 15 | "mininprogram", 16 | "sdk" 17 | ], 18 | "author": "shengyonggen@sensorsdata.cn", 19 | "license": "Apache-2.0", 20 | "bugs": { 21 | "url": "https://github.com/sensorsdata/sa-sdk-miniprogram/issues" 22 | }, 23 | "homepage": "https://github.com/sensorsdata/sa-sdk-miniprogram#readme" 24 | } 25 | -------------------------------------------------------------------------------- /sensorsdata.min.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: wangzhigang@sensorsdata.cn 3 | * @Date: 2022-05-07 14:40:11 4 | * @File: 5 | */ 6 | declare namespace sensors { 7 | function init(): void; 8 | function track(e: string, p?: object): void; 9 | function setPara (p: object): void; 10 | 11 | function identify(id: string, isSave?: boolean): void; 12 | function login(id: string): void; 13 | function logout(isChangeId?: boolean): void; 14 | function setOpenid(id: string, isCover?: boolean): void; 15 | 16 | function setOnceProfile(prop: object): void; 17 | function setProfile(prop: object): void; 18 | function appendProfile(prop: object): void; 19 | function incrementProfile(prop: object): void; 20 | 21 | function registerApp(prop: object): void; 22 | function clearAppRegister(list: Array): void; 23 | } 24 | 25 | export default sensors; --------------------------------------------------------------------------------