📚 接口总览
所有接口统一入口(兼容 keyt.cn 风格):
GET https://你的域名/kami/{用户名}/check.php?act={动作}&app={应用名}&...
主要 act 动作:
| act | 说明 | 是否需要签名 |
| get_time | 获取服务器时间(防本地时间作弊) | 否 |
| get_info | 一次性获取公告/版本/自定义1/自定义2/服务器时间 | 否 |
| get_notice | 获取公告 | 否 |
| get_version | 获取最新版本号 | 否 |
| get_custom1 | 获取自定义内容 1 | 否 |
| get_custom2 | 获取自定义内容 2 | 否 |
| login | 登录/激活(绑定设备) | 是 |
| heartbeat | 心跳保活(建议 50-59 秒一次) | 是 |
| verify | 同 heartbeat(兼容旧版) | 是 |
| self_unbind | 用户自助解绑(扣费时长) | 是 |
🔏 签名机制
对需要签名的接口,使用 MD5 进行签名:
sign = MD5( act + "|" + card + "|" + mac + "|" + app + "|" + ts + "|" + app_key )
app_key:在后台「应用列表」创建应用时自动生成
ts:当前 Unix 时间戳(秒),服务器允许 ±300 秒偏差
card:卡密
mac:设备唯一标识(网卡 MAC / 设备指纹 / 机器码等)
app:应用名
⚠️ app_key 是核心机密,请勿外泄。客户端代码建议做简单字符串混淆。
📦 返回值格式
{
"code": 0, // 0 = 成功;非 0 见下表
"msg": "ok",
"data": { ... } // 业务数据
}
常用错误码:
| code | 含义 |
| 0 | 成功 |
| 1 | 参数错误 |
| 2 | 签名错误 / ts 偏差过大 |
| 3 | 应用不存在 |
| 10 | 卡密不存在 |
| 11 | 卡密已禁用 |
| 12 | 卡密已过期 |
| 13 | 卡密已绑定到其他设备 |
| 20 | 验证已关闭(任意卡密可通过) |
| 21 | 服务器紧急维护中 |
| 30 | 心跳过快(< 50s) |
| 40 | 该卡密未开启自助解绑 |
| 41 | 自助解绑冷却中 |
🛠️ 各语言示例
🐍 Python 对接
requests + hashlib 实现完整验证流程。
查看文档 →
🔷 易语言对接
接口调用方式、参数说明、常见对接问题。
查看文档 →
💎 C# / .NET 对接
HttpClient + MD5 签名示例。
查看文档 →
☕ Java / Kotlin 对接
HttpURLConnection + MessageDigest 实现。
查看文档 →
⚡ C++ 对接
libcurl + OpenSSL MD5 示例。
查看文档 →
🎮 按键精灵对接
完整代码示例、签名校验、心跳处理、返回值说明。
查看文档 →
🛡️ 签名机制详解
防篡改、防重放原理,MD5 + 时间戳签名计算示例。
查看文档 →
📦 其他语言
Go、PHP、VB、JavaScript 等更多语言示例。
查看文档 →
🔁 完整流程(伪代码)
// 1. 启动时拉取公告/版本/自定义
info = http_get("/kami/{user}/check.php?act=get_info&app={app}")
show_notice(info.notice)
if local_version < info.version: prompt_update()
// 2. 用户输入卡密后登录
ts = current_unix_timestamp()
mac = get_device_mac() // 或机器码
sign = md5(act + "|" + card + "|" + mac + "|" + app + "|" + ts + "|" + app_key)
url = "/kami/{user}/check.php?act=login&app=" + app + "&card=" + card +
"&mac=" + mac + "&sign=" + sign + "&ts=" + ts
resp = http_get(url)
if resp.code == 0:
save_card(card)
start_heartbeat_loop()
else:
show_error(resp.msg)
// 3. 启动心跳循环(每 50-59 秒一次)
while running:
sleep(55)
ts = current_unix_timestamp()
sign = md5(...)
resp = http_get("...?act=heartbeat&...")
if resp.code != 0: kill_app() // 验证失败立即退出