Vai al contenuto principale
K

dsh-icp

keyblues/dsh-icp

DeepSeek Harness (DSH) 插件:原生工信部 ICP 备案查询(网站 / APP / 小程序 / 快应用 + 四类违法违规黑名单)——Node 进程内直连官方接口并本地求解滑块验证码,无需 MCP 服务、外部服务或 API Key。Native MIIT ICP filing lookup for DSH.

Installazione

dsh plugin --profile web add github:keyblues/dsh-icp

README

ICP 备案查询 · DSH 原生插件

DSH Plugin DeepSeek Harness License Node DSH GitHub stars

English — MIIT ICP filing lookup for DeepSeek Harness (DSH). A native bundle that reimplements the MIIT filing query flow inside the Node process — access token, locally solved slider captcha, queryByCondition plus app details — and registers two agent tools: icp_query (websites / apps / mini programs / quick apps, plus the four violation blacklists) and icp_query_types. No MCP server, no external service, no API key, zero npm dependencies. Results render as official-style conversation cards.

插件在 Node 进程内自己实现工信部备案查询服务的完整协议:获取访问令牌、在本地求解滑块验证码、调用官方查询接口并补全应用详情。它注册两个原生工具:

  • icp_query — 查询工信部 ICP 备案(网站 / APP / 小程序 / 快应用,以及四类违法违规黑名单),支持分页;
  • icp_query_types — 列出支持的查询类型、各类型 search 的填写方式与当前生效配置。

它不是 MCP 客户端,不依赖任何外部服务,也不需要 API Key。工具在会话里以官方样式的可展开卡片呈现(Host 注册工具 + Client 声明 tool.call.toolview 卡片),折叠时显示查询类型 / 关键词与结果统计,展开后是分页信息与备案记录列表。

特性

  • 直连工信部官方接口 https://hlwicpfwc.miit.gov.cn/icpproject_query/api,实时查询,无中转、无第三方数据商;
  • 单入口 search:域名、主办单位名称、备案号、应用名称都可以直接填;
  • 网站 / APP / 小程序 / 快应用的普通备案查询支持分页(page_num / page_size);
  • APP / 小程序 / 快应用的每条记录会再走官方详情接口(queryDetailByAppAndMiniId)补全服务名称等字段(可用 includeDetails 关闭);
  • 四类违法违规黑名单查询(网站 / APP / 小程序 / 快应用),结果附带威胁等级说明;
  • 滑块验证码在本地解码 PNG 并定位缺口,全程无人工交互;业务令牌与验证码会话在插件生命周期内缓存复用(连续查询只需解一次验证码,实测首查约 0.9 秒、后续约 0.2–0.4 秒);
  • 模型可见结果经过精简:一行一条记录(域名 | 主办单位=… | 主体备案号=…),不再输出内部 ID 等冗余字段,并给出 下一页:page_num=N 提示;
  • 会话内工具卡片:折叠态显示类型 / 关键词 / 条数与耗时,展开态显示分页、记录字段与黑名单等级;运行中有 shimmer、失败与中断各有状态;
  • 零运行时依赖:仅使用 Node 内置 fetch / crypto / zlib 等能力,无 npm 依赖、无构建步骤、无 schemastery。

安装

本插件暂未发布到 npm。npm 上确实存在一个名为 dsh-icp 的包,但那是另一位作者的无关项目(ICP ticker),不要通过 npm 安装本插件。请使用下面的 GitHub 方式安装。

本 bundle 零运行时依赖、无安装脚本、无构建步骤,从 GitHub 源码安装即可使用。

从 GitHub 安装(推荐)

  1. 打开 DSH 侧边栏「插件」页;

  2. 点右上角「添加插件」→「安装第三方插件」;

  3. 在「包名或地址」里填本仓库地址:

    https://github.com/keyblues/dsh-icp
    
  4. 安装完成后,icp_query / icp_query_types 随插件自动注册(工具名就这两个,没有 MCP 前缀)。

也可以让 Agent 代劳:

plugin_manager(action: "install_bundle", target: "github:keyblues/dsh-icp")

本地 clone / 离线安装

git clone https://github.com/keyblues/dsh-icp.git
plugin_manager(action: "install_bundle", target: "<上一步 clone 目录的绝对路径>")

本地目录会以 link: 方式安装,不打包、不下载;之后 git pull 更新代码无需重装(但 Host 模块需按下方说明重新加载)。

