SDK API (Web)
1. SDK 初始化參數
如果使用自動程式碼產生,一般情況下無需手動修改參數。
參數 | 預設值 | 含義 | 備考 |
---|---|---|---|
sdk_url | 無 | sensorsdata.min.js 檔案的網址。 | 請從 GitHub 取得並且放在你們自己網站目錄下。 |
name | sa | SDK 使用的一個預設的全域變數,如定義成 sensors 的話,後面可以使用 sensors.track() 用來跟蹤資訊。為了防止變數名重複,你可以修改成其他名稱比如 sensorsdata 等 。 | |
server_url | 無 | 數據接收網址。 | |
heatmap_url | 無 | heatmap.min.js 文件的網址。神策分析中點擊分析及觸達分析功能程式碼,程式碼產生工具會自動產生。如果神策程式碼中 sensorsdata.min.js 版本是 1.13.1 及以前版本,這個參數須設定,高於此版本不需要設定。 | 請從 GitHub 取得並且放在你們自己網站目錄下。 |
web_url | 無 | 神策分析後台網址,神策分析中點擊分析及觸達分析功能會用到此網址,程式碼產生工具會自動產生。如果神策後台版本及 sensorsdata.min.js 均是 1.10 及以上版本,這個參數不需要設定。 | |
heatmap | 無 | 點擊圖設定。預設設定表示不自動採集元素點擊事件和頁面停留事件,設定成 {} 表示開啟 $WebClick 採集 和 $WebStay 自動採集,預設 $WebClick 只採集 a,button,input ,textarea 四個 dom 元素的點擊事件。 | |
cross_subdomain | true | 設定成 true 後,表示在根網域下設定 cookie 。也就是如果你有 zhidao.baidu.com 和 tieba.baidu.com 兩個網域,且有一個用戶在同一個瀏覽器都登入過這兩個網域的話,我們會認為這個用戶是一個用戶。如果設定成 false 的話,會認為是兩個用戶。 | |
show_log | true | 設定 true 後會在網頁控制台打 logger,會顯示傳送的數據,設定 false 表示不顯示。 | |
use_client_time | false | 用戶端系統時間的不準確,會導致發生這個事件的時間有誤,所以這裡預設為 false ,表示不使用用戶端時間,使用伺服器端時間,如果設定為 true 表示使用用戶端系統時間。如果你在屬性中加入 {$time: new Date()} ,注意這裡必須是 Date 型別,那麼這條數據就會使用你在屬性中傳入的這個時間。 | |
source_channel | 無 | 預設取得的來源是根據 utm_source 等 ga 標準來的,如果使用百度統計的 hmsr 等參數,需在此欄位中加入對應參數,參數必須是陣列,例如:['hmsr']。使用網頁通用管道增加自定義屬性時,需將對應的自定義屬性名增加到此欄位。 | |
source_type | 自定義搜尋引擎流量,社交流量,搜尋關鍵詞。 | ||
max_string_length | 500 | 通用字串最大長度,超過部分會被截取丟掉(由於超過 7000 的字串會導致 url 超長傳不出去,所以限制長度)。 | |
send_type | image | 表示使用圖片 get 請求方式傳數據,( 神策系統 1.10 版本以後 ) 可選使用 'ajax' 和 'beacon' 方式傳送數據,這兩種預設都是 post 方式, beacon 方式相容性較差。 | |
callback_timeout | 200 ,單位毫秒 | 表示回呼函數超時時間,如果數據傳送超過 callback_timeout 還未回傳結果,會強制執行回呼函數。 | SDK 版本 1.11.6 以後支援 |
queue_timeout | 300 ,單位毫秒 | 表示佇列傳送超時時間,如果數據傳送時間超過 queue_timeout 還未回傳結果,會強制傳送下一條數據。 | SDK 版本 1.11.6 以後支援 |
datasend_timeout | 3000 ,單位毫秒 | 表示數據傳送超時時間,如果數據傳送超過 datasend_timeout 還未回傳結果,會強制取消該請求。 | SDK 版本 1.11.6 以後支援 |
preset_properties | 是否開啟 $latest 最近一次相關事件屬性採集以及設定 $url 作為公共屬性,預設值為一個對象。 | ||
is_track_single_page | false | 表示是否開啟單頁面自動採集 $pageview 功能,SDK 會在 url 改變之後自動採集 web 頁面瀏覽事件 $pageview。 | SDK 版本 1.12.18 以後支援 |
batch_send | false | 表示不開啟批量傳送,設定為 true 表示開啟批量採集。 | SDK 版本 1.14.7 以後支援 詳細設定参考 |
2. 取得預設屬性
版本要求
Web JS SDK 1.9.13 及後版本
此方法可取得,頁面網址,頁面標題,參照位址,SDK 類型及版本,螢幕寬高,最近一次的相關屬性,如果伺服器端需要使用這些屬性需要客戶自己傳輸,且這些屬性不包括需要後端解析的 ip 及 UA 等屬性。
sensors.quick('isReady',function(){
sensors.getPresetProperties();
});
3. 取得匿名 ID
3.1. 前端方式取得匿名 ID
增加了取得匿名ID的方法 sensors.quick('getAnonymousID'); 回傳匿名 id (SDK 版本 1.13.4 及以上支援),呼叫這個方法時,可能 Web JS SDK 還未初始化成功,建議將此方法放在下面程式碼中。
sensors.quick('isReady',function(){
sensors.quick('getAnonymousID');
});
3.2. 後端方式取得匿名 ID
可以在 Cookie 裡面找到 key 為 sensorsdata2015jssdkcross 的 value 值然後進行 decodeURIComponent 解析,最後透過 JSON.parse 方法得到一個物件,物件裡面的 Distinct ID 即為用戶所需要的 (注意,如果前端已經呼叫過 login 方法,那麼此時 Distinct ID 為真實 id,所以需要取得 first_id 欄位)。
4. 修改匿名 ID
預設情况下,是把 cookie_id 作為 Distinct ID 的。如果你能取到其他匿名 id(比如設備 id,或者你们自己產生的 cookie_id),可以用 sensors.identify(id, true) 來改變當前的 Distinct ID :
sensors.identify(id, true): 會把這個 id 保存在瀏覽器的 cookie 中,該網域名下的頁面都會預設使用這個 id。
5. 設定事件公共屬性
5.1. 設定事件靜態公共屬性
對於所有事件都需要增加的屬性,可在初始化 SDK 後,呼叫 registerPage() 將屬性註冊為公共屬性:
<script>
// 註冊公共屬性
sensors.registerPage({
current_url: location.href,
referrer: document.referrer
});
</script>
5.2. 設定事件動態公共屬性
版本要求
Web JS SDK 1.14.15 及以後版本
當設定動態公共屬性的時候,注意使用函數型別作為屬性值,函數的回傳值應當是神策支援的型別,請參考數據格式,否則會被過濾掉。
另外您如果使用了 ES6 語法如箭頭函數等,則需要使用編譯工具編譯後執行。
var i=0 sensors.registerPage({ index: function() { return ++i; // 回傳數字 }, istrue: function() { return i<10 ? true : false; // 回傳bool }, isEmptyString: function() { return ""; // 回傳字串 }, isDate: function() { return new Date('December 17, 1995 03:24:00'); // 回傳日期型別 }, isArrayOfStr: function() { return ["1","2","3"] // 回傳元素是字串的陣列 } })
另外如果函數在異步回呼中回傳值,這種情況也是會被過濾掉。
sensors.registerPage({ num:function(){ setTimeout(()=>{ return 100 },500) } })
6. 設定用戶屬性
6.1. setProfile(properties[, callback])
直接設定用戶的屬性,如果存在則覆蓋。
properties:object,必選。
callback:function,可選。
sensors.setProfile({email:'xxx@xx'});
6.2. setOnceProfile(properties[, callback])
如果不存在則設定,存在就不設定。
properties:object,必選。
callback:function,可選。
sensors.setOnceProfile({email:'xxx@xx'});
6.3. appendProfile(properties[, callback])
給陣列屬性增加值。透過setProfile只能改變屬性的值。如果這個屬性是陣列型別的,你不想完全改變這個值,只想做增加操作可以使用此方法。
properties:object,必選。
callback:function,可選。
//給 category 增加兩個值
sensors.appendProfile({catrgory: ['玉米','白菜']});
//給 category 增加一個值
sensors.appendProfile({catrgory: '玉米'});
6.4. incrementProfile(properties[, callback])
對當前用戶的屬性做遞增或者遞減。
properties:object 或者 string,必選。
callback:function,可選。
// 表示 navClick 遞減
sensors.incrementProfile({'navClick': -1});
// 表示 navClick 遞增2
sensors.incrementProfile({'navClick': 2});
// 直接傳入一個屬性名,表示遞增1
sensors.incrementProfile('navClick');
6.5. deleteProfile([callback])
刪除當前用戶及他的所有屬性。
callback: function。{可選}
//刪除當前這個用戶及他的所有屬性
sensors.deleteProfile();
6.6. unsetProfile(property[, callback])
刪除當前用戶的一些屬性
properties:array 或者 string,必選。
callback:function,可選。
//刪除 email 和 location 屬性
sensors.unsetProfile(['email','location']);
//刪除 email 屬性
sensors.unsetProfile('email');
7. 開啟數據的批量傳送
SDK 版本需 1.14.7 及以上
// 預設不開啟批量傳送
batch_send:false,
// 開啟批量傳送
batch_send:true,
//或者
batch_send:{
datasend_timeout: 6000, //一次請求超過多少毫秒的話自動取消,防止請求無回應。
send_interval: 6000, //間隔多少毫秒發一次數據。
one_send_max_length: 6 //一次請求最大傳送幾條數據,防止數據太大
},
原理:
寫入策略:觸發事件就寫入 localStorage,localStorage 的相容性請 [参考文件],如果瀏覽器不支援 localStorage,還是使用即時傳送數據的方式。
傳送策略:定時觸發傳送,或者,遇到 $pageview(或者使用 quick('autoTrack'); 方法)和 $SignUp 也會立即儲存並且傳送。
重複策略:必須請求 success 後,才會刪除數據,不然會一直請求,直到數據滿一定數量。
注意:
1、批量傳送功能和回呼函數功能不可同時使用,比如 track 加了 callback ,使用批量傳送後 callback 不會執行。 2、批量傳送預設使用跨域 ajax 的方式傳送數據。用用戶端系統時間標識數據,如瀏覽器不支援跨域 ajax 傳送數據,還是預設使用 img 且即時傳送數據的方式。 3、如果 localStorage 裡已經存了超過 200 條數據,會導致批量傳送功能失效,localStorage 中只保存這 200 條數據,新產生的數據使用 img 且即時傳送數據的方式。當進入同網域名的新頁面時,會自動檢查快取中是否有數據,如果有會繼續傳送快取的數據。 4、app_js_bridge 和 batch_send 只能選擇一個,開啟了打通就不能再用批量傳送。
8. 部分預設屬性是否採集(preset_properties)相關參數
神策 SDK 採集的最近一次相關的屬性會儲存在瀏覽器的 Cookie 中,如果對 Cookie 儲存大小有要求,可有選擇的採集下列屬性,
可設定是否將 $url 和 $title 作為公共屬性。
( 1.12.18 版本以上,1.14.10 版本以下的相似功能的 SDK 使用的設定 is_track_latest 已做相容處理)
下面設定需要放在初始化設定中,與 server_url 平級,需要 Web JS SDK 版本是 1.14.10 及以上版本
//子設定項 true 表示採集,false 表示不採集,未設定的參數取預設值。
preset_properties: {
//是否採集 $latest_utm 最近一次廣告系列相關參數,預設值 true。
latest_utm:true,
//是否採集 $latest_traffic_source_type 最近一次流量來源類型,預設值 true。
latest_traffic_source_type:true,
//是否採集 $latest_search_keyword 最近一次搜尋引擎關鍵字,預設值 true。
latest_search_keyword:true,
//是否採集 $latest_referrer 最近一次參照位址,預設值 true。
latest_referrer:true,
//是否採集 $latest_referrer_host 最近一次參照位址,1.14.8 以下版本預設是true,1.14.8 及以上版本預設是 false,需要手動設定為 true 開啟。
latest_referrer_host:false,
//是否採集 $latest_landing_page 最近一次到達頁面網址,預設值 false。
latest_landing_page:false,
//是否採集 $url 頁面網址作為公共屬性,預設值 false。
url: false,
//是否採集 $title 頁面標題作為公共屬性,預設值 false。
title: false,
}
9. 關閉頁面傳送數據
一些瀏覽器比如 iOS 系統的 Safari,如果在頁面關閉時上報事件資訊,該上報請求可能會失敗。比如點擊按鈕時觸發了頁面跳轉,則跳轉前頁面上的資訊存在上報失敗的可能。
正常情況下,Web JS SDK 遺失數據的機率不超過 5%,但是在關閉頁面的情況下,遺失率會增加。
針對此問題,可以選擇下面幾種解決方式
9.1. 改為伺服器端傳送事件
如果是關鍵的點擊,需要準確的採集,比如支付等事件是在關閉頁面時傳送,建議在伺服器端中埋點採集。
9.2. 採集跳轉後頁面的 $pageview 事件
用戶點擊 href 屬性為 www.xxx.com 的 a 標籤,觸發 $WebClick 事件或者用戶自定義的 track 事件,這時頁面會進行跳轉。可能數據未傳送成功,頁面已經跳轉到 www.xxx.com ,會造成數據的遺失。
方案:給 a 標籤的 href 屬性增加某個參數,例如www.xxx.com?urlfrom=123 ,當頁面跳轉到www.xxx.com?urlfrom=123 後,採集這個頁面的$pageview 事件,在神策後台中查看Web 瀏覽事件,根據 url 是否包含 urlfrom 這個參數來篩選結果。
9.3. callback 回呼中跳轉頁面
神策自定義事件的track 方法的第三個參數,回呼函數,受 callback_timeout 參數影響(callback_timeout: 預設值200 ,單位毫秒,表示回呼函數超時時間,如果數據傳送超過 callback_timeout 還未回傳結果,會強制執行回呼函數)。
正常情況下數據請求回傳後,就會執行 callback 方法,但是考慮到網路卡或者當機的情況,設定 callback_timeout 的超時來強制執行 callback。其中有兩種不太常見特殊場景需要注意:
1. 不能把時間設定的太長,比如 3s,因為不能保證網路請求一定能回傳,這時候就會使用這個 callback_timeout,所以設定這個時間最好在 500ms 左右,可接受的範圍內。
2. 不能把時間設定的太短,比如 100ms,因為可能請求還沒發成功,就執行 callback 了,正常情況下沒問題,但是如果 callback 裡是頁面跳轉的操作,那這個數據可能會遺失。
// 點擊連結
$('a').on('click',function(e,url){
e.preventDefault(); // 阻止預設跳轉
sensors.track('a_click', {}, function(){
location.href = url;
}); //把跳轉操作加在callback裡
});
9.4. 使用 setTimeout:
// 點擊連結
function targetLinkIcon( url ){
//延遲跳轉頁面,給 SDK 傳送數據提供時間
setTimeout(function(){
window.location.href = url;
},500);
//神策自定義事件的方法
sensors.track('demo',{});
}
9.5. beacon 的方式傳送數據
// 要求 sdk 版本在 v1.15.26 及以上版本
// 開啟 beacon 方案的需要在 SDK 初始化程式碼中增加設定(設定位置與 server_url 同等)如下:
send_type:'beacon',
use_client_time:true,
...
server_url: 'xxx'
這三種方式,第一種從根本上解決問題,將事件進行轉換。推薦使用。
第二種需要阻止預設事件,對瀏覽器相容性好。可以嘗試。
第三種方式,在網頁關閉情況下也可以傳送數據,但是相容性不佳。
- 如果檢測到瀏覽器不支援 beacon 時,會自動降級為使用 img 發送數據
9.6. batch_send 批量傳送快取數據
batch_send: 預設值 false,表示不開啟批量傳送,設定為 true 表示開啟批量採集,並且使用以下預設值 { datasend_timeout: 6000, 一次請求超過多少毫秒的話自動取消,防止請求無回應。 send_interval: 6000, 間隔 6 秒傳一次數據。 one_send_max_length: 6 一次請求最大傳送幾條數據,防止數據太大 },也可以直接以 {} 的方式自定義這幾個參數的值。
// 預設不開啟批量發送
batch_send:false,
// 開啟批量發送
batch_send:true,
//或者
batch_send:{
datasend_timeout: 6000, //一次請求超過多少毫秒的話自動取消,防止請求無回應。
send_interval: 6000, //間隔多少毫秒發一次數據。
},
原理:
寫入策略:觸發事件就寫入 localStorage,localStorage 的相容性請 参考文件,如瀏覽器不支援 localStorage,還是使用即時傳送數據的方式。
傳送策略:定時觸發傳送,或者,遇到 $pageview(或者使用 quick('autoTrack'); 方法)和 $SignUp 也會立即儲存並且傳送。
重複策略:必須請求 success 後,才會刪除數據,不然會一直請求,直到數據滿一定數量。
- 批量傳送功能和神策 SDK 提供的介面回呼函數功能不可同時使用,比如 track,login 等。
- 批量傳送預設使用跨域 ajax 的方式傳送數據,且用用戶端系統時間標識數據,如瀏覽器不支援跨域 ajax 傳送數據,還是預設使用 img 且即時傳送數據的方式。
- 如果 localStorage 裡已經存了超過 200 條數據,會導致批量傳送功能失效,localStorage 中只保存這 200 條數據,新產生的數據使用 img 且即時傳送數據的方式。當進入同網域名的新頁面時,會自動檢查快取中是否有數據,如果有會繼續傳送快取的數據。
- app_js_bridge 和 batch_send 只能選擇一個,開啟了打通就不能再用批量傳送。