ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

court-auction-notice-search 技能深度拆解:在无 Open API 与激进 IP 反爬约束下构建政府拍卖数据查询能力的完整架构与实战

court-auction-notice-search 技能深度拆解:在无 Open API 与激进 IP 反爬约束下构建政府拍卖数据查询能力的完整架构与实战 court-auction-notice-search 技能深度拆解在无 Open API 与激进 IP 反爬约束下构建政府拍卖数据查询能力的完整架构与实战【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill当你的 Agent 需要回答今天首尔哪里有不动产拍卖最权威的数据源是韩国大法院运营的官方「法院拍卖信息」站点courtauction.go.kr——它没有公开 Open API且大约 30 秒内 16 次请求就会把 IP 封锁 1 小时。k-skill 仓库中的 court-auction-notice-search 技能就是为这个困境而生的它直接复用站点内部的 WebSquare JSON XHR 接口把拍卖公告매각공고、案件详情、物件自由检索封装成三套带限流的 read-only JSON 查询从第一次调用起就替你算好封禁成本。本文覆盖三件事三条查询链路公告展开、案件直查、条件检索的数据流与源码落点三层传输通道的优先级和浏览器降级触发条件以及一套慢调用的节流、预算、封禁即停参数如何组合使用。前提是你能读懂 JavaScript、理解什么是会话 Cookie韩语字段名均会标注中文含义。设计哲学与能力边界该技能的核心设计哲学只有一句话慢就是防御能力——在一个快即死亡的站点上每个保守参数间隔、预算、封禁即停都是对调用方 IP 的主动保护而不是性能妥协。它能做的事把不动产拍卖公告列表转成结构化卡片并逐张展开出案件号、用途、地址、评估金额、最低拍卖价按案件号直接查询案件进展含历次拍卖日最低价、拍卖结果、配当要求终期按区域、用途、价格区间、流拍次数、面积做自由条件检索结果带坐标与建筑物清单内置法院事务所代码表、投标区分代码表以及用途/区域的代表性静态代码表src/codetables/直接 HTTP 被 WAF 拦截时自动降级到浏览器通道重试无需调用方手写 fallback。它明确不做的事动产汽车、重机械拍卖——v1 范围外一次性聚合某拍卖日所有法院的日程标注为独立 follow-up物件照片 URL 暴露、物件明细书/现状调查书/评估书 PDF 下载follow-up⚠️ 投标书自动填写与自动提交——投标必须由人在法院完成这条是硬性边界。目标读者画像写过数据抓取脚本、跑得起 Node.js 18 的开发者不需要韩国本地网络或韩语阅读能力正文出现的韩文都会给出中文对照。输入契约与参数归一化所有公开函数都接受一个纯对象入参最容易踩坑的一点是站点的搜索按钮本身只按月查询而这个差异已经被技能在参数层消化掉了。先看全量入参参数含义格式约束默认行为date拍卖日期YYYY-MM/YYYYMM或YYYY-MM-DD/YYYYMMDD必填给特定日时按月查后再按日过滤courtCode法院事务所代码B 6 位数字如B000210留空表示全部法院bidType投标类型date/period/韩文名/000331/000332留空两种都查caseNumber案件号推荐2024타경1000012024-100001等格式自动归一化region/usage/priceRange/area/flbdCount自由检索条件区域代码或韩文名流拍次数仅限整数未知值 fail-open 透传pageSize每页结果数仅 10/20/50/100默认 10其他值本地直接拒绝归一化的宽容度比直觉高两个对照例子date: 2026-04-27会被toNoticeSearchDate拆成月键202604去查询返回后再用dspslDxdyYmd精确过滤到那一天而caseNumber传2024-100001、2024_100001甚至2024 100001normalizeCaseNumber都会统一转成2024타경100001。反向来看校验并不松ensureCourtCode用^B\d{6}$严格匹配B210这种残缺输入会当场抛错不会带病发请求。参数层消化完格式问题之后另一个问题是请求在线上到底长什么样。协议通道与数据流该技能不消费任何官方 API它复刻的是站点内部行为前端页面点搜索按钮本质是向 WebSquare 框架端点发一次 POST JSON。src/transport/http.js里的CourtAuctionHttpClient把这套行为完整模拟出来——每次 POST 前先到对应入口页做一次预热 GET 领取会话 Cookie随后每个请求都携带按端点动态填充的Referer、韩语Accept-Language: ko-KR,ko;q0.9,en;q0.8、X-Requested-With: XMLHttpRequest头自由检索端点还会额外挂submissionid与sc-userid两个标识头让请求与真实浏览器提交无法区分。五个实际 POST 的端点及其请求体核心键端点路径用途请求体核心键/pgj/pgj143/selectRletDspslPbanc.on拍卖公告列表dma_srchDspslPbanc.{srchYmd, cortOfcCd, bidDvsCd, srchBtnYn:Y}/pgj/pgj143/selectRletDspslPbancDtl.on公告详情展开dma_srchGnrlPbanc.{cortOfcCd, dspslDxdyYmd, jdbnCd, ...}/pgj/pgj15A/selectAuctnCsSrchRslt.on案件单条查询dma_srchCsDtlInf.{cortOfcCd, csNo}/pgj/pgjsearch/searchControllerMain.on物件自由检索dma_pageInfo.{pageNo, pageSize, ...}dma_srchGdsDtlSrchInfo.{...}/pgj/pgjComm/selectCortOfcCdLst.on法院事务所代码表{}会话与传输规则浓缩为五条会话由手写cookieJar维护warmup与每次响应都会解析Set-Cookie存进 Map后续请求原样回传warmedUp标记保证每个入口页在一个客户端实例内只预热一次warmup。预热路径与端点一一对应公告/法院表走 PGJ143M01 入口页案件检索走 PGJ159M00自由检索走 PGJ151F00。Referer 与预热页错位是触发上游报错的常见原因排障时先查这里。传输第一层永远是直接 HTTP只有自由检索一条链路挂有第二层。降级触发条件只有两种WAF 型 HTTP 400或BLOCKED且调用方显式传fallbackOnBlocked: true传{ fallback: false }可整体关闭。浏览器层内部再分两级优先附着用户已打开的 runtime 浏览器macOS 依次探测 Aside → BrowserOS → Chrome其他平台 BrowserOS 优先全部不可达才本地chromium.launch连接用户的浏览器时清理阶段只关自己创建的 page/context 并断开 automation client绝不关闭用户的浏览器 profile。通道层搞清楚后下一个问题是数据如何从用户的问题流变成 JSON。核心工作流拆解公告展开流向用户收集拍卖日期必填以及可选的法院、投标类型toNoticeSearchDate把 6 位月/8 位日输入归一成统一结构。searchSaleNotices以月键srchYmd组装请求体命中公告列表端点。若用户指定了具体某一天同一函数会用dspslDxdyYmd过滤月查询结果只留该日卡片。用户选定卡片后把卡片对象原样交给getSaleNoticeDetailbuildNoticeDetailBody从raw中提取cortOfcCd、dspslDxdyYmd和关键的jdbnCd——后者是列表响应里返回的加密令牌外部无法凭空构造缺失会直接抛错。详情响应经normalizeNoticeDetailResponse展开成items[]数组返回。返回 JSON 中最值得关注的是caseNumber、appraisedPrice、minimumSalePrice价格都是韩元整数展示给用户时应换算成亿/万并附千位逗号。案件直查流收集法院事务所代码加案件号normalizeCaseNumber先把2024-100001这类输入统一为2024타경100001。getCaseByCaseNumber组装dma_srchCsDtlInf.{cortOfcCd, csNo}单次请求命中案件端点。若响应里没有dma_csBasInfnormalizeCaseDetailResponse返回found:false常伴随 status 204说明案件不存在或非公开应让用户核对案件号与法院。found:true时同一函数把七张子表一次展开caseInfo、items、schedule、claimDeadline、relatedCases、appeals、stakeholders。支撑这个案子进展到哪了这类追问的是schedule每个拍卖日的最低价/评估价/结果与claimDeadline配当要求终期两组字段。自由条件检索流把用户条件映射到region/usage/priceRange/appraisedPriceRange/flbdCount/area/saleDate校验全部集中在buildPropertySearchBody。区域输入驱动模式切换给了区域时cortStDvs:2地番地址搜索没给时cortStDvs:1公告模式。pageSize走白名单校验toPositiveInt配allowedflbdCount强制整数价格/面积区间允许小数——非法值在本地抛错不浪费一次真实调用。searchProperties先用直接 HTTP 发出仅当收到 WAF 型 HTTP 400 时构造 Playwright 客户端重发同一份 body并在finally中清理本次创建的浏览器。结果行经normalizePropertySearchRow把saNo、gamevalAmt、yuchalCnt等原始列映射为caseNumber、appraisedPrice、flbdCount多段地址拼接为单个address。flbdCount与minimumSalePrice的组合能直接回答流拍几次以上且预算内的物件address已是拼接好的完整韩文地址无需二次解析。通道可能被拦截那么设计问题就变成被拦的代价是多少。防护体系与安全阀 该技能的每一项防护都按威胁面 → 防御手段 → 触发后行为闭环设计参数全部可在客户端构造时覆盖。突发流量。威胁是短时间密集请求防御是调用间至少2000ms基础间隔外加 0 到1000ms的随机增量ensureBudget在每次调用前计算与上一次调用的时间差不足就补足睡眠。触发后的行为是静默等待不产生任何错误。会话超量。威胁是单会话累计调用过多防御是每个客户端实例10次调用的预算maxCallsPerSession。超限在发请求前就抛BUDGET_EXCEEDED这是有意设计的安全阀要继续只能resetSession或新建客户端。显式封禁。威胁是站点按 IP 封禁约 1 小时防御是响应出现data.ipcheck false的瞬间抛BLOCKED并停止不做自动重试——任何重试只会延长封禁时长恢复只能靠等待约 1 小时或更换网络。WAF 拦截。自由检索端点的 WAF 比其他端点更严格只有它对应的UPSTREAM_ERROR statusCode 400才触发浏览器降级降级路径中PLAYWRIGHT_UNAVAILABLE与UNKNOWN_PROVIDER立即抛错UNAVAILABLE浏览器不可达则继续落到本地 launch。超时失控。每个请求设15000ms上限生产配置可放宽到 30 秒超时或断连抛NETWORK_ERROR原始异常挂在error.cause上便于诊断。fail-closed 与 fail-open 的边界很清晰凡是要不要发出这次请求的决策一律 fail-closed预算超限、浏览器模块缺失、provider 名写错都立即抛错凡是字段怎么填的决策一律 fail-open——例如resolveUsageCode(아파트, large)因该名称只存在于其他层级宁可透传原文让用户看到上游报错也不返回同名的错误层级代码去污染请求体。防护机制理解之后回到桌面看它实际怎么调。实战路径最小可用 → 生产配置下面这段演示最短的公告展开路径——两条调用就能从月度列表走到单张公告的明细const { searchSaleNotices, getSaleNoticeDetail } require(court-auction-notice-search); const list await searchSaleNotices({ date: 2026-04, courtCode: B000210 }); console.log(共 ${list.count} 张公告卡片); const detail await getSaleNoticeDetail(list.items[0]); for (const row of detail.items) { console.log(row.caseNumber, row.address, row.appraisedPrice); }生产场景需要更保守的客户端与完整的错误分支下面这段演示了限流定制、预算控制和三类错误的分流处理const { CourtAuctionHttpClient, searchProperties } require(court-auction-notice-search); const slowClient new CourtAuctionHttpClient({ minDelayMs: 3000, jitterMs: 2000, maxCallsPerSession: 5, timeoutMs: 30000 }); try { const page await searchProperties({ client: slowClient, region: { sido: 11, sigungu: 11680 }, usage: { large: 건물, medium: 21200 }, priceRange: { min: 100000000, max: 500000000 }, flbdCount: { min: 1 }, pageSize: 20 }); console.log(本页 ${page.count} 件共 ${page.page.totalCount} 件); } catch (err) { if (err.code BLOCKED) console.error(已被封锁不重试等待约 1 小时); else if (err.code BUDGET_EXCEEDED) console.error(预算用尽请新建客户端); else throw err; }同一能力也全部暴露在 CLI 上四条典型命令覆盖了代码表、列表、案件、检索# 拉取法院事务所代码表 court-auction-notice-search codes courts --pretty | head -40 # 公告列表2026-04 首尔中央地方法院仅期日投标 court-auction-notice-search notices --date 2026-04 --court-code B000210 --bid-type date --pretty # 案件号直查 court-auction-notice-search case --court-code B000210 --case-number 2024타경100001 --pretty # 自由检索首尔特别市 강남구 代码 11680建筑物最低价 1 亿~5 亿韩元 court-auction-notice-search search --sido 서울특별시 --sigungu 11680 --usage-large 건물 \ --price-min 100000000 --price-max 500000000 --pretty正常路径走通之后出错时怎么办同样重要。故障速查与合规红线五个错误码覆盖了全部失败面触发条件与恢复动作如下错误码触发条件可执行的恢复动作BLOCKED响应含ipcheck false等待约 1 小时或换网络禁止自动重试BUDGET_EXCEEDED单会话超过 10 次调用新建客户端或用--max-calls放宽并告知风险UPSTREAM_ERROR站点返回通用错误多为会话过期或jdbnCd失效用新客户端重走 warmup 后重试NETWORK_ERROR超时或连接失败检查网络或调大timeoutMsPLAYWRIGHT_UNAVAILABLE需要浏览器降级但模块未装安装rebrowser-playwright或playwright-core每次交付结果前必须向用户声明的事项数据是官方站点公开信息的原样转述实际投标前必须回法院原始公告复核。⚠️ 站点对自动化极其敏感快速连续查询会使同一 IP 被封锁约 1 小时被锁期间只能等待或换网络。价格、拍卖日期、拍卖场所均以公告时点为准可能因更正、撤回、延期而变化响应里的correctionCount/cancellationCount字段是变化信号。本技能是 read-only 的不投标、不支付、不提交遇到验证码或电子签名环节必须停下交给用户。任务完成的判定标准有四条已向用户告知封禁风险与仅供参考提示展开后的 JSON 中caseNumber、usage、address与价格字段均已填充案件直查found:false时给出了可核对的后续指引遇封禁未自动重试并汇报了剩余调用预算。红线与自检标准就位想深入实现细节的读者可以直接走下面这条源码路径。源码导航与延伸推荐阅读顺序SKILL.md → instruction.md → README.md → src/index.jsbuildPropertySearchBody是参数校验的集中地→ src/transport/http.jsensureBudget与postJson的限流/封禁检测→ src/transport/playwright.js浏览器分层与清理规则→ src/normalize.jsraw 列名到英文键的映射→ src/codetables/index.jsfail-open 解析逻辑。理解响应结构最快的入口是test/fixtures/下的三个夹具notices-sample.json——公告列表响应样例能看到卡片各字段与jdbnCd加密令牌的位置case-found-sample.json——案件命中响应样例七张子表一次看全blocked.json——显式封禁响应的标准形态ipcheck:false就藏在这里。另有canonical-search-body.json是由scripts/capture-pgj151-submit.cjs从真实浏览器提交捕获的自由检索请求体是核对buildPropertySearchBody输出是否与站点期望逐键一致的依据。把这套技能抽象出来它其实是无公开 API 站点做 read-only 查询的可复用模板以站点内部 XHR 为协议、HTTP 为主通道加浏览器冷备、jitter 预算 封禁即停三件套护住调用方 IP、fail-open 代码表避免静默错误。政府采购、金融披露等任何强反爬的官方站点查询都可以直接迁移这套保守参数 分层降级 明确边界的组合。【免费下载链接】k-skill한국인을 위한 스킬 모음집 - 에이전트를 한국인으로项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表