Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
# Tracker SDK

[![build](https://github.com/weavefox/tracker/actions/workflows/build.yml/badge.svg)](https://github.com/weavefox/tracker/actions/workflows/build.yml)
[![npm](https://img.shields.io/npm/v/@weavefox/tracker)](https://www.npmjs.com/package/@weavefox/tracker)
[![minzip](https://img.shields.io/bundlejs/size/@weavefox/tracker)](https://bundlejs.com/?bundle=&name=weavefox-tracker)
[![license](https://img.shields.io/github/license/weavefox/tracker)](LICENSE)
[![types](https://img.shields.io/npm/types/typescript.svg)](https://www.typescriptlang.org/)
[![downloads](https://img.shields.io/npm/dm/@weavefox/tracker)](https://www.npmjs.com/package/@weavefox/tracker)

A lightweight web analytics SDK for tracking user visits and events.

## ✨ Features

- **Vibe Coding Friendly** - Zero-config, AI-generated apps can add tracking with single line
- **Device Fingerprinting** - Canvas-based fingerprint for visitor identification
- **Beacon API** - Non-blocking data transmission
- **Offline Queue** - Local storage retry for failed requests
- **Auto Pageview** - Automatic page visit tracking
- **Custom Events** - Track clicks, errors, and custom actions
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@weavefox/tracker",
"version": "0.1.0",
"version": "0.1.1",
"description": "Website Analytics SDK - Lightweight, secure tracking with anti-bot protection",
"main": "dist/tracer.umd.js",
"module": "dist/tracer.mjs",
Expand Down
48 changes: 16 additions & 32 deletions site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -311,16 +311,16 @@ <h1>Tracker SDK</h1>
<section>
<h2>特性</h2>
<div class="features">
<div class="feature">
<div class="feature-icon">🤖</div>
<div class="feature-title">Vibe Coding</div>
<div class="feature-desc">AI 生成应用友好,一行代码接入</div>
</div>
<div class="feature">
<div class="feature-icon">🔱</div>
<div class="feature-title">设备指纹</div>
<div class="feature-desc">Canvas 指纹识别,无需 Cookie</div>
</div>
<div class="feature">
<div class="feature-icon">🚀</div>
<div class="feature-title">Beacon API</div>
<div class="feature-desc">非阻塞发送,页面关闭后仍可发送</div>
</div>
<div class="feature">
<div class="feature-icon">📦</div>
<div class="feature-title">离线队列</div>
Expand Down Expand Up @@ -398,44 +398,28 @@ <h2>会话统计</h2>
<script type="module">
// ========== 拦截请求日志 ==========
const originalFetch = window.fetch;
const originalSendBeacon = navigator.sendBeacon.bind(navigator);

window.fetch = async function(...args) {
console.log('[fetch] ALL:', args[0]);
const url = args[0];
if (url.includes('collect')) {
if (body?.events) {
body.events.forEach(evt => {
window.dispatchEvent(new CustomEvent('wftk:event', {
detail: evt
}));
});
}
}
return originalFetch.apply(this, args);
};

navigator.sendBeacon = function(url, data) {
if (url.includes('collect')) {
// data 可能是 Blob 或 ArrayBuffer
const readBody = async () => {
try {
const text = data instanceof Blob
? await data.text()
: new TextDecoder().decode(data);
const body = JSON.parse(text);
if (body?.events) {
body.events.forEach(evt => {
// 解析请求体
try {
const body = args[1]?.body;
if (body) {
const text = typeof body === 'string' ? body : await body.text();
const parsed = JSON.parse(text);
if (parsed?.events) {
parsed.events.forEach(evt => {
window.dispatchEvent(new CustomEvent('wftk:event', {
detail: evt
}));
});
}
} catch (e) {}
};
readBody();
}
} catch (e) {}
}
return originalSendBeacon(url, data);
return originalFetch.apply(this, args);
};

import { init, track, getFingerprint } from '@weavefox/tracker';
Expand Down
23 changes: 2 additions & 21 deletions src/sender.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
/**
* 数据上报模块
* 支持 Beacon API 和 fetch 上报,带本地缓存重试机制
* 支持 fetch 上报,带本地缓存重试机制
*/

import { getTimestamp, generateNonce } from './utils';

export interface SendOptions {
url: string;
data: any;
useBeacon?: boolean;
}

export interface QueueItem {
Expand All @@ -32,29 +31,11 @@ const QUEUE_KEY = 'wf_send_queue';
* 发送数据
*/
export async function sendData(options: SendOptions): Promise<boolean> {
const { url, data, useBeacon = true } = options;
const { url, data } = options;

// 优先使用 Beacon API
if (useBeacon && typeof navigator !== 'undefined' && 'sendBeacon' in navigator) {
return sendByBeacon(url, data);
}

// Fallback 到 fetch
return sendByFetch(url, data);
}

/**
* 通过 Beacon API 发送
*/
function sendByBeacon(url: string, data: any): boolean {
try {
const blob = new Blob([JSON.stringify(data)], { type: 'application/json' });
return navigator.sendBeacon(url, blob);
} catch {
return false;
}
}

/**
* 通过 fetch 发送
*/
Expand Down
Loading