8030 控制台登录

赔率采集中心管理后台 · 请使用管理员账号登录

首次部署默认账号 fengwo,登录后请立即修改密码。连续失败 5 次将锁定 15 分钟。

采集概览

实时监控采集状态与赛事统计

服务器状态

加载中…

-
-
负载
-
1 / 5 / 15 分钟
-
CPU
-
-
-
内存
-
-
-
磁盘
-
-
MySQL:检测中…
刷水账号
0
滚球总数
0
今日总数
0
变化序号
0
刷新时间
-
账号登录用户在线余额状态滚球耗时
请求 / 解析
今日耗时
请求 / 解析
出口/代理错误错误次数
ID名称账号用途绑定IP代理状态操作

刷水代理(采集账号用)

刷水代理
0
类型主机:端口用户名密码占用状态操作

下注代理(前端用户账号用)

下注代理
0
下注空闲
0
团队分组用户归属/占用类型主机:端口用户名密码归属地到期状态操作

供 8050 登录页/设置选择的中心入口;各线路应反代到同一套 8030。公开接口仅返回已启用项。

ID 名称 URL 排序 启用 备注 操作
前端用户数
0
已启用
0
平台 状态 版本 文件名 大小 SHA256 运行时哈希 上传时间 操作
下注账号总数
0
已启用
0
用户数
0
ID账号域名归属用户共享用户状态操作
注单数
0
投注总额
0
盈利
0
已结算
0
已确认
0
待确认
0
多出/失败
0
时间团队用户投注人账号注单号状态类型金额投注比分赛果输赢联赛队伍盘口赔率GID
加载中…

按 Token 限制外放接口的调用速度,超出返回 429。保存后立即生效,无需重启服务。

加载中…

快速开始

三步接入:①在「外放 API」页生成 Token 并写入服务端环境变量 ODDS_BET_ALERT_TOKEN;②按下面的示例带上 Token 发起请求;③按「调用限速」一节控制请求频率。接口均为只读 GET,返回 application/json; charset=utf-8(SSE 为 text/event-stream)。

curl -s -H "Authorization: Bearer {{TOKEN}}" \
  "{{BASE}}/api/external/bet-alerts?since=0&limit=50"
示例中的地址与 Token 已自动填入当前控制台的实际值,复制出去可直接执行。若显示 <token>,说明服务端尚未配置 Token。

鉴权

所有外放接口共用同一个 Token。服务端按下表顺序取值,取到第一个非空的就不再往下找。

传法优先级说明
Authorization: Bearer <token>1推荐。标准请求头,不会出现在访问日志的 URL 里。
X-Bet-Alert-Token: <token>2自定义请求头,适合不便改 Authorization 的网关。
?token=<token>3查询参数。SSE 必须用这种,因为浏览器 EventSource 不支持自定义请求头。

Token 有两种形式,效果完全等价:

形式说明
明文与服务端 ODDS_BET_ALERT_TOKEN 完全一致的原文。
e1. 加密串HG_TOKEN_ENCRYPT_KEY 加密后的密文,形如 e1.xxxx。给外部对接方用这种,避免明文四处流传。
两种形式指向同一个 Token 时共用同一个限速配额,换写法拿不到双份额度。

调用限速

按 Token 计数(不是按 IP),所有外放接口共享同一个配额桶。当前配置:每分钟 次,突发 次。可在「外放 API」页随时调整,保存即生效。

概念含义
每分钟次数配额恢复速率。例如设为 60,即平均每秒恢复 1 次可用额度。
突发值桶容量,允许短时间内连续打多少次。长时间闲置后额度攒满到这个上限为止。
SSE 计数方式只在建立连接时扣 1 次额度,连上之后持续推送不再计数。频繁断线重连才会打满配额。

超出配额返回 429,带 Retry-After: 60 响应头,响应体:

{"ok":false,"error":"rate_limited","rate_per_min":60,"burst":20}
收到 429 请退避重试,不要立即重发。持续硬打会一直被拒,额度永远攒不起来。

