百度OCPC推广之不同的页面跳转储存bd_vid值,以及自定义invite参数一并回传JS代码。

将SEM的URL手动埋点,存入localStorage,方便后面在使用中调用!
自动获取URL中传过来的 invite 和 bd_vid值
(bd_vid通常是百度OCPT推广时自动添加的参数)
/**
*
* 百度埋点
* 函数打包
* 记录invite值 和 bd_vid值
* 日期:2025-5-28 MAOMAO
*/
function handleSemTracking(options = {}) {
const TRACK_KEYS = options.keys || ['invite', 'bd_vid'];
const EXPIRE_MS = options.expireMs || 24 * 60 * 60 * 1000; // 默认1天
// 辅助函数:获取 query 参数
function getQueryParam(param) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(param);
}
// 存 key 对应的值
function setKey(key, value) {
localStorage.setItem(`sem_${key}`, value);
localStorage.setItem(`sem_${key}_time`, Date.now().toString());
}
// 获取 key 对应的值(处理过期)
function getKey(key) {
const timestamp = localStorage.getItem(`sem_${key}_time`);
if (!timestamp) return null;
if ((Date.now() - parseInt(timestamp, 10)) > EXPIRE_MS) {
clearKey(key);
return null;
}
return localStorage.getItem(`sem_${key}`);
}
function clearKey(key) {
localStorage.removeItem(`sem_${key}`);
localStorage.removeItem(`sem_${key}_time`);
}
function init() {
TRACK_KEYS.forEach(key => {
const val = getQueryParam(key);
if (val) {
setKey(key, val);
} else {
getKey(key); // 触发过期检测
}
});
}
init();
// 返回接口
return {
getAll: () => {
const result = {};
TRACK_KEYS.forEach(key => {
const val = getKey(key);
if (val) result[key] = val;
});
return result;
},
get: getKey,
clear: () => {
TRACK_KEYS.forEach(clearKey);
}
};
}
handleSemTracking(); // 先执行埋点追踪并存入 localStorage
//百度埋点 MAOMAO end
登陆状态-未登录
应用场景:将全局类名带有ann_button的<a>标签中 href属性值 增加invite和bd_vid参数
// 未登录状态 - 按钮拼接 invite 和 bd_vid 参数 MAOMAO
const buttons = document.querySelectorAll('.ann_button');
const inviteValue = localStorage.getItem('sem_invite');
const bdVidValue = localStorage.getItem('sem_bd_vid');
buttons.forEach(button => {
const href = button.getAttribute('href');
if (!href) return;
try {
const url = new URL(href, window.location.origin); // 兼容相对路径
let changed = false;
if (inviteValue) {
url.searchParams.set('invite', inviteValue);
changed = true;
}
if (bdVidValue) {
url.searchParams.set('bd_vid', bdVidValue);
changed = true;
}
if (changed) {
button.setAttribute('href', url.toString());
}
} catch (e) {
console.warn('无效 href,跳过该按钮:', href);
}
});
// 未登录状态 - 按钮拼接 invite 和 bd_vid 参数 MAOMAO end
登陆状态-已登录
应用场景:将带callback参数里的url直接赋给ann_button类里的href地址
// 已登录状态-按钮跳转应用广场 MAOMAO
const buttons = document.querySelectorAll('.ann_button');
buttons.forEach(button => {
const href = button.getAttribute('href');
const url = new URL(href);
const callback = url.searchParams.get('callback');
if (callback) {
// 构造新的 URL,包含 callback 后面的所有参数
const newHref = new URL(callback);
// 把原 href 中除了 callback 的其他参数都加到新 URL 上
url.searchParams.forEach((value, key) => {
if (key !== 'callback') {
newHref.searchParams.set(key, value);
}
});
button.setAttribute('href', newHref.toString());
}
});
//MAOMAO end
开发人员:李辉
应用场景:百度SEM投放手动埋点
后续的API回传可参考文档:百度API参考文档地址

正文完