
k-skill 中的 S2B 공고 검색 스킬s2b-notice-search的查询配方、回退策略与 fixture 解析实现【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill本篇技术指南围绕 k-skill 仓库中s2b-notice-search技能展开讲解如何通过公开入口https://www.s2b.kr/S2BNCustomer/tcmo001.do以只读方式检索韩国学校市场S2B 학교장터的公开公告与报价请求견적요청覆盖表单字段配方、浏览器优先的三级回退顺序、全部输入参数的归一化规则以及列表/详情 fixture HTML 的解析原理。读完本文你将掌握该技能的完整调用链从normalizeSearchOptions到buildSearchRequest再到parseListHtml/parseDetailHtml并知道在登录墙、CAPTCHA、空结果与上游改版等失败模式下应如何判定结果。技能定位与合规边界S2B Notice Searchinstruction.md是 k-skill 仓库中面向 S2B 학교장터www.s2b.kr公开客户页面공개 고객 공고/견적요청的只读查询技能用于检索学校、教育机构相关的 물품物品、공사工程、용역劳务公告。技能的核心职责有四项归一化关键词、机构名、地区、公告日期范围、물품/공사/용역 分类、1인/2인 수의계약 条件构造发送到/S2BNCustomer/tcmo001.do搜索表单的真实tcmo001FormPOST form recipe从列表 fixture HTML 中提取公告/견적 코드、标题、机构、状态、品目区分、公告日、截止日以及详情的 JavaScript action metadata从详情 fixture HTML 中提取标题、公告号、机构名、品目区分、签约方法、公告日、截止日、正文与附件 action metadata。合规边界本技能明确不做 입찰 참여投标参与、견적 제출报价提交、로그인登录、결제支付、낙찰/계약 처리中标/签约处理等任何自动化操作。仓库中的 skill.json 也标注了profiles: [vault, browser, legal]与category: procurement且 skill 描述强调돌쇠에서는 가능한 가장 가까운 합법적 공식 단계까지 준비한다在 Dolshoi 运行环境中只准备到最接近的合法官方步骤侧面印证该技能仅停留在查询这一官方公开表面上。公开入口与tcmo001Form表单字段通过 Aside Browser 观察 S2B 公开客户页面时优先入口为https://www.s2b.kr/S2BNCustomer/tcmo001.do该页面作为学校市场客户端的公告/报价请求查询表单运行。在浏览器中填写搜索条件并提交后可观察到结果表格以及跳转详情的 JavaScript action。确认的 form 名为tcmo001Form主要字段包括字段含义源码中的取值forwardName动作标识固定为list01固定list01pageNo页码page参数默认 1search_yn是否搜索固定Y固定Yprocess_yn处理状态固定Y固定Ytender_sep1关键词检索字段公告名/公告号默认1标题tender_name关键词keywordcompany_name_s机构/学校名organizationtender_sep2日期检索字段公告日/截止日默认2截止日tender_date_start/tender_date_end日期范围归一化为YYYYMMDDtender_item品目区分물품/공사/용역归一化为1/2/3estimate_kind1인/2인 수의계약归一化为1/2areaKind地区名region上述字段名在 src/index.js 的buildSearchRequest中有完整对应实现BASE_URL、SEARCH_PATH、FORM_NAME三个常量https://www.s2b.kr、/S2BNCustomer/tcmo001.do、tcmo001Form也在该文件中定义。三级回退顺序浏览器优先直接 HTTP 兜底原文档明确给出了查询执行的回退顺序这也是判断技能何时该用何种通道的纲领Aside Browser REPL snapshot/action打开公开页面用 snapshot 确认搜索表单与结果表格再从浏览器表面读取输入、提交与 action metadataBrowserOS CDP 或本地浏览器若无法使用 Aside则通过 CDP 接入用户已启动的 BrowserOS 会话可经由 k-skill-browser-runtime或用本地浏览器打开https://www.s2b.kr/S2BNCustomer/tcmo001.do提交搜索表单后解析渲染出的列表/详情 HTMLDirect HTTP best-effort仅在相同 session cookie、referer、form token 条件与浏览器表现一致时才向/S2BNCustomer/tcmo001.doPOST form body若 session/form 不匹配则回退到浏览器路径。这一顺序在源码中同样可查证buildBrowserAutomationInstructions 会生成包含三个 step 的指令对象其 channel 依次为aside-browser→browseros-cdp-or-local-browser→direct-http-best-effort并附有对应的动作说明如Open ... take a snapshot, fill the visible search form, submit、对直接 HTTP 注明Only when the same session/form tokens work without a browser。测试 test/index.test.js 专门断言了三个通道的先后顺序。输入参数与归一化规则原文档给出的输入参数表如下这是调用本技能时唯一需要关心的对外接口InputValueskeyword검색어搜索词organization기관/학교명机构/学校名dateStart,dateEndYYYYMMDD或YYYY-MM-DD不得超过 3 个自然月itemType물품,공사,용역,allprivateContract1인,2인,allregion지역명地区名page1 以上的整数在源码层面normalizeSearchOptionssrc/index.js对上述输入做了更细的归一化值得注意的细节包括别名映射itemType支持韩文与英文别名如물품/goods/1统一映射为表单值1공사/works/2映射为2용역/service/services/3映射为3见 src/index.jsprivateContract支持1인/single/1→1、2인/two/2→2src/index.js。日期归一化dateStart/dateEnd接受YYYYMMDD与YYYY-MM-DD两种格式统一输出为YYYYMMDD同时校验不存在的日期如2026-02-31会被拒绝src/index.js。3 个自然月上限assertDateRange会对日期跨度做精确校验超过 3 个自然月含刚好 3 个月但日号超出起始日的情况抛出S2B search date range must not exceed 3 calendar monthssrc/index.js。这直接对应原文档3 calendar months 초과 금지的约束。页码校验page必须为 ≥1 的整数否则抛RangeError。未支持的取值传入ITEM_TYPES/PRIVATE_CONTRACTS映射之外的取值会抛出unsupported name: value的RangeError避免把脏数据发到上游。测试 test/index.test.js 对韩文别名 短横线日期的混合输入、非法日期、超期跨度等场景均有断言可作为归一化行为的权威参考。从归一化到 POST 请求配方buildSearchRequestsrc/index.js把归一化结果组装为可直接使用浏览器填充或直接 HTTP 发送的请求描述对象包含method: POST、formName: tcmo001FormbaseUrl/path/url由SEARCH_PATH与BASE_URL拼接headerscontent-type: application/x-www-form-urlencoded; charsetUTF-8且referer设置为搜索页自身 URLbodyURLSearchParams形式的表单体按上文表格逐字段填充tender_item与estimate_kind在all时不写入该字段保持空值keyword、organization、region等可选字段在为空时跳过setParam只在值非空时设置。以测试中的典型输入keyword: 냉장고、itemType: 물품、privateContract: 1인、日期2026-06-01~2026-06-30、page: 2为例生成的 body 关键项为forwardNamelist01、pageNo2、tender_sep11、tender_name냉장고、company_name_s가람초、tender_sep22、tender_date_start20260601、tender_date_end20260630、tender_item1、estimate_kind1、areaKind서울见 test/index.test.js。这也印证了recipe一词的含义它不是直接发起的 HTTP 请求而是交给浏览器或 HTTP 客户端执行的完整配方。列表解析从表格行到结构化公告记录parseListHtmlsrc/index.js以正则扫描整个 HTML 中的tr行对每行调用parseListRowsrc/html.js做字段级提取识别包含a链接的标题单元格从中解析onclick或javascript:href 里的 JS 调用得到{ functionName, args, raw }形式的详情 action metadataparseActionsrc/html.js仅接受f_detail、fn_detail、goView等详情跳转函数名isDetailAction据此过滤掉顶部导航等无关行从 action 的第一个参数或行内XX-XXXX-XXX形态的代码中提取公告/견적 코드从文本单元中按正则识别品目区分물품|공사|용역、机构名含학교|교육청|기관|초등|중학교|고등特征、状态진행|마감|완료|공고|취소|유찰与两个日期公告日、截止日输出{ noticeCode, estimateCode, title, organization, status, itemType, postedDate, deadline, detailAction }。针对 S2B 线上真实页面一条公告横跨两行tr的情况parseListHtml还有行合并逻辑当单行解析失败而下一行存在时尝试把两行拼接后再次解析src/index.js。测试 test/index.test.js 用twoRowListFixture验证了这一合并行为并确认rowspan标题行 元数据行的组合最终被解析为一条完整记录如noticeCode: 202607031350436。详情解析字段表、正文与附件parseDetailHtmlsrc/index.js面向详情页 fixture HTML实现思路如下用tableFieldssrc/html.js把详情页的键值对表格th标签 td值解析为字段映射从而读取공고번호/견적번호、기관명/수요기관、품목구분、계약방법、게시일/공고일、견적마감일/마감일/입찰마감일等标题优先取自h1~h6标题元素否则回退到字段表中的공고명/제목正文优先取id为content/contents/detailContent的div内容否则回退到整页文本附件通过扫描a标签并解析其onclick如downloadFile(A001,spec.pdf)得到{ filename, action }列表parseAttachmentssrc/html.js。输出结构为{ title, noticeCode, estimateCode, organization, status, itemType, privateContract, postedDate, deadline, contentText, fields, attachments }。测试 test/index.test.js 对详情 fixture 的字段、正文/설치 포함/与附件 actiondownloadFile的args: [A001, spec.pdf]均有断言。包使用方式技能文档提供了零依赖 CommonJS 包的导入方式详见 README.mdconst { buildBrowserAutomationInstructions, buildSearchRequest, normalizeSearchOptions, parseDetailHtml, parseListHtml } require(s2b-notice-search)package.jsonpackages/s2b-notice-search/package.json标明该包version: 0.2.1、license: MIT、main: src/index.js、engines.node 18测试与语法检查可通过npm test/npm run lint运行。包的典型组合用法是先用normalizeSearchOptions清洗入参 → 用buildSearchRequest生成表单配方 → 按回退顺序用浏览器或直接 HTTP 拿到页面 → 用parseListHtml/parseDetailHtml提取结构化结果。若在 k-skill CLI 环境中使用该技能也可以通过npx -y nomadamas/k-skill0 instruct s2b-notice-search获取与运行时匹配的最新指令见 SKILL.md。失败模式何时判定失败而非重试原文档明确了四类失败模式技能对此采取显式失败、不绕过的策略malformed curl/client errorform body、cookies、referer、编码或客户端超时错误导致 S2B 未返回正常 HTMLlogin/CAPTCHA/blocked出现登录墙、CAPTCHA、拦截/维护/安全页面时不尝试绕过直接归类为失败empty要么是搜索条件确实无结果要么是 session/form state 不匹配导致返回空列表upstream markup changeS2B 的表格结构、详情 action、hidden input 或 JavaScript 函数名一旦变化解析结果可能部分缺失或为空。这也与 SKILL.md 中的硬性规则相呼应不得绕过 legal、CAPTCHA、身份验证、电子签名等边界不得在用户明确许可前执行任何支付、提交、发布等动作。完成条件一次成功的技能调用需要满足原文档列出的全部Done when条件已在 Aside Browser 或回退浏览器中打开公开 S2B 查询表面搜索日期有效且未超过 3 个自然月列表/详情 fixture parser 已提取所需字段结果仅用于只读查询未进行提交/签约/登录自动化。结合源码看前两条由buildSearchRequest的assertDateRange校验与回退顺序约束保障第三条由parseListHtml/parseDetailHtml及配套测试验证第四条则是贯穿 instruction.md、SKILL.md 与包 README 的硬性合规约定——这正是该技能查询配方 解析器 合规边界三位一体的完整画像。【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考