
kleague-results 技能实战指南用官方 JSON 端点查询 K League 1/2 赛事结果与球队排名【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill本指南以 k-skill 仓库中 kleague-results/instruction.md 为核心文档讲解如何通过官方 K League JSON 接口而非 HTML 爬虫按日期查询 K리그1/K리그2K League 1/2比赛结果按球队名称/别名/代码过滤并附带当前排名。读完本文你将掌握从全局安装 npm 包、直接调用getKLeagueSummary组合 API、到理解底层参数归一化与测试验证的完整实战链路可将其直接嵌入 Agent 技能流程回答今天 K리그1 战报某日某队比赛与排名一类问题。技能定位与适用场景kleague-results 是 k-skill 为韩国用户에이전트를 한국인으로让 Agent 更像韩国人提供的一组技能中的一个定位为体育数据查询类只读技能SKILL.md 中category: sports、locale: ko-KR。它的核心承诺是放弃脆弱的 HTML 爬虫直接对接 K League 官网公开的 JSON 表面把日期 联赛 球队三个输入转成结构化的比赛结果与排名。指令文档instruction.md给出的典型触发语句包括오늘 K리그1 경기 결과 알려줘今天 K리그1 的比赛结果2026-03-22 FC서울 경기 결과랑 현재 순위 보여줘2026-03-22 FC서울 的比赛结果和当前排名2026-03-22 K리그2 결과 정리해줘整理 2026-03-22 K리그2 结果可见该技能覆盖两类典型需求整日赛果速览scoreboard与单队赛果 当前排名team lookup后者是差异化能力——不仅给出比赛还把该队当前在积分榜上的位置一并整理。前置条件与全局安装环境要求Node.js 18kleague-results 包在 package.json 中声明engines: { node: 18 }并依赖全局fetch实现源码 index.js 中const fetchImpl options.fetchImpl || global.fetch。Node 18 起fetch已内建无需额外安装 polyfill。kleague-resultsnpm 包指令要求通过npm install -g kleague-results全局安装。验证与安装命令指令文档Workflow 第 0 步明确指出如果npm root -g下找不到kleague-results不要用 HTML 抓取绕行而应首先尝试全局安装npm install -g kleague-results注意kleague-results 是仓库内新增的包版本 0.2.0见 packages/kleague-results/package.json若尚未通过 Changesets 流程发布到 npm全局安装可能失败。指令文档Notes 一节为此预留了兜底新包在发布前需先用本地 workspace / pack artifact 验证合并merge后申请 npm publish全局安装链路才会真正生效。输入参数说明指令文档Inputs 一节定义了三类输入参数说明示例日期YYYY-MM-DD格式的绝对日期2026-03-22联赛K리그1或K리그2默认值为K리그1K리그1球队可选球队短名 / 全名 / 球队代码서울、FC서울、K09其中球队过滤支持三种等价写法背后的别名解析逻辑在源码中有完整实现详见下文球队别名解析。工作流详解第 0 步缺失时安装全局包npm root -g # 确认输出目录下存在 kleague-results 子目录 npm install -g kleague-results # 不存在时先安装第 1 步拉取官方 K League JSON指令文档Workflow 第 1 步明确本技能不依赖 HTML 爬虫而是直接调用 K League 官网的两个公开 JSON 端点赛程 / 比赛结果https://www.kleague.com/getScheduleList.do球队排名https://www.kleague.com/record/teamRank.do这两处端点与源码中的常量一一对应index.jsconst SCHEDULE_URL https://www.kleague.com/getScheduleList.do; const TEAM_RANK_URL https://www.kleague.com/record/teamRank.do;指令文档给出了在 Agent 环境中直接执行的完整 Node 内联脚本——它不依赖本地项目安装而是从全局 npm 目录动态 import 包入口非常适合 Skill 运行时一键执行GLOBAL_NPM_ROOT$(npm root -g) node --input-typemodule - JS import path from node:path; import { pathToFileURL } from node:url; const entry pathToFileURL( path.join(process.env.GLOBAL_NPM_ROOT, kleague-results, src, index.js), ).href; const { getKLeagueSummary } await import(entry); const summary await getKLeagueSummary(2026-03-22, { leagueId: K리그1, team: FC서울, includeStandings: true, }); console.log(JSON.stringify(summary, null, 2)); JS该脚本的关键点GLOBAL_NPM_ROOT$(npm root -g)拿到全局 npm 模块根目录pathToFileURL(...)将src/index.js转成file://URL配合--input-typemodule下的顶层await import(entry)加载 CommonJS 包getKLeagueSummary(2026-03-22, { leagueId: K리그1, team: FC서울, includeStandings: true })一次调用同时返回比赛与排名输出用JSON.stringify(summary, null, 2)美化便于阅读或进一步加工。第 2 步面向人类的规范化输出指令文档强调不要把原始 JSON 直接丢给用户应按以下标准整理Workflow 第 2 步主队 vs 客队홈팀 vs 원정팀比赛时间 / 比赛是否已结束경기 시간 / 경기 종료 여부比分스코어当前排名현재 순위若有指定球队只保留该队比赛요청 팀 필터링第 3 步保持回答紧凑指令文档Workflow 第 3 步对输出形态给出明确约定若请求是整日赛果scoreboard先给每场比赛一行的摘要若请求是特定球队先展示该队比赛与其当前排名再视需要补充其他信息。源码实现原理包内部是如何工作的仓库中的 npm 包 packages/kleague-results 是该技能的底层实现由两个源文件构成src/index.js网络抓取 组合 API与src/parse.js数据归一化与解析。联赛 ID 归一化parse.jsparse.js 用LEAGUE_ALIAS_MAP统一处理韩文与数字写法const LEAGUE_ALIAS_MAP new Map([ [1, 1], [K1, 1], [KLEAGUE1, 1], [K리그1, 1], [2, 2], [K2, 2], [KLEAGUE2, 2], [K리그2, 2], ]);normalizeLeagueId先做 NFKC 归一化 去除非字母数字/韩文符号normalizeToken再查表无法解析时抛错leagueId must resolve to K League 1 or 2。因此调用方写K리그1、1、kleague2、甚至k league 2都能正确解析——测试 index.test.js 中normalizeLeagueId accepts K League numeric and Korean aliases用例验证了这一点并断言K리그3会抛错。日期归一化parse.jsnormalizeDateInput同时接受Date对象与YYYY-MM-DD/YYYY.MM.DD字符串对Date用Intl.DateTimeFormat(en-CA, { timeZone: Asia/Seoul, ... })转成韩国时区的日期避免跨时区算错今天对字符串正则^(\d{4})-.-.$校验格式再用isValidCalendarDateisLeapYear校验真实日历合法性例如2026-13-40会直接抛错且不会发起网络请求——测试getMatchResults rejects impossible calendar dates before fetching明确断言fetchCalled false。球队别名解析parse.js指令文档中서울、FC서울、K09三种写法等价底层由buildClubDirectoryresolveTeamQuery实现buildClubDirectory为每个俱乐部建立{ code, name, fullName, homepage, leagueId, aliasTokens }目录其中aliasTokens是 code / 短名 / 全名等所有字段归一化后的集合resolveTeamQuery把用户输入同样归一化后与所有俱乐部的别名集合比对命中即返回该俱乐部完整信息未命中则回退为按原样字符串匹配itemMatchesRequestedTeam检查主/客队任一方的aliasTokens是否包含查询 token从而实现过滤。测试用例给出了实际效果用team: 서울查询时命中的是homeTeam.fullName FC서울。比赛状态与比分解析parse.jsnormalizeMatchStatus将官网状态码映射为统一语义官网码statelabel韩文FEfinished종료已结束NSscheduled예정未开始LIVE/INlive진행 중进行中HThalftime하프타임中场PPpostponed연기延期CANcancelled취소取消normalizeScheduleItem进一步输出结构化的单场数据competitionName赛事名、round轮次、gameId、date、kickOff、status、homeTeam/awayTeam、score、winnerfinished 状态下推断 home/draw/away、venue、audience、broadcastChannels、matchCenterUrl等。比分、轮次等统一经normalizeNumber转数字空值保持null。排名归一化parse.jsnormalizeStandingsResponse把官网teamRank数组规整为可读表格行rank、points积分、played场次、win/draw/loss、goalsFor/goalsAgainst、goalDifference、form近 6 场走势如[승,승,승,승]、homepage、stadium。teamId去重后按rank升序、同分按积分降序排列。它还保留isSplitRank是否季后赛分段排名与notice官网公告。网络层与组合 APIindex.jsindex.js 暴露五个导出函数fetchScheduleMonth、fetchStandings、getKLeagueSummary、getMatchResults、getStandings。关键实现细节fetchScheduleMonth向getScheduleList.do发送POSTbody 为{ year, month: 03, leagueId }。由于官网接口是按月返回getMatchResults拿到整月数据后再用normalizeScheduleResponse按请求日期精确过滤测试断言 body 中包含month:03fetchStandings向teamRank.do发送POSTQuery 参数为leagueId、year、stadiumall、recordTyperank。当前实现固定使用stadiumall全主客场合并的排名表docs 特性文档 docs/features/kleague-results.md 说明如需可扩展为主场/客场分表getKLeagueSummary组合getMatchResultsgetStandingsincludeStandings默认true它把查询日期、联赛、过滤球队、比赛列表与排名打包进一个summary对象——这正是指令文档内联脚本所调用的函数请求头默认携带accept: application/json、accept-language: ko-KR,...、user-agent: k-skill/kleague-results确保拿到韩文响应测试断言所有请求头都含ko-KR可注入fetchImpl/signal所有函数都支持外部传入 fetch 实现与 AbortSignal方便测试与超时控制。测试验证行为如何被锁定包的测试 packages/kleague-results/test/index.test.js 使用 Node 内置node:testnpm test对应node --test配合 test/fixtures 下的官方 JSON 样本覆盖四条核心路径联赛别名1/K리그1/k league 2/kleague2均正确解析非法值抛错月度数据过滤从schedule-kleague1-2026-03.json中筛出2026-03-22、team: FC서울的唯一一场比赛K리그1 第 5 轮状态FE/종료主队 K09 서울 5:0 光州主场 서울 월드컵 경기장断言filteredTeam.normalized FC서울排名形状standings-kleague1-2026.json解析出 12 行K09 서울 以 12 分、4 场全胜位列第 1form 前 4 项均为승组合流程mock fetch替换global.fetch后getMatchResults→getStandings→getKLeagueSummary依次调用断言getScheduleList.do被调用 2 次、请求体带month:03、所有请求头含ko-KR。这套测试既是行为契约也印证了官方端点响应结构变化 → 包需随之修改这一失败模式见下文。完成判定Done when指令文档给出了明确的完成标准Agent 在交付答案前应逐条自检有按日期整理的比赛摘要날짜 기준 경기 요약若请求指定球队结果中只保留该队比赛팀 요청 필터링当前排名已一并整理현재 순위 포함。失败模式与应对指令文档Failure modes列出了三个已知风险均可在源码与 docs 中找到依据官方端点结构变更getScheduleList.do或teamRank.do的响应结构一旦变化包的normalizeScheduleResponse/normalizeStandingsResponse解析逻辑就需要同步修改——这是所有依赖公开接口的客户端都要面对的维护点赛前日期查询日期早于比赛开球时返回的是예정scheduled状态而非结果进行中会返回진행 중live。STATUS_MAP中NS/LIVE/HT等状态就是为此准备的答案中应如实呈现而非臆造比分短名歧义仅给서울这类短名时不同联赛可能指向不同球队——K리그1 中通常指FC서울K리그2 则可能指서울 이랜드。docs 特性文档 docs/features/kleague-results.md 特别提醒查询 K리그2 时要确认是否应为서울 이랜드。实测中别名目录会尽量消除歧义但 Agent 面对短名输入时应主动确认联赛上下文。注意事项与边界约束指令文档Notes补充了四条使用约定只读查询该技能只做查询不涉及任何写入/提交操作相对日期转绝对日期用户说오늘/어제今天/昨天时必须先在运行时换算成绝对YYYY-MM-DD再执行避免时区与日期滚动歧义normalizeDateInput的韩国时区处理为此提供了底层保障发布流程若包为新增状态合并后需通过 Changesets 机制触发npm publish全局安装链路才可用发布前应先用本地 workspace / pack artifact 验证延伸阅读更多用法示例见 docs/features/kleague-results.md 与 packages/kleague-results/README.mdREADME 还给出了 CommonJS 直接 require 的 API 用法getMatchResults(date, options)、getStandings(options)、getKLeagueSummary(date, options)。小结kleague-results 技能展示了一条官方 JSON 优先的稳健数据接入路线指令层kleague-results/instruction.md定义安装、调用与回答规范包层packages/kleague-results封装网络抓取、别名解析、日期/联赛归一化与组合 API测试层锁定端到端行为。对于需要查询韩国职业足球赛果与排名的 Agent 场景只需 Node.js 18 与全局 npm 包即可用一段内联脚本完成按日期/联赛/球队查询 附带排名的完整链路。【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考