开发文档
使用此接口可以实现应用与云端的对接。适合用户进行对接开发程序,本页面对各项参数进行介绍及解释,便于用户的开发使用。温馨提示:check为二次效验功能,计算规则为md5(服务器返回的时间戳+APPKEY)
协议规则
传输方式:HTTP
提交方式:POST
返回格式:JSON
数据加密:RSA、RC4
签名算法:MD5
字符编码:UTF-8
使用此接口可以实现应用与云端的对接。适合用户进行对接开发程序,本页面对各项参数进行介绍及解释,便于用户的开发使用。温馨提示:check为二次效验功能,计算规则为md5(服务器返回的时间戳+APPKEY)
传输方式:HTTP
提交方式:POST
返回格式:JSON
数据加密:RSA、RC4
签名算法:MD5
字符编码:UTF-8
已注册普通注册为例:
代码示例:
Sign = 取MD5值("user=" + 编辑框_user.内容 + "&password=" + 编辑框_mima.内容 + "&inv=" + 编辑框_inv.内容 + "&markcode=" + 机器码 + "&t=" + 取现行时间戳(2) + "&" + APPKEY)
心跳机制用于:① 客户端会话保活、② 后台实时在线人数统计、③ 卡密有效性二次检查、④ IP地域分布地图。强烈建议在登录接口成功之后立即启动。
set.php?mod=heartbeat
1
准备环境:导入 install_heartbeat.sql 到数据库 → 登录站长后台 → 系统设置 → 心跳配置 → 确认「心跳总开关」=开启、设置建议间隔(默认60s)/ 超时(默认180s)。
2
用户登录:调用 kmlogon(卡密登录)或 userlogon(用户登录),记录返回的 kami / appuser 和本机 markcode(机器码)。
3
启动心跳定时器:登录成功后立即发起第 1 次心跳;之后按服务端返回的 interval 字段(秒)定时 setInterval / setTimeout。
4 按错误码处理:200=正常(继续下一次);180/181=心跳被禁用或参数缺失(停止定时器并提示);201=卡密已过期/禁用(立即退出登录);1xx=其他错误(退避重试2~3次后再退出)。
| 项 | 内容 |
|---|---|
| 请求地址 | /api.php?api=heartbeat&app=你的应用ID |
| 请求方式 | POST |
| 必选参数 |
markcode(机器码,必填)+
kami 或 appuser 二选一(对应第2步登录身份)
|
| 加密/签名 | 若应用开启数据加密/签名,则和其他接口一致:需传 t / sign / data 三个参数(详见 Sign 签名章节)。 |
| 成功返回(code=200 msg字段) |
interval 建议心跳间隔(秒) ·
timeout 判定离线超时(秒) ·
server_time 服务端时间戳 ·
online_count 该应用当前在线人数 ·
next_heartbeat 下一次建议心跳的时间戳
|
| 离线判定规则 | 服务端每 100 次接口调用会执行一次惰性清理:last_time < time() - timeout 的心跳行会被置为离线 status=0,不计入在线人数。客户端超时后如再次上线会自动重新置为在线。 |
替换 BASE_URL / APP_ID / KAMI / MARKCODE 后即可运行。完整代码与 curl / 伪代码版本,见心跳文档的 [demo] 子页。
import time, requests, hashlib
BASE_URL = "http://你的域名/api.php"
APP_ID = "10001" # 站长后台应用列表中的 appid
APP_KEY = "你的APPKEY" # 应用KEY
KAMI = "AABB-CCDD-EEFF-0001" # 卡密登录返回的kami
MARKCODE = hashlib.md5(b"my-pc").hexdigest() # 本机机器码(示例)
def sign_ts():
t = str(int(time.time()))
# sign = md5(post键值串 + "&" + APPKEY),最小示例kami+markcode
raw = f"kami={KAMI}&markcode={MARKCODE}&t={t}&{APP_KEY}"
return t, hashlib.md5(raw.encode()).hexdigest()
def heartbeat_once():
t, s = sign_ts()
r = requests.post(f"{BASE_URL}?api=heartbeat&app={APP_ID}", data={
"kami": KAMI, "markcode": MARKCODE, "t": t, "sign": s
}, timeout=8).json()
code = r.get("code", -1)
print(f"[心跳] code={code} msg={r.get('msg')}")
if code == 200:
m = r["msg"] if isinstance(r["msg"], dict) else {}
return int(m.get("interval", 60)), None # 继续
elif code in (180, 181, 201):
return None, f"致命错误 code={code},退出登录" # 停止
else:
return 30, f"可重试 code={code}" # 退避重试
# 主循环
fail_cnt = 0
while True:
nxt, err = heartbeat_once()
if err:
fail_cnt = fail_cnt + 1 if "重试" in err else 99
if fail_cnt >= 3: print(err); break
else:
fail_cnt = 0
time.sleep(nxt or 60)
appid + markcode + kami/appuser 三者合一是服务端唯一键,不要传空 markcode。online_count 仅统计当前应用的在线人数,管理员后台可查看全部应用汇总。api_log_enabled=1 总开关,默认开启;如不需要可在站长后台关闭。