安装后

  • 安装成功后 application 应为 applied,bundle 行 dsh-icp 立即激活;
  • 本 bundle 没有任何依赖和安装脚本,无需 pnpm、无需构建、无需额外审批 approvedBuilds;
  • 工具卡片由 Client 半在页面启动时加载:首次安装、升级或修改 client.js 后需刷新一次浏览器页面(Host 工具无需刷新);
  • 若修改了本插件目录中的 index.js / lib/**,Host 进程不会自动重载模块:在「插件」页把本 bundle 禁用再启用即可重新加载(已实测生效),或重启 DSH。仅重新安装同一路径不会刷新已缓存的模块。

卸载

在「插件」页找到本插件后卸载,或:

plugin_manager(action: "remove_bundle", target: "@local/dsh-icp")

卸载会移除 profile 中的 bundle 选择与 dsh-icp 行;克隆到本地的目录不会被删除,随时可以重新安装。彻底清理时重启 DSH 以确保 Host 模块释放。

兼容性

项要求
Node.js>= 20
DSH>= 0.2.1-rc.3 < 0.3.0-0(见 package.json 的 engines.dsh)
平台macOS / Windows / Linux(纯 JS,无原生依赖)
网络需能直连 hlwicpfwc.miit.gov.cn
凭据无(匿名令牌仅保存在进程内存中)

工具参考

icp_query

查询一类 ICP 备案数据。参数如下:

参数类型必填说明
typestring(枚举)是查询类型,取值见下方「查询类型」表:web / app / mapp / kapp / bweb / bapp / bmapp / bkapp
searchstring是查询关键词。普通类型可填:域名(baidu.com)、主办单位名称(深圳市腾讯计算机系统有限公司)、备案号(京ICP证030173号);APP / 小程序 / 快应用也可填应用名称(微信);四类黑名单类型分别填域名或应用名称
page_numinteger否页码,从 1 开始,上限 10000(越界页返回 0 行);四类黑名单忽略此参数
page_sizeinteger否每页条数,默认 min(10, maxPageSize),上限为插件配置的 maxPageSize(默认 10,最大 26);四类黑名单忽略此参数

没有单独的 unitName / domain / appName / 许可证号参数——一个 search 同时承担这些查询条件。

返回字段(工具输出 schema):

字段类型说明
type / labelstring查询类型 key 与中文名
searchstring实际使用的关键词(已 trim)
pageNum / pageSizeinteger实际生效的页码与每页条数;黑名单类型 pageSize=0
total / pagesinteger总条数 / 总页数(黑名单为 1 页或 0)
hasNextPageboolean是否还有下一页(由官方返回的 pageNum / pages 推导;官方该字段恒为 false,不可直接用)
rowCountinteger本页记录数(黑名单为 0 或 1)
rowsarray备案记录。常见字段:domain / domainName 域名、unitName 主办单位、mainLicence 主体备案号、serviceLicence 服务备案号、updateRecordTime 审核通过日期、serviceName 服务名称、natureName 单位性质等;APP 类补全详情后还会带官方详情字段
detailsFetchedboolean是否成功补充了 APP / 小程序 / 快应用详情
elapsedMsinteger本次查询耗时(毫秒)
messagestring(可选)说明信息,例如无记录提示或黑名单等级解释

icp_query_types

无输入参数({})。返回:

字段类型说明
countinteger类型数量(固定 8)
typesarray每项含 type、label、blacklist、paginated、service_type、search_hint
endpointstring官方接口基地址
notestring使用提示(验证码成本、反爬与限频说明)
configobject当前生效配置(captcha_max_attempts、timeout_ms、max_page_size、detail_concurrency、include_details)

查询类型

type中文上游 serviceTypesearch 可填分页
web网站备案1域名 / 主办单位名称 / 备案号支持
appAPP 备案6应用名称 / 主办单位名称 / 备案号支持(自动补详情)
mapp小程序备案7应用名称 / 主办单位名称 / 备案号支持(自动补详情)
kapp快应用备案8应用名称 / 主办单位名称 / 备案号支持(自动补详情)
bweb违法违规网站—域名不支持(单条记录)
bapp违法违规 APP6APP 名称不支持(单条记录)
bmapp违法违规小程序7小程序名称不支持(单条记录)
bkapp违法违规快应用8快应用名称不支持(单条记录)

bweb / bapp / bmapp / bkapp 分别对应上游黑名单接口的四类查询;返回记录中的 blackListLevel=2 表示暂无违法违规信息,其它等级表示存在记录,具体含义以官方返回为准。

工具卡片(Client 半)

client.js 是该 bundle 的 Client 半(package.json → dsh.client),只做一件事:向 tool.call.toolview 槽位注册两个按工具名分发的会话卡片(icp_query / icp_query_types),样式沿用官方 Tool 行:

  • 折叠头:官方 14px 线条图标(备案文件 + 放大镜 / 列表)、标题、· 分隔的摘要(类型 · 关键词)、右侧统计(条数 · 耗时);悬停时图标切换为展开箭头。
  • 展开体:复用官方 details-card 原语(.ict_detailsCard,只用 --dsw-alias-* 主题变量);icp_query 显示类型、关键词、分页、耗时以及每条备案记录的字段,icp_query_types 显示接口基地址、当前生效配置与 8 类说明。
  • 状态:运行中是 shimmer 扫光 + 当前参数摘要;失败显示错误摘要与错误面板;被用户停止显示停止态;结果过大落盘(spill)时卡片仍可从持久化 meta 重绘。
  • 数据来源:Host 侧 output.presentationMeta 写入的持久化卡片事实(最多 10 条精简记录),不依赖模型可见正文,因此 fork / 重开会话后卡片仍完整。

Client 半由页面在启动时加载:新增或修改 client.js 后需要刷新一次浏览器页面才会出现卡片;Host 侧工具本身即时生效。卡片没有插件设置页,配置仍来自 profile patch 行。

配置项

配置写在 bundle 的 cordis.patch.yml 中(安装时随 bundle 生效),也可以在本 profile 的 cordis.patch.yml 里按行 id dsh-icp 覆盖同名项:

- id: dsh-icp
  config:
    timeoutMs: 45000
    includeDetails: false
配置项类型默认范围作用
captchaMaxAttemptsinteger51–10单次查询内滑块验证码的最大尝试次数(每次尝试都会重新取图)
timeoutMsinteger300005000–120000单次上游 HTTP 请求超时(毫秒);工具级超时会随该值与重试次数自动放宽
maxPageSizeinteger101–26每页条数上限;page_size 超过该值会被截断(官方上限 26)
detailConcurrencyinteger51–10并发拉取 APP / 小程序 / 快应用详情的数量
includeDetailsbooleantruetrue / false是否补全 APP / 小程序 / 快应用详情;关闭后更快、结果只含列表字段

本 bundle 刻意不依赖 schemastery:配置由 index.js 的 normalizeConfig() 在代码里归一化,非法值回退默认值并截断到范围内,因此没有插件设置表单,配置只来自 Loader 行的 config。修改配置后重启 DSH 或重载该 bundle 行生效。

为什么是"原生"的

维度本插件典型 MCP 方案(如 icp-mcp bundle)
查询链路Node 进程 → 工信部官方接口Node → MCP 服务 → 第三方接口
外部依赖无(不需要部署 MCP server / 中继)需要可达的 MCP 服务或 API 提供方
凭据无 API Key,只用官方匿名令牌通常需要 API Key 或订阅账号
验证码本地解码 PNG + 缺口定位,自动求解由远端服务处理
运行时依赖0 个 npm 包视实现而定

它是对公开项目 HG-ha/ICP_Query 查询流程的 Node 重写:不把该项目的实例接进来,而是直接复刻它访问工信部服务的行为。lib/miit.js 负责协议与网络,lib/png.js 负责纯 JS 解码 PNG,lib/slider.js 负责滑块缺口定位。

这是非官方实现:工信部未公开该接口文档,协议来自对公开项目的复刻与实测。官方接口或反爬策略变化时,插件可能失效。

上游查询流程

一次 icp_query 的完整时序(与 HG-ha/ICP_Query 一致):

  1. POST /auth — 取访问令牌。authKey = md5("testtest" + timestamp),请求体为 authKey 与 timestamp(application/x-www-form-urlencoded);响应 params.bussiness 即业务令牌,params.expire 为有效期。
  2. POST /image/getCheckImagePoint — 携带 token 请求滑块验证码,响应返回 uuid、背景图 bigImage 与拼图块 smallImage(均为 base64 PNG)。
  3. 本地求解滑块 — 用 lib/png.js 解码两张 PNG,用 lib/slider.js 在背景图中定位缺口位置,得到水平偏移量 offsetX。
  4. POST /image/checkImage — 提交 { key: uuid, value: offsetX },通过后响应 params 即为该验证码会话的 sign。
  5. POST /icpAbbreviateInfo/queryByCondition — 携带 token、uuid、sign 三个请求头,请求体 { pageNum, pageSize, unitName: search, serviceType };serviceType 为 1(网站)/ 6(APP)/ 7(小程序)/ 8(快应用)。响应 params.list 为备案记录,params.total / pages / hasNextPage 为分页信息。
  6. POST /icpAbbreviateInfo/queryDetailByAppAndMiniId — 仅 APP / 小程序 / 快应用:对每条带 dataId 的记录按 { dataId, serviceType } 拉取详情并合并进该行;并发数由 detailConcurrency 限制,详情失败只降级为缺少详情,不影响列表结果。

违法违规黑名单走同样第 1–4 步拿验证码会话,然后:

  • 违法违规网站:POST /blackListDomain/queryByCondition,请求体 { domainName: search };
  • 违法违规 APP / 小程序 / 快应用:POST /blackListDomain/queryByCondition_appAndMini,请求体 { serviceName: search, serviceType }。

黑名单接口不分页,返回单条记录(blackListLevel=2 表示暂无违法违规信息)。

重试策略:

  • 业务令牌在进程内缓存到过期前 5 秒;并发的多个查询共用同一次 /auth 请求。
  • 单次查询内,若滑块定位或校验失败,会重新取一张验证码再试,最多 captchaMaxAttempts 次。
  • 验证码会话复用:checkImage 返回的 sign 本身有数分钟有效期,解析其 JWT 里的过期时间作为复用截止点(最多 3 分钟),期间所有查询共用同一会话;只有被 401 拒绝时才作废并重解一次(最多重试一轮)。
  • 因此只有「会话过期后的第一次查询」需要解滑块(实测约 0.9 秒),后续查询约 0.2–0.4 秒;这是官方接口的正常成本。

风险与限制

  • 创宇盾反爬:官方服务由创宇盾保护。出口 IP 被判定异常时,接口会返回“当前访问疑似黑客攻击”页面,此时插件抛出 BLOCKED 错误;请稍后重试或更换网络出口,不要连续重试。
  • 含 HTML/特殊片段的关键词可能被 WAF 拦截:实测搜索词里带 <script> 等片段时,创宇盾会直接拦截(BLOCKED),与查询内容本身无关;这属于官方 WAF 行为,插件按错误返回且不自动重试。
  • 大页码不报错:page_num 超过 10000 会被截断为 10000,超出实际页数时返回 0 行(total 仍为真实总数),而不是抛出错误。
  • 官方限频未知:工信部未公布该匿名接口的频率配额,高频或并发查询可能被限流、拦截甚至临时封 IP。icp_query 已声明为非并发安全(同一 Agent 内不会并行调用),但仍建议保持低频、按需查询,不要批量扫描。
  • 首查约 1 秒、后续约 0.2–0.4 秒:验证码会话在有效期内复用,只有会话过期后的第一次查询需要本地解滑块;这是协议本身的成本,不是插件卡顿。
  • 非官方协议:接口文档未公开,协议逆向自公开项目 HG-ha/ICP_Query 并经过实测;官方调整接口、验证码或风控策略时插件可能失效,需要跟进修改(lib/miit.js 的端点、lib/slider.js 的定位算法)。
  • 数据仅供参考:结果以工信部备案系统(https://beian.miit.gov.cn/)与官方解释为准;rowCount=0 只代表该关键词在官方接口下未命中,不代表主体一定未备案。
  • 无担保:本项目按 MIT 许可“as is”提供,作者不对查询结果的正确性、完整性、可用性及因使用产生的任何后果负责。
  • 合规使用:仅用于查询公开备案信息,请遵守法律法规与官方服务条款,勿用于批量采集或攻击性用途。
  • 隐私:插件不收集、不上传用户数据;业务令牌与验证码会话只保存在进程内存中,不落盘。

文件

文件作用
package.jsonbundle 清单:包名 @local/dsh-icp、导出 index.js / locale / icon、dsh.bundle.patch
cordis.patch.yml插入一条 Host 行:id: dsh-icp、name: '@local/dsh-icp' 及默认 config
index.jsCordis Host 插件:name / inject = ['tools'] / apply,注册 icp_query 与 icp_query_types,归一化配置、精简渲染、写卡片 meta
client.jsCordis Client 插件:向 tool.call.toolview 注册 icp_query / icp_query_types 官方样式卡片,并注册词典与样式表
lib/miit.js工信部协议客户端:/auth 令牌、滑块验证码会话(含复用)、queryByCondition、应用详情、四类黑名单端点、错误类型
lib/png.js纯 JS PNG 解码器(解析 IHDR/PLTE/IDAT,用 node:zlib 解压并按行反滤波,支持调色板 / RGB / RGBA / 灰度),供验证码图像处理使用
lib/slider.js滑块缺口定位算法(复刻上游 match_slider_offset):背景图降采样 + 颜色量化,取前三大颜色做垂直游程统计,按长宽比筛出方形缺口,返回水平偏移量
locale/en.json / locale/zh.jsonPlugin Manager 显示的标题与描述(英文 / 中文)
icon.svg插件图标(备案文件 + 放大镜,64×64 SVG)
test/contract.mjs离线契约测试:用桩上下文跑真实 apply(),校验注册、参数校验、精简渲染、卡片 meta 与 disposer(不联网)
test/client.mjs离线卡片测试:用 React 桩加载 client.js,校验两个卡片的注册与成功 / 折叠 / 黑名单 / 运行中 / 失败 / 类型目录等渲染文本(不联网)
test/stability.mjs离线稳定性 / 故障注入套件:假 MIIT 服务 + 自造验证码 PNG,覆盖网络错误、超时、创宇盾拦截、401、并发首查、超大响应、异常行数据、异常 PNG 等 27 项(不联网)
test/smoke.mjs手工实查冒烟:八类查询 + 分页,每类一次真实调用(会消耗滑块验证码,请低频运行)
test/live-stability.mjs手工实网稳定性探测:四类正常查询 + 黑名单 + 分页越界 / page_size 截断 + 无结果,约 9 次真实调用(低频)
docs/verification.md代码审查、稳定性修复、离线测试与实网验证记录
README.md本文档

本 bundle 是 Host + Client 结构:Host 半边提供工具与协议实现;Client 半边(client.js)只声明会话工具卡片,没有插件设置页,也不注册任何 HTTP 路由。

本地开发与测试

五个脚本都在 test/ 下,直接用 Node 运行(零依赖、不需要 DSH,也不需要先安装):

node test/contract.mjs        # 离线:契约 / 参数 / 精简渲染 / 卡片 meta / disposer
node test/client.mjs          # 离线:React 桩加载 client.js,浅渲染两种卡片各状态
node --unhandled-rejections=strict test/stability.mjs   # 离线:27 项故障注入稳定性测试
node test/smoke.mjs           # 联网:八类查询 + 分页各一次真实调用
node test/live-stability.mjs  # 联网:边界稳定性探测(约 9 次真实调用)
node test/smoke.mjs web app   # 只跑指定类型

contract.mjs / client.mjs / stability.mjs 不触网,可随时运行;smoke.mjs 与 live-stability.mjs 会真实调用官方接口并求解滑块验证码,受官方反爬限制,请低频使用(脚本内已做间隔;遇到创宇盾拦截会立即停止)。

测试与验证

套件结果
test/contract.mjs(契约 / 渲染 / meta / dispose)全部通过
test/client.mjs(两种卡片各状态 + legacy/malformed meta)全部通过
test/stability.mjs(离线故障注入)27/27
独立审查与实网验证见 docs/verification.md

离线套件覆盖协议状态机、401 重试、并发首查、取消、响应体上限、PNG 解压边界、异常行数据、卡片渲染与清理等路径;完整记录(含审查发现的 HIGH/MEDIUM 问题清单与修复方式)在 docs/verification.md。

与 MCP 方案共存

本插件与 icp-mcp 之类的 MCP 中继互不冲突:MCP 方案的工具名是 mcp__icp__*,本插件注册的是 icp_query / icp_query_types。两者可以同时安装,但会出现两套 ICP 工具,按需保留其中一个即可。

许可

MIT © 2026 keyblues

  • 查询流程参考公开项目 HG-ha/ICP_Query,本项目为 Node 原生重写,不依赖其运行实例;
  • 本项目是非官方实现,与工信部及备案系统运营方无关联;接口与验证码可能随时变化;
  • 仅用于查询公开备案信息,请遵守法律法规与官方服务条款,勿用于批量采集或攻击性用途。

Plugin correlati