Node.js
日志式的 POST /api/v1/server/events 是另一条接口,这个类不会调用它,见 服务端事件。
安装
源码在 packages/sdk-server/node/src/index.ts,仓库内包名 @webcount/node。package.json 标了不发布,没有公开的安装命令:把该文件拷进服务,或用工作区依赖引用。运行需要 Node.js 18 自带的 fetch。
初始化
import { WebCount } from '@webcount/node';
const wc = new WebCount({
apiKey: 'wck_…',
endpoint: 'https://YOUR_ORIGIN',
});endpoint 只写源,不要带路径,类会自己拼接 /api/v1/track。密钥只在创建时显示一次,文档和日志里最多保留前缀。
页面浏览
这个类不发送页面浏览。浏览仍由网站脚本采集,见 JavaScript(w.js)。
事件
await wc.track('purchase', { loginId: 'USER_ID', insertId: 'order-1', properties: { revenue: 19.9 } });默认每 3 秒或满 200 条刷出一批。进程退出前调用 flush 或 close,否则内存里剩余的事件会丢掉。构造时把 consumer 设为 'sync' 则每条立刻发送。debug(true) 时请求带 debug=1,只校验不落库。insertId 最长 36 个字符,用来挡住重试造成的重复。更正已入库事件用 trackUpdate 或 trackOverwrite,物品用 itemSet 和 itemDelete。
身份
await wc.trackSignup('USER_ID', 'custom:device-id');
await wc.profileSet('USER_ID', { plan: 'pro' });还有 bind、unbind、profileSetOnce、profileIncrement、profileAppend 和 profileUnset。bind 里的邮箱和手机号会先做 SHA-256。字段说明见 SDK 总览与支持矩阵。
限制
| 项目 | 默认 | 说明 |
|---|---|---|
| 批量 | 200 条 | 可用 maxBatch 调整,接口单次最多 1000 条 |
| 间隔 | 3 秒 | flushIntervalMs 可改 |
| 密钥 | 必填 | 请求头为 Authorization: Bearer,后接 wck_ 密钥 |
错误
除 429 以外的失败状态会抛出 WebCount track 加状态码。429 不会抛出,而这一批已经从队列取出,不会重发。缺少密钥时接口返回 401 NO_API_KEY,密钥无效或没有 track:write 时返回 401 BAD_API_KEY,请求体不对返回 400。endpoint 若写成带路径的地址,会再拼一次 /api/v1/track 从而 404。收到成功响应后,到事件列表确认入库,见 服务端事件与日志导入。
PHP
需要 PHP 8 和 curl 扩展。日志接口 POST /api/v1/server/events 不由这个类调用,见 服务端事件。
安装
源码在 packages/sdk-server/php/src/WebCount.php,命名空间 Webcount。目录里没有 Composer 清单,把这个文件放到自动加载能找到的位置。
初始化
$wc = new \Webcount\WebCount('wck_…', 'https://YOUR_ORIGIN');第二个参数只写源,类会自己拼接 /api/v1/track。密钥不要写全,也不要写进仓库。
页面浏览
这个类不发送页面浏览。浏览用网站脚本,见 JavaScript(w.js)。
事件
$wc->track('purchase', [
'loginId' => 'USER_ID',
'insertId' => 'order-1',
'properties' => ['revenue' => 19.9],
]);track 立刻发送这一条,没有客户端批量队列,flush 和 close 是空方法。属性请传关联数组,不要传已经编码好的 JSON 字符串。
每次都要传 insertId
源码在缺少 insertId 时会发送 "insert_id": null,接口校验不通过,返回 400 VALIDATION,事件不入库。同一笔订单始终用同一个 insertId,通知重试也不会记成两笔。
身份
$wc->trackSignup('USER_ID', 'custom:device-id', ['source' => 'web']);
$wc->profileSet('USER_ID', ['plan' => 'pro']);trackSignup 的属性和 profileSet 的属性不要传空数组:PHP 会把空数组编码成 JSON 数组,接口返回 400。字段说明见 SDK 总览与支持矩阵。
限制
| 项目 | 这一文件 | 说明 |
|---|---|---|
| 每次请求 | 1 条 | 没有客户端批量队列 |
| 超时 | 8 秒 | curl 超时写死在源码里 |
| 密钥 | Bearer | 请求头是 Authorization: Bearer 加 wck_ 密钥 |
错误
这个文件不检查状态码,只把响应体解码后返回;curl 失败时返回 null。401 NO_API_KEY 或 BAD_API_KEY、400 校验失败,都要自己看返回值里的 accepted 和错误码,没有抛错不代表已经收下。地址如果已经带了路径,还会再拼 /api/v1/track。见 服务端事件与日志导入。
Python
只用标准库,适合 Python 3.7 及以上。日志接口 POST /api/v1/server/events 不由这个类调用,见 服务端事件。
安装
源码在 packages/sdk-server/python/webcount/__init__.py。目录没有打包清单,把 webcount 目录放到 PYTHONPATH 能导入的位置。导入失败通常是目录不在模块搜索路径里。
初始化
from webcount import WebCount
wc = WebCount("wck_…", "https://YOUR_ORIGIN")endpoint 只写源,类会自己拼接 /api/v1/track。密钥不要写全,也不要打进日志或异常文本。
页面浏览
这个类不发送页面浏览。浏览由网站脚本负责,见 JavaScript(w.js)。
事件
wc.track("purchase", login_id="USER_ID", insert_id="order-1", properties={"revenue": 19.9})每次 track 立刻发送一条,没有批量队列,flush 和 close 是空方法。参数名可以用 login_id 或 loginId,insert_id 或 insertId。
每次都要传 insert_id
源码在缺少 insert_id 时会发送 "insert_id": null,接口校验不通过,返回 400,事件不入库。同一业务单据始终用同一个 insert_id,超时重试时沿用原值。
身份
wc.track_signup("USER_ID", "custom:device-id")
wc.profile_set("USER_ID", {"plan": "pro"})字段说明见 SDK 总览与支持矩阵。
限制
| 项目 | 这一文件 | 说明 |
|---|---|---|
| 每次请求 | 1 条 | 没有批量队列 |
| 超时 | 8 秒 | 写在 urlopen 调用里 |
| 密钥 | Bearer | Authorization 头携带 wck_ 密钥 |
错误
状态码表示失败时,标准库抛出 HTTPError,调用方要自己接住并记录状态码。401 表示缺少密钥或密钥无效,400 表示请求体不符合字段约定。成功返回后到事件列表确认入库,见 服务端事件与日志导入。
Java
使用 Java 11 的 HttpClient。日志接口 POST /api/v1/server/events 不在这个类里,见 服务端事件。
安装
源码在 packages/sdk-server/java/src/main/java/com/webcount/WebCount.java。目录没有 Maven 或 Gradle 工程,把这一个源文件放进工程的 com.webcount 包。
初始化
WebCount wc = new WebCount("wck_…", "https://YOUR_ORIGIN");地址只写源,类会拼接 /api/v1/track。密钥不要写全,也不要写进源码仓库。
页面浏览
这个类不发送页面浏览。见 JavaScript(w.js)。
事件
wc.track("purchase", "{\"revenue\":19.9}");属性参数应是 JSON 对象文本,传 null 时属性为空对象。每次调用立刻发送,平台固定为 server。事件名会被直接拼进 JSON,不要包含引号或换行。
身份
这个类没有 login 方法,也没有 login_id 或 insert_id 参数。需要登录标识或幂等键时,改用 Node.js 或 Go 源文件,或按 SDK 总览与支持矩阵 的字段自己组请求。
限制
| 项目 | 这一文件 | 说明 |
|---|---|---|
| 方法 | 只有 track | 没有注册、档案或批量方法 |
| 超时 | 连接 8 秒 | 写在 HttpClient 上,没有单独的读取超时 |
| 密钥 | Bearer | Authorization 头携带 wck_ 密钥 |
错误
网络失败抛出受检异常。类把响应体当作字符串返回,不解析 401 或 400,调用方要自己看正文里的接受数量和 NO_API_KEY、BAD_API_KEY 或 VALIDATION。属性参数若不是合法的 JSON 对象文本,整段请求体都会坏掉。没有 insert_id,重试可能产生重复事件。见 服务端事件与日志导入。
Go
需要 Go 1.18。日志接口 POST /api/v1/server/events 不由这个文件调用,见 服务端事件。
安装
源码在 packages/sdk-server/go/webcount.go。目录没有 go.mod,把这个文件放进你自己的模块,包名保持 webcount。
初始化
c := webcount.New("wck_…", "https://YOUR_ORIGIN")地址只写源,函数会拼接 /api/v1/track。密钥放在配置里,不要写全,也不要写进仓库。
页面浏览
这个文件不发送页面浏览。见 JavaScript(w.js)。
事件
err := c.Track("purchase", map[string]any{
"insert_id": "order-1",
"properties": map[string]any{"revenue": 19.9},
})Track 往传入的 map 里补上 type 和 event,然后立刻发送这一条。map 的键就是 SDK 总览与支持矩阵 里的接口字段。未设置 context 时,源码写入平台 server 和库名 webcount-go;已有的 context 原样保留。
身份
没有单独的登录方法。登录标识作为 login_id 字段放进 Track 的 map。login_id 和 insert_id 漏写不会在编译期报错。
限制
| 项目 | 这一文件 | 说明 |
|---|---|---|
| 每次请求 | 1 条 | 没有批量队列 |
| 超时 | 8 秒 | 写在默认 HTTP 客户端上 |
| 密钥 | Bearer | Authorization 头携带 wck_ 密钥 |
错误
状态码大于等于 300 时返回错误,文本是 webcount track 加状态;网络错误原样返回。401 与 400 都落在这条路径上,响应正文不会被解析成错误码。返回 nil 只表示状态码低于 300,仍要到事件列表确认入库,见 服务端事件与日志导入。