数据接口与采集说明

逐球进度与历史记录。第三方服务器按本站标准自行接入,无需注册或令牌。

接口地址

主站与备用站数据同源。请由你的网站服务器统一采集,再向自己的用户提供结果;不要让每位观众直接轮询本站。

https://kinmen6.comhttps://jinmen6.com
/public/collector/live.json当天逐球进度
/public/collector/results.json最近完整结果
/public/collector/history.json全量历史记录
/public/openapi.jsonOpenAPI 字段契约

如何读取逐球结果

开奖前:pendingDraw 是已公开承诺,不是开奖结果。不得把昨日结果当作今天。

开奖中:读取 liveDraw.numbers,数组保持公开顺序,逐步增加至六个正码;special 为 null,不能当作 0。

完整揭晓后:在 issues 中按 currentDay.id 找到当天完整记录,读取 numbers 和 special。不要按数组第一条或最后一条猜当天。

主备切换时不接受较旧 publicationVersion,同一期不撤回已公开的球。results 尚未追上时保留 live 接口已公开的当天完整结果;外部证据状态单独核对。

关键字段

字段含义
currentDay.id / currentDay.date当天期号与北京时间日期
publicationVersion公开快照递增版本;跨文件核对时 live 与 results 版本应一致
historyVersion历史版本;对应 history.archiveVersion
liveDraw.numbers已公开正码,保留公开顺序
issues[].special完整揭晓后的特码;此前为 null
publishedAt快照生成时间,不是请求当前时间

时间与更新

所有 Unix 时间戳均为毫秒;ISO 时间按 Asia/Shanghai 显示。每日 20:30 开始揭晓,实际公开状态才是采集依据。已有发布链路存在数秒延迟,不保证各网站同时展示。

用 currentDay.date、publishedAt、expectedUpdateAt 和 nextTransitionAt 判断新鲜度。等待期间 publishedAt 不变并不代表停机;超过预期更新时点仍无新版本,应标记延迟并重试。results.expectedUpdateAt 可能为 null,新鲜度以 live 接口为准。

请求频率与历史更新

开奖窗口每 2 秒读取一次 live,其他时段每 60 秒一次。完整结果出现后停止高频请求。单个采集系统只运行一个轮询循环,并错开请求时刻。

首次下载 history 并保存 archiveVersion。以后仅在 live.historyVersion 变化时重新下载,且须核对两者相等。历史数据没有在线分页或日期查询参数;请下载后在自己的系统检索。

results.currentResult 才是当天完整结果,否则为 null;results.latest 可能是昨日。最近结果最多 50 条,不等于全量历史。逐期 /public/feeds/issues/{id}.json 仅覆盖已经导出的正式记录,旧历史期可能没有该文件。

独立采集入口按来源 IP 限流:live 与 results 共享每秒 2 次、突发 10 次;history 每分钟 6 次、突发 2 次。同出口的多个采集程序需要合并请求。原官网观众接口不使用这组限流。

缓存、失败与主备

这三个可变采集接口使用无条件 GET,不发送 If-None-Match 或 If-Modified-Since。保留 publicationVersion 与 historyVersion,按内容版本处理更新;可发送 Accept-Encoding: gzip。

遇到 429、503 或网络失败,按 2、4、8、16、30 秒上限退避。失败时保留最后确认结果并标注延迟,不显示为最新。备用地址使用相同路径,切换时先确认期号和版本没有倒退。

支持 GET 与 HEAD;不存在的资源返回 404,其他方法通常返回 405。错误正文可能是 HTML,不要假设一定能解析成 JSON。

服务器读取示例

下面的 Node.js 示例读取一次已公开快照,不连接后台。生产使用时还需保存版本、检查日期和预期更新时点,并按上面的规则轮询与退避。

// Node.js 20+; run on your server, not in a viewer's browser.
const base = 'https://kinmen6.com';
const response = await fetch(base + '/public/collector/live.json', {
  signal: AbortSignal.timeout(10000), redirect: 'error'
});
if (!response.ok) throw new Error('HTTP ' + response.status);
const state = await response.json();
const id = state.currentDay?.id;
if (!id) throw new Error('No current issue');
const today = new Intl.DateTimeFormat('en-CA', {
  timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit'
}).format(new Date());
if (state.currentDay.date !== today) throw new Error('Stale issue date');
const expected = state.expectedUpdateAt ?? state.nextTransitionAt;
if (Number.isFinite(expected) && Date.now() > expected + 30000) {
  throw new Error('Expected update overdue; retain last confirmed result');
}
const complete = state.issues.find(item => item.id === id);
const live = state.liveDraw?.id === id ? state.liveDraw : null;
console.log({
  id, version: state.publicationVersion,
  numbers: complete?.numbers ?? live?.numbers ?? [],
  special: complete?.special ?? null,
  completed: Boolean(complete)
});

记录与核验边界

保留 simulation、backfilled、precommitted、isHistoricalDemo 等原始来源标记。历史记录上传时间不能当作当年的开奖前存证时间。GitHub 上传、OTS 提交与独立验证通过是不同状态。号码及承诺材料不因外部证据状态更新而改变。

采集说明公开的是读取方式,不是数据实时可达性保证。第三方需自行确认其服务器能够访问本站。