(function(){ // 访客 id (localStorage 持久,跨 session) let vid=localStorage.getItem('nf_vid'); if(!vid){vid='v_'+Math.random().toString(36).slice(2,12)+'_'+Date.now();localStorage.setItem('nf_vid',vid);} function track(event,meta){ try{ fetch('/api/nf/track',{method:'POST',headers:{'Content-Type':'application/json'},credentials:'include', body:JSON.stringify({event:event,page:location.pathname+location.search,ref:document.referrer,visitor:vid,meta:meta||{}})}).catch(()=>{}); }catch(e){} } // page_view 自动 track('page_view'); // 暴露给页面用 window.nfTrack=track; // 卡片点击自动追(.card a / .rec-card) document.addEventListener('click',function(e){ let a=e.target.closest('.card a, .rec-card, .tab, .ch-tab, .topic, .read-btn'); if(a){ const id=a.dataset?.id||a.href||a.textContent.trim().slice(0,30); track('click',{kind:a.className||'?',id:id}); } }); // 图片加载失败追 document.addEventListener('error',function(e){ if(e.target.tagName==='IMG' && e.target.src){ track('img_error',{src:e.target.src.slice(0,200)}); } },true); })();