k-skill g2b-sanctioned-supplier:通过代理一条命令查询조달청나라장터부정당제재(受制裁供应商)信息 k-skill g2b-sanctioned-supplier通过代理一条命令查询조달청나라장터부정당제재受制裁供应商信息【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill本文基于仓库内 g2b-sanctioned-supplier/instruction.md 展开讲解 k-skill 中g2b-sanctioned-supplier技能的完整技术链路它如何通过k-skill-proxy调用韩国公共数据门户data.go.kr的调达厅나라장터用户信息服务按 사업자등록번호事业者登录编号精确匹配查询“查询时点当前有效”的부정당제재投标资格限制/受制裁供应商记录。读完后你将掌握该技能的适用边界、命令行用法、密钥配置方式以及代理端请求参数、错误映射与响应结构的源码级实现。1. 技能定位一条命令查询“当前有效”的制裁记录g2b-sanctioned-supplier的数据源是公共数据门户上的调达厅나라장터用户信息服务服务编号 15129466upstream 接口getUnptRsttCorpInfo02调用链路为CLI helper (Python) → k-skill-proxy 的 GET /v1/g2b/sanctioned-supplier → data.go.kr upstream查询方式为 사업자등록번호 精确匹配inqryDiv1返回的是查询时点当前有效的부정당제재返回内容包括制裁开始/结束日期、制裁机关名、合同法区分、制裁依据法律等 upstream 字段的原文代理端封装的 upstream 地址常量定义在 g2b-sanction.js 中const G2B_SANCTION_URL https://apis.data.go.kr/1230000/ao/UsrInfoService02/getUnptRsttCorpInfo02;2. 覆盖边界这不是历史查询instruction.md 明确给出了该技能的能力边界这部分内容在实际使用中最为关键按 upstream 规格以下两类数据不提供——这不是一个历史查询接口查询时点已制裁期满、已被解除的记录针对나라장터未登记企业、个人的制裁。如需查看已失效的历史制裁需要到나라장터官方站点 g2b.go.kr手动确认。对应的“设计原则”同样写死在文档中不制造分数、等级、解释性标签只承载 upstream 事实、出处、适用范围限制。这一点在代理端代码中得到落实——响应里附带的coverage对象就是用来显式声明适用范围与“0 条结果”含义的见第 6 节。3. 适用场景、前置条件与输入适用场景文档原文列出的典型问句“这家公司有投标制裁부정당제재记录吗”“在交易/签约前帮我确认是否为부정당업자受制裁经营者”前置条件互联网连接、python3随技能分发的 helper 脚本 g2b_sanctioned_supplier.py可访问 hosted 或 self-host 的k-skill-proxy的/v1/g2b/sanctioned-supplier路由。输入参数只有一个且必填参数说明约束--bizno사업자등록번호10 位数字必填允许包含连字符如124-81-00998内部会去掉所有非数字字符后校验是否为 10 位纯数字4. 凭据要求与代理地址配置该技能的凭据设计遵循“用户侧零密钥”原则用户侧无需任何 secretKSKILL_PROXY_BASE_URL仅在使用 self-host 代理时设置留空则使用 hosted 地址https://k-skill-proxy.nomadamas.orgDATA_GO_KR_API_KEY只放在代理运行服务器环境中。且该密钥必须在公共数据门户上对“조달청_나라장터 사용자정보 서비스”含부정당제재업체정보 조회完成활용신청使用申请。Python helper 中代理地址的解析逻辑在 resolve_proxy_base_url显式传参--proxy-base-url优先于环境变量若环境变量的值为off/false/0/disable/disabled/none大小写不敏感则直接抛错提示已禁用值为占位符replace-me时同样回落到 hosted 默认地址最终返回的地址会去掉尾部/。5. CLI 用法与 helper 执行流程标准调用方式通过 k-skill CLI 执行helper 随技能分发npx -y nomadamas/k-skill0 exec g2b-sanctioned-supplier scripts/g2b_sanctioned_supplier.py -- --bizno 124-81-00998--之后的参数原样传给 helper。helper 的命令行接口build_parser--bizno必填사업자등록번호 10 位允许连字符--proxy-base-url可选显式指定代理 base URL覆盖环境变量。一次查询在 helper 内部的调用链为normalize_biznore.sub(r\D, , raw)去掉所有非数字后用re.fullmatch(r\d{10}, ...)校验不合格即抛ValueError源码query_sanctions拼接{base}/v1/g2b/sanctioned-supplier?bizno...发送带Accept: application/json与User-Agent: k-skill-g2b-sanctioned-supplier/1.0头的 GET 请求read_json_response30 秒超时读取响应并解析 JSON对503 errorupstream_not_configured专门转换为面向用户的韩语提示代理未配置 API 密钥其余 HTTP 错误优先提取响应体中的message字段源码。成功时main以indent2的 JSON 打印到 stdout 并返回 0参数/网络错误以{error: ...}形式输出到 stderr 并返回 1。6. 响应结构事实 覆盖范围声明代理成功返回的顶层字段由 fetchG2bSanctions 组装字段含义bizno规范化后的 10 位사업자번호total_count命中条数active_sanctions当前有效制裁的 upstream 原始字段列表如bizno、bizNm、rstrtSttDt等coverage.scope固定为currently-effective-g2b-sanctionscoverage.match_basis固定为exact-business-number精确事业者编号匹配coverage.exclusions显式排除项expired-or-lifted-sanctions、sanctions-against-suppliers-or-individuals-not-registered-in-g2bcoverage.zero_result_meaning0 条结果的官方解释仅代表查询时点该事业者编号下未查到当前有效制裁不代表不存在历史已失效/解除的制裁coverage.checked_at查询时间ISO 8601用于标注结果时效match_basis英文说明精确匹配inqryDiv1、返回查询时点有效的制裁列表前 100 条、过期/未登记者由 upstream 不提供proxy代理元信息name、cache.hit、cache.ttl_ms、requested_at测试中的上游样例展示了active_sanctions内单条记录的原样字段server.test.js{ bizno: 1234567890, bizNm: 甲, rstrtSttDt: 20250101 }7. 代理端实现深潜请求参数、认证失败识别与错误映射7.1 路由注册GET /v1/g2b/sanctioned-supplier在 server.js 中注册复用统一的handleKeyedDataGoKrLookup处理器app.get(/v1/g2b/sanctioned-supplier, async (request, reply) handleKeyedDataGoKrLookup({ route: g2b-sanctioned-supplier, normalizer: normalizeG2bSanctionQuery, fetcher: fetchG2bSanctions, request, reply }));7.2 统一处理器流程与错误映射handleKeyedDataGoKrLookup 的执行顺序参数规范化normalizeG2bSanctionQuery接受bizno/b_no/bno三种键名去非数字后必须匹配^\d{10}$否则返回400bad_request密钥检查配置中无 data.go.kr 密钥代码中为config.molitApiKey来自环境变量DATA_GO_KR_API_KEY时返回503upstream_not_configured缓存以{route, ...normalized}生成缓存键命中则直接返回并标记proxy.cache.hit: true未命中则调用 fetcherupstream 错误映射fetcher 返回带error的结果时upstream errorHTTP 状态码upstream_forbidden502upstream_timeout504upstream_invalid_response502upstream_error502fetcher 抛出的异常非预期错误统一返回502proxy_error。成功结果写入缓存并附带proxy.requested_at。7.3 upstream 请求细节fetchG2bSanctions 向 data.go.kr 发起的 GET 固定携带这些查询参数ServiceKey 代理服务端密钥大写 S 的 ServiceKey numOfRows 100 pageNo 1 type json inqryDiv 1 # 按事业者编号精确匹配 bizno 10 位事业者编号upstream 使用 20 秒超时AbortSignal.timeout(20000)超时返回upstream_timeout。认证/授权失败有三条识别路径统一映射为502upstream_forbidden并在 message 中提示“代理密钥可能未申请服务 15129466”HTTP 401/403 直接判定响应体为OpenAPI_ServiceResponseXML 时解析returnReasonCode代码20/21/30/31/32/33视为认证类错误parseGatewayAuthErrorJSON 信封中response.header.resultCode属于同一组认证代码时取resultMsg报错源码。此外extractSanctionItems 对 data.go.kr 的单条/零条结果返回形态做了容错items可能是对象{item: [...]}、数组或空值最终归一化为数组header.resultCode非00/0时抛出 upstream 错误。8. 失败模式速查综合 instruction.md 的 Failure modes 与源码行为客户端可能遇到的情形如下现象原因与处理400 bad_request事业者编号不是 10 位数字helper 侧本地校验失败时则直接输出本地错误 JSON不发起请求503 upstream_not_configured代理服务器未配置DATA_GO_KR_API_KEY联系代理运营方502 upstream_forbidden代理密钥未在 15129466 服务完成활용신청504 upstream_timeoutupstream 20 秒未响应502 upstream_invalid_response / proxy_errorupstream 返回非法 JSON 或其他代理端异常代理不可达helper 输出“k-skill-proxy 服务器无响应请稍后重试”含底层 reasontotal_count 0查询时点无当前有效制裁不等于无历史已失效制裁见coverage.zero_result_meaning9. 测试用例中的验证要点server.test.js 用 mock fetch 对两条核心路径做了断言可作为行为验证依据命中路径注入resultCode: 00、items.item为单条记录、totalCount: 1的响应后断言响应 200、total_count 1、active_sanctions[0].bizNm透传、coverage.scope currently-effective-g2b-sanctions、coverage.match_basis exact-business-number、checked_at存在同时断言发出的 upstream URL 包含大写 S 的ServiceKeydata-go-key与inqryDiv1重复请求命中缓存proxy.cache.hit true且 upstream 只被调用一次未配置密钥路径无DATA_GO_KR_API_KEY的实例请求该路由返回 503零结果路径upstream 返回items: 、totalCount: 0时断言total_count 0、coverage.zero_result_meaning非空、coverage.exclusions包含expired-or-lifted-sanctions。10. 官方来源与相关仓库文件instruction.md 列出的官方面Official surfaces公共数据门户服务编号 15129466data.go.kr 上的 openapi 页面upstream 接口getUnptRsttCorpInfo02见第 1 节代码常量手动核对나라장터官方站点代理路由GET /v1/g2b/sanctioned-supplier。仓库内可继续深入的文件instruction.md本技能的完整指令文档本文主体来源SKILL.md技能清单frontmattercategory business、locale ko-KR、phase v1与 CLI 调用约定skill.json技能元数据与 profilesproxy、lookupg2b_sanctioned_supplier.pyPython helperg2b-sanction.js代理端 upstream 封装server.js路由与统一处理器server.test.js路由行为测试docs/features/g2b-sanctioned-supplier.md功能页文档适用前提与限制小结该技能依赖代理侧已配置并对 15129466 完成활용신청的DATA_GO_KR_API_KEY查询结果只反映查询时点有效的制裁前 100 条且仅限精确事业者编号匹配响应中的coverage.checked_at是判断结果时效的字段。对需要历史全量制裁的场景应以나라장터官方站点的查询结果为准。【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考