GET新注单实时推送(SSE)

/api/external/bet-alerts/stream?token=<token>

与控制台新注单弹窗同源的实时流。Content-Typetext/event-stream,事件名固定为 bet_alertdata 为一条 JSON。

字段说明
alert_id自增告警 id。断线后用它作为轮询接口的 since 补齐断连期间漏掉的告警。
at_ms告警产生时间,毫秒时间戳。
event注单详情对象,字段见「注单轮询」一节。
const es = new EventSource("{{BASE}}/api/external/bet-alerts/stream?token={{TOKEN}}");
let lastId = 0;

es.addEventListener("bet_alert", (e) => {
  const rec = JSON.parse(e.data);
  lastId = rec.alert_id;
  console.log(rec.event.wager_id, rec.event.stake, rec.event.market);
});

es.onerror = () => {
  // EventSource 会自动重连;重连成功后用 lastId 调轮询接口补齐断连期间的告警
  console.warn("SSE 断开,最后收到的 alert_id =", lastId);
};
浏览器 EventSource 不支持自定义请求头,所以 SSE 只能用 ?token= 传参。请优先使用 e1. 加密串,避免明文 Token 落进访问日志。

GET新注单轮询

/api/external/bet-alerts?since=0&limit=50

SSE 的轮询替代方案,也用于断线后补齐历史告警。服务端只保留最近若干条告警,长时间不拉可能丢失,建议轮询间隔不超过一分钟。

参数默认说明
since0游标,只返回 alert_id 大于该值的告警。首次传 0,之后传上一次返回的 next_since
limit不限本次最多返回多少条。

响应为 {"ok":true,"items":[…],"next_since":N}items[].event 的字段:

字段说明
action事件类型:new 新注单、status 状态变更、settle 结算。
id系统内部注单记录 id。
wager_id皇冠注单号,去重的主依据。
status注单状态,外放只推送 confirmed
stake投注金额,数字类型。
odds成交赔率,字符串。
gid关联赛事 id。
league / teams联赛名与对阵双方。
market玩法描述,如「全场大小 2.5 大」。
account_id / account_name下注所用的账号 id 与名称。
user_id / user_name归属用户 id 与名称。
placed_by实际操作下注的人。
settle_text / win_gold / final_score结算文案、输赢金额、最终比分。仅结算类事件有值。
created_at注单创建时间。
推送规则:仅 status=confirmed 且非结算的注单会触发告警;同一注单号、或同一「场次 + 玩法」组合在 24 小时内只推一次。
事件体含 account_nameuser_name 等内部账号信息,与控制台弹窗一致。转发给第三方前请自行裁剪。
curl -s -H "Authorization: Bearer {{TOKEN}}" \
  "{{BASE}}/api/external/bet-alerts?since=0&limit=50"

错误码

状态码含义排查方向
400参数缺失或非法详情接口未带 gid 时返回 {"error":"missing_gid"}
401Token 缺失或不正确核对是否漏传 Token、明文与服务端不一致、或 e1. 串用的加密密钥不对。
404赛事不存在gid 写错,或该场次已完场被清理。返回 {"error":"not_found"}
405请求方法不对外放接口只接受 GET
429超出调用频率Retry-After 退避后重试,或在「外放 API」页调高配额。
503外放功能未启用服务端没有配置 ODDS_BET_ALERT_TOKEN。在「外放 API」页生成 Token,写入环境变量后重启服务。
401 与 503 的区别:503 表示整个外放功能没开,改服务端配置;401 表示功能已开但你的 Token 不对,改调用方。

加载中…

加载中…
显示信息级

加载中…

时间级别类型IP用户版本次数摘要

待升级客户端

运维状态,非安全事件:internal keeper 请求未携带用户 Token 的来源。归零后才可设 ODDS_INTERNAL_REQUIRE_USER_TOKEN=1。

加载中…

IP次数最后出现最后路径